任务:将旧数据库中的数据完全导出到新数据库中
环境:旧数据库: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
步骤:( 注:考虑篇幅, 本文中仅列出实际操作中部分代码 )
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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/3898/viewspace-785004/