zoukankan      html  css  js  c++  java
  • 数据迁移、重组、备份、恢复

    数据库迁移、重组、备份、恢复可以有如下几种处理方式:

    1.导出、导入用户
     1.1导出用户
      exp system/oracle@orcl file=c:\ies20101009.dmp log=c:\ies20101009_exp.log owner=(ies) buffer=655000 compress=y
     1.2导入用户
      connect system/oracle@orcl;
      --删除用户--
      drop user ies cascade;
      --删除表空间--
      drop tablespace iests including contents;
      --创建表空间--
      create tablespace iests datafile 'D:\oracle\oradata\orcl\iests.dbf' size 200m reuse autoextend on next 50m;
      --创建用户并授权--
      create user ies identified by oracle default tablespace iests;
      grant resource,connect to ies;
      grant select any dictionary to ies;
      grant select any sequence to ies;
      grant create any table,alter any table,drop any table to ies;
      grant select any table,insert any table,update any table,delete any table to ies;
      grant create any trigger,alter any trigger,drop any trigger to ies;
      grant create any procedure,alter any procedure,drop any procedure,execute any procedure to ies;
      grant create any view,drop any view to ies;
      grant create any synonym to ies;
      grant create any snapshot to ies;
      --导入dmp--
      imp system/oracle@orcl fromuser=(ies) touser=(ies) buffer=655000 ignore=y file=c:\ies20101008.dmp log=c:\ies20101008_imp.log
     1.3总结
               导出、导入用户的操作是备份、恢复的主要方法,该方法非常稳定,一般不会产生异常或报错的信息。
               需要注意的是在oracle不同版本之间备份和恢复时,导入、导出需要是同一个版本的数据库,即需要将10g的数据库备份到9i时,需要用9i的客户端连接10g的数据库进行导出,然后在用9i进行导入。

        导入、导出常遇到的问题有:1.字符集不匹配,一般使用NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK,2.客户端版本不对,10.0.2.0.1不能导入到10.0.2.0.3的数据库中。

        在数据库恢复时(导入),需要停止web服务,是数据库处于不被连接的状态,否则用户删除时报错,不能被删除。

    如果不删除用户,只删除表空间,将导致用户下的object不能被删除(object包括function,procedure,synonym,package,Javasource,javaclass等),同样object不能被导入。

    2.导出、导入表
     2.1 导出表
      exp ies/oracle@orcl tables=(YJ_FDKKX,YJ_FDQYCWYB,YJ_FDQYCWZB,YJ_FDQYDLSCQKB) file=c:\ies_tables20101009.dmp log=c:\ies_tables20101009_exp.log compress=n direct=y
     2.2 导入表
                2.2.1 删除表中数据(是否需要删除表中数据需要依据实际情况而定)
      truncate table YJ_FDKKX;
      truncate table YJ_FDQYCWYB;
      truncate table YJ_FDQYCWZB;
      truncate table YJ_FDQYDLSCQKB;
      提示:
      truncate table YJ_FDQYCWZB;
      ORA-02266: 表中的唯一/主键被启用的外部关键字引用 
      delete from YJ_FDQYCWZB;
      --12 rows deleted
      结论:
      truncate 不能够用于删除父表中的数据,delete则可以在满足外键约束的情况下删除父表中的数据。
               2.2.2 导入可能存在的问题
      imp ies/oracle@orcl tables=(YJ_FDKKX,YJ_FDQYCWYB,YJ_FDQYCWZB,YJ_FDQYDLSCQKB) file=c:\ies_tables20101009.dmp log=c:\ies_tables20101009_imp.log ignore=y
      导入时要注意表之间的外键关系,需要先导父表,再导子表
      imp ies/oracle@orcl tables=(YJ_FDKKX,YJ_FDQYCWZB,YJ_FDQYCWYB,YJ_FDQYDLSCQKB) file=c:\ies_tables20101009.dmp log=c:\ies_tables20101009_imp.log ignore=y
      导入时即使注意到表之间的外键关系,需要先导父表,再导子表,同样导子表时也会提示违反完整性约束,即导入的顺序由导出顺序决定。
      imp ies/oracle@orcl tables=(YJ_FDQYCWYB) file=c:\ies_tables20101009.dmp log=c:\ies_tables20101009_imp.log ignore=y
      导入子表时提示违反完整性约束,可以二次单独导入子表,导入正常。
               2.2.3 导入问题的处理
      调整导出顺序:先导父表,再导子表
      exp ies/oracle@orcl tables=(YJ_FDKKX,YJ_FDQYCWZB,YJ_FDQYCWYB,YJ_FDQYDLSCQKB) file=c:\ies_tables20101009.dmp log=c:\ies_tables20101009_exp.log compress=n direct=y
      imp ies/oracle@orcl tables=(YJ_FDKKX,YJ_FDQYCWZB,YJ_FDQYCWYB,YJ_FDQYDLSCQKB) file=c:\ies_tables20101009.dmp log=c:\ies_tables20101009_imp.log ignore=y
      导入正常。
     2.3 总结
                    对表的导出导入不像对用户的导出导入那样稳定,主要是因为表之间存在着外键关系,表中字段也存在着约束,还有唯一索引的约束。
                    对于导入实在困难时可以考虑数据优先,即先删除或失效这些约束,导入数据后,再重建或启用这些约束;在重建或启用些约束时,如果数据不满足条件,需要具体考虑数据的修复问题。将约束失效的操作包括将相关触发器失效和将外键约束失效。

    3.直接路径插入
     直接路径插入是通过已有表及表中数据构建新的表,
                 该功能只能创建表结构及生成表中的数据,不能创建表的主键、外键、约束等
     create table YJ_FDKKX_temp as select * from YJ_FDKKX;
     create table YJ_FDQYCWYB_temp as select * from YJ_FDQYCWYB;
     create table YJ_FDQYCWZB_temp as select * from YJ_FDQYCWZB;
     create table YJ_FDQYDLSCQKB_temp as select * from YJ_FDQYDLSCQKB;
     commit;
    4.sql*loader 
     4.1 sql*loader作用:用于将少量文本型数据加载到数据库中(对于字符型、数字型该方法适用,对于日期型、大对象型不适用该方法)
     4.2 sql*loader命令:sqlldr scott/tiger control=ulcase6.ctl log=ulcase6.log direct=true; 
            4.3 ulcase6.ctl是控制文件,需要手工编写,分为两种情况:
                4.3.1 将数据一起写在控制文件中
           load data
           infile *
           insert into table scott.dept 
            fields terminated by ',' optionally enclosed by '"'
            (deptno,dname,loc)
           begindata
            10,account,new york
            20,research,dallas
            30,sales,chigago

                4.3.2 数据文件与控制文件分开(ulcase6.dat是数据文件)
           load data
           infile 'ulcase6.dat'
           insert into table emp
            (empno position(01:04) integer external nullif empno=blanks,...)
            4.4 限制
                 4.4.1 sql*loader  insert 时表必须为空。
        sqlldr ies/oracle@orcl control=C:\temp\YJ_FDQYCWYB_TEMP.ctl log=C:\temp\YJ_FDQYCWYB_TEMP.log direct=true;
        sql*loader  insert 时表必须为空。
        delete from YJ_FDQYCWYB_TEMP;
        commit;
                 4.4.2 sql*loader 只能将少量文本型数据加载到数据库中,不能处理日期类型
        sqlldr ies/oracle@orcl control=C:\temp\YJ_FDQYCWYB_TEMP.ctl log=C:\temp\YJ_FDQYCWYB_TEMP.log direct=true;
        表 YJ_FDQYCWYB_TEMP 的列 CDATE 出现错误。
        ORA-01861: 文字与格式字符串不匹配
        select cdate from YJ_FDQYCWYB where id='375E892B4D0F4B8081D61C518A14E6C2'
        2010-12-1
        update YJ_FDQYCWYB set cdate=2010-12-1 where id='375E892B4D0F4B8081D61C518A14E6C2';
            4.5 总结
                sql*loader 不能加载日期类型导致其处理功能十分有限,且整理控制文件和数据文件也相对比较麻烦,一般不建议使用。
               
    5.将execl中数据导入到oracle中
      步骤:
        1.生成execl文件
              对于不存在的数据:手动编辑execl文件;
              对于数据库中存在的数据:在pl/sql developer的sql windows 窗口查询数据,并copy to Execl,删除首列行序号的信息,
                                      如果某列被进行了科学计数法,则将该列选中,点格式-》单元格-》数字-》数值-》-1234 即可。
        2.把Excel文件另存为文本文件(制表符分隔)(*.txt)
        3.用pl/sql developer工具导入文本文件
          3.1 打开pl/sql developer->tools->Text Importer,选中要导入的文本文件,
          3.2 在data to oracle 中维护 用户名、表名,在fields中可以看到文本文件中的列与数据字段进行了对应,对日期类型的属性要单独选中维护格式转换
          3.3 但看到import与 import to Script 可以操作时,便可以用import将数据导入到数据库中(切记:该按钮只能点一次,多次点击可能导致数据被重复导入);
              import to Script 不能直接将数据导入到数据库中,而是生成insert 语句。建议生成insert语句,在执行insert语句可以加入spool记录日志信息。
        4.总结:
          pl/sql developer->tools->Text Importer工具封装扩展了sql*loader的功能,解决了sql*loader只能导入文本型数据的限制。
          pl/sql developer->tools->Text Importer工具可以实现单表的数据备份功能,为数据迁移提供的一种可选途径(对于大对象仍需要单独处理)。
          可以支持单独导数据,不导表结构的功能,补充了exp导出表的缺陷。
         
    6.pl/sql developer工具用途(单独导库结构)
          1.pl/sql developer->tools->Export User Objects 导出整个用户的所有对象(如果选中单个对象『如:表X_RY』,便可以导出单个对象的结构),将数据库结构(导成脚本)    
          2.pl/sql developer->tools->Find Database Objects 查找数据库对象
          3.pl/sql developer->tools->Compile invalid Objects 编译对象(有效)
          4.pl/sql developer->tools->Compare User Objects   对比数据库对象(适用于对比两个数据库中相同对象的区别)
          5.pl/sql developer->tools->Sessions               看起来很有用,随后研究
          6.pl/sql developer->tools->Export Tables          导出表(1.oracle export 调用的oracle的exp命令,生成dmp文件。2.sql inserts 将表结构、约束、相关主键、外键、触发器、及数据全部导出成脚本。3.pl/sql developer 导出文件是pde格式,pde格式文件只能在import tables-->pl/sql developer中使用,且没有sql inserts功能强大,不建议使用。)
          7.pl/sql developer->tools->Import Tables 有三个窗口   oracle import 选中oracle的dmp文件调用的oracle的imp命令;
                                 sql inserts 选中*.sql文件,并执行该文件;pl/sql developer 需要选中pl/sql developer的导出文件(pde文件),*.dmp、*.sql文件均不能选择。
          8.pl/sql developer->tools->Compare Table Data   对比表中数据(适用于对比两个数据库中相同表的数据的区别) 与4比较类似

    7.自行构造抽数据的sql(单独导数据)
        7.1 功能:将数据抽成insert语句,保存在文件中
        7.2 写法(语句)
      set heading off;
      spool c:\temp\6-data.sql;
      select 'insert into TX_BMZJ (ID,MC,SJBM,ZZLJ,XTML) values ('''||ID||''','''||MC||''','''||SJBM||''','''||ZZLJ||''','''||XTML||''');' from TX_BMZJ;
      select 'insert into TX_RY (ID,MC,XB,ZW,BGDH,YDDH,QYMC,SSMB) values ('''||ID||''','''||MC||''','''||XB||''','''||ZW||''','''||BGDH||''','''||YDDH||''','''||QYMC||''','''||SSMB||''');' from TX_RY;
      select 'insert into XT_BM (ID,FID,MC,BZ) values ('''||ID||''','''||FID||''','''||MC||''','''||BZ||''');' from XT_BM;
      select 'insert into XT_JS (ID,MC,BZ) values ('''||ID||''','''||MC||''','''||BZ||''');' from XT_JS;
      select 'insert into XT_XTCS (ID,FZM,CSM,CSZ,BZ) values ('''||ID||''','''||FZM||''','''||CSM||''','''||CSZ||''','''||BZ||''');' from XT_XTCS;
      spool off;
      set heading on;
     7.3 限制
         必须清楚表结构,需要手工构造,生成的文件中包含没有用的信息
     7.4 总结
         正在试图通过存贮过程将手工构造的限制取消掉。
        
    8.对于大对象的单独导入、导出
     oracle操作文件
    9.建数据库连接并同步数据
         9.1 建数据库连接
      create database link ies207 connect to "ies" identified by "ies2010"  using 'ies207';
         9.2 用A数据库同步B数据中的表的数据
    --  select * from ies.yj_dmxxrb@ies207 where rownum<3;
    --  select * from yj_dmxxrb where rownum<3;
      delete from ies.yj_dmxxrb@ies207;
      insert into ies.yj_dmxxrb@ies207 (ID,DCID,ZZJRL,JZGC,FDL,GML,HML,DMKC,KYTS,QMTJTS,QMTJRL,CDATE ) select ID,DCID,ZZJRL,JZGC,FDL,GML,HML,DMKC,KYTS,QMTJTS,QMTJRL,CDATE  from yj_dmxxrb;
        9.3 限制
      drop table ies.yj_dmxxrb@ies207;
      create table ies.yj_dmxxrb@ies207 as select * from yj_dmxxrb;
      ORA-02021: 不允许对远程数据库进行 DDL 操作
       9.4 总结
            对于多个数据库而言数据库连接是很有效的,
            对于复杂的功能可以用存贮过程同步,再用job定时触发。

    10. 可传输的表空间

    知识点:
    1.mstsc 远程连接
      regedit 注册表
      regsvr32 /s AUTOMENU.DLL 注册dll

  • 相关阅读:
    GoldenGate HANDLECOLLISIONS参数使用说明
    GoldenGate for bigdata 12.3.2.1版本新特性
    使用GoldenGate EVENTACTIONS执行数据的实时触发和定制化
    基于Docker的GoldenGate部署
    Redis热点数据预写方案
    Redis缓存和数据库双写一致方案
    Redis主从复制原理和高可用方案
    Redis的并发竞争如何解决?如何保证并发写的有序?
    Redis 的单线程模型
    Nginx系列之6:重要模块
  • 原文地址:https://www.cnblogs.com/BradMiller/p/1846841.html
Copyright © 2011-2022 走看看