Oracle 11g大SQL文件高效导入方法及外键插入顺序问题咨询
嘿,针对你遇到的这两个Oracle 11g迁移问题,我给你整理了几个实用的解决方案,都是生产环境里验证过的:
一、更快的导入方式:换掉SQL Developer的SQL脚本导入
SQL Developer执行SQL脚本本质是逐条跑INSERT语句,2GB的脚本慢很正常,试试下面这两种更高效的方式:
1. 优先用Oracle Data Pump(expdp/impdp)
这是Oracle官方专门为大规模数据迁移设计的工具,直接读写数据库数据文件,效率比SQL脚本高几个数量级,2GB的数据大概率几十分钟就能搞定。
- 如果源库还能访问,建议重新用
expdp导出(比SQL脚本导出也快):expdp your_username/your_password@your_orcl schemas=your_target_schema dumpfile=schema_dump.dmp logfile=expdp_export.log - 然后用
impdp导入到目标库:
还可以加impdp your_username/your_password@your_orcl schemas=your_target_schema dumpfile=schema_dump.dmp logfile=impdp_import.logparallel=4参数开启并行导入(根据服务器CPU核心数调整),进一步提升速度。
2. 用SQL*Plus执行现有脚本(优化参数)
如果只能用现有的2GB SQL脚本,那用SQL*Plus代替SQL Developer,并且调整参数减少交互开销:
- 打开SQL*Plus连接目标库后,先设置这些参数:
SET DEFINE OFF; -- 关闭变量替换,避免脚本里的&符号触发交互 SET AUTOCOMMIT OFF; -- 关闭自动提交,减少事务日志写入开销 SET ARRAYSIZE 1000; -- 每次批量读取1000行数据 SET BATCHSIZE 1000; -- 每1000行批量提交一次 SET FEEDBACK OFF; -- 不显示每行执行的结果计数 SET ECHO OFF; -- 不打印执行的SQL语句 SET TERMOUT OFF; -- 关闭终端输出,进一步降低资源消耗 - 然后执行脚本:
这样调整后,速度会比SQL Developer快至少一倍以上。@/full/path/to/your/large_script.sql
二、外键约束的问题:不按顺序插入肯定报错,这么处理
为什么会报错?
没错,外键约束要求子表的关联字段必须在父表中存在对应记录。比如你先插订单明细表(子表),再插订单主表(父表),明细里的订单ID在主表还没数据,就会触发ORA-02291: integrity constraint violated - parent key not found错误。
解决方法
1. 禁用外键→导入→重新启用(最省心)
这是大文件导入的首选方案:
- 先生成禁用所有外键的SQL语句:
执行这个查询,把输出的SQL语句复制出来执行,就能禁用所有外键。SELECT 'ALTER TABLE ' || table_name || ' DISABLE CONSTRAINT ' || constraint_name || ';' FROM user_constraints WHERE constraint_type = 'R'; -- R代表外键约束 - 然后随便按什么顺序导入数据就行。导入完成后,再生成启用外键的语句:
执行这些语句重新启用外键。注意:启用前要确保数据没有违反外键的脏数据(比如子表有父表不存在的记录),不然启用会失败。SELECT 'ALTER TABLE ' || table_name || ' ENABLE CONSTRAINT ' || constraint_name || ';' FROM user_constraints WHERE constraint_type = 'R';
2. 按依赖顺序导入(适合小批量)
如果你想保留外键约束导入,可以先查清楚表的依赖顺序:先导入没有外键依赖的父表,再导入子表。用这个查询获取顺序:
WITH table_deps AS ( SELECT t.table_name, COUNT(c.constraint_name) AS dep_count FROM user_tables t LEFT JOIN user_constraints c ON t.table_name = c.table_name AND c.constraint_type = 'R' GROUP BY t.table_name ) SELECT table_name FROM table_deps ORDER BY dep_count ASC;
然后把SQL脚本拆分成对应顺序的批次导入,不过这个方法对2GB的大文件来说太繁琐,不推荐。
3. 用Data Pump自动处理
如果用impdp导入,它会自动识别表的依赖关系,按父表→子表的顺序导入数据,完全不需要你手动处理外键顺序,这也是我优先推荐数据泵的原因之一。
内容的提问来源于stack exchange,提问作者Win_z
相关产品推荐
相关产品推荐

