数据迁移、重组、备份、恢复

系统 1682 0

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

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

数据迁移、重组、备份、恢复


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论