在上篇《XTTS系列之四:迷迷糊糊的并行度》验证之后,就让测试组在RMAN配置中设置好正确的并行。然后重新将备份任务执行,平均速度直接由之前的150MB/s提升为1200MB/s。优化效果非常明显,速度直接提升了8倍。但是由于用户的数据库存在大文件表空间,当执行到大文件表空间时,速度又降到150MB/s的速度,无法使用并行。
我们知道大文件表空间在11g引入了Multi-Section,可以通过指定section size来用到并行,但现在很尴尬的是:
也就是说,就是无法用到并行。
那用户还要继续要求优化速度,想想这该怎么办呢?
...
讨论阶段有合作伙伴提出让原厂来改脚本,这条路基本很难,不甘心可以去MOS提SR给后台要求,后续有机会我也会和公司反馈,当提这样需求的关键用户多了,在后续xtts版本就有希望会加入这个功能,但对于当下依然是远水解不了近渴。
既然改脚本不靠谱,那我们又该如何继续优化呢?
...
首先了解下目前客户大文件表空间情况:具体有多个大文件表空间,其中最大的那个大小在8T,其余几个加起来小于8T;
此时庆幸还好不是1个,基于这个背景,workaround的方案就有了,使用当前xtts的perl脚本手工并行来做,分成3批,比如xtt1,xtt2,xtt3:
最后总时间理论就是备这个8T的时间,这个是最后的瓶颈,目前条件下没法再优化了。
那这种分批执行具体要怎么来做呢?
假设:
之前已有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方案迁移,但其数据库中就只有一个大文件表空间,这种情况你会如何做呢?