Oracle 自动化运维与监控
Oracle 自动化运维与监控
适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
Oracle 自动化运维降低人工成本[1]:
自动化内容:
- 备份
- 统计收集
- 健康检查
- 监控告警
- 调度任务
2. 自动备份
2.1 RMAN 调度
# 脚本
#!/bin/bash
rman target / <<EOF
RUN {
BACKUP DATABASE PLUS ARCHIVELOG;
DELETE OBSOLETE;
}
EOF
2.2 调度
# crontab
0 2 * * * /u01/scripts/rman_backup.sh
2.3 OEM 调度
- 备份策略
- 自动调度
- 失败重试
详细见:Oracle RMAN 备份恢复。
3. 自动统计收集
3.1 自动任务
SELECT * FROM dba_autotask_client
WHERE client_name = 'auto optimizer stats collection';
3.2 启用
EXEC DBMS_AUTO_TASK_ADMIN.ENABLE(
client_name => 'auto optimizer stats collection',
operation => NULL,
window_name => NULL
);
3.3 窗口
SELECT * FROM dba_autotask_window_clients;
详细见:Oracle 直方图与统计信息。
4. 自动健康检查
4.1 健康检查
-- HM
SELECT * FROM v$hm_run;
SELECT * FROM dba_hm_findings;
-- 运行
BEGIN
DBMS_HM.RUN_CHECK('Database Check Health', 'my_run');
END;
/
-- 报告
SELECT DBMS_HM.GET_RUN_REPORT('my_run') FROM dual;
4.2 自定义脚本
CREATE OR REPLACE PROCEDURE health_check AS
BEGIN
-- 表空间检查
FOR t IN (SELECT tablespace_name, pct_used FROM ...) LOOP
IF t.pct_used > 80 THEN
INSERT INTO alert_log VALUES ('TABLESPACE', ...);
END IF;
END LOOP;
END;
/
-- 调度
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'health_check_job',
job_type => 'STORED_PROCEDURE',
job_action => 'health_check',
repeat_interval => 'FREQ=HOURLY; INTERVAL=1',
enabled => TRUE
);
END;
/
详细见:Oracle 数据库健康检查。
5. 自动告警
5.1 Server-Generated Alerts
SELECT * FROM dba_outstanding_alerts;
SELECT * FROM dba_alert_history ORDER BY creation_time DESC;
5.2 阈值配置
BEGIN
DBMS_SERVER_ALERT.SET_THRESHOLD(
metrics_id => DBMS_SERVER_ALERT.TABLESPACE_PCT_FULL,
warning_operator => DBMS_SERVER_ALERT.OPERATOR_GE,
warning_value => 80,
critical_operator => DBMS_SERVER_ALERT.OPERATOR_GE,
critical_value => 95,
observation_period => 1,
consecutive_occurrences => 1,
instance_name => NULL,
object_type => DBMS_SERVER_ALERT.OBJECT_TYPE_TABLESPACE,
object_name => NULL
);
END;
/
详细见:Oracle 监控告警配置。
6. 调度任务
6.1 DBMS_SCHEDULER
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'daily_report',
job_type => 'STORED_PROCEDURE',
job_action => 'generate_daily_report',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=DAILY; BYHOUR=6',
enabled => TRUE
);
END;
/
6.2 查看
SELECT * FROM dba_scheduler_jobs;
SELECT * FROM dba_scheduler_running_jobs;
SELECT * FROM dba_scheduler_job_run_details;
6.3 启用/禁用
EXEC DBMS_SCHEDULER.ENABLE('daily_report');
EXEC DBMS_SCHEDULER.DISABLE('daily_report');
7. 自动诊断
7.1 ADDM
SELECT * FROM dba_advisor_tasks WHERE advisor_name = 'ADDM';
-- 手动
@?/rdbms/admin/addmrpt.sql
7.2 Segment Advisor
EXEC DBMS_SPACE.AUTO_SPACE_ADVISOR_JOB_PROC;
7.3 SQL Tuning Advisor
SELECT * FROM dba_autotask_task
WHERE client_name = 'sql tuning advisor';
详细见:Oracle 自动化诊断 ADDM/ASH/AWR。
8. 自动数据生命周期
8.1 ILM
-- 19c+ ILM
ALTER TABLE sales ILM ADD POLICY
TIER TO archive_tbs READ ONLY
AFTER 30 DAYS OF NO MODIFICATION;
8.2 分区自动
-- Interval 分区
CREATE TABLE sales (...)
PARTITION BY RANGE (sale_date)
INTERVAL (NUMTOYMINTERVAL(1, 'MONTH'))
(...);
9. OEM Cloud Control
9.1 监控
- 多数据库集中
- 告警
- 性能分析
9.2 自动化
- 备份调度
- 补丁
- 配置管理
10. 监控脚本
10.1 表空间监控
SELECT
tablespace_name,
ROUND(used / total * 100, 2) AS pct
FROM (
SELECT
df.tablespace_name,
SUM(df.bytes) AS total,
SUM(df.bytes - NVL(fs.bytes, 0)) AS used
FROM dba_data_files df, dba_free_space fs
WHERE df.file_id = fs.file_id(+)
GROUP BY df.tablespace_name
)
WHERE used / total > 0.8;
10.2 锁监控
SELECT
blocking_session,
sid,
event,
seconds_in_wait
FROM v$session
WHERE blocking_session IS NOT NULL;
10.3 慢 SQL 监控
SELECT
sql_id,
elapsed_time / 1000000 AS sec,
status
FROM v$sql_monitor
WHERE status = 'EXECUTING'
AND elapsed_time > 60 * 1000000
ORDER BY elapsed_time DESC;
11. 常见坑与排错
11.1 自动任务失败
-- 查看错误
SELECT * FROM dba_scheduler_job_run_details WHERE status = 'FAILED';
11.2 告警丢失
-- 1. 检查阈值
-- 2. 检查 MMON
-- 3. 检查 ADR
11.3 调度错过
SELECT * FROM dba_scheduler_job_run_details
WHERE actual_start_date > scheduled_start_date + 1/24;
12. 最佳实践
- 自动备份:基础
- 自动统计:性能
- 自动诊断:发现问题
- 自动告警:及时
- 调度任务:自动化
- OEM 集中:多库
- ILM:数据生命周期
- 定期复审:有效性
- 文档化:维护
- 监控自动化:降低人工
13. 参考资料
[1] Oracle Database Administrator’s Guide 19c, “Automating Database Tasks” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/automating-database-tasks.html