ITPub博客

首页 > 数据库 > 数据库开发技术 > 【工作日志】数据迁移完整过程

【工作日志】数据迁移完整过程

原创 数据库开发技术 作者:yaanzy 时间:2004-12-21 14:19:11 0 删除 编辑

任务:将旧数据库中的数据完全导出到新数据库中
环境:旧数据库:CPU UltraSPARC-II 400MHz × 1   Mem 512M  SunOS 5.8  Oracle 8.1.7.0
         新数据库:CPU Intel 2.80GHz × 2   Mem 2048M  RedHat AS 3.0  Oracle 9.2.0.4

[@more@]

步骤:( 注:考虑篇幅, 本文中仅列出实际操作中部分代码 )

1、使用toad > dba > generate database script工具生成旧数据库的脚本,从中提取出表空间和用户
     的创建语句,将创建表空间的语句适当改造(因为新库是9i,可以用到LMT、ASSM特性)
  
     CREATE TABLESPACE AIR DATAFILE '/mnt/raid/oradata/lrgarbo/AIR.dbf' SIZE 100M
     EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
       
     CREATE TABLESPACE CMCC_WAP DATAFILE '/mnt/raid/oradata/lrgarbo/CMCC_WAP.dbf' SIZE 100M
     EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
       
     CREATE TABLESPACE LINKRICH_MMS DATAFILE '/mnt/raid/oradata/lrgarbo/LINKRICH_MMS.dbf' SIZE 2048M
     EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
  
  
     CREATE USER CMCC_WAP IDENTIFIED BY CMCC_WAP DEFAULT TABLESPACE CMCC_WAP
     TEMPORARY TABLESPACE TEMP PROFILE DEFAULT ACCOUNT UNLOCK;
     GRANT CONNECT TO CMCC_WAP;
     GRANT DBA TO CMCC_WAP;
     ALTER USER CMCC_WAP DEFAULT ROLE ALL;
 
     GRANT UNLIMITED TABLESPACE TO CMCC_WAP;
  
     CREATE USER LINKRICH_MMS IDENTIFIED BY VAS_LINKRICH DEFAULT TABLESPACE LINKRICH_MMS
      TEMPORARY TABLESPACE TEMP PROFILE DEFAULT ACCOUNT UNLOCK;
      GRANT CONNECT TO LINKRICH_MMS;
      GRANT DBA TO LINKRICH_MMS;
     ALTER USER LINKRICH_MMS DEFAULT ROLE ALL;
 
    GRANT ALTER ANY INDEX TO LINKRICH_MMS;
    GRANT ALTER ANY TABLE TO LINKRICH_MMS;
    GRANT CREATE TABLE TO LINKRICH_MMS;
    GRANT CREATE TRIGGER TO LINKRICH_MMS;
    GRANT DROP ANY TABLE TO LINKRICH_MMS;
    GRANT UNLIMITED TABLESPACE TO LINKRICH_MMS;
    GRANT UPDATE ANY TABLE TO LINKRICH_MMS;
    ALTER USER LINKRICH_MMS
      QUOTA UNLIMITED ON LINKRICH_MMS;
    
    CREATE USER WAPLAT IDENTIFIED BY LINKRICH DEFAULT TABLESPACE USERS
     TEMPORARY TABLESPACE TEMP PROFILE DEFAULT  ACCOUNT UNLOCK;
    GRANT CONNECT TO WAPLAT WITH ADMIN OPTION;
    GRANT DBA TO WAPLAT WITH ADMIN OPTION;
    ALTER USER WAPLAT DEFAULT ROLE ALL;
 
    GRANT UNLIMITED TABLESPACE TO WAPLAT WITH ADMIN OPTION;
  
    在新数据库中创建旧数据库中的表空间、用户(如果已有就不用创建了,例如system用户、
     user表空间)
  
2、到晚上12点后,停下旧数据库上的所有业务,按用户导出旧数据库的数据

     注:之所以按用户导出而不是用全库导出,是因为数据库版本不一致,在之前我曾经做过测试
     全库导出后再导入时报错很多,都是数据库系统表级的不同导致的,所以安全起见还是按用户
     导出再导入基本不会报错。
  
     旧数据库的字符集是:UTF8   新数据库的字符集是:ZHS16GBK
  
     导出是在旧数据库的服务器上直接做的,导出到导入是子集到超集,理论上可以,所以导出时先
     设置导出客户端的字符集:
      export NLS_LANG=american_america.ZHS16GBK
  
     然后按照以下脚本导出数据:
  
     exp cmcc_wap/cmcc_wap file=cmcc_wap.dmp compress=y feedback=10000  log=exp.log
     exp linkrich_mms/vas_linkrich file=linkrich_mms.dmp compress=y feedback=10000 log=exp.log
     exp waplat/linkrich file=waplat.dmp compress=y feedback=10000 log=exp.log

3、由于旧数据库不能直接访问新数据库,把导出文件*.dmp传到另一个8i的客户端机器上192.168.1.200,
     在这台机器上执行导入操作,注意不能使用9i的客户端去导入这些导出文件
  
     imp cmcc_wap/cmcc_wap@42 file=cmcc_wap.dmp  feedback=10000  log=imp.log full=y
     imp linkrich_mms/vas_linkrich@42 file=linkrich_mms.dmp  feedback=10000 log=imp.log full=y
     imp waplat/linkrich@42 file=waplat.dmp feedback=10000 log=imp.log full=y

4、导入完毕后检查新、旧数据库的表数据是否一致,下面这个存储过程输出当前用户下所有表的记录数:

   create or replace procedure p_print_table_cnt is
   TYPE type_Cursor IS REF CURSOR;
   v_cursor     type_Cursor;
  
   v_count      int;
   begin
     for c_tablename in (select table_name from user_tables)
     loop
        open v_cursor for 'select count(*) from '||c_tablename.table_name;
        loop
           fetch v_cursor into v_count;
           exit when v_cursor%notfound;
        end loop;
        close v_cursor;
     
        dbms_output.put_line(lpad(c_tablename.table_name,20)||':   '||to_char(v_count));
     end loop;
  
   end p_print_table_cnt;

  
5、检查存储过程、触发器、job是否正常,将新、旧数据库的ip地址、机器名互换,改动oracle相关文件
     如listener.ora、tnsnames.ora, 启动业务应用程序,检查是否正常

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/3898/viewspace-785004/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    108
  • 访问量
    760236