oracle - 自动优化器统计收集作业导致 Oracle RDS 数据库重新启动
问题描述
我们在 AWS RDS 上有一个 Oracle 19C 数据库 (19.0.0.0.ru-2021-04.rur-2021-04.r1),它托管在一个 4 CPU 32 GB RAM 实例上。数据库的大小不大(35 GB),PGA Aggregate Limit 为 8GB,Target 为 4GB。每当计划的内部 Oracle Auto Optimizer Stats Collection Job (ORA$AT_OS_OPT_SY_nnn) 运行时,它会消耗大量 PGA 内存(大约 7GB),有时这会使数据库变得不稳定,AWS 会失去与 RDS 实例的通信,因此它会重新启动数据库。
我们认为这可能与现有的 Oracle 错误 30846782(19C+:使用 DBMS_STATS.GATHER_TABLE_STATS 时 PGA 快速/过度增长)有关,但 Oracle 和 AWS 已在我们使用的当前 19C 版本中修复了它。没有应用程序级别的操作会消耗这么多 PGA,并且在自动优化器统计收集作业运行时总是会重新启动数据库。还有几个数据库,它们在相同的版本上,观察到相同的模式并且数据库由 AWS 重新启动。我们现在已经在这些数据库上禁用了该作业,以避免进一步发生此问题,但是我们希望运行此作业,因为禁用它可能会导致旧的统计信息在数据库中可用。
有关如何解决此问题的任何指示?
解决方案
与其完全放弃自动收集统计信息,不如尝试找出导致问题的任何特定对象。如果只有少数表负责收集大量统计信息,您可以手动分析这些表或更改它们的首选项。
首先,使用下面的 SQL 来查看哪些对象导致了最多的统计信息收集。根据 bug 30846782 中的测试用例,问题似乎只与调用 DBMS_STATS的次数有关。
select *
from dba_optstat_operations
order by start_time desc;
此外,您可以通过以下查询找到生成大量 PGA 内存的特定 SQL 语句或会话。(但是,如果数据库重新启动,AWR 可能不会保存记录的值。)
select username, event, sql_id, pga_allocated/1024/1024/1024 pga_allocated_gb, gv$active_session_history.*
from gv$active_session_history
join dba_users on gv$active_session_history.user_id = dba_users.user_id
where pga_allocated/1024/1024/1024 >= 1
order by sample_time desc;
如果问题仅与具有大量分区的少量表有关,您可以在单独的会话中手动收集该表的统计信息。收集统计信息后,在更改大约 10% 的数据之前不会再次分析该表。
begin
dbms_stats.gather_table_stats(user, 'PGA_STATS_TEST');
end;
/
数据库花费很长时间收集统计数据的情况并不少见,但数据库不断分析数千个对象的情况并不罕见。遇到这个错误意味着您的数据库有一些不寻常的地方——您是否不断地删除和创建对象,或者您是否有大量的对象每天修改 10% 的数据?您可能需要在一些流程中添加手动收集步骤。
完全关闭自动统计作业最终会导致许多性能问题。即使您无法添加手动收集步骤,您仍可能希望保持启用该作业。例如,如果表的分析过于频繁,您可能希望将“STALE_PERCENT”阈值的表首选项从 10% 增加到 20%:
begin
dbms_stats.set_table_prefs
(
ownname => user,
tabname => 'PGA_STATS_TEST',
pname => 'STALE_PERCENT',
pvalue => '20'
);
end;
/
推荐阅读
- momentjs - momentjs 在时区之间切换,时差为 12 小时或更长时间
- python - 在 Python 中的 Selenium Webdriver 中的可重复类中按标题获取元素
- ruby - Ruby 程序中的案例代码无法使用传递的值
- html - 在未知大小的非固定标题下方填充剩余屏幕高度
- amazon-web-services - Datadog 中的 AWS Cloudwatch 警报
- php - PHP中每5年从MySQL分组中动态选择输入
- r - 如何创建一个循环:将 4 个月的错误项相加,然后除以 r 中等效的 4 个月真实数字的总和?
- python - 盈透证券 TWS API 上的 IB Insync 期货订单问题
- php - 将 Ajax 与 php 站点一起使用
- javascript - 将幻灯片值的 ID 分配给变量