1.使用V$视图诊断RMAN性能问题
通常,通过使用V$视图来确认RMAN备份和还原操作的哪个环节遇到问题来开始调优过程。
1.1.使用V$SESSION_LONGOPS监控RMAN作业进度
可以通过查询视图V$SESSION_LONGOPS监控备份和还原作业的进度。RMAN在V$SESSION_LONGOPS使用两个行类型:详情行和汇总行。
详情行描述被一个作业步骤正在处理的文件,而汇总行描述被一个RMAN命令中所有作业步骤处理的文件。一个作业步骤是创建或还原一个备份集或数据文件副本。详情行使用每个在备份步骤期间读取或写入的缓存更新,因此它们的更新粒度是小的。汇总行是当每个作业步骤完成时更新,因此它们的更新粒度是大的。
下表描述V$SESSION_LONGOPS中RMAN最相关的列。通常,你查看详情行而不是汇总行来确认每个备份集的进度。
列 | 详情行的描述 |
---|---|
SID | 对应于RMAN通道的服务器会话ID |
SERIAL# | 服务器会话序列号。每次服务器会话被重用时这个值会更改。 |
OPNAME | 行的文本描述。详情行的示例包括RMAN:datafile copy,RMAN:full datafile backup和RMAN:full datafile restore。注:RMAN:aggregate input和RMAN:aggregate output是仅有的汇总行。 |
CONTEXT | 对于备份输出行,这个值是2。对于除代理拷贝(它不更新这个列)的所有其它行,这个值是1。 |
SOFAR | 这个列的含义取决于这个行描述的操作类型:1)对于映像副本,已经读取的块的数量。2)对于备份输入行,从正在备份的文件中已经读取的块的数量。3)对于备份输出行,已经写到备份片的块的数量。4)对于还原,在这个作业步骤中已经处理到正在被还原的文件的块的数量。5)对于代理拷贝,已经被拷贝的文件的数量。 |
TOTALWORK | 这个列的含义取决于这个行描述的操作类型:1)对于映像副本,文件中的块的总数量。2)对于备份输入行,在这个作业步骤中从所有文件中读取的块的总数量。3)对于备份输出行,这个值是0,因为RMAN不知道多少个块它会写到任何备份片。4)对于还原,在这个作业步骤中所有被还原的文件中的块的总数量。5)对于代理拷贝,在这个作业步骤中已经被拷贝的文件的总数量。 |
每个执行备份或还原作业的服务器会话报告它与作业步骤要求的总工作相比的进度。例如,如果你使用两个通道还原数据库,每个通道有两个备份集要还原(总共是4个备份集),那么每个服务器会话报告它通过一个单一的备份集的进度。当一个备份集被完成还原时,RMAN开始报告下一个要还原的备份集的进度。
监控RMAN作业进度:
1)在启动RMAN作业之前,创建一个脚本文件(名为longops),包含以下SQL语句:
SELECT SID, SERIAL#, CONTEXT, SOFAR, TOTALWORK,
ROUND(SOFAR/TOTALWORK*100,2) “%_COMPLETE”
FROM V$SESSION_LONGOPS
WHERE OPNAME LIKE ‘RMAN%’
AND OPNAME NOT LIKE ‘%aggregate%’
AND TOTALWORK != 0
AND SOFAR <> TOTALWORK;
2)启动RMAN,连接到目标数据库和恢复目录(如果有使用)。
3)启动RMAN作业。
RMAN> RESTORE DATABASE;
4)当RMAN作业正在运行时,启动SQL*Plus,连接到目标数据库,执行longops脚本检查RMAN作业的进度。如果当RMAN作业前进时你重复查询,那么你看到如下输出:
SQL> @longops
SID SERIAL# CONTEXT SOFAR TOTALWORK %_COMPLETE
---------- ---------- ---------- ---------- ---------- ----------
8 19 1 10377 36617 28.34
SQL> @lon ops
SID SERIAL# CONTEXT SOFAR TOTALWORK % COMPLETE
---------- ---------- ---------- ---------- ---------- ----------
8 19 1 21513 36617 58.75
SQL> @longops
SID SERIAL# CONTEXT SOFAR TOTALWORK % COMPLETE
---------- ---------- ---------- ---------- ---------- ----------
8 19 1 29641 36617 80.95
SQL> @longops
SID SERIAL# CONTEXT SOFAR TOTALWORK % COMPLETE
---------- ---------- ---------- ---------- ---------- ----------
8 19 1 35849 36617 97.9g
SQL> @longops
no rows selected
5)如果你以2分钟或更多的时间间隔运行longops脚本和%_COMPLETE列不增长,那么RMAN在遇到问题。
1.2.使用V$BACKUP_SYNC_IO和V$BACKUP_ASYNC_IO发现瓶颈
你可以使用V$BACKUP_SYNC_IO和V$BACKUP_ASYNC_IO视图来确认备份源或还原瓶颈和查看备份作业的详细进度。
V$BACKUP_SYNC_IO包含行当I/O与执行备份的进程(在某些平台上是线程)同步时。V$BACKUP_ASYNC_IO包含行当I/O是异步时。异步I/O使用I/O进程或因为它被底层的操作系统支持而获得。
备份或还原作业的结果保留在内存中直到数据库实例关闭。因此,你可以在作业完成后查询视图。
当I/O是同步时,确认磁带是否在流动(streaming):
1)启动SQL*Plus,连接到目标数据库。
2)查询V$BACKUP_SYNC_IO或V$BACKUP_ASYNC_IO视图中的EFFECTIVE_BYTES_PER_SECOND列。
如果EFFECTIVE_BYTES_PER_SECOND比硬件的裸容量更少,那么磁带没有在流动。如果EFFECTIVE_BYTES_PER_SECOND比硬件的裸容量更大,磁带可能或可能不在流动。压缩可能会导致EFFECTIVE_BYTES_PER_SECOND比真实I/O的速度更大。
1.2.1.辨认同步I/O的瓶颈
查询视图V$BACKUP_SYNC_IO来辨认同步I/O的瓶颈。
对于同步I/O,要识别特定的瓶颈是很困难的,因为所有同步IO对于进程都是一个瓶颈。调优同步IO的唯一方法是与设备的最大吞吐速率比较速率(每秒的字节数)。如果速率比设备指定的低,那么考虑调优备份和还原进程的这个方面。
确认同步I/O速率:
1)启动SQL*Plus,连接到目标数据库。
2)查询V$BACKUP_SYNC_IO视图中的DISCRETE_BYTES_PER_SECOND列来显示I/O速率。
如果在V$BACKUP_SYNC_IO中看到数据,那么问题是没有启用异步I/O或你没有正在使用磁盘I/O slaves。
1.2.2.辨认异步I/O的瓶颈
查询视图V$BACKUP_ASYNC_IO来辨认异步I/O的瓶颈。
Long waits是备份或还原进程通知操作系统等待直到I/O完成的次数。Short waits是备份或还原进程在非阻塞模式中做操作系统调用来轮询I/O完成的次数。Ready指示当I/O准备好使用的次数,因此不需要做操作系统调用来轮询I/O完成。
确认异步I/O速率:
1)启动SQL*Plus,连接到目标数据库。
2)查询V$BACKUP_ASYNC_IO视图中的LONG_WAITS和IO_COUNT列来显示I/O速率。
辨认瓶颈的最简单方式是找到具有最大的LONG_WAITS/IO_COUNT的数据文件。例如,可以使用以下查询:
SELECT LONG_WAITS/IO_COUNT, FILENAME
FROM V$BACKUP_ASYNC_IO
WHERE LONG_WAITS/IO_COUNT > 0
ORDER BY LONG_WAITS/IO_COUNT DESC;
注:如果你有同步I/O但你设置了BACKUP_DISK_IO_SLAVES,那么I/O显示在V$BACKUP_ASYNC_IO。
2.调优RMAN备份性能
2.1.从通道设置中移除RATE参数
通道中的RATE参数是用来减少而不是增加备份吞吐量以便磁盘带宽可用于其它数据库操作。如果备份没有流动(streaming)到磁带,那么确认没有设置RATE参数。
移除RATE参数:
1)检查备份脚本。
2)做以下其中一个操作:
a.如果备份是在RUN命令中,那么从ALLOCATE命令中移除RATE参数,如果它被指定。跳过剩余的步骤。
b.如果备份不在RUN命令中,那么启动RMAN,连接到目标数据库,执行SHOW ALL命令来显示当前配置的设置。从CONFIGURE CHANNEL命令中移除RATE参数,如果它被设置。
2.2.设置DBWR_IO_SLAVES来模拟异步I/O
某些操作系统支持原生异步I/O。如果和如果仅仅是磁盘不支持异步I/O,那么设置DBWR_IO_SLAVES。DBWR_IO_SLAVES任何非零值会引起使用固定数量的磁盘I/O slaves模拟异步I/O进行备份和还原。
启用磁盘I/O slaves:
1)启动SQL*Plus和连接到目标数据库。
2)关闭数据库。
3)设置DBWR_IO_SLAVES初始化参数到非零值。
这个设置让数据库写进程使用slaves。因此,你可能需要增加初始化参数PROCESSES的值。
4)重启数据库。
5)重启RMAN备份。
2.3.设置LARGE_POOL_SIZE来解决共享内存问题
设置LARGE_POOL_SIZE初始化参数如果数据库在alert日志中报错说它没有足够的内存和它不能启动I/O slaves。
alert日志信息与以下类似:
ksfqxcre: failure to allocate shared memory means sync I/O will be used whenever
async I/O to file not supported natively
large pool用来给RMAN和其它目的使用,因此总大小必须满足所有需要。这个更是如此,如果设置了DB_IO_SLAVES和DBWR进程需要缓存。
设置large pool大小:
1)启动SQL*Plus,连接到目标数据库。
2)可选地,查询V$SGASTAT.POOL来确认对象的内存会驻留在哪个池中(共享池或大池)。
3)设置目标数据库的LARGE_POOL_SIZE初始化参数。
可以执行ALTER SYSTEM SET语句动态设置参数。设置LARGE_POOL_SIZE的公式如下:
LARGE_POOL_SIZE = number_of_allocated_channels *(16 MB + ( 4 * size_of_tape_buffer ) )
4)重启RMAN备份。
2.4.调优读,写和拷贝阶段
查看官方文档《Oracle Database Backup and Recovery User’s Guide,19c》的23.4.4章节。
来源:《Oracle Database Backup and Recovery User’s Guide,19c》