工作中都是用oracle官方封装的工具(rman_xttconvert)做迁移,其实也是可以用手工做跨平台迁移。针对复杂场景,可以用手工方式定制化做迁移。
一、全量传输表空间
如果数据库在1T以内,停机时间运行,可以直接一次性使用RMAN备份,将数据文件传输到目标平台主机。需要将迁移的表空间置为只读。
--确认组件是否一致
SET lines 90 NUMWIDTH 12 PAGES 10000 LONG 2000000000
ALTER SESSION SET nls_date_format='YYYY-MM-DD HH24:MI:SS';
COL version FORMAT a12
COL comp_id FORMAT a8
COL schema LIKE version
COL comp_name FORMAT a35
COL status FORMAT a12
SELECT comp_id,schema,status,version,comp_name
FROM dba_registry
ORDER BY 1;
复制
--确定平台ID
col PLATFORM_NAME for a30
col ENDIAN_FORMAT for a30
SELECT D.PLATFORM_NAME, ENDIAN_FORMAT,d.platform_id
FROM V$TRANSPORTABLE_PLATFORM TP, V$DATABASE D
WHERE TP.PLATFORM_NAME = D.PLATFORM_NAME;
复制
--生产库确认是否有用户表在系统表空间
User-Owned Tables Residing in the SYSTEM or SYSAUX Tablespaces
select owner, segment_name, segment_type
from dba_segments
where tablespace_name in ('SYSTEM', 'SYSAUX')
and owner not in
(select name
from system.logstdby$skip_support
where action=0)
;
复制
--原库表空间自包含检查
declare
checklist varchar2(4000);
i number := 0;
begin
for ts in
(select tablespace_name
from dba_tablespaces
where tablespace_name not in ('SYSTEM','SYSAUX','AUDITTBS') and contents = 'PERMANENT')
loop
if (i=0) then
checklist := ts.tablespace_name;
else
checklist := checklist||','||ts.tablespace_name;
end if;
i := 1;
end loop;
dbms_tts.transport_set_check(checklist,TRUE,TRUE);
end;
/
select * from transport_set_violations;
复制
--源库设置表空间只读
alter tablespace TESTXTT read only;
alter tablespace TESTXTTIDX read only;
复制
--源库转换表空间为目标平台字节序
CONVERT TABLESPACE TESTXTT,TESTXTTIDX
TO PLATFORM 'Linux x86 64-bit'
FORMAT='/xttsoft/backupdir/%N_%f.dbf' parallelism 3;
复制
--目标库将备份出来的数据文件放入目标空的对应目录
mv /xttsoft/backupdir/TESTXTT* $ORACLE_BASE/oradata/tdb/
复制
目标库导入元数据
impdp userid=\"sys/Passw0rd as sysdba\" directory=exp_dir logfile=tts_imp.log \ network_link=from_old transport_full_check=no \ transport_tablespaces=TESTXTT,TESTXTTIDX \ transport_datafiles='/oracle/app/oracle/oradata/testdb/TESTXTT_5.dbf','/oracle/app/oracle/oradata/testdb/TESTXTTIDX_6.dbf'
复制
二、增量跨平台传输表空间
适用数据库比较大,停机时间短,只需要在最后一次增量的时候停机。
--源库开启块跟踪,并确增大增量备份记录次数。必须设置,否则增量时间和全量时间一样长。
select * From v$block_change_tracking;
alter system set "_bct_bitmaps_per_file"=100;
alter database enable block change tracking using file '/arch/change_tracking.f'
select * from v$block_change_tracking;
alter system set large_pool_size=2G;
复制
--生成全量备份和全量恢复的语句,源端执行
select RMAN_SCRIPT
From (select '1' step,
tablespace_name,
file_id,
'backup as copy tag ''prepare'' datafile ' || FILE_ID ||
' format ''/xttsoft/backupdir/' || TABLESPACE_NAME || '_' ||
file_id || '.enmo''; #scn:' ||
dbms_flashback.get_system_change_number rman_script
from dba_data_files
where tablespace_name in ('TESTXTT', 'TESTXTTIDX')
union all
select '2' step,
tablespace_name,
file_id,
'convert from platform ''Linux x86 64-bit'' datafile ''/xttsoft/backupdir/' ||
tablespace_name || '_' || file_id ||
'.enmo'' format ''/oracle/app/oracle/oradata/testdb/' ||
TABLESPACE_NAME || '_' || file_id || '''; #scn:' ||
dbms_flashback.get_system_change_number rman_script
from dba_data_files
where tablespace_name in ('TESTXTT', 'TESTXTTIDX'))
order by step;
复制
--脚本生成的备份,源端执行
backup as copy tag 'prepare' datafile 5 format '/xttsoft/backupdir/TESTXTT_5.enmo'; #scn:1173499
backup as copy tag 'prepare' datafile 6 format '/xttsoft/backupdir/TESTXTTIDX_6.enmo'; #scn:1173499
复制
--脚本生成的转换,目标端执行
convert from platform 'Linux x86 64-bit' datafile '/xttsoft/backupdir/TESTXTT_5.enmo' format '/oracle/app/oracle/oradata/testdb/TESTXTT_5'; #scn:1173499
convert from platform 'Linux x86 64-bit' datafile '/xttsoft/backupdir/TESTXTTIDX_6.enmo' format '/oracle/app/oracle/oradata/testdb/TESTXTTIDX_6'; #scn:1173499
复制
--第一次全备
backup as copy tag 'prepare' datafile 5 format '/xttsoft/backupdir/TESTXTT_5.enmo'; #scn:1173499
backup as copy tag 'prepare' datafile 6 format '/xttsoft/backupdir/TESTXTTIDX_6.enmo'; #scn:1173499
复制
--第一次全量恢复
convert from platform 'Linux x86 64-bit' datafile '/xttsoft/backupdir/TESTXTT_5.enmo' format '/oracle/app/oracle/oradata/testdb/TESTXTT_5'; #scn:1173499
convert from platform 'Linux x86 64-bit' datafile '/xttsoft/backupdir/TESTXTTIDX_6.enmo' format '/oracle/app/oracle/oradata/testdb/TESTXTTIDX_6'; #scn:1173499
复制
--增量合成存储过程,在目标端创建,后续增量合成会使用到
create or replace procedure rollforward(p_datafile_name varchar2,p_incr_file_name varchar2,p_fnumber number) as
outhandle varchar2(512);
outtag varchar2(30);
done boolean;
failover boolean;
devtype VARCHAR2(512);
BEGIN
DBMS_OUTPUT.put_line('Entering RollForward');
-- Now the rolling forward.
devtype := sys.dbms_backup_restore.deviceAllocate;
sys.dbms_backup_restore.applySetDatafile(check_logical => FALSE,
cleanup => FALSE);
DBMS_OUTPUT.put_line('After applySetDataFile');
sys.dbms_backup_restore.applyDatafileTo(dfnumber => p_fnumber,
toname => p_datafile_name,
fuzziness_hint => 0,
max_corrupt => 0,
islevel0 => 0,
recid => 0,
stamp => 0);
DBMS_OUTPUT.put_line('Done: applyDataFileTo');
DBMS_OUTPUT.put_line('Done: applyDataFileTo');
-- Restore Set Piece
sys.dbms_backup_restore.restoreSetPiece(handle => p_incr_file_name,
tag => null,
fromdisk => true,
recid => 0,
stamp => 0);
DBMS_OUTPUT.put_line('Done: RestoreSetPiece');
-- Restore Backup Piece
sys.dbms_backup_restore.restoreBackupPiece(done => done,
params => null,
outhandle => outhandle,
outtag => outtag,
failover => failover);
DBMS_OUTPUT.put_line('Done: RestoreBackupPiece');
sys.dbms_backup_restore.restoreCancel(TRUE);
sys.dbms_backup_restore.deviceDeallocate;
END;
/
复制
--增量备份
select 'backup incremental from scn 1314780 tag tts_incr_update1 tablespace ''' ||
name ||
''' format ''/xttsoft/backupdir/incr_%d_%T_%U''; #scn:' ||
dbms_flashback.get_system_change_number rman_inc_script
from v$tablespace
where name in ('TBS_IDX', 'TBS_DATA')
order by name;
backup incremental from scn 1173499 tag tts_incr_update tablespace 'TESTXTT' format '/xttsoft/backupdir/incr_%d_%T_%U'; #scn:1173657
backup incremental from scn 1173499 tag tts_incr_update tablespace 'TESTXTTIDX' format '/xttsoft/backupdir/incr_%d_%T_%U'; #scn:1173657
复制
--转变备份片字节序
conver.sh
sqlplus "/as sysdba" <512);
comment varchar2(80);
media varchar2(80);
concur boolean;
recid number;
stamp number;
pltfrmfr number;
devtype VARCHAR2(512);
BEGIN
BEGIN
sys.dbms_backup_restore.restoreCancel(TRUE);
devtype := sys.dbms_backup_restore.deviceAllocate;
sys.dbms_backup_restore.backupBackupPiece(bpname => '/xttsoft/backupdir/incr_TDB_20220421_420rgc01_1_1',fname => '/xttsoft/backupdir/incr_TDB_20220421_420rgc01_1_1_conv',handle => handle,media=> media,comment=> comment, concur=> concur,recid=> recid,stamp => stamp, check_logical => FALSE,copyno=> 1, deffmt=> 0, copy_recid=> 0,copy_stamp => 0,npieces=> 1,dest=> 0,pltfrmfr=> 6);
sys.dbms_backup_restore.backupBackupPiece(bpname => '/xttsoft/backupdir/incr_TDB_20220421_440rgc06_1_1',fname => '/xttsoft/backupdir/incr_TDB_20220421_440rgc06_1_1_conv',handle => handle,media=> media,comment=> comment, concur=> concur,recid=> recid,stamp => stamp, check_logical => FALSE,copyno=> 1, deffmt=> 0, copy_recid=> 0,copy_stamp => 0,npieces=> 1,dest=> 0,pltfrmfr=> 6);
END;
END;
/
quit
EOF
复制
sh 执行该脚本,生成转换目标平台后的增量文件,注意pltfrmfr=> 6为源平台号
--增量合成
select 'exec rollforward(''/oracle/app/oracle/oradata/testdb/' || t3.TABLESPACE_NAME || '_' || B.FILE# || ''',''' || C.HANDLE || ''',' || b.FILE# || ')' FROM V$BACKUP_SET A LEFT OUTER JOIN V$BACKUP_DATAFILE B ON (A.SET_STAMP = B.SET_STAMP AND A.SET_COUNT = B.SET_COUNT) LEFT OUTER JOIN V$BACKUP_PIECE C ON (A.SET_STAMP = C.SET_STAMP AND A.SET_COUNT = C.SET_COUNT) left join dba_data_files t3 on (b.FILE# = t3.file_id) where b.file# <> 0 and c.TAG='TTS_INCR_UPDATE' ORDER BY b.COMPLETION_TIME desc
复制
--目标端执行增量合成,需要每次登录sqlplus执行一条
exec rollforward('/oracle/app/oracle/oradata/testdb/TESTXTT_5','/xttsoft/backupdir/incr_TDB_20220421_420rgc01_1_1_conv',5)
exec rollforward('/oracle/app/oracle/oradata/testdb/TESTXTTIDX_6','/xttsoft/backupdir/incr_TDB_20220421_440rgc06_1_1_conv',6)
复制
--源库设置表空间只读
alter tablespace TESTXTT read only;
alter tablespace TESTXTTIDX read only;
复制
--readonly后增量备份
select 'backup incremental from scn 1173657 tag tts_incr_update tablespace '''||TABLESPACE_NAME||''' format ''/xttsoft/backupdir/incr_%d_%f_%T_%U''; #scn:'||dbms_flashback.get_system_change_number rman_inc_script from dba_data_files where tablespace_name in ('TESTXTT','TESTXTTIDX') order by tablespace_name,file_name;
backup incremental from scn 1173657 tag tts_incr_update tablespace 'TESTXTT' format '/xttsoft/backupdir/incr_%d_%T_%U'; #scn:1174501
backup incremental from scn 1173657 tag tts_incr_update tablespace 'TESTXTTIDX' format '/xttsoft/backupdir/incr_%d_%T_%U'; #scn:1174501
复制
--readonly备份片转换
conver.sh
sqlplus "/as sysdba" <<EOF
set timing on
DECLARE
handle varchar2(512);
comment varchar2(80);
media varchar2(80);
concur boolean;
recid number;
stamp number;
pltfrmfr number;
devtype VARCHAR2(512);
BEGIN
BEGIN
sys.dbms_backup_restore.restoreCancel(TRUE);
devtype := sys.dbms_backup_restore.deviceAllocate;
sys.dbms_backup_restore.backupBackupPiece(bpname => '/xttsoft/backupdir/incr_TDB_20220421_423rgc01_1_1',fname => '/xttsoft/backupdir/incr_TDB_20220421_423rgc01_1_1_conv',handle => handle,media=> media,comment=> comment, concur=> concur,recid=> recid,stamp => stamp, check_logical => FALSE,copyno=> 1, deffmt=> 0, copy_recid=> 0,copy_stamp => 0,npieces=> 1,dest=> 0,pltfrmfr=> 6);
sys.dbms_backup_restore.backupBackupPiece(bpname => '/xttsoft/backupdir/incr_TDB_20220421_442rgc06_1_1',fname => '/xttsoft/backupdir/incr_TDB_20220421_442rgc06_1_1_conv',handle => handle,media=> media,comment=> comment, concur=> concur,recid=> recid,stamp => stamp, check_logical => FALSE,copyno=> 1, deffmt=> 0, copy_recid=> 0,copy_stamp => 0,npieces=> 1,dest=> 0,pltfrmfr=> 6);
END;
END;
/
quit
EOF
复制
sh执行该脚本,生成转换目标平台后的增量文件
--readonly后增量合成
exec rollforward('/oracle/app/oracle/oradata/testdb/TESTXTT_5','/xttsoft/backupdir/incr_TDB_20220421_423rgc01_1_1_conv',5)
exec rollforward('/oracle/app/oracle/oradata/testdb/TESTXTTIDX_6','/xttsoft/backupdir/incr_TDB_20220421_442rgc06_1_1_conv',6)
复制
--导入元数据
impdp userid=\"sys/Passw0rd as sysdba\" directory=exp_dir logfile=tts_imp.log \
network_link=from_old transport_full_check=no \
transport_tablespaces=TESTXTT,TESTXTTIDX \
transport_datafiles='/oracle/app/oracle/oradata/testdb/TESTXTT_5','/oracle/app/oracle/oradata/testdb/TESTXTTIDX_6'
复制
最后修改时间:2022-07-22 19:17:47
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。