本系列的定位是對XTTS及相關技術進行深刻的學習研究。做爲本系列的開篇,本着實用性的原則,我先把一次實際生產環境U2L的遷移實戰實施方案進行提煉簡化,旨在能清楚說明該如何使用XTTS這種解決方案來進行U2L遷移,先達到能夠跟着作下來的初級目標,若是有興趣再去深刻研究相關細節。html
採用XTTS(Cross Platform Transportable Tablespaces)遷移方式,準確說這裏指的是增強版XTTS,具有跨平臺字節序轉換、全量初始化、屢次增量前滾的功能,從而有效縮短正式遷移階段的生產停機時間,順利完成U2L的遷移工做。好比本次需求以下:linux
源端 | 目標端 | |
---|---|---|
IP地址 | 10.6.xx.xx | 10.5.xx.xx |
操做系統 | AIX 5.3 | RHEL 6.7 |
是否RAC | 否 | 是 |
數據庫名稱 | sourcedb | targetdb |
遷移業務用戶 | JINGYU | JINGYU |
2.1 校驗自包含
本次只遷移 JINGYU 用戶,只檢查 JINGYU 用戶所在表空間的自包含驗證便可:sql
SQL> select distinct tablespace_name from dba_segments where owner='JINGYU' order by 1; TABLESPACE_NAME ------------------------------ DBS_D_JINGYU DBS_I_JINGYU SQL> execute dbms_tts.transport_set_check('DBS_D_JINGYU, DBS_I_JINGYU'); PL/SQL procedure successfully completed. SQL> select * from TRANSPORT_SET_VIOLATIONS; no rows selected
上述查詢若沒有結果行返回,說明自包含校驗經過。數據庫
2.2 建立XTTS工做目錄
本次我設置的XTTS的工做目錄是/exp/newxx,在源端和目標端都建立相關目錄,上傳並解壓MOS(文檔 ID 1389592.1)提供的xttconvert腳本。oracle
--源端AIX建立相關目錄 mkdir -p /exp/newxx mkdir -p /exp/newxx/src_backup mkdir -p /exp/newxx/tmp mkdir -p /exp/newxx/dump mkdir -p /exp/newxx/backup_incre chown -R ora103:dba /exp/newxx --源端AIX上傳rman-xttconvert_2.0.zip至/exp/newxx cd /exp/newxx unzip rman-xttconvert_2.0.zip --目標端Linux建立相關目錄 mkdir -p /exp/newxx mkdir -p /exp/newxx/src_backup mkdir -p /exp/newxx/tmp mkdir -p /exp/newxx/dump mkdir -p /exp/newxx/backup_incre chown -R ora11g:dba /exp/newxx --目標端Linux上傳rman-xttconvert_2.0.zip至/exp/newxx cd /exp/newxx unzip rman-xttconvert_2.0.zip
2.3 源端開啓 bct
源端開啓bct(block change tracking)app
SQL> alter database enable block change tracking using file '/exp/newxx/bct2'; Database altered.
若是測試階段發現bct沒法生效(增量備份時間很長),可考慮手工進行一次表空間的0級備份:ide
--手動以level 0進行備份待遷移的表空間(只是爲了增量可讀bct,不作其餘恢復操做) RMAN> CONFIGURE DEVICE TYPE DISK PARALLELISM 16 BACKUP TYPE TO BACKUPSET; RMAN> backup incremental level 0 tablespace DBS_D_JINGYU, DBS_I_JINGYU format '/exp/test/%U.bck';
注:這是特殊狀況,不必定會遇到,根據你的實際測試狀況選擇是否要作。本次大概2T的表空間0級備份時間:2h。學習
2.4 配置 xtt.properties測試
配置源端AIX xtt.properties屬性文件:spa
cd /exp/newxx vi xtt.properties #增長以下配置信息: tablespaces=DBS_D_JINGYU,DBS_I_JINGYU platformid=6 dfcopydir=/exp/newxx/src_backup backupformat=/exp/newxx/backup_incre backupondest=/exp/newxx/backup_incre stageondest=/exp/newxx/src_backup storageondest=+DG_DATA/targetdb/datafile parallel=16 rollparallel=16 getfileparallel=6
配置目標端Linux xtt.properties屬性文件:
cd /exp/newxx vi xtt.properties #增長以下配置信息: tablespaces=DBS_D_JINGYU,DBS_I_JINGYU platformid=6 dfcopydir=/exp/newxx/src_backup backupformat=/exp/newxx/backup_incre backupondest=/exp/newxx/backup_incre stageondest=/exp/newxx/backup_incre storageondest=+DG_DATA/targetdb/datafile parallel=16 rollparallel=16 getfileparallel=6 asm_home=/opt/app/11.2.0/grid asm_sid=+ASM1
注:這裏的platformid=6是根據源端的OS平臺決定的,能夠經過查詢v$database的platform_id字段進行確認,也可參照v$transportable_platform中的平臺對應。
2.5 目標端提早創建用戶角色
目標端建立JINGYU用戶,完成元數據導入後纔可修改默認表空間。
如下是在源端執行獲取建立用戶和對應角色、權限的語句後,在目標端對應建立(若是你很清楚要遷移業務用戶的用戶密碼和權限等信息,也能夠選擇直接建立):
--源端執行: --create user sqlplus -S / as sysdba set pages 0 set feedback off spool /exp/newxx/scripts/create_user.sql select 'create user '||name||' identified by values '''||password||''';' from user$ where name = 'JINGYU' and type#=1; spool off exit --create role sqlplus -S / as sysdba set pages 0 set feedback off spool /exp/newxx/scripts/create_role.sql select 'grant '||GRANTED_ROLE||' to '||grantee||';' from dba_role_privs where grantee = 'JINGYU'; spool off exit --owner爲sys的表的權限須要手動賦予 sqlplus -S / as sysdba set pages 0 set feedback off spool /exp/newxx/scripts/grant_sys_privs.sql select 'grant '||PRIVILEGE||' on '||owner||'.'||table_name||' to '||GRANTEE||';' from dba_tab_privs where owner='SYS' and GRANTEE = 'JINGYU'; spool off exit --源端驗證SQL正確與否: cat /exp/newxx/scripts/create_user.sql cat /exp/newxx/scripts/create_role.sql cat /exp/newxx/scripts/grant_sys_privs.sql --目標端執行: @/exp/newxx/scripts/create_user.sql @/exp/newxx/scripts/create_role.sql @/exp/newxx/scripts/grant_sys_privs.sql
2.6 表空間全量備份
源端AIX執行被傳輸業務表空間全量備份建立xtts表空間全量備份腳本執行過程當中產生的配置文件,用於數據文件轉換及每次增量備份及恢復,同時每次執行增量備份過程當中,配置文件內容會發生變化,用於新的增量恢復,主要是SCN的變化。
增長rman備份並行度:
RMAN> CONFIGURE DEVICE TYPE DISK PARALLELISM 16 BACKUP TYPE TO BACKUPSET;
編輯備份文件,每次備份失敗會在/exp/newxx/tmp產生fails文件須要刪除後方可再次運行
cd /exp/newxx --full_backup.sh腳本內容以下 export ORACLE_SID=sourcedb export TMPDIR=/exp/newxx/tmp export PERL5LIB=/opt/app/ora103/10.2.0/product/perl/lib /opt/app/ora103/10.2.0/product/perl/bin/perl /exp/newxx/xttdriver.pl -p –d
在後臺執行全量備份:
cd /exp/newxx nohup sh full_backup.sh > full_backup.log &
查看/exp/newxx/src_backup產生的全量備份大小(本次測試大小爲 2T,備份耗時 4小時34分鐘)
2.7 表空間全量恢復及轉換
將文件傳輸至目標端
cd /exp/newxx/src_backup scp * ora11g@10.5.xx.xx:/exp/newxx/src_backup --scp拷貝耗時10小時 cd /exp/newxx/tmp scp * ora11g@10.5.xx.xx:/exp/newxx/tmp
目標端 Linux 執行表空間恢復並將數據文件轉換至 ASM 磁盤組中,每次恢復失敗時會在/exp/newxx/tmp 產生 fails 文件須要刪除後方可再次運行(詳見下面3.2節的特別說明)。
cd /exp/newxx --full_restore.sh腳本內容以下 export TMPDIR=/exp/newxx/tmp export ORACLE_SID=targetdb1 /opt/app/ora11g/product/11.2.0/perl/bin/perl /exp/newxx/xttdriver.pl -c –d
在後臺執行全量恢復及轉換:
nohup sh full_restore.sh > full_restore.log &
本次恢復及轉換耗時:4 小時15分鐘。
3.1 表空間增量備份
源端進行增量備份:
cd /exp/newxx --增量備份腳本incre_backup.sh內容以下 export ORACLE_SID=sourcedb export TMPDIR=/exp/newxx/tmp export PERL5LIB=/opt/app/ora103/10.2.0/product/perl/lib /opt/app/ora103/10.2.0/product/perl/bin/perl /exp/newxx/xttdriver.pl -i –d
在後臺執行增量備份:
cd /exp/newxx nohup sh incre_backup.sh > incre_backup.log &
增量備份前確認xtt.properties文件配置正確,增量備份耗時幾分鐘,說明bct起做用了。
--(選作)第二次作一個測試驗證表: SQL> create table JINGYU.xttstest tablespace DBS_D_JINGYUas SELECT * FROM DBA_objects; Select count(1) from JINGYU.xttstest;
將文件傳輸至目標端:
cd /exp/newxx/backup_incre scp *_1_1 ora11g@10.5.xx.xx:/exp/newxx/backup_incre cd /exp/newxx/tmp scp * ora11g@10.5.xx.xx:/exp/newxx/tmp
3.2 表空間增量恢復
目標端進行增量恢復:
cd /exp/newxx --incre_recover.sh腳本內容以下 export TMPDIR=/exp/newxx/tmp export ORACLE_SID=targetdb1 /opt/app/ora11g/product/11.2.0/perl/bin/perl /exp/newxx/xttdriver.pl -r –d
在後臺執行增量恢復:
nohup sh incre_recover.sh > incre_recover.log &
特別說明:
1.以上增量前滾的步驟在正式遷移前可重複執行屢次,用於對目標庫進行屢次表空間增量恢復,使目標端數據庫在正式遷移前與生產數據庫近乎一致,大幅減小遷移停機時間。
2.每次備份(全量和增量)成功後,源端/exp/newxx/tmp目錄中會生成文件,須要將此目錄下的全部文件傳輸到/exp/newxx/tmp下(每次覆蓋便可)
3.每次備份(全量和增量)後,/exp/newxx/tmp目錄中會生成最新的xttplan.txt.new文件,該文件中記錄了各表空間最新的scn,須要將舊的xttplan.txt文件在每次增量恢復前linux端進行以下更名操做:
cd /exp/newxx/tmp
mv xttplan.txt xttplan.old1.txt
mv xttplan.txt.new xttplan.txt
4.1 表空間read only
應用側中止業務後,數據庫層面複查確認沒有用戶會話鏈接;
源端AIX將被傳輸業務表空間修改成READ ONLY狀態:
sqlplus -S / as sysdba set pages 0 set feedback off spool /exp/newxx/scripts/read_only.sql select 'alter tablespace '||name||' read only;' from v$tablespace where name in ('DBS_D_JINGYU','DBS_I_JINGYU') order by 1; spool off exit cat /exp/newxx/scripts/read_only.sql @/exp/newxx/scripts/read_only.sql
4.2 最後一次增量操做
按照前面 增量前滾階段的方法,完成最後一次增量備份與恢復。
本次測試,最後一次增量備份時間用時 21 分鐘。
4.3 目標端開啓閃回
目標端Linux開啓在導入元數據前開啓閃回
SQL> alter system set db_recovery_file_dest_size=100g scope=both; System altered. SQL> alter system set db_recovery_file_dest='+DG_DATA' scope=both; System altered. SQL> alter database flashback on; Database altered. SQL> select flashback_on from v$database; FLASHBACK_ON ------------------ YES SQL> create restore point before_imp_xtts guarantee flashback database; Restore point created. SQL> select name from v$restore_point; 確認有剛創建的restore point。
4.4 導入XTTS元數據
4.4.1 AIX源端導出XTTS元數據:
create directory dump as '/exp/newxx/dump';
導出表空間、用戶元數據:
--導出表空間元數據(vi expdp_xtts.sh) expdp system/oracle parfile=expdp_xtts.par --expdp_xtts.par內容以下: directory=dump dumpfile=tbs_xtts.dmp logfile=expdp_xtts.log transport_tablespaces=('DBS_D_JINGYU','DBS_I_JINGYU') transport_full_check=y metrics=yes --導出用戶元數據(vi expdp_xtts_other.sh) expdp system/oracle parfile=expdp_xtts_other.par --expdp_xtts_other.par內容以下 directory=dump dumpfile=tbs_xtts_other.dmp logfile=expdp_xtts_other.log content=metadata_only schemas=JINGYU metrics=yes
執行導出表空間、用戶元數據的腳本:
cd /exp/newxx/dump ./expdp_xtts.sh ./expdp_xtts_other.sh
導出完成後將dump文件傳輸到目標端/exp/newxx/dump目錄
cd /exp/newxx/dump scp *.dmp ora11g@10.5.108.28:/exp/newxx/dump
4.4.2 LINUX目標端導入XTTS元數據:
建立directory:
create or replace directory dump as '/exp/newxx/dump';
導入XTTS元數據:
--導入XTTS元數據(vi impdp_xtts.sh) impdp system/oracle parfile=impdp_xtts.par --impdp_xtts.par內容以下: directory=dump logfile=impdp_xtts.log dumpfile=tbs_xtts.dmp cluster=n metrics=yes transport_datafiles='+DG_DATA/targetdb/DATAFILE/DBS_D_JINGYU.290.976290433', '+DG_DATA/targetdb/DATAFILE/DBS_I_JINGYU.286.976290433'
注意:上面數據文件路徑須要根據實際導入狀況更改。
執行導入XTTS元數據的腳本:
cd /exp/newxx/dump ./impdp_xtts.sh SQL> select count(1) from JINGYU.xttstest; 正常返回結果.
執行完成後,同時驗證成功。
4.5 表空間read write
LINUX目標端表空間read write:
sqlplus -S / as sysdba set pages 0 set feedback off spool /exp/newxx/scripts/read_write.sql select 'alter tablespace '||name||' read write;' from v$tablespace where name in ('DBS_D_JINGYU','DBS_I_JINGYU') order by 1; spool off exit cat /exp/newxx/scripts/read_write.sql @/exp/newxx/scripts/read_write.sql
4.6 第二次開啓閃回
目標端Linux在其餘元數據導入前再次開啓閃回
sqlplus / as sysdba select flashback_on from v$database; create restore point before_imp_other guarantee flashback database; select name from v$restore_point;
4.7 導入其餘元數據
導入其餘元數據
--導入其餘元數據(vi impdp_xtts_other.sh) impdp system/oracle parfile=impdp_xtts_other.par --impdp_xtts_other.par 內容以下 directory=dump dumpfile=tbs_xtts_other.dmp logfile=impdp_xtts_other.log content=metadata_only schemas=JINGYU cluster=n metrics=yes
執行導入其餘元數據的腳本:
cd /exp/newxx/dump ./impdp_xtts_other.sh
4.8 檢查public dblink
原生產環境查詢public dblink,如有結果,到新生產環境建立:
--原生產環境查詢: select * from dba_db_links; OWNER DB_LINK USERNAME HOST CREATED ------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------- JINGYU XXX_TMP JINGYU xxdb 2008-05-20 09:51:14 select dbms_metadata.get_ddl('DB_LINK',DB_LINK,'JINGYU') FROM DBA_DB_LINKS where owner='JINGYU'; CREATE DATABASE LINK "XXX_TMP" CONNECT TO "JINGYU" IDENTIFIED BY VALUES '056414CFC01C4F42E2E496B913FDC0212A' USING 'xxdb'; --鏈接到JINGYU用戶建立便可,開始沒有權限: grant create database link to JINGYU;
4.9 檢查public synonyms
原生產環境查詢public synonyms,如有結果,到新生產環境建立:
select owner,SYNONYM_NAME,TABLE_OWNER,TABLE_NAME from dba_synonyms where owner='PUBLIC' and table_owner in ('JINGYU');
本次無結果。
4.10 檢查外部表
原生產環境查詢外部表信息,如有結果,到新生產環境建立:
SQL> select * from dba_external_tables;
本次無結果。
4.11 數據比對
源環境和目標環境分別查詢比對:
set linesize 200 set pagesize 9999 col owner format a15 col object_type format a15 select owner, object_type, count(*) from dba_objects where object_name not like 'BIN%' and owner in ('JINGYU') group by owner, object_type order by 1,2 desc; OWNER OBJECT_TYPE COUNT(*) --------------- --------------- ---------- JINGYU VIEW 2 JINGYU TABLE PARTITION 25 JINGYU TABLE 49 JINGYU SEQUENCE 4 JINGYU PROCEDURE 5 JINGYU INDEX PARTITION 225 JINGYU INDEX 55 JINGYU FUNCTION 3 JINGYU DATABASE LINK 1 9 rows selected.
4.12 編譯失效對象
查詢失效對象數量,按對象類型分組統計:
sqlplus / as sysdba set timing on select owner, object_type, count(*) from dba_objects where status <> 'VALID' and owner in ('JINGYU') group by owner, object_type order by 1, 2 desc; OWNER OBJECT_TYPE COUNT(*) --------------- --------------- ---------- JINGYU PROCEDURE 1 JINGYU FUNCTION 1 --查看具體失效對象,比對源端、目標端: set linesize 200 set pagesize 9999 col owner format a15 col object_type format a15 col OBJECT_NAME for a32 select owner,object_name, object_type, status from dba_objects where status <> 'VALID' and owner in ('JINGYU') order by 2; OWNER OBJECT_NAME OBJECT_TYPE STATUS --------------- -------------------------------- --------------- ------- JINGYU XXXXCITY FUNCTION INVALID JINGYU TAB_MAINTAIN_XXX PROCEDURE INVALID 編譯失效對象(若兩邊失效對象一致可不作) exec utl_recomp.recomp_parallel(64);
4.13 更改用戶默認表空間
因爲表空間比用戶晚建立,須要手動更改默認表空間:
alter user JINGYU default tablespace DBS_D_JINGYU; select username,default_tablespace,temporary_tablespace from dba_users where username='JINGYU';
4.14 刪除閃回點
確認本次遷移成功後,手動刪除閃回點
--(選作)此時能夠先刪除以前的測試表: drop table JINGYU.xttstest; --手動刪除閃回點: drop restore point BEFORE_IMP_XTTS; drop restore point before_imp_other; select name from v$restore_point; --關閉閃回數據庫的功能: SQL> alter database flashback off; Database altered. SQL> select flashback_on from v$database; FLASHBACK_ON ------------------ NO SQL> alter system set db_recovery_file_dest='' sid='*' scope=both; System altered.
4.15 修改service參數
手動修改和用戶同名的service參數:
--service_names參數保持和源端一致: show parameter service_names alter system set service_names ='dbaas','targetdb','jingyursv', 'jingyu' sid='*' scope=both; alter system register;
檢查監聽註冊狀況:
--本次環境使用的非默認監聽,名字是targetdb: lsnrctl status targetdb
收集了公司同事在其餘項目實際進行XTTS遷移項目的經驗,再結合本次本身實施過程當中遇到的狀況,列舉了XTTS相關的其餘注意事項(歡迎你們繼續補充本身作XTTS時踩過的坑和對應的經驗分享):
/*查詢表空間中對象的詳細信息*/ SELECT OWNER AS OWNER ,SEGMENT_NAME AS SEGMENT_NAME ,SEGMENT_TYPE AS SEGMENT_TYPE ,SUM(BYTES)/1024/1024 AS SEGMENT_SIZE FROM DBA_SEGMENTS WHERE TABLESPACE_NAME in ('DBS_D_JINGYU','DBS_I_JINGYU') and owner <> 'JINGYU' GROUP BY OWNER,SEGMENT_NAME,SEGMENT_TYPE ORDER BY 4;
select count(1) from dba_data_files where tablespace_name in ('DBS_D_JINGYU','DBS_I_JINGYU'); --本次遷移數據文件數量135,與表空間全量備份出來的文件數量進行對比確認一致。
關於第7項,我實際遇到並在測試環境進行了重現,具體可參考以前的隨筆: