在上篇《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方案迁移,但其数据库中就只有一个大文件表空间,这种情况你会如何做呢?

XTTS系列之五:警惕大文件表空间的更多相关文章

  1. 【Oracle】删除(释放)数据文件/表空间流程

    oracle删除(释放)数据文件/表空间流程 生产环境:数据库里空间不足,niptest 表空间251G,只使用了17G 再alter database datafile '...../niptest ...

  2. 【Oracle XE系列之四】创建OracleXE表空间详解

    创建OracleXE表空间示例 sqlplus /nolog connect sys as sysdba SQL> create tablespace OPFOCN  datafile 'C:\ ...

  3. 如何删除offline数据文件/表空间上的分区

    接上一篇"Oracle 10g RAC全库flashback " http://www.cnblogs.com/cqubityj/p/3265552.html 在打开数据库之前把2 ...

  4. 表空间与数据文件Offline,online的区别

    首先明确,表空间与数据文件的关系:Oracle数据库表空间有两种,一种smallfile小文件表空间(默认),另一种bigfile大文件表空间: 默认表空间与数据文件的关系:允许一对多的处理方式,一个 ...

  5. OCM_第三天课程:Section1 —》表空间的操作和管理、服务配置

    注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...

  6. Oracle表空间概述及其基本管理

    最近在工作中遇到有同事对Oracle表空间的理解有问题,所以写了这篇文章.我会从概念,管理及特别需要关注的点等几个维度对表空间进行一些介绍.本文以介绍表空间为主,涉及到的其他概念不展开描述.有问题的地 ...

  7. oracle表空间简单学习

    1.重命名表空间:alter tablespace 原表空间名 rename to 新表空间名ps:(1)system 和sysaux表空间不能重名(2)如果该表空间中任何一个数据出于脱机状态或者表空 ...

  8. Oracle表空间,用户,用户授权

    一:Oracle表空间 1,Oracle表空间与SQL Server文件组对比 SQL Server的文件组(文件组包括若干MDF,NDF数据文件)对我们来说并不陌生,前段时间我在博客“怎样玩转千万级 ...

  9. oracle表空间相关

    数据库被划分为若干个表空间,每个表空间内保存一组相关的逻辑对象.每个表空间由一个或者多个数据文件组成.oracle中的数据逻辑上存储在表空间里,物理上存储在属于该表空间的数据文件里.表空间是用户和物理 ...

  10. Oracle表空间、段、区和块

    数据块(Block) 数据块Block是Oracle存储数据信息的最小单位.注意,这里说的是Oracle环境下的最小单位.Oracle也就是通过数据块来屏蔽不同操作系统存储结构的差异.无论是Windo ...

随机推荐

  1. [数据库]MySQL之备份与恢复【未完待续】

    1 恢复 方式一 source sqlFile.sql 登陆MySQL 创建数据库db (create database db;) 进入/使用 数据库db (use db;) 将要导入的sql文件放到 ...

  2. LINUX 下LAMP之yum方法部署环境

    一. 系统组成 系统由前台网站和后台保种服务两部分组成,其中后台保种可以扩展成多台设备,提高保种的资源量以及性能.下面安装以houtaiip代表后台保重服务器ip地址,qiantaiip代表前台网站i ...

  3. PHPCMSV9 单文件上传功能代码

    后台有"多文件上传"功能,但是对于有些情况,我们只需要上传一个文件,而使用多文件上传功能上传一个文件,而调用时调用一个文件太麻烦了. 所以我就自己动手,参考其他字段类型的网站,研究 ...

  4. include-file

    0X01 前言 这篇文章介绍文件包含漏洞. 0X02 最常见的两个函数的形象解释: 我们知道文件包含最常见的是两个函数 include() require()(这里就不谈他们的亲戚 include_o ...

  5. blog图片资源

  6. SpringBoot 使用 Sa-Token 完成权限认证

    一.设计思路 所谓权限认证,核心逻辑就是判断一个账号是否拥有指定权限: 有,就让你通过. 没有?那么禁止访问! 深入到底层数据中,就是每个账号都会拥有一个权限码集合,框架来校验这个集合中是否包含指定的 ...

  7. java封装和关键字

    一.封装 封装:告诉我们如何正确设计对象的属性和方法 对象代表什么,就得封装对应的数据,并提供数据对应的行为 封装的好处: 让编程变得很简单,有什么事,找对象,调方法 降低学习成本,可以少学,少记,或 ...

  8. 【Python基础】字典的基本使用

    字典是由一系列键值对组成的无序集合.每个键值对包含一个键和一个对应的值.键必须是不可变的,如字符串.数字或元组.值可以是任意类型的对象.字典可以使用花括号({})或者内置函数dict()来创建. di ...

  9. 2022-11-04:给定一个正数n,表示有多少个节点 给定一个二维数组edges,表示所有无向边 edges[i] = {a, b} 表示a到b有一条无向边 edges一定表示的是一个无环无向图,也

    2022-11-04:给定一个正数n,表示有多少个节点 给定一个二维数组edges,表示所有无向边 edges[i] = {a, b} 表示a到b有一条无向边 edges一定表示的是一个无环无向图,也 ...

  10. 2021-11-12:前 K 个高频元素。给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。提示:1 <= nums.length <=

    2021-11-12:前 K 个高频元素.给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素.你可以按 任意顺序 返回答案.提示:1 <= nums.length ...