简介:面向Oracle数据库运维人员,这份压缩包提供RMAN扩展工具XTTConvert 2.0版本,用于高效处理XML表空间的备份与恢复场景,解决海量XML数据在备份迁移时的物理块处理瓶颈。包内共6个文件,以sql脚本、pl驱动、tmpl模板及properties配置文件为主,分别承担预检查、备份转换、恢复装载等环节的自动化流程,整体仅25KB,轻量易部署。已有379人学习下载。借助该工具脚本,读者可快速掌握RMAN与XTTConvert的调用方式,理解xttprep预处理、xttdriver主驱动及数据库启停脚本的配合逻辑,并参考配置模板自定义备份参数,提升Oracle数据库在XML密集型环境下的运维效率与数据安全水平。
1. 打开 rman-xttconvert_2.0.rar 之前,先弄懂它解决的迁移难题
做 Oracle 跨平台迁移的人,大概率在某个深夜下载过一个叫 rman-xttconvert_2.0.rar 的压缩包。这个包里的脚本体系解决的是 XTTS(跨平台可传输表空间)增量迁移的自动化问题:把源数据库的全量数据文件转换一次之后,后续每天只传增量,最后一次切换时在目标端把增量应用进去。它最大的价值不是省掉全量拷贝这一步,而是让"停机窗口只够传最后一次增量"成为可能。
我做过的某银行核心系统迁移项目里,源端是 AIX 上的 Oracle 11g,目标端是 Linux 上的同版本库,全量数据文件接近 2TB。如果按传统办法做物理迁移,停机窗口至少要一个周末;用了这套增量脚本方案之后,全量传输提前两周完成,每天增量只有几 GB,最终切换停机压缩到了 45 分钟。这包脚本适合三类人:正在做跨平台数据库迁移的 DBA、需要把 Oracle 库从旧平台搬到新平台的运维团队、以及想搞懂 XTTS 增量逻辑的数据库学习者。读完这篇文章,你能搞懂它怎么工作、参数怎么改、增量循环怎么嵌入日常备份,以及那些第一次跑必然踩的坑。
2. 增量 XTTS 的脚本逻辑:全量打底、增量同步、最终切换三阶段
2.1 先理解 XTTS 的增量机制,再谈脚本
XTTS 能成为 Oracle 官方推荐的跨平台迁移方式,核心在于它允许数据文件在平台间直接搬运,只要源端和目标端的字节序一致或经过转换。常见做法是先用备份集把源端表空间的数据文件转成目标端可读格式,传输过去完成"全量打底";随后源库继续对外服务,这段时间产生的变化通过增量备份记录。这套脚本做的事就是把"全量转换 + 增量备份 + 传输 + 目标端应用"串成一个可重复执行的流程。
脚本里我一般会分三阶段理解:
第一阶段是全量基线阶段。源端 rman 备份表空间,脚本把这些备份集转换成目标平台格式,传输到目标端并完成数据文件 restore。这个阶段只跑一次,耗时主要取决于数据量。
第二阶段是增量累积阶段。源端按你设定的频率(比如每小时或每天)做增量备份,脚本自动把增量备份集传输到目标端,并在目标端执行转换命令。
第三阶段是最终应用阶段。停机后,把最后一次增量备份应用进去,再处理归档日志,导入元数据,库就切换完成。
2.2 脚本目录结构里藏着的执行顺序
解压 rman-xttconvert_2.0.rar 之后,典型的目录布局是这样的:
xttconvert_2.0/ ├── xtt.properties # 核心配置文件,所有路径、表空间、平台参数都在这里 ├── xtt.driver.pm # Perl 驱动模块,负责调度底层 rman 命令 ├── xttconvert.pl # 主执行脚本,传入不同参数执行不同阶段 ├── xttdriver.pl # 底层封装,实际调用 rman 和转换逻辑 ├── xttprep.pl # 预检查脚本,校验配置和环境的完备性 └── logs/ # 运行日志输出目录先说结论:你用这个包的时候,真正要改的是 xtt.properties,真正要盯的是 logs 目录。xttconvert.pl 接收不同参数进入不同执行模式,我在项目中会严格分三步调用——先跑预检查、再做全量转换、最后做增量应用。别想着一条命令解决问题,这套脚本的健壮性建立在每一步都分开跑的基础上。
执行顺序的常见做法是:在源端和跨平台可用的中转机上分别解压一份相同配置的脚本,源端负责产生备份集和增量转换,目标端负责接收并应用。如果你只在一台机器上部署,又不理解传输方向,后面大概率会遇到"目标端找不到备份集"这类问题。
2.3 为什么这个方案能缩短停机窗口
很多人第一次接触这包脚本时有个困惑:全量都传过去了,为什么切换还要跑增量?原因在于源库在全量备份之后还在产生新数据,这些新变化必须通过增量备份的方式补到目标端去。增量备份只记录变化的数据块,体积比全量小几个数量级。体量越大的库,增量同步阶段省下的时间越明显。
脚本里增量同步的核心变量是"增量级别"和"增量频率"。比如用 rman 的 INCREMENTAL LEVEL 0 作为基线、LEVEL 1 作为日常增量,那么从 LEVEL 0 之后每次生成的 LEVEL 1 备份都包含上次以来的所有变化。脚本在目标端按顺序应用这些增量,最终使目标端数据文件与该时间点的源库一致。
我第一次跑这个流程时忽略了一个要点:增量备份要的不仅是备份集本身,还需要备份期间生成的归档日志对应关系。脚本之所以在最终应用阶段把归档日志列入流程,是因为增量备份和归档日志之间存在依赖,漏掉归档等于增量白做。
3. 把 xtt.properties 改对的实操:8 组参数决定迁移成败
3.1 参数文件必须逐行核对,不是改完就万事大吉
xtt.properties 是整个迁移的"黑匣子"开关。我见过太多项目第一轮跑挂,原因要么是参数值填错,要么是某个必须存在的目录没建。先贴一个我在生产环境用过的配置骨架,注意参数行的含义在注释里写清楚:
# 指定要迁移的表空间列表,逗号分隔,不要带引号 tablespaces=USERS,TS_APP_DATA,TS_APP_INDEX # 源端平台 ID,对应 v$transportable_platform 里的 PLATFORM_ID src_platform_id=6 # 目标端平台 ID dst_platform_id=13 # 源端数据文件所在目录 srcdir=/u01/oradata/ORCL # 目标端数据文件目录 dstdir=/u02/oradata/ORCL # rman 备份片存放的暂存目录,源端和目标端都要能访问到 backup_dir=/xtts_backup # 增量备份文件的传输方式,scp 或 rsync,我一般用 rsync 断点续传 transfer_method=rsync # 每天的增量备份保留天数,建议至少保留 3 份,防止增量序列断裂 keep_incremental_days=3这段配置的核心逻辑是让脚本知道:迁哪些对象、源端长什么样、目标端长什么样、备份文件放哪。参数不多,但每个都直接影响命令生成。比如 tablespaces 填错一个名字,rman 备份阶段就会报错;src_platform_id 和 dst_platform_id 填反,生成的备份集在目标端根本识别不了。
3.2 平台 ID 和文件目录的对应关系别凭记忆
平台 ID 是这套脚本里最容易翻车的地方。Oracle 的跨平台传输依赖每个平台有一个固定的 ID,比如 Linux x86-64 通常是 13,AIX 通常是 6,Solaris 通常是 2 或 3。这个 ID 决定了数据文件字节序是否需要转换。字节序相同的平台间传输,理论上可以跳过转换步骤,但脚本不会自己判断"反正一样就不转了",它只会按照你给的 ID 生成相应的 rman convert 命令。
我在第一次项目里就把源端 AIX(6)和目标端 Linux(13)填反了,结果是全量备份集在目标端 restore 时直接报"平台不匹配",重新生成了 2TB 的备份集才恢复。所以配置完第一步,永远是先查一遍两边平台的 ID,用这条 SQL 确认:
SELECT PLATFORM_ID, PLATFORM_NAME, ENDIAN_FORMAT FROM V$TRANSPORTABLE_PLATFORM ORDER BY PLATFORM_ID;目标端的 ENDIAN_FORMAT 和源端不一样时,脚本会自动走转换路径;一样时就跳转换。但不管你看到的结果是否一致,平台 ID 必须与源库和目标库的实际操作系统严格对应,这一点没有商量余地。
3.3 目录和权限的隐性要求:先把地基打好
xtt.properties 里写的 srcdir、dstdir、backup_dir 三个目录,表面上只是路径字符串,但实际上要满足几个硬条件:源端和目标端都能读到 backup_dir、空间足够容纳至少两轮增量备份、目录属主必须是运行 rman 和脚本的操作系统用户。我第一次跑时把 backup_dir 放在了源端一个 100GB 的挂载点上,增量跑到第三天磁盘满了,rman 直接 abort,整个增量序列断掉。
这里我的习惯是:backup_dir 用 NFS 共享或者干脆放一个两边都能访问的中转机,同时把 keep_incremental_days 设为 3。这样即使某一天的增量备份损坏,还有前一天的备份可以重传,不至于让整个迁移推倒重来。源端和目标端的 srcdir、dstdir 只需要在各自本机存在,脚本不会替你创建目录,目录不存在时 rman 会在 restore 阶段报错,现象很有迷惑性,因为它会把问题指向备份集损坏。
4. 增量循环的落地脚本:把备份、传输、应用拼成流水线
4.1 增量备份循环的标准操作流程
配置改对之后,日常增量循环是这套方案真正发挥价值的地方。我的做法是在源端写一个循环脚本,按固定时间间隔执行 xttconvert 的增量模式。间隔通常选 1 小时到 1 天,取决于业务写入量和停机窗口要求。贴一段项目里用过的循环脚本:
#!/bin/bash # 增量循环脚本,每小时执行一次,保留最近 3 份增量 # 依赖 crontab 调用,日志按天切割 export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 export ORACLE_SID=ORCL export PATH=$ORACLE_HOME/bin:$PATH XTTCONVERT=/xtts/xttconvert_2.0/xttconvert.pl LOGDIR=/xtts/logs TS=$(date +%Y%m%d_%H%M%S) # 执行增量备份与传输,目标端应用由目标机上的另一个定时任务负责 $XTTCONVERT -d /xtts/xttconvert_2.0/xtt.properties >> $LOGDIR/incremental_$TS.log 2>&1 # 删除 3 天前的增量备份文件,释放暂存空间 find /xtts_backup -name "*.bkp" -mtime +3 -delete这段脚本的逻辑是:调用 xttconvert.pl 执行增量模式,日志按时间戳保存,同时清理超过保留天数的备份文件。整个过程中源端 rman 生成增量备份集,脚本通过 transfer_method 指定的方式推送到目标端中转目录,目标端的对应脚本会在自己的调度周期里把增量应用进去。两边的调度周期可以不一致,我通常源端每小时跑一次,目标端每半小时检查一次有没有新备份到达。
4.2 目标端应用增量的时机与依赖关系
目标端不是收到备份就立刻应用,而是要等源端这一轮的增量备份完整传输到达,并且在目标端完成转换之后才能 apply。如果目标端的应用频率比源端快,它可能会说"没找到可用的增量备份",这不是错误,只是等待下一个周期。为避免误判,我在目标端脚本里加了一个判断:
#!/bin/bash # 目标端应用脚本,每 30 分钟检查一次新备份并应用 XTTCONVERT=/xtts/xttconvert_2.0/xttconvert.pl LOGDIR=/xtts/logs TS=$(date +%Y%m%d_%H%M%S) # 检查备份文件是否完整,通过文件大小和文件数判断 COUNT=$(find /xtts_backup -name "*.bkp" -newer /xtts/.last_apply 2>/dev/null | wc -l) if [ "$COUNT" -gt 0 ]; then $XTTCONVERT -d /xtts/xttconvert_2.0/xtt.properties -a >> $LOGDIR/apply_$TS.log 2>&1 touch /xtts/.last_apply fi这里的核心是 .last_apply 文件,它记录了上次应用增量备份的时间点。新增的备份文件时间戳晚于这个标记时,就执行一次应用动作。这样即使源端重启或网络抖动导致某一个批次的备份传输失败,目标端也不会反复尝试应用不完整的备份集。
4.3 增量序列连续性:宁可重跑不可跳跃
增量应用最怕的是序列断裂——源端第 5 份增量丢失,目标端拿着第 6 份增量去应用,rman 会报"增量备份集不连续"。这个问题的根源往往是源端清理脚本写得太激进,把还没传到目标端的备份给删了。我的方案是把清理动作放到目标端,源端只产生备份,不负责删除。
具体参数是 keep_incremental_days 要结合传输耗时设置。假设每天 5GB 增量,网络传输需要 2 小时,那么至少保留 2 天的备份才能确保万一传输失败了还有重传的余地。把清理工作放到目标端执行,源端的暂存空间压力会小很多,也更安全。
另外每次增量应用完成后,我会在目标端执行一次表空间数据文件的完整性检查:
# 检查数据文件头信息,确认所有文件时间戳一致 sqlplus / as sysdba <<EOF SELECT file_id, name, status FROM dba_data_files WHERE tablespace_name IN ('USERS','TS_APP_DATA','TS_APP_INDEX'); EOF这个检查的意义在于确认所有表空间的数据文件都已经被增量更新,不会存在某个文件停留在一个更早的版本。切换时如果发现文件时间戳不一致,说明增量应用没跑全,这时候直接切会产生数据不一致。
5. 迁移现场避坑记录:五条必须知道的实战教训
5.1 平台 ID 填反导致全量白传
现象:全量备份集传到目标端,restore 时报 ORA-19611,提示平台不匹配。
原因:xtt.properties 中 src_platform_id 和 dst_platform_id 填反,脚本生成的 convert 命令方向反了。
解决:不要只依赖记忆填平台 ID。在源库和目标库分别执行 v$transportable_platform 查询,再将结果与配置文件逐字核对。已经生成的备份集不需要全部重来,可以重新用正确的平台参数生成新的全量备份,但时间成本很高,最好在配置阶段就避免。
5.2 时区不一致导致归档日志应用错位
现象:目标端应用增量时报 ORA-26653,增量中的 SCN 无法匹配当前日志。
原因:源端和目标端操作系统时区不一致,rman 备份集的时间戳和归档日志的时间戳对不上。
解决:在迁移准备阶段,强制把源端和目标端的系统时区设为一致。常见做法是两边都用 UTC 作为业务时间以外的统一标准,并且确认 Oracle 的 SYSTIMESTAMP 偏差在几分钟内。增量循环里的每次日志切割、每次应用,都依赖时间戳排序,时区错位会让这个顺序乱掉。
5.3 备份目录空间不足导致增量序列中断
现象:源端 rman 在生成增量备份时,报错"unable to allocate new file, no space left"。
原因:backup_dir 空间不够,脚本的清理动作没有及时执行。
解决:前面提到的"源端只生成、目标端负责清理"策略,能从根本上解决这个问题。另外把 backup_dir 改成 NFS 挂载的时候要特别注意,NFS 服务端空间满了之后表现可能是 IO 卡死而不是直接报错,排查难度更大。我给 backup_dir 设计的容量底线是至少存下三轮增量,四轮更稳。
5.4 目标端应用增量时锁定文件导致 apply 卡住
现象:xttconvert.pl 执行到 apply 阶段长时间无响应,日志停在"Waiting for file lock"。
原因:目标端可能有其他进程在访问这个数据文件——最常见的是误开了目标库实例,或者监控脚本在读取 dba_data_files 时把文件句柄占住了。
解决:在增量应用的时间窗口内,目标端实例应该是 nomount 或 mount 状态,绝对不允许 open。任何外部程序都不要直接读取这些数据文件。我在项目里会固定一个维护窗口,应用增量期间只保留必要的监控连接。
5.5 表空间名大小写不一致导致迁移失败
现象:预检查阶段报错"tablespace not found"。
原因:xtt.properties 里写的表空间名用了小写,但实际库里的表空间是创建时的大写形式,导致脚本在查询 dba_tablespaces 时匹配不到。
解决:配置文件里表空间名与数据字典保持严格一致。先在源端执行一次查询,从 dba_tablespaces 中把表空间名复制出来,粘贴到配置里,不要手敲。这个教训看起来很基础,但我在两个项目里都因为偷懒手敲表空间名踩过坑。
6. 切换前的验证习惯:一致性检查与快速回退技巧
增量循环跑了一段时间之后,切换前不能急着关源库。我的习惯是先在目标端做一次数据文件的状态检查,再用 dbms_tdb.check_external 做外部依赖检查。前者确保所有表空间的数据文件状态正常,后者确保目标端能识别源库的所有东西——比如目录对象、外部表、BFILE 等。很多项目栽在"数据文件都传完了,元数据导不进去"这种坑上。
-- 目标端执行,确认所有迁移表空间的数据文件处于 ONLINE 状态 SET LINESIZE 200 COLUMN TABLESPACE_NAME FORMAT A20 COLUMN STATUS FORMAT A10 SELECT TABLESPACE_NAME, STATUS FROM DBA_TABLESPACES WHERE TABLESPACE_NAME IN ('USERS','TS_APP_DATA','TS_APP_INDEX');做完状态检查后,最关键的一步是保留一份切换前的源端最后一次增量备份文件,不要着急清理。切换过程中如果目标端应用增量出现异常,这份备份是唯一的后悔药。具体做法是把备份文件从 backup_dir 复制到一个单独的归档目录,用日期命名。等到目标端库成功打开、业务验证完成之后,再删除这份备份。
还有一个我养成的习惯是:切换当天手工跑一次全量备份并保存,而不依赖脚本的定时清理逻辑。这就等于给整个迁移按了一次"保险快门",万一切换后的目标库出了问题,还能退回到源库继续服务。切换完成后,观察目标库的告警日志和监听状态,确认业务连接正常,再通知应用团队做数据校验。增量循环里的血泪经验总结下来就一句话:宁可备份多留几天,不要等到需要回退时才发现备份已被清理。这套方案值不值得投入,关键看你的数据库迁移频率和停机窗口要求;如果你也在做跨平台库迁移,增量 XTTS 这套逻辑值得反复用,跑通一次之后后面的项目就都是照方抓药了,希望帮到你。
本文还有配套的精品资源,点击获取