Oracle-XTTS


1. 介紹

Transportable Tablespace (TTS)傳輸表空間,把表空間數據從一個庫傳輸到另外一個庫,而XTTS是在TTS基礎上進一步增強,支持跨平台和增量備份。

 

2. XTTS使用的限制條件--參考【Doc ID 1454872.1】

1) 源庫軟件版本必須是11.2.0.3或更高
2) 源庫的 COMPATIBLE 參數必須設置為 10.2.0 或更高。
3) 源庫的 COMPATIBLE 參數值不能大於目標庫的 COMPATIBLE 參數值。
4) 源庫必須處於 ARCHIVELOG 模式。
5) 目標庫必須是是11.2.0.4或更高版本
6) rman的默認備份類型必須是DISK。
7) 源庫的 RMAN 配置里 DEVICE TYPE DISK 不能設置為 COMPRESSED,否則會拋出ORA-19994錯誤。
8) 目標庫的 COMPATIBLE 參數必須設置為 11.2.0.4 或更高。
9) 要遷移的表空間的數據文件必須都是 online 或者不包含 offline 的數據文件。
10) 源庫的oracle版本必須低於或等於目標庫
11) 這些步驟都需要使用 OSDBA 組中的 oracle 用戶來執行。需要使用 OS 驗證的方式來連接源庫和目標庫。
12) 如果使用dbms_file_transfer進行初始化,則目標端數據庫必須是11.2.0.4
13) 這個方法不支持在備庫和snapshot備庫
14) 這個方法不支持多租戶數據庫。Enhancement bug 22570430 描述了這個限制。
15)源端的操作系統不能是Windows
16)源端和目標端時區,字符集保持一致
17)目標端db_files比源庫大

3. 實例流程步驟

3.1 初始化設置

(1)服務器搭建安裝數據庫軟件和創建實例
(2)rman-xttconvert軟件包准備及配置參數($TMPDIR: 保存臨時文件目錄)
(3)檢查自包含情況,傳輸對象是否在系統表空間等
(4)目標庫創建用戶,角色,profile,臨時表,外部表等xtts遷移受限的對象
(5)平台檢查

3.2 准備階段(源庫數據仍然在線)

(1)源庫rman copy方式全庫導出到NAS存儲或是NFS存儲文件系統
(2)在目標系統恢復數據文件至目標端的 endian 格式

3.3 前滾階段(源庫數據仍然在線)

(1)在源庫創建增量備份
(2)把增量備份轉換成目標系統的 endian 格式並且把增量備份應用至目標數據文件
(3)(源庫)為下次增量備份確定 next_scn
(4)重復3.3的步驟直到准備好操作傳輸表空間

3.4 傳輸階段(源庫數據表空間置為read only模式)

(1)源庫停業務應用,確認數據庫無job和事務運行和日志都應用到備庫后將源庫表空間置為 READ ONLY模式
(2)最后一次執行前滾階段步驟
(3)源庫通過數據泵方式導出元數據(注意:表空間元數據並不包含視圖,過程,同義詞等對象)
(4)目標庫導入元數據,並將表空間改成讀寫模式

3.5 收尾階段

(1)校驗數據
(2)統計信息收集或導入
(3)無效對象重新檢查編譯
(4)臨時表對象導入

 

4. 實施過程詳情

4.1 環境信息

image

4.2 初始化階段

  1)目標端部署數據庫(包括同步源端tns等文件)

  2)檢查源端數據庫對象信息(業務賬號對象的表空間依賴性,業務賬號及臨時表信息)

-- 調用dbms_tts.transport_set_check()
exec sys.dbms_tts.transport_set_check(ts_list => 'tablespace_name', incl_constraints => TRUE);
-- 查看檢查結果
select * from sys.transport_set_violations;

  3)掛載目錄用於存儲源端數據(此處使用NFS)-- 參考MOS(Doc ID 359515.1)文件中參數掛載文件系統

在目標端分配足夠存儲空間創建文件系統后通過NFS的方式掛載到源端數據庫服務器

clipboard

--源端NAS存儲掛在參數
mount -o llock,rw,bg,vers=3,proto=tcp,noac,forcedirectio,hard,nointr,timeo=600,rsize=32768,wsize=32768,suid  127.0.0.1:/dbdump /datadump

--目標端
mount -t nfs -o rw,bg,hard,nointr,rsize=32768,wsize=32768,tcp,noac,vers=4,timeo=600,actimeo=0 127.0.0.1:/dbdump /datadump

  

4)安裝XTTS軟件

這里選擇安裝到臨時數據目錄(即上面NFS的文件系統)

su - oracle
unzip -qo /oracle/soft/rman_xttconvert_v3.zip -d /datadump/xtts_dir/
--源庫備份文件目錄(在 xtt.properties 文件中由 backupformat 參數定義)
mkdir -p /datadump/xtts_dir/sourcedir
-- 目標系統數據文件目錄(在 xtt.properties 文件中由 storageondest 參數定義)
mkdir -p /datadump/xtts_dir/destdir
-- 修改目錄權限
chmod 777 xtts_dir
chmod 777 /datadump/xtts_dir/destdir
chmod 777 /datadump/xtts_dir/sourcedir

-- 編輯配置文件 xtt.properties
tablespaces=DEV_DATA,DEV_IDX,DEV_TMP        # 需要傳輸的業務表空間名稱列表
platformid=4                                # 源端數據庫platform id (select PLATFORM_ID from V$DATABASE;)
dfcopydir=/datadump/xtts_dir/sourcedir      # 源端數據庫全備份文件目錄
backupformat=/datadump/xtts_dir/sourcedir   # 源端增量備份存儲目錄
stageondest=/datadump/xtts_dir/destdir      # 目標端存儲源端備份文件的目錄
storageondest=+DATA                         # 目標端最終數據文件目錄
backupondest=/datadump/xtts_dir/destdir     # 目標端增量備份格式轉換后的輸出目錄
parallel=8                                  # RMAN的並行數量
rollparallel=2                              # 前滾並行度
desttmpdir=/datadump/xtts_dir # 目標端tmpdir目錄,建議執行xtts目錄,xttdriver.pl產生新文件目錄

 

  5)准備用戶,角色,profile語句

-- 創建dblink
create database link XTTS_DBLINK connect to xtts identified by 'xtts' using '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = localhsot)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = orcl)))';

-- 目標庫創建角色
select 'create role '||role ||';' from dba_roles@XTTS_DBLINK
minus
select 'create role '||role ||';' from dba_roles;

-- 目標庫創建用戶 
select 'create user "'||a.username ||'" identified by values '''||b.password||
 ''' default tablespace USERS '|| 'temporary tablespace '||
 a.TEMPORARY_TABLESPACE||';'
from dba_users@XTTS_DBLINK a,sys.user$@XTTS_DBLINK b,
dba_users c,sys.user$   d
where a.username=b.name  and
a.username=d.name(+)
and a.username = c.username(+) and c.username is null
order by a.username;

 

4.3 准備階段

注意:建議禁止同步開始后增加數據文件

4.3.1 方案選擇

  1)dbms_file_transfer會根據源端的目錄結構傳送到目標端時配置成相同的目錄結構,但是容易觸發bug,整個准備階段的同步過程中容易間斷,需要后期使用rman單獨數據文件的方式傳送失敗的數據文件。

  2)rman方式目前為止比較穩定,但是它會將所有的數據文件后綴改名為xtf,並且每一個批次的數據文件只能傳送到一個目錄下。比較適用於asm的情況

4.3.2 源端0級全備

# 源庫rman [backup as copy]方式進行0級備份到 xtt.properties 文件中由 dfcopydir 參數定義

export TMPDIR=/datadump/xtts_dir
export XTTDEBUG=1

echo $TMPDIR
nohup $ORACLE_HOME/perl/bin/perl xttdriver.pl -p -d >full_back.log &

chmod -R 777 /datadump/xtts_dir/sourcedir

# 產生xttplan.txt(表空間當前SCN記錄), rmanconvert.cmd(記錄文件轉換的數據文件名稱)

 

4.3.3 目標端還原數據文件

# 
su - oracle export TMPDIR=/datadump/xtts_dir export XTTDEBUG=1 echo $TMPDIR nohup $ORACLE_HOME/perl/bin/perl xttdriver.pl -c -d >convert.log &

 

4.4 前滾階段

       在這個階段,增量備份會在源庫創建,發送到目標系統,轉換成目標系統的 endian 格式,應用到目標庫數據文件拷貝上並進行前滾。這個階段可能需要運行很多次。每次增量備份都會比上次的增量備份花費更少的時間,並且把目標系統的數據文件拷貝和源庫更貼近。在這個階段,源庫上的數據仍然可以被正常訪問。

4.4.1 源庫rman 增備

su - oracle
export TMPDIR=/datadump/xtts_dir
export XTTDEBUG=1
echo $TMPDIR
nohup $ORACLE_HOME/perl/bin/perl xttdriver.pl -i -d >incr_1.log &

cd  /datadump/xtts_dir
chmod  777  tsbkupmap.txt
chmod  777  incrbackups.txt
chmod  777  xttplan.txt
mv /datadump/xtts_dir/backup/*   /datadump/xtts_dir/dfcopydir
chmod 777 /datadump/xtts_dir/dfcopydir

        源庫對xtt.properties參數文件中指定的表空間進行增量備份,同時會生成 tsbkupmap.txt、 incrbackups.txt、 xttplan.txt三個文件。備份的數據是從做xttdriver.pl -s 時在xttplan.txt文件中記錄的SCN開始的。備份完成后需要將這3個文件連同增量備份集一起傳輸到目標端。

4.4.2 應用增備到目標端數據文件

su - oracle
export TMPDIR=/datadump/xtts_dir
export XTTDEBUG=1
echo $TMPDIR
nohup $ORACLE_HOME/perl/bin/perl xttdriver.pl -r -d >restore_incr1.log &

 

4.4.3 推進源端增量備份的next_scn

su - oracle
export TMPDIR=/datadump/xtts_dir
export XTTDEBUG=1

echo $TMPDIR
$ORACLE_HOME/perl/bin/perl xttdriver.pl -s -d

        該命令產生最新 xttplan.txt 文件(修改FROM_SCN),用於確定下一次增量備份的起點(下次增量備份開始 SCN)。建議在【目標端】每次做完recover動作后, 【源端】就執行一次該命令,以免遺忘。

4.4.4 重復執行前滾階段步驟,盡量縮少增量備份數據,從而減少停機時間

 

4.5 傳輸階段

注意事項:
1. 元數據導入前,需要在目標端創建業務用戶和角色,用戶默認表空間需要在導入完成后指定
2. 元數據導入時只導入和指定表空間相關聯的對象,存放在系統表空間的對象需要二次導入
3. 導入前需要檢查目標端db_files參數是否大於等於源庫的值
4. 臨時表空間中對象不會隨元數據導入而導入,需要提前創建
5. 元數據導入時無法開啟並行,耗時比重高

 

4.5.1 停應用業務

4.5.2 停止源庫job

alter system set job_queue_processes=0 scope=both;
alter system set aq_tm_processes=0 scope=both;

-- 停止JOB回話 
select /*+ rule */ * from dba_jobs_running;
====根據情況是否kill當前運行的job
select sid, SERIAL#,USERNAME from v$session where sid=507;
alter system kill session '507,5,@inst_id' immediate;

4.5.3 源庫將表空間置為只讀模式

--設置表空間為只讀模式
SELECT 'alter tablespace ' || t.tablespace_name || ' read only;'
  FROM dba_tablespaces t
      ,dba_data_files  f
 WHERE t.tablespace_name = f.tablespace_name
   AND t.tablespace_name NOT IN ('SYSTEM'
                                ,'SYSAUX'
                                ,'USERS')
   AND t.contents = 'PERMANENT'
 GROUP BY t.tablespace_name
 ORDER BY COUNT(f.file_id);

alter tablespace DEV_DATA read only;
alter tablespace DEV_IDX read only;
alter tablespace DEV_TMP read only;


對數據文件的OFFLINE操作,為了避免歸檔文件不存在的情況了,建議執行一次RECOVER操作。
-- 獲取recover datafile腳本
SELECT FILE#,ONLINE_STATUS,CHANGE#,ERROR,'recover datafile '|| file# sql_cmd FROM V$RECOVER_FILE;
--檢查確認
set linesize 168 pagesize 99
col tablespace_name for a24
select tablespace_name,status from dba_tablespaces;
SELECT FILE#,ONLINE_STATUS,CHANGE#,ERROR FROM V$RECOVER_FILE;

 

4.5.4 源庫最后一次增備

-- 源庫rman 增備
su - oracle
export TMPDIR=/datadump/xtts_dir
export XTTDEBUG=1

echo $TMPDIR
nohup $ORACLE_HOME/perl/bin/perl xttdriver.pl -i >incr_1.log &

cd  /datadump/xtts_dir
chmod  777  tsbkupmap.txt
chmod  777  incrbackups.txt
chmod  777  xttplan.txt
mv /datadump/xtts_dir/backup/*   /datadump/xtts_dir/dfcopydir
chmod 777 /datadump/xtts_dir/dfcopydir

        源庫對xtt.properties參數文件中指定的表空間進行增量備份,同時會生成 tsbkupmap.txt、 incrbackups.txt、 xttplan.txt三個文件。備份的數據是從做xttdriver.pl -s 時在xttplan.txt文件中記錄的SCN開始的。備份完成后需要將這3個文件連同增量備份集一起傳輸到目標端。

4.5.5 應用增備文件到目標庫

-- 應用增備到目標端數據文件
su - oracle
export TMPDIR=/datadump/xtts_dir
export XTTDEBUG=1

echo $TMPDIR
nohup $ORACLE_HOME/perl/bin/perl xttdriver.pl -r -d >restore_incr1.log &

4.5.6 源庫導出元數據

# 1. OS創建目錄並修改權限
mkdir -p /datadump/xtts_dir/dmp
chown oracle:oinstall /datadump/xtts_dir/dmp
chmod 777 /datadump/xtts_dir/dmp
# 2. DB創建目錄並授權
sqlplus / as sysdba
col directory_name for a50
col directory_path for a50
set linesize 300
select directory_name,directory_path from dba_directories;
create  directory XTTS_DIR as '/datadump/xtts_dir/dmp';
grant read,write on directory XTTS_DIR to sys;

# 3. 導出表空間metadata
expdp \"/ as sysdba\" directory=XTTS_DIR dumpfile=xtts_tbs_metadata.dmp transport_tablespaces=DEV_IDX,DEV_IDX,DEV_TMP logfile=xtts_tbs_metadata.log CLUSTER=N exclude=STATISTICS

# 4. 導出臨時表結構
TMP_TABS=$(echo "set heading off feedback off time off  timing off pages 0 lines 200\nSELECT trim(owner||'.'||table_name) objs FROM dba_tables WHERE temporary = 'Y' AND owner NOT IN (SELECT owner FROM dba_logstdby_skip);" | sqlplus -S "/ as sysdba"|xargs -n 1000 echo|tr -s ' ' ',')
cat > tmptabs.par <<EOF
USERID="/ as sysdba"
TABLES=(${TMP_TABS})
FILE=temp_tables.dmp
LOG=exp_temp_tables.log
EOF
exp parfile=tmptabs.par rows=y

# 5. 檢查外部表對象(可選)
mkdir -p /tmp/soc/
chown oracle:oinstall /tmp/soc/

create  directory SOCDUMP as '/tmp/soc/';
grant read,write on directory SOCDUMP to SOC;

expdp expdp \"/ as sysdba\" dumpfile=LOG.dmp directory=XTTS_DIR tables=soc.log

# 6. 物化視圖結構(可選)
cd /datadump/xtts_dir/dmp
TMP_MVS=$(echo "set heading off feedback off time off  timing off pages 0 lines 200\nSELECT trim(owner||'.'||MVIEW_NAME) objs FROM dba_mviews WHERE  owner NOT IN (SELECT owner FROM dba_logstdby_skip);" | sqlplus -S "/ as sysdba"|xargs -n 1000 echo|tr -s ' ' ',')
cat > tmpmvs.par <<EOF
USERID="/ as sysdba"
TABLES=(${TMP_MVS})
FILE=exp_mvs.dmp
LOG=exp_mvs.log
EOF
exp parfile=tmpmvs.par rows=y
-- 檢查確認文件內容
imp \"/ as sysdba\" file=exp_mvs.dmp show=y full=y

# 7. 目標庫導入元數據
chmod 777 /datadump/xtts_dir/dmp

sqlplus / as sysdba
col directory_name for a50
col directory_path for a50
set linesize 300
select directory_name,directory_path from dba_directories;

create  directory XTTS_DIR as '/datadump/xtts_dir/dmp';
grant read,write on directory XTTS_DIR to sys;

-- 導入表空間metadata(必須先創建用戶和角色,及授權)
$ORACLE_HOME/perl/bin/perl xttdriver.pl -e
--獲取全部數據文件列表,獲取文件transport_datafiles內容信息
cp xttplugin.txt dmp/impdp_tbs.par

nohup impdp parfile=impdp_tbs.par >tbs.out 2>&1 &

vi impdp_tbs.par
USERID="/ as sysdba"
directory=XTTS_DIR
dumpfile=xtts_tbs_metadata.dmp
logfile=impdp_xtts_tbs_metadata.log
CLUSTER=N
transport_datafiles='+DATA/orcl/datafile/dev_9.dbf','+DATA/orcl/datafile/dev_idx_11.dbf'
exclude=statistics

-- 導入用戶metadata
nohup impdp \"/ as sysdba\" directory=XTTS_DIR dumpfile=xtts_us_metadata.dmp logfile=imp_xtts_us_metadata.log schemas=dev,soc CLUSTER=N parallel=8 exclude=index,table,constraint >ou.out 2>&1 &

# 8. 導入臨時表對象

# 9. 外部表
mddir -p /tmp/soc/
chown oracle:oinstall /tmp/soc/
touch /tmp/soc/soc.log
create  directory SOCDUMP as '/tmp/soc/';
grant read,write on directory SOCDUMP to SOC;

impdp \"/ as sysdba\" dumpfile=LOG.dmp directory=XTTS_DIR tables=soc.log

# 10. 目標端將表空間置為讀寫模式
alter tablespace DEV_DATA read write;
alter tablespace DEV_IDX read write;
alter tablespace DEV_TMP read write;

# 11. 通過rman校驗數據傳輸是否異常
rman target /
validate tablespace DEV_DATA,DEV_IDX,DEV_TMP check logical;

 

4.6 檢查源庫和目標庫數據一致性

4.6.1 通過DB_LINK檢查對象信息

--對比無效對象
select r.owner, r.object_type, r.remote_cnt Source_Cnt, l.local_cnt Target_Cnt
from ( select owner, object_type, count(owner) remote_cnt
from dba_objects@XTTS_DBLINK
where owner not in
(select name
from system.logstdby$skip_support
where action=0) group by owner, object_type ) r
, ( select owner, object_type, count(owner) local_cnt
from dba_objects
where owner not in
(select name
from system.logstdby$skip_support
where action=0) group by owner, object_type ) l
where l.owner (+) = r.owner
and l.object_type (+) = r.object_type 
and nvl(l.local_cnt,-1) != r.remote_cnt
order by 1, 3 desc;
 
--對比sequence大小
select * from(
select a.SEQUENCE_OWNER,a.sequence_name,a.last_number prod_number, 
b.last_number dr_number,(b.last_number - a.last_number) gap_than_zero
 from dba_sequences@XTTS_DBLINK a,dba_sequences b
  where a.sequence_owner not in
 ('SYS','SYSTEM','XDB','WMSYS','TSMSYS','SYSMAN','PRECISE1',
'ORDSYS','OUTLN','OLAPSYS','ORDPLUGINS','MDSYS','EXFSYS',
'DMSYS','DSG','DBSNMP','PRECISE2','SI_INFORMTN_SCHEMA','SPA','TSMSYS','PUBLIC','GOLDENGATE',
'ORDDATA','PRECISE4','PRECISE3','CTXSYS','SCOTT','PERFSTAT')
and a.sequence_owner=b.sequence_owner (+)
and a.sequence_name=b.sequence_name(+)
 order by 5,1,2 desc) where gap_than_zero < 0 ;
 
--檢查無效index
select owner, index_name, status from dba_indexes 
where status='UNUSABLE' order by 1,2;
 
select i.owner, i.index_name, p.partition_name, p.status 
from dba_ind_partitions p,dba_indexes i 
where p.index_name=i.index_name and p.status='UNUSABLE'
order by 1,2,3;
 
select i.owner,i.index_name,s.subpartition_name,s.status from
dba_ind_subpartitions s,dba_indexes i where
s.index_name=i.index_name and s.status='UNUSABLE'
order by 1,2,3;

  

4.6.2 檢查並編譯無效對象無效對象

@?/rdbms/admin/utlrp.sql
select count(*) from dba_objects where status='INVALID';
select owner,count(*) from dba_objects where status='INVALID' group by owner;

4.6.3 收集統計信息

exec dbms_stats.gather_database_stats(estimate_percent=>100,degree=>30,cascade=>true,granularity=>'AUTO');


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM