Oracle 不同环境下导入解决方案
2015-11-06 10:48
387 查看
最近由于开发需要,要将现生产环境的数据库全部同步到开发环境中(包括数据、表结构、存储过程、方法……)。但是在导入的过程中发现了以下问题:
数据库服务端编码不一致,导入之后数据为乱码。
表中存在Blob和Clob类型的字段,在导入过程中出现了表不能导入或者导入后没有数据的情况。
由于数据源于生产库且不能随意访问(更不要说是上去操作了),现所有生产库数据都是通过已有脚本在晚上定时进行远程备份。查看后发现dmp文件是直接exp导出,没有使用数据泵。因此要导入的时候做一些特殊处理才能完全导入。
1 在开发库中用dba账号登陆,将当前账号下的所有表的column的comments文件和table的comments导出到excel。
导出column comments语句:
导出table comments语句:
查询后通过PLSQL的“Copy to Excel…”导出到Excel
![](https://img-blog.csdn.net/20151106104202375)
2 将dmp拉到需要导入的环境,然后导出当前dmp的结构信息。
通过上面的语句会将dmp中的结构信息导出成一个sql文件,里面的内容大致如下:
![](https://img-blog.csdn.net/20151106100741354)
3 用plsql打开这个结构的sql文件,执行5步替换操作:
找到: ‘REM ’ 替换: ”
找到: ‘”原来的表空间”’ 替换: ‘”目标表空间”’
找到: ‘…’ 替换: ‘REM …’
找到: ‘CONNECT’ 替换: ‘REM CONNECT’
找到: ‘REM ’ 替换: ‘–’
做完5步操作之后执行该脚本,则数据库中已经生成好表的结构了。
4 执行存储过程干掉所有约束
存储过程的代码如下:
5 执行正常的imp导入
6 导入完成之后再重新执行刚才的存储过程开启约束
7 将上面第一点中的excel中的脚本在Command窗口下执行即可
数据库服务端编码不一致,导入之后数据为乱码。
表中存在Blob和Clob类型的字段,在导入过程中出现了表不能导入或者导入后没有数据的情况。
由于数据源于生产库且不能随意访问(更不要说是上去操作了),现所有生产库数据都是通过已有脚本在晚上定时进行远程备份。查看后发现dmp文件是直接exp导出,没有使用数据泵。因此要导入的时候做一些特殊处理才能完全导入。
1 在开发库中用dba账号登陆,将当前账号下的所有表的column的comments文件和table的comments导出到excel。
导出column comments语句:
select 'comment on column '||table_name||'.'||column_name||' is '''||comments||''';' from dba_col_comments t where t.owner = 'xxx';
导出table comments语句:
select 'comment on table '||table_name||' is '''||comments||''';' from dba_tab_comments t where t.owner = 'xxx';
查询后通过PLSQL的“Copy to Excel…”导出到Excel
2 将dmp拉到需要导入的环境,然后导出当前dmp的结构信息。
imp <xe_username>/<password>@XE file=<filename.dmp> indexfile=index.sql full=y
通过上面的语句会将dmp中的结构信息导出成一个sql文件,里面的内容大致如下:
3 用plsql打开这个结构的sql文件,执行5步替换操作:
找到: ‘REM ’ 替换: ”
找到: ‘”原来的表空间”’ 替换: ‘”目标表空间”’
找到: ‘…’ 替换: ‘REM …’
找到: ‘CONNECT’ 替换: ‘REM CONNECT’
找到: ‘REM ’ 替换: ‘–’
做完5步操作之后执行该脚本,则数据库中已经生成好表的结构了。
4 执行存储过程干掉所有约束
exec MANAGE_USER_CONSTRAINTS('disable',true,true,true);
存储过程的代码如下:
CREATE OR REPLACE PROCEDURE MANAGE_USER_CONSTRAINTS(OPERATION VARCHAR2, FK BOOLEAN DEFAULT TRUE, PK BOOLEAN DEFAULT TRUE, UK BOOLEAN DEFAULT TRUE) IS /** 启动和关闭约束的存储过程脚本 created by yuanzh 2015-10-22 */ ST VARCHAR2(255); --获取外键关系 CURSOR R IS SELECT TABLE_NAME, CONSTRAINT_NAME FROM USER_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'R'; --获取主键 CURSOR P IS SELECT TABLE_NAME, CONSTRAINT_NAME FROM USER_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'P' AND INSTR(CONSTRAINT_NAME,'BIN') = 0; --获取唯一索引 CURSOR U IS SELECT TABLE_NAME, CONSTRAINT_NAME FROM USER_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'U'; BEGIN --如果参数中是disable,关闭约束的情况下 IF UPPER(OPERATION) IN ('DROP', 'DISABLE') THEN --先执行外键约束的关闭 IF FK THEN FOR E IN R LOOP BEGIN ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || ' CONSTRAINT ' || E.CONSTRAINT_NAME; EXECUTE IMMEDIATE (ST); EXCEPTION WHEN OTHERS THEN NULL; DBMS_OUTPUT.PUT_LINE(ST); END; END LOOP; END IF; --执行主键约束的关闭 IF PK THEN -- 先关闭外键 FOR E IN R LOOP BEGIN ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || ' CONSTRAINT ' || E.CONSTRAINT_NAME; EXECUTE IMMEDIATE (ST); EXCEPTION WHEN OTHERS THEN NULL; DBMS_OUTPUT.PUT_LINE(ST); END; END LOOP; --再关闭主键 FOR E IN P LOOP BEGIN ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || ' CONSTRAINT ' || E.CONSTRAINT_NAME; EXECUTE IMMEDIATE (ST); EXCEPTION WHEN OTHERS THEN NULL; DBMS_OUTPUT.PUT_LINE(ST); END; END LOOP; END IF; --执行唯一约束的关闭 IF UK THEN FOR E IN U LOOP 4000 BEGIN ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || ' CONSTRAINT ' || E.CONSTRAINT_NAME; EXECUTE IMMEDIATE (ST); EXCEPTION WHEN OTHERS THEN NULL; DBMS_OUTPUT.PUT_LINE(ST); END; END LOOP; END IF; --若是启用约束的时候 ELSIF UPPER(OPERATION) IN ('ENABLE') THEN --先启用主键 IF PK THEN FOR E IN P LOOP BEGIN ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || ' CONSTRAINT ' || E.CONSTRAINT_NAME; EXECUTE IMMEDIATE (ST); EXCEPTION WHEN OTHERS THEN NULL; DBMS_OUTPUT.PUT_LINE(ST); END; END LOOP; END IF; --启用外键 IF FK THEN --先主键启动 FOR E IN P LOOP BEGIN ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || ' CONSTRAINT ' || E.CONSTRAINT_NAME; EXECUTE IMMEDIATE (ST); EXCEPTION WHEN OTHERS THEN NULL; DBMS_OUTPUT.PUT_LINE(ST); END; END LOOP; --在外键启动 FOR E IN R LOOP BEGIN ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || ' CONSTRAINT ' || E.CONSTRAINT_NAME; EXECUTE IMMEDIATE (ST); EXCEPTION WHEN OTHERS THEN NULL; DBMS_OUTPUT.PUT_LINE(ST); END; END LOOP; END IF; --启用唯一约束 IF UK THEN FOR E IN U LOOP BEGIN ST := 'ALTER TABLE ' || E.TABLE_NAME || ' ' || OPERATION || ' CONSTRAINT ' || E.CONSTRAINT_NAME; EXECUTE IMMEDIATE (ST); EXCEPTION WHEN OTHERS THEN NULL; DBMS_OUTPUT.PUT_LINE(ST); END; END LOOP; END IF; ELSE DBMS_OUTPUT.PUT_LINE('THE FIRST PARAMETER OF THE PROCEDURE MUST BE DROP OR ENABLE OR DISABLE'); END IF; END;
5 执行正常的imp导入
imp xxx/abc@se file=xxx220151020_235000.dmp fromuser=fuser touser=tuser ignore=y grants=n constraints=n rows=y buffer=80000000
6 导入完成之后再重新执行刚才的存储过程开启约束
exec MANAGE_USER_CONSTRAINTS('enable',true,true,true);
7 将上面第一点中的excel中的脚本在Command窗口下执行即可
相关文章推荐
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- Oracle Containers for J2EE远程安全漏洞(CVE-2014-0413)
- Oracle 10g R2不能使用EM的问题
- 表空间操作
- PreparedStatement中in子句的处理
- VMware下RedHat4.8_64位安装Oracle 10g RAC--简略脚本
- oracle sql日期比较
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- OS block size和Oracle block size,查找OS Blocksize的方法
- oracle中创建数据库和表空间的几点总结
- 数据库自动备份脚本
- oracle的nvl函数的使用介绍
- 解决oracle用户连接失败的解决方法
- oracle的一些tips技巧
- Oracle 下的开发日积月累
- Oracle存储过程之数据库中获取数据实例
- Windows下ORACLE 10g完全卸载的方法分析
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- ORACLE LATERAL-SQL-INJECTION 个人见解