Oracle資料庫——xTTS技術的使用

張衝andy發表於2016-11-29

NiuJinlin 

關於xTTS(增量傳輸表空間)技術,在網上沒有特別多的描述,但是在大資料量的增量遷移,減少停機時間,保證業務訪問的前提下,xTTS可以替代OGG(畢竟Oracle Golden Gate不是免費的軟體)成為遷移的首選。本文將對xTTS的使用方法做一個詳細的介紹:

首先交代一下實驗環境:

Source:

Operation-System: Red Hat Enterprise Linux 5.5

Oracle-Software: Oracle Database 11g Release 2 (11.2.0.4.0)

Global-database-name: ora11g01.us.oracle.com

Hostname: ora11g01.us.oracle.com IP-address:172.25.0.30

Destination:

Operation-System: Red Hat Enterprise Linux 5.5

Oracle-Software: Oracle Database 11g Release 2 (11.2.0.4.0)

Global-database-name: ora11g02.us.oracle.com

Hostname: ora11g02.us.oracle.com IP-address:172.25.0.40

由於我這裡沒有搭建不同位元組序作業系統的條件,就統一使用RedHat作業系統進行演示,實際生產中需要更改平臺ID,以完成跨平臺的表空間遷移。

一、xTTS技術的三個階段:

1.準備階段:

在準備階段中,源端相關表空間的資料檔案備份要傳輸到目標端作業系統相關目錄下,並且完成位元組序的轉換,Application在準備階段是完全可訪問的。

準備階段可以透過RMAN備份來完成,也可以透過dbms_file_transfer來完成,本文將使用基於RMAN備份的xTTS技術。

2.前滾階段:

類似於Oracle資料庫中的前滾,既然是增量的傳輸,一定會有前滾資料的需要。

在前滾階段中,在準備階段中備份並且完成位元組序轉換的資料檔案將會使用源端(Source)的增量備份來進行前滾使得資料達到最新狀態。透過多次執行該階段,使得每個連續的增量備份的應用變得更加快速,從而也使得目標端(Destination)資料庫和源端資料庫的資料更加接近。

3.傳輸階段:

在傳輸階段中,表空間將被置為只讀(Read-Only Mode)方式傳輸,將會最後執行一次源端資料庫的增量備份並且應用在目標端上,使得目標端資料庫中資料可以與源端完全一致。

當資料備份中的內容完全一致時,匯出源端資料庫後設資料,並載入到目標端資料庫中。

最後,將相關的表空間置為讀寫模式(Read-Write Mode),使得遷移完畢,並且恢復正常業務,在這個階段中,應用不能接受任何的DML操作。

二、關於xTTS技術三個階段的總結:

透過上面的流程我們可以發現,xTTS其實是一定程度上的增量,不能做到真正的“0停機時間”,但是可以進行增量的資料傳輸,可以大幅度的減少停機時間,完成跨平臺的資料遷移。但是需要注意的是:

xTTS同樣具有TTS技術相同的缺點,基於System表空間的資料庫物件將會丟失,需要自己透過dbms_metadata.get_ddl或者第三方工具自行建立。

三、跨平臺增量備份支援指令碼

xTTS需要Oracle的版本在11.2.0.4.0及以後的版本,如果需要遷移更早的版本,則需要建立轉換例項進行版本的轉換。

完成xTTS技術需要相關的指令碼,rman-xttconvert_2.0.zip檔案可以在MyOracleSupport自行下載(文件ID 1389592.1),也可以透過發郵件到筆者郵箱18306392321@163.com進行索取。

四、xTTS技術的具體步驟

階段1:初始化階段

階段 1.1 - 安裝目標端資料庫軟體並且建立資料庫

具體方法不再贅述,透過dbca或者create database語句自定義資料庫均可。

階段 1.2 - 如果有必要,配置增量轉換家目錄和例項

如果要遷移的版本低於11.2.0.4.0,那麼需要建立convert_home和convert_instance:

[oracle@ora11g02]$ export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/\

xtt_home

[oracle@ora11g02]$ export ORACLE_SID=xtt

[oracle@ora11g02]$ cat << EOF > $ORACLE_HOME/dbs/ \

init$ORACLE_SID.ora \

db_name=‘xtt’ \

compatible=’11.2.0.4.0’ \

EOF

[oracle@ora11g02]$ sqlplus “/as sysdba” << EOF \

startup \

EOF

階段 1.3 - 驗證相關表空間是否可以被傳輸

使用dbms_tts來驗證相關表空間是否為自包含或者是半包含表空間,如果不是,那麼將不能完成相關表空間的傳輸。

階段 1.4 - 建立database link用於傳輸後設資料(可以不做)

這個步驟並不是必要的,後期可以使用expdp抽取本地DUMP檔案來完成後設資料的傳輸,不需要透過網路的方式來完成。

SQL@ora11g02> create public database link ttslink

  connect to system identified by oracle

  using ‘ora11g01’;

(這裡就不再對ora11g01本地連線名的配置做贅述)

SQL@ora11g02> select * from dual@ttslink;

階段 1.5 - 建立stage area

根據xtt.properties檔案中定義的backupformat引數和backupondest引數,在源端和目標端作業系統建立stage area。 //*stage area指的是存放資料庫備份的區域,用來完成xTTS的中間過程必須存在的區域*//

如果在準備階段使用RMAN備份,使用xtt.properties中定義的dicopydir和stageondest引數來建立stage area。

階段 1.6 - 安裝xttconvert指令碼

[oracle@ora11g01]$ mkdir -p /home/oracle/xtt\

&& cd /home/oracle/xtt

[oracle@ora11g01]$ unzip rman-xttconvert_2.0.zip

該指令碼將會解壓出的檔案有:

xttcnvrtbkupdest.sql, xttdbopen.sql ,xttdriver.pl ,xttprep.tmpl ,xtt.properties ,xttstartupnomount.sql

階段 1.7 - 在源端配置xtt.properties檔案

[oracle@ora11g01]$ mv xtt.properties xtt.properties.bak

[oracle@ora11g01]$ cat xtt.properties.bak | grep -v ^# | grep -v ^$ > xtt.properties

[oracle@ora11g01]$ cat xtt.properties

tablespaces=TEST_TAB  ##源端要傳輸的表空間

platformid=13 ##源端作業系統平臺號,可以在

v$transportable_platform檢視中獲取

#srcdir=SOURCEDIR1,SOURCEDIR2

#dstdir=DESTDIR1,DESTDIR2

#srclink=TTSLINK ##這三行被註釋的引數,在基於dbms_file_transfer的方

法中會被用到,這裡我已經註釋掉

dfcopydir=/home/oracle/copies #對於接下來四行引數對應的路徑,

backupformat=/home/oracle/copies 在之前已經所有描述,就不在這裡

stageondest=/home/oracle/copies 進行贅述。

backupondest=/home/oracle/copies

storageondest=/u01/app/oracle/oradata/ora11g02 ##該引數對應的路徑決

定了目標段資料檔案存放的位置

#parallel=3

#rollparallel=2

#getfileparallel=4 ##這三個並行引數不再多解釋,對應之前的各個階段的並行

#cnvinst_home=/u01/app/oracle/product/11.2.0/xtt_home

#cnvinst_sid=xtt ##這裡用語指定轉換例項(低於11.2.0.4.0的xTTS)

階段 1.8 - 將xtt-rmanconvert指令碼傳輸到目標端系統

[oracle@ora11g01]$ scp -r /home/oracle/xtt oracle@ora11g02:~

階段 1.9 - 設定TMPDIR

在源端和目標端系統上,都需要設定Shell變數TMPDIR,該變數對應的路徑用語支援中間指令碼的存放。

[oracle@ora11g01]$ export TMPDIR=/home/oracle/xtt

[oracle@ora11g02]$ export TMPDIR=/home/oracle/xtt




階段2:準備階段(這裡對應著三個階段的第一階段)

由於這裡我們使用的是RMAN指令碼備份的方式,就不再進行第一種方式的描述,需要的朋友請到MyOracleSupport自行查詢前面提到的文件。

階段 2.1 - 在源端執行準備指令碼

在源端作業系統登入Oracle軟體擁有者使用者,設定ORACLE_HOME和ORACLE_SID變數用語指向源端資料庫。

[oracle@ora11g01]$ $ORACLE_HOME/perl/bin/perl xttdriver.pl -p

該指令碼做了以下事情:

1.在dfcopydir指定的目錄下建立需要傳輸的資料檔案備份

2.驗證資料檔案是否在讀寫模式,並且沒有offline的資料檔案

3.建立相關中間指令碼:xttplan.txt ## 記錄要傳輸的表空間和scn資訊

rmanconvert.cmd ## 在目標端convert資料檔案的指令碼,其中轉

換後的路徑是基於引數storageondest來指定的。

我們看一下指令碼的內容

[oracle@ora11g01]$ cat xttplan.txt

TEST_TAB::::976843 ## 要傳輸的表空間名,傳輸時的scn資訊

5 ## 要傳輸的表空間號

[oracle@ora11g01]$ cat rmanconvert.cmd

host 'echo ts::TEST_TAB'; 

  convert from platform 'Linux x86 64-bit

  datafile 

  '/home/oracle/copies/TEST_TAB_5.tf' 

  format '/u01/app/oracle/oradata/ora11g02/%N_%f.xtf' 

parallelism 8;

我們看一下藍色標註的部分,第一部分是平臺名稱,這個是根據我們之前在xtt.properties裡面填寫的platform_id來決定的。

第二部分是生成的資料檔名,這個是根據backupformat引數來決定的,如果現在檢視/home/oracle/copies目錄,會發現該備份已經生成。

[oracle@ora11g01]$ ls -l /home/oracle/copies

total 102512

-rw-r----- 1 oracle oinstall 104865792 Nov 21 22:14 TEST_TAB_5.tf

第三部分就是由storageondest引數來決定的,我們可以看出來這個語句應該是在目標資料庫上執行的一次資料檔案轉換平臺的語句。

對於後面的並行度8,這個是生成指令碼預設的。

階段 2.2 - 傳輸備份檔案到目標系統

我們將剛才指令碼生成的資料檔案備份傳輸到目標平臺上,以便後期的增量應用。

[oracle@ora11g01]$ scp /home/oracle/copies/TEST_TAB_5.tf \

oracle@ora11g02:/home/oracle/copies

階段 2.3 - 在目標端資料庫轉換資料檔案備份

將源端的rmanconvert.cmd傳輸到目標端$TMPDIR對應的目錄下,並執行相應指令碼。

[oracle@ora11g01]$ scp rmanconvert.cmd oracle@ora11g02:/home/ \

oracle/xtt

[oracle@ora11g02]$ $ORACLE_HOME/perl/bin/perl xttdriver.pl -c

完成這一步後,stageondest中指定路徑(我這裡是/home/oracle/copies)中的資料檔案備份就可以刪除了,沒有任何作用了。




階段3:前滾階段

在前滾階段中,將會在源端資料庫建立增量備份檔案,並且傳輸到目標端轉換成目標端作業系統位元組序(Endian),最後透過增量備份檔案完成對轉換後資料檔案的前滾。這個階段可以執行多次,從而減少資料量的丟失,並且減少最後階段的時間,這個階段中資料也是完全可訪問並且可以修改的。業務不會受到影響。

首先自行建立一下增量資料,以方便我們觀察實驗結果,增量資料的建立方法和環境的初始化方法會在文件的最後貼出。

階段 3.1 - 在源端建立相關表空間的增量備份

[oracle@ora11g01]$ $ORACLE_HOME/perl/bin/perl xttdriver.pl -i

這個指令碼將會生成兩個檔案:

tsbkupmap.txt    ## 記錄表空間名,表空間id,增量次數和增量備份名稱

incrbackups.txt  ## 記錄了增量備份檔案所在位置

兩個檔案的內容就不再貼出,大家自己使用cat命令檢視即可。

階段 3.2 - 傳輸增量備份到目標端stage area

[oracle@ora11g01]$ scp `cat incrbackups.txt` oracle@ora11g02\

:/home/oracle/copies

階段 3.3 - 轉換增量備份並在目標端進行應用

[oracle@ora11g01]$ scp /home/oracle/xtt/xttplan.txt \

oracle@ora11g02:/home/oracle/xtt

[oracle@ora11g01]$ scp /home/oracle/xtt/tsbkupmap.txt \

oracle@ora11g02:/home/oracle/xtt

[oracle@ora11g02]$ $ORACLE_HOME/perl/bin/perl xttrdriver.pl -r 

如果該命令發生了報錯,很難排查。但是Oracle提供了debug功能讓我們來看一下到底在哪兒出現了錯誤。

[oracle@ora11g02]$ export XTTDEBUG=1

此時再次執行$ORACLE_HOME/perl/bin/perl xttrdriver -r 就可以看到該指令碼執行的詳細資訊了。

階段 3.4 - 為下一次增量備份確定FROM_SCN(增量備份起點)

[oracle@ora11g01]$ $ORACLE_HOME/perl/bin/perl xttdriver.pl -s 

這個scn資訊將會再次被記錄在xttplan.txt中。所以再次執行$ORACLE_HOME/perl/

bin/perl xttdriver.pl時,該指令碼還會讀取該檔案。

階段 3.5 - 重複整個階段3的步驟

在這個階段有兩種選擇:

1.你想進一步縮短資料的同步差距,從而減少最後一步切換到只讀模式的時間減少,那麼重複整個第三階段的步驟。

2.如果資料已經很接近最終資料,那麼可以直接進入傳輸階段。

由於我沒有在源端資料庫繼續插入新的資料,所以這裡我選擇第二步,在生產過程的遷移中,建議使用第一種,多做幾次,再進入傳輸階段,可以大大減少停機時間。




階段4:傳輸階段

在這個階段中,源端資料庫將會被置為只讀模式,目標端資料庫將會完成最後一次增量應用以達成和源端資料的完全一致,最後將資料庫後設資料匯入,並將表空間置為讀寫模式,完成資料的遷移。

該階段就是真正資料庫要停機的時間,要想停機時間足夠短,請在階段3的時候多做幾次增量備份的應用。

階段 4.1 - 將源端表空間置為只讀

SQL> alter tablespace test_tab read only;

Tablespace altered.

階段 4.2 - 建立最後一次增量備份,傳輸,轉換,並且完成應用增量備份

[oracle@ora11g01]$ $ORACLE_HOME/perl/bin/perl xttdriver.pl -i

[oracle@ora11g01]$ scp `cat incrbackups.txt` oracle@ora11g02:\

/home/oracle/copies

[oracle@ora11g01]$ scp xttplan.txt oracle@ora11g02:/home/oracle/xtt

[oracle@ora11g01]$ scp tsbkupmap.txt oracle@ora11g02:/home/oracle\

/xtt

[oracle@ora11g02 ]$ $ORACLE_HOME/perl/bin/perl xttdriver.pl -r 

階段4.3 - 匯入後設資料到目標資料庫

[oracle@ora11g02 ]$ $ORACLE_HOME/perl/bin/perl xttdriver.pl -e

這裡可以用impdp直接網路匯入後設資料,使用dblink

命令如下:

[oracle@ora11g02]$ impdp \'/ as sysdba\' directory=tts\ 

network_link=ttslink \ 

transport_full_check=no transport_tablespaces=test_tab\

transport_datafiles=‘/u01/app/oracle/oradata/ora11g02/\

TEST_TAB_5.xtf’ 


階段 4.5 - 將目標資料庫表空間置為讀寫模式並驗證資料完整性

SQL> alter tablespace test_tab read write;

Tablespace Alterd.

SQL> validate tablespace test_tab check logical;




五、關於xTTS技術的注意事項:

1.stage_area(stage area):用語存放資料庫完整備份和增量備份

2.$TMPDIR:perl執行指令碼過程中生成的.txt .cmd等檔案,全部在該路徑下,但執行perl指令碼請在rman-xttconvert_2.0目錄下進行

3.注意XTTDEBUG=1的使用,可以進行排錯

4.database_link使用時要注意tnsnames.ora檔案的配置

5.生產環境中要多做幾次階段3,來縮短資料庫的停機時間。




六、環境初始化和增量資料建立:

建立初始化資料:

SQL> create tablespace test_tab datafile '/u01/app/oracle/oradata/ora11g01/test_tab.dbf' size 100m autoextend on;

Tablespace created.

SQL> create user njl identified by oracle;

User created.

SQL> grant connect,resource to njl;

Grant succeeded.

SQL> alter user njl default tablespace test_tab;

User altered.

SQL> create table njl.t1(id number);

Table created.

SQL> begin    

  2  for i in 1..100 loop

  3  insert into njl.t1 values (i);

  4  end loop;

  5  end;

  6  /

PL/SQL procedure successfully completed.

SQL> commit;

Commit complete.

SQL> select count(*) from njl.t1;

  COUNT(*)

----------

       100

建立增量資料:

SQL> create table njl.t2 (id number);

Table created.

SQL>begin

  2  for i in 1..10000 loop

  3  insert into njl.t2 values(i);

  4  end loop;

  5  end;

  6  /

PL/SQL procedure successfully completed.

SQL> commit;

Commit complete.

SQL> select count(*) from njl.t2;

  COUNT(*)

----------

     10000

希望我的文章對大家有用,也希望大家對我的文章中的理解偏差和錯誤進行批評。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31383567/viewspace-2129321/,如需轉載,請註明出處,否則將追究法律責任。

相關文章