暂无图片
暂无图片
5
暂无图片
暂无图片
暂无图片

控制文件问题引起的log file sync

617

Part1问题环境

Oracle 11GR2 Rac

Linux服务器

Part2问题定位

群友发了一个AWR报告,说是数据库负载特比高,需要帮忙看看什么情况

2.1、查看数据库负载

DB Time / Elapsed = 207.26 倍

null 负载很大

2.2、判断数据库使用类型

null 要初步判断数据库的适用类型,究竟是逻辑型数据库还是IO型数据库,这个有助于接下来的分析思路

每秒 Redo的产生量是 45kb/s,低的吓人

每秒逻辑读的产生量是 445MB/s

每秒物理读的产生量是 189M/s

每秒物理写的产生量是 0.1M/s

每秒硬解析的产生量是 6.7个/s

每秒事务的产生量是 9.8个/s

基本判断数据库属于逻辑型数据库,数据量产生的很小,物理读的也不小,但是在这里我基本判断还是一个由于查询事务导致的数据库高负载,只不过逻辑查询更严重一些。

2.3、数据库命中率判断

null Redo NoWait %这个数值低于95%就需要严重关注,它的含义是redo提交不需要等待的百分比,这个已经到了负值,说明数据库提交方面遇到了很严重的问题。

2.4、等待时间排序的等待事件

null 问题太多,一下子不知道该看哪个了,

总的来说由commit和system I/O更显眼一点,这里注意到的是控制文件读和log file sync排第一和第二,这个情况在DBA攻坚指南看到过。属于是引起log file sync的种类之一,因为控制文件太大或者归档操作太过频繁引起的。

cluster等待事件的热点块也许是原因也许是结果,需要第二层关注

2.5、判断等待类型的时间排序

null %DBTIME加起来没到100%,大约只有50%,说明这台服务器要么是CPU太老旧,要么是这台服务器有其他的服务在使用,划分走了机器的CPU

%WIO说是CPU因为等待IO计算的百分比,在CPU拉跨的情况下,IO等待百分比还是这么高,实在是太夸张了

尤其是log file sync等待事件的情况下,应该现在优先判断一下磁盘的情况

看看io
of=/soft/testdisk/io_test.bin 
指的是redo日志磁盘路径生成的压测文件

dd if=/dev/zero of=/soft/testdisk/io_test.bin bs=8192 count=1000 oflag=direct

注意:严重危险,不熟悉的情况下,建议云平台或者存储人员操作

2.6、零零碎碎的验证

null
null
null
null
SELECT MAX(SEQUENCE#) SEQUENCE, THREAD# THREAD FROM GV$ARCHIVED_LOG WHERE RESETLOGS_CHANGE# = (SELECT RESETLOGS_CHANGE# FROM V$DATABASE) AND STATUS='A' AND STANDBY_DEST='NO' GROUP BY THREAD#

按理来说,查询归档的sql成本不会这么大

null 日志切换频率,验证了和数据量没有什么关系

null 控制文件这么大的逻辑读是不正常的。

Part3问题解决

3.1、磁盘IO验证

看看io
of=/soft/testdisk/io_test.bin 
指的是redo日志磁盘路径生成的压测文件

dd if=/dev/zero of=/soft/testdisk/io_test.bin bs=8192 count=1000 oflag=direct

3.2、控制文件定位

判断步骤是

1、查询控制文件大小

2、查询归档大小和归档数量

3、查看这个时间段是否有归档的操作(尤其是删除)

解决方案

设置归档保留时间(不要再业务高峰清理)

控制 控制文件大小,看是否能缩一下

监控归档sql是否需要这么频繁,设置执行间隔

查看控制文件真实大小
select v.*,round(BLOCK_SIZE*FILE_SIZE_BLKS/1024/1024,2) from v$controlfile v;
null
查看控制文件构成及其每部分大小

record_size的单位是字节(bytes),
select type,record_size from v$controlfile_record_section order by record_size desc;

SELECT
    type AS "区域类型",
    records_total AS "预分配记录数",
    record_size AS "单条记录大小(字节)",
    -- 核心计算:区域总大小 = 记录数 × 每条大小
    ROUND((records_total * record_size) / 1024 /1024, 2) AS "总大小(MB)"
FROM v$controlfile_record_section
ORDER BY (records_total * record_size) DESC;


BACKUP_REDOLOG  40M
ARCHIVED_LOG    127.75M 
DELETED_OBJECT  1M
LOG_HISTORY     2M
null
查询现存的数据库归档,deleted表示归档是否删除,name一定要指定对,因为可能会有ADG,所以只需要看本地实际存在的就行。

SELECT 
    COUNT(1) AS "现存归档条数",
    ROUND(SUM(BLOCKS * BLOCK_SIZE) / 1024 / 1024,2) AS "总大小(MB)",
    MIN(FIRST_TIME) AS "最早归档时间",
    MAX(COMPLETION_TIME) AS "最新归档时间"
FROM v$archived_log 
WHERE 
    name IS NOT NULL  -- 确保是有效归档
    AND deleted = 'NO' -- 未被删除
    AND standby_dest = 'NO' -- 排除备用库归档;
null

后续发个截图发现是备库归档满了,导致数据库同步失败。

crosscheck backup;
crosscheck archivelog all;
delete noprompt archivelog all completed before 'sysdate-1';

Part4问题回溯

1、看到log file sync的时候,又看到控制文件,当时想的就是控制文件出现了问题,攻坚指南里但是写着enq: CF - contention是形影不离的关系,可是在top 10没看到,在后续的后台等待日志看到了,可惜是事后梳理发现的,说明等待事件之间的绑定关系还是记得不清

2、虽然直觉性直接去判断控制文件的大小,再去查归档的大小,而且在top 10的sql语句里发现了归档的查询,消耗占比排第二,当时是笃定就是他的问题,但是事后反思还是应该看看磁盘的IO,进行一下压测,可以更好地判断,到底是磁盘性能异常还是控制文件过大引起的。

3、后续群友更发了一个关于数据库归档无法传输,导致数据库归档积攒的报错,但是当时好多查询sql写的并不是那么准确,也给我的判断带来了误判,比如说现存归档的数量和大小,他给我的是所有的,而不是现存的。

4、最重要的是,还没进行归档删除,数据库负载自己降下来了,很奇怪,到底做了什么操作也没说。到底是业务下来了(因为已经是快下午六点了)还是磁盘异常恢复还是数据库监控归档sql停止,都没说,所以很难判断真正的原因。

Part5问题原理

控制文件的原理、作用、判断方式建议看看 《Oracle DBA实战攻略:运维管理、诊断优化、高可用与最佳实践》.(周亮)

到时候跟写一篇具体的吧

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论