Skip to content
無糧不聚兵
Go back

Oracle 数据库日常运维实践指南

编辑本文

前言

Oracle 数据库作为企业级关系型数据库的标杆,至今仍在金融、电信、制造等行业中扮演核心角色。尽管云原生和开源数据库浪潮汹涌,但大量存量系统依然跑在 Oracle 上。掌握一套系统化的运维方法论,对 DBA 来说依然是基本功。

本文从日常运维的视角出发,梳理几个高频场景下的实战操作。


一、数据库健康检查

1.1 实例状态确认

运维的第一步,永远是确认实例是否正常运行:

-- 检查实例状态
SELECT instance_name, status, database_status FROM v$instance;

-- 检查数据库打开模式
SELECT name, open_mode, log_mode FROM v$database;

健康的实例应满足:STATUS = OPENDATABASE_STATUS = ACTIVE。如果是 Data Guard 备库,OPEN_MODE 可能是 MOUNTEDREAD ONLY WITH APPLY

1.2 Alert Log 巡检

Alert Log 是 Oracle 的”黑匣子”,记录了所有关键事件:

# 快速定位最近的 ORA- 错误
adrci exec="show alert -tail 200" | grep -i "ORA-"

# 或直接查看 alert log 文件
tail -500 $ORACLE_BASE/diag/rdbms/<db_name>/<instance_name>/trace/alert_*.log | grep "ORA-"

常见需要关注的错误

1.3 表空间使用率

SELECT
    tablespace_name,
    ROUND(used_space * 8192 / 1024 / 1024, 2) AS used_mb,
    ROUND(tablespace_size * 8192 / 1024 / 1024, 2) AS total_mb,
    ROUND(used_percent, 2) AS used_pct
FROM dba_tablespace_usage_metrics
ORDER BY used_percent DESC;

经验值:表空间使用率超过 85% 就应该告警,超过 95% 需要立即处理。


二、性能诊断

2.1 AWR 报告

AWR(Automatic Workload Repository)是 Oracle 性能分析的核心工具:

-- 查看可用的 AWR 快照
SELECT snap_id, begin_interval_time, end_interval_time
FROM dba_hist_snapshot
ORDER BY snap_id DESC
FETCH FIRST 20 ROWS ONLY;

-- 生成 AWR 报告(HTML 格式)
@?/rdbms/admin/awrrpt.sql

AWR 报告重点关注

指标关注点
DB Time是否远超 CPU 时间
Top 5 等待事件是否存在异常等待
SQL ordered by Elapsed Time最消耗时间的 SQL
Instance EfficiencyBuffer Cache Hit Ratio 是否 > 95%

2.2 实时会话分析

当系统突然变慢时,第一步是看当前在跑什么:

-- 查看活跃会话及等待事件
SELECT
    s.sid,
    s.serial#,
    s.username,
    s.program,
    s.sql_id,
    s.event,
    s.wait_class,
    s.seconds_in_wait,
    s.status
FROM v$session s
WHERE s.status = 'ACTIVE'
  AND s.type = 'USER'
ORDER BY s.seconds_in_wait DESC;

2.3 锁等待排查

锁争用是 OLTP 系统的常见问题:

-- 查找阻塞链
SELECT
    l1.sid AS blocker_sid,
    s1.username AS blocker_user,
    l2.sid AS waiter_sid,
    s2.username AS waiter_user,
    s2.sql_id AS waiter_sql_id,
    l1.type AS lock_type
FROM v$lock l1
JOIN v$lock l2 ON l1.id1 = l2.id1 AND l1.id2 = l2.id2
JOIN v$session s1 ON l1.sid = s1.sid
JOIN v$session s2 ON l2.sid = s2.sid
WHERE l1.block = 1
  AND l2.request > 0;

遇到严重的锁等待,确认业务允许后可以 kill 阻塞会话:

ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;

三、备份与恢复

3.1 RMAN 备份策略

生产环境推荐使用增量备份 + 归档日志的组合策略:

# 0 级全量备份(周日)
rman target / <<EOF
BACKUP INCREMENTAL LEVEL 0
  DATABASE
  FORMAT '/backup/rman/full_%d_%T_%U'
  TAG 'WEEKLY_FULL';
BACKUP ARCHIVELOG ALL
  FORMAT '/backup/rman/arch_%d_%T_%U'
  DELETE INPUT;
EOF

# 1 级增量备份(周一至周六)
rman target / <<EOF
BACKUP INCREMENTAL LEVEL 1
  DATABASE
  FORMAT '/backup/rman/incr_%d_%T_%U'
  TAG 'DAILY_INCR';
BACKUP ARCHIVELOG ALL
  FORMAT '/backup/rman/arch_%d_%T_%U'
  DELETE INPUT;
EOF

3.2 备份验证

备份如果不验证,等于没有备份:

# 验证备份的可恢复性
rman target / <<EOF
RESTORE DATABASE VALIDATE;
RESTORE ARCHIVELOG ALL VALIDATE;
EOF

3.3 关键恢复场景

场景一:误删数据(Flashback Query)

-- 查看 5 分钟前的数据
SELECT * FROM schema.table_name
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '5' MINUTE)
WHERE id = 12345;

-- 恢复误删数据
INSERT INTO schema.table_name
SELECT * FROM schema.table_name
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '10' MINUTE)
WHERE id = 12345;

场景二:误 truncate 表(需要 RMAN + 不完全恢复)

# 这是破坏性操作,需要在测试环境先验证!
rman target / <<EOF
RUN {
  SET UNTIL TIME "TO_DATE('2026-03-29 12:00:00', 'YYYY-MM-DD HH24:MI:SS')";
  RESTORE DATABASE;
  RECOVER DATABASE;
}
ALTER DATABASE OPEN RESETLOGS;
EOF

四、空间管理

4.1 大对象排查

当表空间告急时,先定位空间消耗大户:

-- 查找占用空间最大的段(表、索引)
SELECT
    owner,
    segment_name,
    segment_type,
    ROUND(bytes / 1024 / 1024, 2) AS size_mb
FROM dba_segments
WHERE tablespace_name = 'USERS'
ORDER BY bytes DESC
FETCH FIRST 20 ROWS ONLY;

4.2 表空间扩展

-- 方式一:为数据文件启用自动扩展
ALTER DATABASE DATAFILE '/oradata/users01.dbf' AUTOEXTEND ON MAXSIZE 32G;

-- 方式二:添加新数据文件
ALTER TABLESPACE users ADD DATAFILE '/oradata/users02.dbf' SIZE 10G AUTOEXTEND ON MAXSIZE 32G;

4.3 碎片整理

长期运行的表往往存在大量碎片(高水位线问题):

-- 启用行移动(前置条件)
ALTER TABLE schema.table_name ENABLE ROW MOVEMENT;

-- 在线收缩表空间(不影响业务)
ALTER TABLE schema.table_name SHRINK SPACE CASCADE;

-- 或者使用在线重定义(大表推荐)
-- 需要 DBMS_REDEFINITION 包

五、日常运维检查清单

将以上内容固化为一份每日巡检清单:

检查项频率命令/工具
实例状态每日v$instance
Alert Log每日adrci
表空间使用率每日dba_tablespace_usage_metrics
ASM 磁盘组每日v$asm_diskgroup
备份状态每日v$rman_backup_job_details
AWR 报告每周awrrpt.sql
无效对象每周dba_objects WHERE status='INVALID'
密码过期每月dba_users
统计信息每月DBMS_STATS

写在最后

Oracle 运维的核心思想是预防大于治疗。通过标准化的巡检流程、完善的备份策略和及时的性能监控,把问题消灭在萌芽阶段。同时,建议建立自己的运维知识库,把每次故障处理的过程记录下来,日积月累就是最宝贵的经验。

好的 DBA 不是救火队长,而是让火烧不起来的人。


编辑本文
Share this post on:

Next Post
你好,世界