XTTS系列之五:警惕大檔案表空間

2023-07-06 06:00:18

在上篇《XTTS系列之四:迷迷糊糊的並行度》驗證之後,就讓測試組在RMAN設定中設定好正確的並行。然後重新將備份任務執行,平均速度直接由之前的150MB/s提升為1200MB/s。優化效果非常明顯,速度直接提升了8倍。但是由於使用者的資料庫存在大檔案表空間,當執行到大檔案表空間時,速度又降到150MB/s的速度,無法使用並行。

我們知道大檔案表空間在11g引入了Multi-Section,可以通過指定section size來用到並行,但現在很尷尬的是:

  • 目前xtts的封裝Perl指令碼是動態生成的RMAN備份命令,且未指定這個section size
  • 在RMAN設定中,也無法將section size指定為預設通道設定

也就是說,就是無法用到並行。
那使用者還要繼續要求優化速度,想想這該怎麼辦呢?

...

討論階段有合作伙伴提出讓原廠來改指令碼,這條路基本很難,不甘心可以去MOS提SR給後臺要求,後續有機會我也會和公司反饋,當提這樣需求的關鍵使用者多了,在後續xtts版本就有希望會加入這個功能,但對於當下依然是遠水解不了近渴。

既然改指令碼不靠譜,那我們又該如何繼續優化呢?

...

首先了解下目前客戶大檔案表空間情況:具體有多個大檔案表空間,其中最大的那個大小在8T,其餘幾個加起來小於8T;
此時慶幸還好不是1個,基於這個背景,workaround的方案就有了,使用當前xtts的perl指令碼手工並行來做,分成3批,比如xtt1,xtt2,xtt3:

  • 普通小檔案表空間一批,對應xtt1
  • 8T大檔案表空間自己一批,對應xtt2
  • 其他大檔案表空間一批,對應xtt3

最後總時間理論就是備這個8T的時間,這個是最後的瓶頸,目前條件下沒法再優化了。

那這種分批執行具體要怎麼來做呢?

假設:

  • 普通小檔案表空間:TEST,JINGYU
  • 大檔案表空間Part1:BG1
  • 大檔案表空間Part2:BG2,BG3

之前已有TEST,JINGYU表空間,現在模擬新增大檔案表空間BG1,BG2,BG3:

SQL> create bigfile tablespace BG1 datafile '/flash/oradata/DEMO/fb6d1d5d4f0a245be0530b01a8c024da/datafile/bg1.dbf' size 2G;

Tablespace created.

SQL> create bigfile tablespace BG2 datafile '/flash/oradata/DEMO/fb6d1d5d4f0a245be0530b01a8c024da/datafile/bg2.dbf' size 1G;

Tablespace created.

SQL> create bigfile tablespace BG3 datafile '/flash/oradata/DEMO/fb6d1d5d4f0a245be0530b01a8c024da/datafile/bg3.dbf' size 1G;

Tablespace created.

首先指令碼直接拷貝新的3份出來:

[oracle@bogon ~]$ pwd
/home/oracle
[oracle@bogon ~]$ ls -ld xtt
drwxr-xr-x. 3 oracle oinstall 4096 Jul  5 23:00 xtt
[oracle@bogon ~]$ cp -rp xtt xtt1
[oracle@bogon ~]$ cp -rp xtt xtt2
[oracle@bogon ~]$ cp -rp xtt xtt3
[oracle@bogon ~]$ ls -ld xtt*
drwxr-xr-x. 3 oracle oinstall 4096 Jul  5 23:00 xtt
drwxr-xr-x. 3 oracle oinstall 4096 Jul  5 23:00 xtt1
drwxr-xr-x. 3 oracle oinstall 4096 Jul  5 23:00 xtt2
drwxr-xr-x. 3 oracle oinstall 4096 Jul  5 23:00 xtt3

修改下組態檔:
1)xtt是全部表空間的備份,不做任何拆分:

[oracle@bogon xtt]$ grep -vE '^#|^$' xtt.properties 
tablespaces=TEST,JINGYU,BG1,BG2,BG3
platformid=13
src_scratch_location=/flash/xtts
dest_datafile_location=+DATADG
dest_scratch_location=/xtts
parallel=3
rollparallel=2
getfileparallel=4
srcconnstr=sys/oracle@jingyu
destconnstr=sys/oracle@jingyu

2)下面xtt1,xtt2,xtt3就是按我上面的策略做的拆分,3個部分加起來相當於上面全部的表空間:

[oracle@bogon xtt1]$ grep -vE '^#|^$' xtt.properties 
tablespaces=TEST,JINGYU
platformid=13
src_scratch_location=/flash/xtts/xtt1
dest_datafile_location=+DATADG
dest_scratch_location=/xtts/xtt1
parallel=3
rollparallel=2
getfileparallel=4
srcconnstr=sys/oracle@jingyu
destconnstr=sys/oracle@jingyu

[oracle@bogon xtt2]$ grep -vE '^#|^$' xtt.properties 
tablespaces=BG1
platformid=13
src_scratch_location=/flash/xtts/xtt2
dest_datafile_location=+DATADG
dest_scratch_location=/xtts/xtt2
parallel=3
rollparallel=2
getfileparallel=4
srcconnstr=sys/oracle@jingyu
destconnstr=sys/oracle@jingyu

[oracle@bogon xtt3]$ grep -vE '^#|^$' xtt.properties 
tablespaces=BG2,BG3
platformid=13
src_scratch_location=/flash/xtts/xtt3
dest_datafile_location=+DATADG
dest_scratch_location=/xtts/xtt3
parallel=3
rollparallel=2
getfileparallel=4
srcconnstr=sys/oracle@jingyu
destconnstr=sys/oracle@jingyu

我這裡實測src_scratch_location最開始都是設定的/flash/xtts,是可以的。但為了更好區分每個部分,建議選擇分開不同目錄。
另外在分了任務之後,就需要特別注意TMPDIR的設定了,因為每次不一樣,我這裡設計都是對應xtts指令碼目錄中的tmp目錄下:

所有表空間使用一個perl指令碼一起備份:

# xtt_full:
export TMPDIR=/home/oracle/xtt/tmp
$ORACLE_HOME/perl/bin/perl xttdriver.pl --backup --debug 3

SESSION_KEY INPUT_TYPE           STATUS               START_TIME          END_TIME              INPUT_MB  OUTPUT_MB    SECONDS
----------- -------------------- -------------------- ------------------- ------------------- ---------- ---------- ----------
       5097 DATAFILE FULL        COMPLETED            2023-07-05 23:26:31 2023-07-05 23:26:47   2,048.00   2,048.00         16
       5099 DATAFILE FULL        COMPLETED            2023-07-05 23:26:50 2023-07-05 23:26:58   1,024.00   1,024.00          8
       5101 DATAFILE FULL        COMPLETED            2023-07-05 23:27:00 2023-07-05 23:27:16   2,048.00   2,048.00         16
       5103 DATAFILE FULL        COMPLETED            2023-07-05 23:27:19 2023-07-05 23:27:35   2,048.00   2,048.00         16

2023-07-05 23:26:31 到 2023-07-05 23:27:35
共備份7G的檔案,耗時1分零4秒。

表空間按我之前說的策略拆分,每個perl指令碼對應一部分任務,分別開啟備份:

# xtt_part1:
export TMPDIR=/home/oracle/xtt1/tmp
$ORACLE_HOME/perl/bin/perl xttdriver.pl --backup --debug 3

# xtt_part2:
export TMPDIR=/home/oracle/xtt2/tmp
$ORACLE_HOME/perl/bin/perl xttdriver.pl --backup --debug 3

# xtt_part3:
export TMPDIR=/home/oracle/xtt3/tmp
$ORACLE_HOME/perl/bin/perl xttdriver.pl --backup --debug 3

這裡直接開三個視窗同時執行,觀察RMAN的執行情況:

SESSION_KEY INPUT_TYPE           STATUS               START_TIME          END_TIME              INPUT_MB  OUTPUT_MB    SECONDS
----------- -------------------- -------------------- ------------------- ------------------- ---------- ---------- ----------
       5105 DATAFILE FULL        RUNNING              2023-07-05 23:31:39 2023-07-05 23:31:53   2,048.00   2,048.00         14
       5106 DATAFILE FULL        RUNNING              2023-07-05 23:31:41 2023-07-05 23:31:53   1,024.00   1,024.00         12
       5109 DATAFILE FULL        RUNNING              2023-07-05 23:31:45 2023-07-05 23:31:53   2,048.00   2,048.00          8

執行完之後:

SESSION_KEY INPUT_TYPE           STATUS               START_TIME          END_TIME              INPUT_MB  OUTPUT_MB    SECONDS
----------- -------------------- -------------------- ------------------- ------------------- ---------- ---------- ----------
       5105 DATAFILE FULL        COMPLETED            2023-07-05 23:31:39 2023-07-05 23:32:05   2,048.00   2,048.00         26
       5106 DATAFILE FULL        COMPLETED            2023-07-05 23:31:41 2023-07-05 23:32:07   1,024.00   1,024.00         26
       5109 DATAFILE FULL        COMPLETED            2023-07-05 23:31:45 2023-07-05 23:32:11   2,048.00   2,048.00         26
       5112 DATAFILE FULL        COMPLETED            2023-07-05 23:32:09 2023-07-05 23:32:25   1,024.00   1,024.00         16
       5114 DATAFILE FULL        COMPLETED            2023-07-05 23:32:14 2023-07-05 23:32:31   1,024.00   1,024.00         17

2023-07-05 23:31:39 到 2023-07-05 23:32:31
這種採用拆分xtts任務的方式,手工並行備份7G的檔案,耗時52秒。

因為我這裡測試環境資源有限,並行多個perl指令碼的提升還不夠明顯,但即使這樣也能看到有提升。
注意觀察RMAN執行情況時,我特意擷取了執行中的一個狀態,實際從STATUS中三個同時RUNNING的狀態,就可以知道,並行多個perl指令碼可以讓之前等待序列的大檔案能夠先並行和其他任務一起跑起來,這必然就會提升效率了。

附:本文中查詢RMAN執行情況SQL如下:

set lines 180 pages 200  
COL INPUT_TYPE FORMAT a20
COL STATUS FORMAT a20
COL minutes FORMAT 999.999
COL Input_mb FORMAT 99,999.99
COL Output_mb FORMAT 99,999.99

SELECT SESSION_KEY, INPUT_TYPE, STATUS,
TO_CHAR(START_TIME,'yyyy-mm-dd hh24:mi:ss') start_time,
TO_CHAR(END_TIME,'yyyy-mm-dd hh24:mi:ss') end_time,
INPUT_BYTES/1024/1024 Input_mb,
OUTPUT_BYTES/1024/1024 Output_mb,
ELAPSED_SECONDS Seconds
FROM V$RMAN_BACKUP_JOB_DETAILS
ORDER BY SESSION_KEY;

最後留給大家一個思考題,如果說你有客戶使用XTTS方案遷移,但其資料庫中就只有一個大檔案表空間,這種情況你會如何做呢?