由于过去时间挺久得了 那个时候的记录都找不到了 大概看下解决思路
公司前端反应 操作慢、卡顿
一开始猜测网络问题 (走的内部VPN 可能会导致这个问题)切换网络之后还是有问题 这时候登录数据库服务器感觉卡顿
一查top 发现根本不正常 平时基本只有个位数的负载 这次一看有70+(32cpus 64Gmem) 业务高峰是一个问题 推断应该就是数据库出现了问题
进入数据库 查等待事件和blocking_session
发现等待事件 基本就是shard_pool 和libnary_cache 这类的数据字典相关 sql解析问题
初步推测sql 应该有大量DDL和硬解析问题
这个时候 去跑@?/rdbms/admin/awrrpt.sql 也没办法 根本跑不出来
只能建议先停会业务
exec dbms_workload_repository.create_snapshot 产生awr快照 生成 awr
从awr 验证上面的推测 果然存在大量的DDL(建表语句) 从sql_top 观察发现极大的sql硬解析问题
和开发沟通 果然是因为没有采用绑定变量 问题
数据库这边打开 CURSOR_SHARING 测试 发现load 并没有下降
(
CURSOR_SHARING
EXACT 默认,不替换
SIMIAR 当替换不会影响到执行计划时,才会将字面量替换成绑定变量
FORCE 只要有可能,字面量会被替换为绑定变量
)
这边考虑打开大页 使得sga 全部bind到memory中 再后续观察 是否有相同的情况产生
步骤:
1:关闭AMM=============>MEMORY_TARGET / MEMORY_MAX_TARGET设为0
2.去mos 上看文档(401749.1)计算出你服务器需要的大页 计算出的页数*2M 对于基本只跑Oracle的服务 设置大小大概为SGA大小 多那么一页就差不多
3.vi /etc/sysctl.conf
vm.nr_hugepages = 你的页数
sysctl -p
vi /etc/security/limits.conf
oracle soft memlock 页数+1 *1024
oracle hard memlock 页数+1 *1024
重启数据库
watch -n1 'cat /proc/meminfo |grep -i HugePage'