是时候
关注
我们一波了
某年某月某日的一个下午,接收到监控服务器的一条告警短信:尊敬的运维工程师 XX,你好:“192.168.136.200”数据库服务器 CPU 异常,CPU 使用率 98.7%,请尽快处理。看到这个消息浑身一紧,赶紧掐灭手中的烟,跑回办公室。
以上段子纯属捏造,如有雷同,我反正是不改。
言归正传,本文是记录一次对达梦数据库的优化过程。
处理问题的第一步,是需要了解当前服务器的状况,我们通过以下两种手段确认服务器瓶颈。
通过上图我们看出 CPU 基本耗尽,IO 飙升。
sar 10 3
确认 CPU 被耗满,没有空闲。
通过我的细致观察,发现服务器 CPU 被耗满。接下来需要查看数据库服务器的配置参数是否合理,是否有慢查询脚本。
cd /dm7/dmdbms/devdb cat dm.ini | grep -E "MEMORY_POOL|MEMORY_TARGET|BUFFER"
发现数据库参数配置为安装时候的默认配置,参数不合理,需要优化参数配置。
cp dm.ini dm.ini.bak
参数 | 优化建议 | 优化后的值,单位 M |
---|---|---|
MEMORY_POOL | 建议为内存的 90% | 1800 |
MEMORY_TARGET | 建议为内存的 90% | 1800 |
BUFFER | 建议为内存的 60% | 1200 |
MAX_BUFFER | 建议为内存的 70% | 1400 |
MAX_SESSIONS | 1000 |
service DmServerdm restart
参数优化后我们尝试找出当前数据库存在的慢查询 SQL,看看是否可以优化。
达梦数据库不像 MySQL 可以直接将慢查询存放在指定位置,达梦需要通过 AWR 报告中找出慢查询。(AWR 报告大家自行百度) 启用 DM 快照需要调用 DBMS_WORKLOAD_REPOSITORY 包。
disql SYSDBA/password
SP_INIT_AWR_SYS(1);
SELECT SF_CHECK_AWR_SYS;
CALL DBMS_WORKLOAD_REPOSITORY.AWR_SET_INTERVAL(30);
DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();
这里我们可以间隔几分钟多执行几遍创建几个不同的快照。
查看创建的快照信息,包括快照 id:
SELECT * FROM SYS.WRM$_SNAPSHOT;
SELECT * FROM TABLE (DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML(1,2));
查看 snapshot 的 id 在 1~2 范围内的 AWR 分析报告的带 html 格式的内容。
这个内容格式基本没办法看,我们需要将其转化成 html 页面查看。
SQL Ordered by Elapsed Time 的内容就是慢查询语句。 在拿到慢查询语句后我们需要联系开发人员修改查询语句,这次优化过程中我通过给相关字段添加索引,改写一部分 SQL 完成。 但是数据表本身设计不合理这个没有优化,由于设计不合理导致查询没办法走索引;而有些查询则需要从业务角度进行优化,比如是否有必要对大表进行全表查询然后再排序?等等等等。。。(至于数据库 SQL 优化的具体策略我们下期再聊)
在完成优化后重启应用,再次通过sar 10 3
观察 CPU 性能,较优化前还是有不少的提升的,又可以抽空去抽根烟了。