ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Oracle导入导出实战:exp/imp与expdp/impdp的选型、排错与自动化

Oracle导入导出实战:exp/imp与expdp/impdp的选型、排错与自动化 1. 两种工具体系的分工exp/imp与expdp/impdp别再傻傻分不清凡是干过几年Oracle的人基本都被问过同一个问题导入导出到底用哪个命令每次我都得从头解释一遍你问的是传统exp/imp还是数据泵expdp/impdp这两套东西虽然都叫导入导出但背后的设计逻辑完全不同用错了轻则效率低重则数据导不出来。先说传统exp/imp。它从上世纪90年代就在Oracle里服役了架构非常朴素exp客户端连上数据库把查询结果写成二进制文件imp再把文件读回去。它的好处是轻几乎所有的Oracle环境都能跑不需要额外配置目录对象直接指定文件路径就行。而且它对老版本数据库的兼容性特别好跨大版本导入时往往还得靠它兜底。缺点是性能真心一般导出大表时那个速度能让急性子抓狂而且exp生成的dmp文件是客户端本地文件和服务器文件系统完全隔离在RAC环境或远程导出场景下经常搞得人很被动。数据泵expdp/impdp则是Oracle 10g开始引入的重型工具它的所有操作都在数据库内部完成导出时服务器端把数据读出来写成dmp文件导入时也是服务器端自己读文件写数据。这意味着你必须先在数据库里创建directory对象把所有文件操作限定在服务器文件系统内。听起来好像更麻烦但换来的是压倒性的性能优势——数据泵支持并行、支持压缩、支持加密还能在导入时直接做网络模式传输跨库同步数据不需要先落盘。凡是正经做过TB级数据迁移的人只用过一次数据泵就不会再想碰传统exp/imp了。我个人的习惯是日常小表备份、跨低版本数据库应急恢复、或者对方环境啥都没配置只能给个exp命令时用传统exp/imp但凡涉及正式的数据迁移、生产环境备份恢复演练、大批量表数据搬运一律上expdp/impdp。搞清楚这个分工后面所有命令才不容易混乱。2. exp/imp老工具的高频用法与常见报错处理2.1 三个层级导出命令表级、用户级、全库级传统exp命令的参数结构很简单核心就是通过tables、owner、full三个参数来区分导出范围。我按日常使用频率给你列全# 表级导出导出一张或多张指定的表 exp 用户名/密码orcl file/backup/tab.dmp tablesemp,dept log/backup/tab.log buffer102400 # 用户级导出导出该用户下所有对象 exp 用户名/密码orcl file/backup/user.dmp owner用户名 log/backup/user.log buffer102400 # 全库导出需要足够权限通常要dba角色 exp 用户名/密码orcl file/backup/full.dmp fully log/backup/full.log buffer102400每次写exp命令我都要强调一个最容易被忽略的参数buffer。这是个非常老派的调优手段它决定了exp在读取数据时使用的缓冲区大小。默认值在部分环境下只有10240字节导出大表时会被折磨得痛不欲生。我做过一个测试导出同一张200GB的订单表buffer设为102400比默认值快了将近40%。原理并不复杂exp是典型的按块读取逻辑缓冲区越大单次能刷回文件的数据量越大磁盘IO的往返次数自然就少了。另一个值得提的是log参数很多人图省事不写结果导出到一半报错了屏幕上刷过去的错误信息早翻没影了你想排查都无从下手。我的规矩是凡是导出导入操作必带log参数到独立目录哪怕最后一切顺利留个日志也能作为事后审计的依据。2.2 imp导入时的关键参数经验导入命令imp的格式类似但有几个参数特别考验经验# 普通导入用导出文件的元数据重建对象和数据 imp 用户名/密码orcl file/backup/user.dmp fully ignorey log/backup/imp.log # 只导入数据不碰结构 imp 用户名/密码orcl file/backup/user.dmp fully ignorey rowsy indexesn constraintsn # 指定表空间迁移旧库新库表空间名不同时很管用 imp 用户名/密码orcl file/backup/user.dmp fully ignorey tablespacesUSERS log/backup/imp.logignorey这个参数长期存在争议我讲点实际经验。它的作用是让imp在遇到对象已存在时不报错跳过继续执行后续操作。很多新手一听忽略错误就慌觉得会让导入变脏。实际上在真实项目里目标库往往不会完全干净——表可能预先建过、触发器可能已经存在、同义词可能重复。我处理过的大多数导入任务都会加ignorey但前提是你已经对冲突对象做了评估。如果目标库是全新环境理论上不加ignorey更干净但任何一个小对象冲突都会中断整个导入你还得一遍遍排错效率极低。两相权衡我建议正式操作时加上导入完成后统一检查日志里的警告信息。rowsy表示导入表数据indexesn表示跳过索引创建这在数据校验阶段特别有用——先灌数据、验证逻辑、最后再统一建索引能省下大量时间。同理constraintsn跳过约束的话导数据阶段不会因为外键顺序or唯一键冲突而中断但导入结束后一定要记得单独跑一遍约束脚本别把完整性规则给丢了。2.3 老工具最容易踩的坑字符集乱码和版本冲突传统exp/imp最大的坑在字符集。Oracle的dmp文件头里记录了导出时数据库的字符集编码导入时如果目标库字符集不一致最典型的症状是中文全部变成靠字或者问号。我自己真有这种血泪史有一回帮一家制造业客户从AIX上的ZHS16GBK库导数据到Linux上的AL32UTF8库没提前做字符集检查导入完客户打开报表一看一堆锟斤拷当场脸都绿了。处理思路是这样的导入前先查两边的字符集SELECT * FROM nls_database_parameters WHERE parameter NLS_CHARACTERSET;如果确实不一致优先考虑改目标库的字符集很多场景下目标库是新建的改起来没有负担或者导数据后用iconv等工具做转码。但说实话字符集转换这事在dmp文件层面做手脚很危险我最推荐的做法还是让导出端和导入端字符集尽量保持一致实在不行就在业务层面接受转码成本别在命令行上硬赌。版本冲突则是另一个高频坑。Oracle 11g的exp导出的dmp文件拿到9i环境里去imp常常直接报EXP-00008: Oracle error encountered之类的错误。高版本导出的文件低版本根本读不了。反过来低版本导出高版本导入倒是大多数情况下可以但遇到特殊数据类型也可能半路中断。所以接跨版本任务时先问清楚两边的数据库版本号再决定要不要用更高版本的exp命令加上兼容参数。一般的经验法则是保留一套老版本的exp工具11g之前用于客户端导出低版本库文件比什么花活都可靠。3. expdp/impdp数据泵完整实操从创建目录到并行调度3.1 目录对象这东西为什么必须存在数据泵和传统exp最大的使用差异就是第一步你必须在数据库里先创建一个directory对象。这个对象本质上是数据库授权给Oracle进程访问服务器文件系统上某个物理目录的凭证。Oracle进程属于操作系统用户oracle它能不能往某个路径写文件既看Linux权限也要看数据库目录对象的指向。-- 创建物理目录操作系统层面 mkdir -p /u01/dpdir -- 授权给oracle用户 chown oracle:oinstall /u01/dpdir -- 登录数据库创建directory对象 sqlplus / as sysdba CREATE OR REPLACE DIRECTORY dpdir AS /u01/dpdir; GRANT READ, WRITE ON DIRECTORY dpdir TO scott;这里有个多年以来特别容易绊倒新人的点路径得是服务器上的绝对路径不是客户端机器的路径。数据泵的一切操作都在数据库服务器上执行你哪怕用本地SQL Developer连接远程数据库file参数指向的目录也必须是远程服务器上存在的目录。我第一次用expdp时就在这上面栽过跟头本地建了个文件夹传参过去一直报ORA-39002: invalid operation后来才反应过来服务器上根本没这个路径。另外操作系统目录的属主和权限也要对齐。你要是随手用root建了个目录oracle用户写不进去照样报ORA-39070: Cannot open the log file之类的毛病。我现在的标准流程是先以root建目录、chown给oracle再进数据库创建directory对象并授权顺序一步不乱问题率大幅度下降。3.2 数据泵常用参数速查与并行调度实例expdp/impdp的参数远比传统exp丰富挑几个日常必用的说。# 并行导出按表维度拆分 expdp scott/tigerorcl directorydpdir dumpfileexpdp_%U.dmp parallel4 logfileexpdp.log schemasscott # 带压缩的导出适合较空闲的业务窗口 expdp scott/tigerorcl directorydpdir dumpfilecomp.dmp compressionALL logfilecomp.log schemasscott # 按查询条件导出部分数据 expdp scott/tigerorcl directorydpdir dumpfilepart.dmp tablesorders queryWHERE order_date DATE 2024-01-01 logfilepart.log # 完整导出并行多文件大表场景推荐 expdp system/***orcl directorydpdir dumpfilefull_%U.dmp parallel8 logfilefull_exp.log fully并行参数是数据泵的成名绝技。parallel的值通常建议不要超过CPU核数也不要超过物理盘能承受的并发写入能力。我做过的一个真实调优环境是32核机器数据盘是SSD阵列导出1.5TB数据parallel从1调高到8耗时从2小时47分钟压到28分钟这改善幅度你用传统exp是做梦都想不到的。但是注意并行不是越大越好曾有一次我把parallel拉到16最后发现日志文件成了并发瓶颈IO等待全线飘红耗时反而比8还慢。所以合适的做法是先小步试探从4开始观察数据库的系统负载和数据泵的IO等待再逐步往上加。dumpfile参数支持%U通配符配合parallel用会生成多个分片文件形如expdp_01.dmp、expdp_02.dmp。导入时必须把这些文件都放到同一个目录并且使用同样的通配符模式impdp scott/tigerorcl directorydpdir dumpfileexpdp_%U.dmp parallel4 logfileimp.log schemasscott还有一个容易被忽略的reuse_dumpfiles参数。默认情况下如果目录里已经存在同名的dmp文件expdp会直接报错退出防止覆盖误伤。我在自动化备份脚本里会特意加上reuse_dumpfilesy否则每天定时任务第二天必然失败得手动清文件很烦。3.3 数据泵导入的过滤、重映射与网络模式impdp最有价值的几个功能传统imp完全没有table_exists_action、remap_schema、remap_tablespace、network_link。table_exists_action解决的是目标库已经有一批同名表时怎么办的问题。可选值有skip、append、truncate、replace四种。我归纳下使用心得skip跳过已有表适合增量导入历史数据但不想碰已有结构的情况append如果表和源结构一致直接把数据追加进去适合每天或每周的增量同步truncate先清空目标表数据再导入适合全量刷新但结构不想重建的场景replace删掉老表重建来源表结构变化大时用这个最干净。最怕的是有人不加这个参数直接跑impdp然后碰上目标库表已存在默认行为是报错中断整个导入失败。所以在这个参数上丢过坑的人远不止我一个。remap_schema和remap_tablespace是跨环境迁移的神器。比如从开发库schema名dev_user导入到测试库schema名test_user表空间也要换impdp system/***orcl directorydpdir dumpfiledev_user.dmp \ remap_schemadev_user:test_user \ remap_tablespacedev_data:test_data \ logfileimp_remap.log不重映射的话你会发现在测试库上建了一堆属于dev_user的表表空间还是dev_data权限乱得没法收拾。这个参数的逻辑就是源对象名:目标对象名的映射对多个schema可以连续写。network_link则是更进阶的玩法不生成dmp文件直接从源库拉数据到目标库-- 在目标库创建指向源库的dblink CREATE DATABASE LINK SRC_LINK CONNECT TO scott IDENTIFIED BY tiger USING 10.10.1.5:1521/ORCLPDB; -- 网络模式导入 impdp scott/tigerorcl directorydpdir network_linkSRC_LINK \ schemasscott remap_schemascott:scott_new logfilenet_imp.log适合数据量中等几十GB内且源库、目标库网络带宽足够的场景省去了导出—传输—导入中间那一大段搬运时间也省了磁盘空间。当年ERP系统逐步上云的割接流程我基本都是用这个模式做的数据同步。4. 跨版本与字符集问题的处理细节4.1 高版本导低版本怎么处理版本冲突数据泵的dmp文件跨版本兼容性比传统exp强不少但不是完全没有限制。一个经验值expdp导出的文件往低两个大版本以内的库导入大多没问题超过两个大版本就要用version参数显式指定目标版本。# 源库19c目标库11g导出时指定版本 expdp scott/tigerorcl directorydpdir dumpfileto_11g.dmp schemasscott version11.2.0.2 logfileexp_11g.logversion参数的值理论上是任意Oracle版本号但实际使用中最好紧跟目标库的小版本号走别用裸版本号糊弄。比如目标库是11.2.0.4就写version11.2.0.4少了末尾小版本在某些兼容性敏感对象上也会出幺蛾子。反过来低版本库导入高版本dmp文件基本不用处理直接impdp。唯一要小心的是部分高级数据类型比如XMLType的特定存储格式低版本库可能压根没这类型导入就直接报错那种情况只能找替代方案或者手动改造表结构没什么命令行的旁门左道。4.2 字符集差异排查实战不要上来就导我处理字符集问题的固定套路是三查两断三查指查导出库字符集、导入库字符集、dmp文件头写的字符集两断指判断是否需要转码、判断是结构性字符集差异还是纯数据编码差异。查dmp文件头有个小技巧用cat加管道直接看文件的前几行字节cat /u01/dpdir/expdp.dmp | od -c | head -5输出里能看到字符集ID的十六进制编码对照V$NLS_VALID_VALUES表里的值就能确定。比如AL32UTF8的字符集ID是873ZHS16GBK是852。这招在排查外部团队发来的dmp文件时很有用省得反复问两边管理员查库。如果两边字符集确实不兼容我的建议是先在导出的查询条件层面做数据预处理比如varchar2字段里无法转换的特殊字符提前用regexp_replace清洗掉这种方案比盲目在导入端设置NLS_LANG环境变量更可控。NLS_LANG那个变量不是万能钥匙设置不当反而会让日期格式、货币符号等全部混乱不如直接在数据层面处理干净。4.3 分区表导入导出的效率优化分区表的数据泵操作比普通表多几个讲究。首先是并行度分区天然适合并行expdp的parallel参数会尽量去分摊到不同分区的读取。这个特性意味着分区表的导出速度往往比同等数据量的普通表快很多。我处理过一个400GB的按月分区流水表parallel8全量导出不到40分钟要是普通表估计得奔着2小时去了。导入分区表时如果目标库里表还未创建impdp会自动根据dmp里的定义把分区一起建出来如果表已经存在且结构不一致就得考虑用table_exists_actiontruncate或者replace了。另外对于分区表导入我特别建议先只导入结构contentmetadata_only确认分区的分布符合预期后再导入数据避免表在但分区边界不对这种脏状态。5. 实战链路一次真实的高频故障排查记录5.1 问题开场登录缓慢和监听状态异常这个项目是客户要迁移一套旧的11g库到19c数据量不大但整个操作过程中客户反复提到sqlplus登录特别慢卡好几秒才出提示符。我们一开始以为是命令问题后来发现连跑impdp都受到影响——登录时延高导致作业频繁超时。顺着这个线索最后定位在监听服务上。排查监听状态的手段其实很基础但特别管用# 查看监听运行状态 lsnrctl status # 查看监听日志中最近的错误 tail -200 $ORACLE_HOME/network/log/listener.log监听服务本身是启动的但日志里大量WARNING: Subscription for node down event still pending这类告警这是老版本监听在RAC或主机名解析异常时的典型症状。原因多半是主机名解析配置出了问题——/etc/hosts里的主机名和$ORACLE_HOME/network/admin/listener.ora里的配置对不上或者DNS超时导致主机名反向解析极慢。我们当时的处理方式是在listener.ora里显式指定静态监听地址把主机名改成固定的IP再在/etc/hosts里补全主机名映射避免依赖DNS解析。修改完成重载监听lsnrctl reload重启后登录速度立刻恢复到毫秒级。这个坑值得所有做数据泵迁移的人注意登录慢的隐患会直接传导到impdp作业导致连接超时、日志中断、任务失败你在命令上折腾半天都解决不了根子却在网络解析层。5.2 impdp导入卡死背后的锁和undo数据泵导入过程中另一个高频故障是卡住不动日志停在某个百分比一看会话状态是WAITING。有一次客户导入一张大表百分比停在17%三个小时不动Active Session历史里显示大量enq: TX - row lock contention等待事件。根因是目标表在某些行上存在未提交事务或者有应用会话长期持有锁。impdp往里插数据时遇到这些锁定的块就得一直等待。排查手段就是查锁SELECT s.sid, s.serial#, s.username, s.status, l.type, l.id1, l.id2 FROM v$lock l, v$session s WHERE l.sid s.sid AND l.type IN (TM,TX) AND s.username IS NOT NULL;定位到持有锁的会话后确认是不是业务应用残留的僵尸会话是就可以直接清掉ALTER SYSTEM KILL SESSION sid,serial# IMMEDIATE;清理完再继续impdp进度条立马往前走。另外还有一个被低估的原因undo表空间不足。因为impdp是大批量DML操作产生的undo量非常大如果undo表空间配置偏小导入就会反复扩展表空间甚至报ORA-30036。所以在导入大表前先检查数据库的undo表空间可用性必要时提前扩容比等到卡死再救火要省事得多。5.3 导入完成后如何验证数据完整性导入结束不等于任务完成验证环节经常被新手跳过去但老手一定不会省。我的验证清单大致是这三条第一对比源库和目标库的对象数量-- 源库 SELECT owner, object_type, COUNT(*) FROM dba_objects WHERE ownerSCOTT GROUP BY owner, object_type ORDER BY object_type; -- 目标库执行同样的查询两边结果对齐第二抽几张关键大表比对行数SELECT COUNT(*) FROM scott.orders; -- 两边分别执行数字一致才算过关第三跑一遍数据泵自带的验证工具impdp的sqlfile参数可以只生成SQL脚本而不真正执行用这个把元数据脚本拉出来人工检查一遍重点看有没有遗漏的约束、触发器和索引。6. 导出导入后最常被追问的周边操作6.1 Oracle分页查询的推荐写法导入完数据业务方第一件事往往是写分页查询。Oracle没有MySQL那个limit必须借ROWNUM或ROW_NUMBER()实现标准分页。我的写法偏好是SELECT * FROM ( SELECT t.*, ROW_NUMBER() OVER (ORDER BY t.id) rn FROM orders t ) WHERE rn BETWEEN 1 AND 20;这条SQL在小数据量下性能没问题。但一旦表到了百万级这个分页写法在深页时表现很拉胯——因为子查询会全表算一遍行号再截取。更快的办法是结合索引先定位最大最小值再做条件过滤这个写法优化空间很大具体怎么改取决于表的排序字段和索引分布。总之导入完大量数据后别忘了给分页常用的排序字段建好索引否则随便一个后台列表查询都能把数据库打满。6.2 过滤不可转为数字的字符串这也是热搜里频繁出现的需求存量表里有个varchar2字段想转成数字类型但里面有历史脏数据塞了字母、中文、特殊符号直接的TO_NUMBER一执行就抛ORA-01722。处理这类问题用正则表达式先做数据清洗是标准做法-- 找出所有含非数字字符的行 SELECT * FROM records WHERE REGEXP_LIKE(amount, [^0-9.]); -- 清洗后更新进新列 UPDATE records SET amount_clean CASE WHEN REGEXP_LIKE(amount, ^[0-9](\.[0-9])?$) THEN TO_NUMBER(amount) ELSE NULL END;这种正则验证后转换的手法可以放心用在大批量历史数据治理上。唯一要注意的是别指望直接对列类型做ALTER TABLE MODIFYOracle对已有数据做类型转换的约束非常死板老老实实加新列、转换完、再改列类型才是安全的路径。6.3 存储过程在导入后的编译检查导入后存储过程、函数和包经常会出现状态为INVALID的情况这不是导入失败而是依赖对象创建顺序导致的暂时性失效。正常的处理流程是手动编译验证-- 查看无效对象 SELECT owner, object_name, object_type FROM dba_objects WHERE statusINVALID AND ownerSCOTT; -- 批量编译可以用utl_recomp包自动完成 BEGIN UTL_RECOMP.RECOMP(SCOTT); END;这里分享一个项目里总结的小经验批量重编译时用utl_recomp比手动逐个ALTER ... COMPILE要可靠得多尤其当存储过程之间存在相互依赖时UTL_RECOMP会按照依赖顺序自动处理。做完重编译后再查一次dba_objects确保只剩真正有bug的对象才去人工排错。6.4 导出的dmp数据如何与第三方数据库做衔接热搜里还出现了达梦、SQLite、MySQL等关键词很多场景是客户要求把Oracle数据导出来再送去别的数据库环境。坦率说直接用dmp文件做跨数据库导入是不现实的Oracle的dmp只认Oracle自己。更通用的路径是把数据泵导出的内容转为中间格式比如用sqlfile参数生成纯SQL脚本或者在导出时通过外部表CTAS的方式把数据落地成CSV-- 用外部表方式导出CSV CREATE OR REPLACE DIRECTORY ext_dir AS /u01/extdir; CREATE TABLE ext_orders ( id NUMBER, order_date DATE, amount NUMBER ) ORGANIZATION EXTERNAL ( TYPE ORACLE_LOADER DEFAULT DIRECTORY ext_dir ACCESS PARAMETERS ( RECORDS DELIMITED BY NEWLINE FIELDS TERMINATED BY , MISSING FIELD VALUES ARE NULL ) LOCATION (orders_ext.csv) ) AS SELECT * FROM orders;这个思路在做异构数据迁移时很常用既绕开了字符集纠纷也让第三方数据库团队拿到的就是干净的可解析格式。我在好几个数据交换项目里用这套方案解决了Oracle导出、异构分析平台消费的衔接问题。7. 数据泵作业在自动化脚本里的调度技巧最后聊一个多库环境下几乎天天面对的实操问题怎么把expdp/impdp塞进计划任务里稳定跑起来而不是每次都手动登录执行。我有个现成的备份脚本模板结构很简单但任何一个细节没处理好就会翻车#!/bin/bash export ORACLE_HOME/u01/app/oracle/product/19c/dbhome_1 export ORACLE_SIDORCL export PATH$ORACLE_HOME/bin:$PATH export NLS_LANGAMERICAN_AMERICA.AL32UTF8 DATE$(date %Y%m%d_%H%M%S) LOG_DIR/home/oracle/backup_logs mkdir -p $LOG_DIR expdp system/passwdorcl \ directorydumpdir \ dumpfileweekly_%U.dmp \ logfileweekly_${DATE}.log \ parallel4 \ schemasscott \ reuse_dumpfilesy # 检查日志中是否有错误关键字 if grep -iE ORA-|EXP-|IMP- $LOG_DIR/weekly_${DATE}.log; then echo [$(date)] Backup failed, check log. $LOG_DIR/job_monitor.log exit 1 else echo [$(date)] Backup completed. $LOG_DIR/job_monitor.log fi这里几个要点都是多年实战摔出来的经验。NLS_LANG必须显式指定不写的话字符集环境变量随系统默认走导出的大型中文数据在别的机器导入时极易乱码。reuse_dumpfilesy放在自动化任务里尤其关键否则前一天没及时清理的dmp文件会让第二天的任务直接失败。最后的日志关键字检查也尽量别省Cron只按exit code判断成功与否而Oracle命令往往看起来执行完但日志里已经埋了ORA-直接在脚本层抓关键字比事后翻日志高效很多。导入方向的自动化同理除了参数差异外额外建议在脚本里加一个预检查环节先检查目标库的undo表空间剩余量、表空间可用空间、连接数上限再把预检查结果写入日志。这样导入任务即使凌晨失败你也有一份完整的现场证据而不是早上起来面对一个半死不活的导入进程空想原因。调度周期方面我的实践经验是小表几个GB的日常备份放在凌晨业务低峰跑没问题大表几百GB或全库导出尽量选择周末或停机窗口并且并行度别给太狠给主机留出常规业务负载的空间。曾有一个客户贪快把parallel拉满结果备份窗口正好撞上批处理作业数据库资源被挤爆最后连备份进程都被挂起教训够深刻。8. 我的一些土办法和个人习惯写到这里其实导入导出命令本身没有那么多的玄学更多是熟练度和预案能力的比拼。我把自己多年养成的几个土习惯分享在最后指望对新人有帮助。第一所有导入导出任务必须带log参数并保留至少30天。哪怕任务没有报错你后来排查数据差异时也常常要回头翻日志。我经历过不止一次当时明明成功了为什么三个月后数据对不上的情况一查日志才发现当初有个不起眼的warning被忽略了。第二dmp文件的命名里必须带日期和时间戳。weekly_20240915_023000.dmp这种格式一眼就能看出是哪次备份处理循环覆盖时也不会搞混。千万别用backup.dmp这种固定名时间一长你根本不知道这是哪个年代的数据。第三导入到目标库前先做一次dry-run似的元数据导入试试水。所谓试水就是把impdp的sqlfile参数用起来只生成目标库的SQL脚本不真导入。用这个脚本检查有没有语法不支持、表空间名错误、序列号冲突等隐患成本极低但价值极高能避免很多中途翻车的尴尬。第四也是最重要的一条别在生产环境上盲目挑战新参数。每次接触一个不熟悉的参数先在测试库跑一遍。数据泵虽然功能强大但它的一些组合参数比如compression加上加密选项、network_link加并行在不同版本下的表现差异很大。我吃过一次亏——11g上用了compressionALL再配合parallel8导出过程中频繁报回滚段不足后来拆开参数分别试才定位到是并行写入对undo的冲击。所以版本特性测试永远是生产操作的前置条件。这篇文字的含金量与你踩坑的数量成正比。Oracle导入导出的命令语法上翻官方文档五分钟就能学会但怎么选型、怎么排错、怎么在自动化任务里稳定运行靠的是对数据库底层机制的理解和一次次实战积累下来的直觉。希望我这些经验能帮你少走几步弯路尤其那些被日志埋起来的暗坑真的要亲历一遍才知道有多坑。
返回列表