最近公司Oracle升級,考慮到停機時間等綜合因數,最終選擇了xtts數據遷移方案。
為此我整理了一份操作手冊,方便以后查閱。
關於xtts的介紹可以參見這篇文章:
《XTTS,又一個值得你重視的Oracle數據庫遷移升級利器》
https://blog.csdn.net/weixin_34064653/article/details/90584543
需要注意的是,引文使用的是xtts2,而我采用的xtts4對配置文件和步驟有很大簡化。
好了話不多少,把我的手冊奉上。
一、 使用場景:
源庫: Linux RAC ASM 11.2.0.4
目標庫:Linux RAC ASM 19.6.0.0.0
XTTS版本:xttsV4
二、 操作步驟:
1、 准備階段
1) 校驗環境信息,為備份做前期准備
2、 傳輸階段
1) 源庫創建備份
2) 目標庫恢復備份
3、 增量階段
1) 源庫做增量備份,可以多次執行,目的是讓目標庫和源庫盡可能接近
2) 目標庫同步增量
4、 停機階段
1) 源庫創建驗證表,並寫入一條數據
2) 源庫表空間切換至read only
3) 源庫做最后一次增量備份
4) 復制增量到目標庫
5) 目標庫同步增量
6) 導入角色、用戶信息(若准備階段已經處理,則跳過)
7) 目標庫導入表空間元數據
8) 確認表空間已導入
9) rman下檢查表空間是否有物理和邏輯錯誤
10) 修改目標庫表空間read write
11) 導入profile
12) 導入其他對象
13) 手動收集統計信息(如果導入表空間元數據時排除了統計信息)
5、 驗證階段
1) 查詢目標庫驗證表數據是否和源庫一致
2) 驗證數據對象
三、 准備階段
1、 檢查數據庫版本:目標必須>=源>=11.2.0.4
SELECT * FROM v$version;
2、 確認compatible版本:目標必須>=源>=11.2.0.4
SELECT * FROM v$parameter WHERE NAME = 'compatible';
3、 確認instance_name,archive模式必須開啟
SELECT * FROM v$instance;
4、 確認rman備份策略必須為disk(關鍵字:TO DISK)
rman target/
show default device type;
5、 確認rman未開啟壓縮(關鍵字:TO BACKUPSET)
show device type;
6、 目標庫db_files必須大於源庫
SELECT * FROM v$parameter WHERE NAME = ' db_files ';
7、 確認源和目標的字符集一致
select * from nls_database_parameters t where t.parameter in ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');
8、 確認時區一致
select dbtimezone from dual;
9、 要遷移的表空間都是online
select tablespace_name, status from dba_tablespaces t where tablespace_name = ' TESTDB ';
select file_name, online_status from dba_data_files where tablespace_name = ' TESTDB ';
10、 要遷移的表空間中沒有sys,system用戶的對象
select * from dba_segments where tablespace_name = 'TESTDB' and owner IN ('SYS', 'SYSTEM');
11、 用戶對象沒有存儲在system,sysaux,users上
select * from dba_segments where tablespace_name in ('SYSTEM','SYSAUX','USER') and owner = 'TEST';
12、 是否存在外部表
select OWNER, TABLE_NAME from DBA_EXTERNAL_TABLES;
13、 是否存在加密列、加密表空間
select owner, table_name, count(*) from DBA_ENCRYPTED_COLUMNS group by owner, table_name;
select TABLESPACE_NAME, ENCRYPTED from dba_tablespaces where ENCRYPTED = 'YES';
14、 表空間是否自包含
execute dbms_tts.transport_set_check('TESTDB', true);
select * from transport_set_violations;
15、 清空回收站
select count(*) from dba_recyclebin;
purge dba_recyclebin;
16、 為源庫開啟快跟蹤(可以提升增量備份的效率)
alter database enable block change tracking using file '%ORACLE_HOME%/trace/trace.log';
17、 檢查無效對象
select owner, object_name, object_type, status from dba_objects where owner = 'TEST' and status <> 'VALID';
18、 檢查無效索引
select index_name, table_name, tablespace_name, from dba_indexes where tablespace_name = 'TESTDB' and status <> 'VALID';
19、 創建目標庫到源庫的DBLINK(用於比對pfile,role,user和import表空間元數據)
create public database link TTSLINK connect to system identified by密碼 using
'(DESCRIPTION =
(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 源庫地址)(PORT = 1521)))
(CONNECT_DATA = (SERVICE_NAME = 源庫服務名))
)';
select 1 from dual@ TTSLINK;
20、 目標庫創建directory(用於導入元數據)
create directory TTSDUMP as '工作目錄/ttsdump';
21、 目標庫檢查是否已存在欲復制的表空間和對象(存在則需重命名或刪除)
select * from dba_tablespaces where tablespace_name = 'TESTDB';
select t1.*
from
(select owner, object_name, object_type from dba_objects where owner = 'TEST') t1,
(select owner, object_name, object_type from dba_objects@TTSLINK where owner = 'TEST') t2
where t1. owner = t2.owner and t1.object_name = t2.object_name and t1.object_type = t2.object_type;
22、 對比新舊庫的profile
select distinct(t.pro) from
(
select s.profile pro, l.profile pro2
from dba_profiles@ TTSLINK s, dba_profiles l
where s.profile = l.profile(+)
) t
where t.pro2 is null
order by t.pro;
23、 對比新舊庫的role
select 'create role '||role ||';' from dba_roles@TTSLINK
minus
select 'create role '||role ||';' from dba_roles;
24、 對比新舊庫的user
select 'create user "'||a.username ||'" identified by values '''||b.password||
''' default tablespace '|| a.default_tablespace || ' temporary tablespace '|| a.temporary_tablespace||';'
from dba_users@TTSLINK a, sys.user$@TTSLINK b, dba_users c
where a.username=b.name
and a.username = c.username(+) and c.username is null
order by a.username;
select 'grant ' || GRANTED_ROLE || ' to ' || GRANTEE from DBA_ROLE_PRIVS
where GRANTEE IN(
SELECT username FROM dba_users b
WHERE b.username NOT IN ('SYS', 'SYSTEM', 'SYSAUX', '…….')
) order by GRANTEE, GRANTED_ROLE;
四、 傳輸階段
1、 源庫部署rman_xttconvert_VER4.zip腳本
mkdir –p /home/db/oracle/xtts/backup
cd /home/db/oracle/xtts
unzip rman_xttconvert_VER4.zip
2、 修改xtt.properties配置文件:
以下五個參數為必要參數:
1) tablespaces:欲復制的表空間,多個表空間之間用“,”分隔。
2) platformid:源庫platformid (SLECT platform_id FROM v$database;)
3) src_srcatch_location:源庫創建備份的位置(使用nas目錄)
4) dest_srcatch_location:目標庫接受備份的位置(同上目錄)
5) dest_datafile_location:目標庫表空間文件的位置
3、 復制腳本到目標庫
scp –r /home/db/oracle/xtts 目標庫ip:/home/db/oracle/xtts
4、 源庫目標庫設置環境變量
1) 確認源庫目標庫的oralce_sid,避免一台服務器有多個實例的情況導錯庫
echo $ORACHE_SID
2) 源庫目標庫設置xtts工作目錄、開啟debug
export TMPDIR=/home/db/oracle/xtts
export XTTDEBUG=1
3) 切換工作目錄
cd /home/db/oracle/xtts
5、 源庫創建備份
cd /home/db/oracle/xtts
nohup $ORACLE_HOME/perl/bin/perl xttdriver.pl --backup &
6、 復制到目標庫
scp –r backup res.txt 目標庫ip:/home/db/oracle/xtts/
7、 目標庫應用備份
nohup $ORACLE_HOME/perl/bin/perl xttdriver.pl --restore &
五、 增量階段
此階段工作和備份階段基本一致,目標是讓備庫更接近源庫:
1、 源庫創建增量備份
cd /home/db/oracle/xtts
nohup $ORACLE_HOME/perl/bin/perl xttdriver.pl --backup &
2、 復制到目標庫
scp –r backup res.txt 目標庫ip:/home/db/oracle/xtts/
3、 目標庫應用備份
nohup $ORACLE_HOME/perl/bin/perl xttdriver.pl --restore &
六、 停機階段
1、 源庫創建驗證表,並寫入一條數據
create table TEST.XTTS_TEST tablespace TESTDB as select 1 C1 from DUAL;
2、 源庫表空間切換至read only
ALTER TABLESPACE TESTDB READ ONLY;
ALTER TABLESPACE TESTDB2 READ ONLY;
3、 源庫做最后一次增量備份
cd /home/db/oracle/xtts
export TMPDIR=/home/db/oracle/xtts
export XTTDEBUG=1
nohup $ORACLE_HOME/perl/bin/perl xttdriver.pl --backup &
4、 復制到目標庫
scp –r backup res.txt 目標庫ip:/home/db/oracle/xtts/
5、 目標庫同步增量
cd /home/db/oracle/xtts
export TMPDIR=/home/db/oracle/xtts
export XTTDEBUG=1
nohup $ORACLE_HOME/perl/bin/perl xttdriver.pl --restore &
6、 導入角色、用戶信息(免得導入表空間元素據報錯,若准備階段已經處理,則跳過)
impdp system/oracle metrics=yes network_link=TTSLINK include=role,user full=y content=metadata_only > other.log
7、 目標庫導入表空間元數據
1) 復制xttplan.txt,xttnewdatafiles.txt
scp xttplan.txt xttnewdatafiles.txt目標庫ip:/home/db/oracle/xtts/
2) 生成DataPump 導入模板文件xttplugin.txt
nohup $ORACLE_HOME/perl/bin/perl xttdriver.pl -e &
3) 修改xttplugin.txt
修改以下內容
1、 用戶名/密碼
2、 dmp目錄
3、 network_link
可選配置:exclude=(TABLE_STATISTICS,INDEX_STATISTICS)
通過以上選項跳過統計信息導入,后續手動收集
8、 確認表空間已導入
SELECT * FROM dba_segments WHERE tablespace IN (‘TESTDB’,’TESTDB2’);
SELECT * FROM TEST.xtts_test;
9、 rman下檢查表空間是否有物理和邏輯錯誤
RMAN> validate tablespace TESTDB, TESTDB2 check logical;
10、 修改目標庫表空間read write
ALTER TABLESPACE TESTDB READ WRITE;
ALTER TABLESPACE TESTDB2 READ WRITE;
11、 導入profile
impdp system/oracle metrics=yes network_link=TTSLINK include=profile full=y content=metadata_only > other.log
12、 導入其他對象
impdp system/oracle metrics=yes network_link=TTSLINK include=view,sequence,fuction,procedure schemas=(TEST,TEST2) content=metadata_only > other.log
13、 手動收集統計信息(如果導入表空間元數據時排除了統計信息)
select 'EXEC DBMS_STATS.GATHER_TABLE_STATS('''||owner||''','''||table_name||''',estimate_percent=>1,method_opt=>''FOR ALL COLUMNS SIZE AUTO'',degree=>12,cascade=>TRUE);' from dba_tables where owner in('TEST','TEST2') ;
七、 驗證階段
通知應用切換ip,驗證應用服務是否正常