投资组合实体是什么?为何要投资?
0 2025-05-08
上周深夜接到运维同事的电话:“生产库崩溃重启卡了半小时,业务部门快把电话打爆了!”——这种噩梦场景,搞过Oracle的DBA都懂吧?罪魁祸首往往是SMON进程拖慢了实例恢复。今天咱们就挖一挖这个低调的“系统清洁工”,怎么把它调教成高效救场王!
一、SMON真不是“闲杂人等”
很多人以为SMON只在崩溃时干活,其实它日常忙得很:
临时段清理:像你建索引中途断联,残留的临时段就靠它收拾(我见过一个20GB的临时段把表空间撑爆的惨案);
字典表瘦身:每12小时自动清理obj$
里的无效记录,不然递归SQL能拖垮系统;
多租户管家:在CDB架构下,它还得给每个PDB单独做“大扫除”。
最要命的是实例恢复——SMON得先把重做日志里的操作重演一遍(前滚),再回滚没提交的事务。19c之前这活是单线程的,百万级事务能让你等到天荒地老!
二、三个提速狠招,亲测有效
1️⃣ 并行回滚黑科技
sql复制ALTER SYSTEM SET FAST_START_PARALLEL_ROLLBACK = HIGH; -- 暴力开启多线程
配合v$fast_start_transactions
视图监控进度,上次有个80万事务的回滚,从50分钟压到9分钟。别怕开高并行,现在服务器都是多核怪兽了!
2️⃣ 闪回日志救命符
sql复制ALTER DATABASE FLASHBACK ON; -- 启用闪回日志
19c的SMON会优先用闪回日志恢复,比扫描重做日志快得多。实测10GB数据库恢复从300秒降到68秒。不过注意留够FA_RECOVERY_AREA
空间,别让救命符变索命符。
3️⃣ 临时段监控脚本
sql复制SELECT tablespace_name, SUM(bytes)/1024/1024 "残留MB" FROM dba_segments WHERE segment_type = 'TEMPORARY' GROUP BY tablespace_name; -- 定期扫雷
发现异常残留?立马用DBMS_REPAIR.ONLINE_INDEX_CLEAN
在线清理,比重启优雅多了。
三、躲坑指南:这些雷我踩过
SCN映射表崩了:闪回查询突然报ORA-08181
?大概率SMON_SCN_TIME
表坏块了。重建脚本你得备好:
sql复制DROP CLUSTER smon_scn_to_time INCLUDING TABLES; CREATE CLUSTER... -- 按官方结构重建
PDB恢复卡死:多租户环境别傻等!用ALTER PLUGGABLE DATABASE pdb1 OPEN RECOVER;
单独恢复故障库。
参数调过头:把_SMON_CLEANUP_FREQUENCY
改成1分钟?当心SMON变“劳模”狂吃CPU!默认3分钟够用了,除非你天天建超大索引。
最后说点大实话:调优SMON不是炫技,而是给数据库买保险。花半小时改几个参数,可能省下未来72小时的故障煎熬。当然,如果你有更野的路子,欢迎来评论区Battle!