Skip to content

Oracle 检查工具与脚本

官方检查工具

Oracle Enterprise Manager

核心功能

  • 数据库健康检查:提供全面的数据库健康状态检查
  • 性能监控:实时监控数据库性能指标
  • 存储监控:监控表空间、数据文件等存储资源
  • 安全审计:审计数据库安全配置和访问
  • 自动诊断:自动诊断数据库问题并提供解决方案
  • 报告生成:生成详细的数据库健康报告

使用方法

  1. 登录 OEM:打开浏览器,输入 OEM 控制台 URL,使用管理员账号登录
  2. 选择目标:在目标导航器中选择要检查的数据库实例
  3. 健康检查:点击"健康"选项卡,查看数据库健康状态
  4. 性能分析:点击"性能"选项卡,分析数据库性能
  5. 生成报告:点击"报告" → "健康检查报告",生成详细报告

SQL*Plus

核心功能

  • 执行 SQL 语句:执行各种 SQL 和 PL/SQL 语句
  • 数据库状态检查:检查数据库实例状态、表空间使用情况等
  • 性能诊断:执行性能诊断 SQL 语句
  • 脚本执行:执行 SQL 脚本文件

常用检查命令

  • 检查实例状态

    sql
    SELECT status, instance_name FROM v$instance;
  • 检查表空间使用情况

    sql
    SELECT tablespace_name, 
           ROUND((total_space - free_space) / total_space * 100, 2) AS used_percent
    FROM (
      SELECT tablespace_name,
             SUM(bytes) / 1024 / 1024 AS total_space
      FROM dba_data_files
      GROUP BY tablespace_name
    ) t1,
    (
      SELECT tablespace_name,
             SUM(bytes) / 1024 / 1024 AS free_space
      FROM dba_free_space
      GROUP BY tablespace_name
    ) t2
    WHERE t1.tablespace_name = t2.tablespace_name
    ORDER BY used_percent DESC;
  • 检查数据文件状态

    sql
    SELECT file_name, status, tablespace_name FROM dba_data_files;
  • 检查数据库等待事件

    sql
    SELECT event, COUNT(*) AS count FROM v$session_wait GROUP BY event ORDER BY count DESC;

RMAN

核心功能

  • 备份验证:验证备份的有效性
  • 数据库健康检查:检查数据库物理和逻辑一致性
  • 块损坏检测:检测数据块损坏

常用检查命令

  • 验证备份

    sql
    RMAN> VALIDATE BACKUPSET <backup_set_id>;
  • 检查数据库一致性

    sql
    RMAN> VALIDATE DATABASE;
  • 检查数据文件

    sql
    RMAN> VALIDATE DATAFILE <file_number>;

Oracle Database Configuration Assistant (DBCA)

核心功能

  • 数据库配置检查:检查数据库配置是否合理
  • 数据库创建和删除:创建和删除数据库实例
  • 模板管理:管理数据库创建模板

Oracle Recovery Manager

核心功能

  • 备份恢复管理:管理数据库备份和恢复操作
  • 备份验证:验证备份的有效性
  • 块损坏检测:检测和修复数据块损坏

第三方检查工具

Toad for Oracle

核心功能

  • 数据库浏览器:可视化浏览数据库对象
  • SQL 编辑器:编写和执行 SQL 语句
  • 性能分析器:分析 SQL 语句性能
  • 健康检查:执行数据库健康检查
  • 数据库比较:比较不同数据库或 schema 之间的差异

使用方法

  1. 连接数据库:启动 Toad,连接到目标数据库
  2. 健康检查:点击"数据库" → "健康检查"
  3. 选择检查项:选择需要检查的项目
  4. 执行检查:点击"执行"按钮执行检查
  5. 查看报告:查看检查结果报告

PL/SQL Developer

核心功能

  • PL/SQL 编辑和调试:编辑和调试 PL/SQL 代码
  • SQL 窗口:执行 SQL 语句
  • 数据库浏览器:浏览数据库对象
  • 性能分析:分析 PL/SQL 代码性能

Oracle SQL Developer

核心功能

  • SQL 编辑和执行:编辑和执行 SQL 语句
  • 数据库浏览器:浏览数据库对象
  • PL/SQL 调试:调试 PL/SQL 代码
  • 数据建模:创建和编辑数据模型
  • 健康检查:执行数据库健康检查

使用方法

  1. 连接数据库:启动 SQL Developer,连接到目标数据库
  2. 健康检查:点击"工具" → "健康检查"
  3. 配置检查:配置检查选项
  4. 执行检查:执行健康检查
  5. 查看结果:查看检查结果和建议

Quest Spotlight on Oracle

核心功能

  • 实时性能监控:实时监控数据库性能
  • 健康检查:执行数据库健康检查
  • 瓶颈识别:识别数据库性能瓶颈
  • 预测分析:预测数据库性能趋势

SolarWinds Database Performance Monitor

核心功能

  • 多数据库监控:监控多个数据库实例
  • 性能分析:分析数据库性能
  • 告警管理:管理数据库告警
  • 报告生成:生成数据库性能报告

自定义检查脚本

健康检查脚本

基本健康检查脚本

sql
-- 数据库基本健康检查脚本
SET linesize 200
SET pagesize 100

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

-- 检查数据库状态
SELECT name, open_mode, log_mode FROM v$database;

-- 检查表空间使用情况
SELECT tablespace_name, 
       ROUND((total_space - free_space) / total_space * 100, 2) AS used_percent,
       total_space,
       free_space
FROM (
  SELECT tablespace_name,
         SUM(bytes) / 1024 / 1024 AS total_space
  FROM dba_data_files
  GROUP BY tablespace_name
) t1,
(
  SELECT tablespace_name,
         SUM(bytes) / 1024 / 1024 AS free_space
  FROM dba_free_space
  GROUP BY tablespace_name
) t2
WHERE t1.tablespace_name = t2.tablespace_name
ORDER BY used_percent DESC;

-- 检查数据文件状态
SELECT file_name, status, tablespace_name, ROUND(bytes/1024/1024, 2) AS size_mb FROM dba_data_files;

-- 检查重做日志状态
SELECT group#, status, type, member FROM v$logfile;

-- 检查会话状态
SELECT status, COUNT(*) AS count FROM v$session GROUP BY status;

-- 检查等待事件
SELECT event, COUNT(*) AS count FROM v$session_wait WHERE event NOT LIKE 'SQL*Net%' GROUP BY event ORDER BY count DESC;

-- 检查数据库参数
SELECT name, value FROM v$parameter WHERE name IN ('sga_target', 'pga_aggregate_target', 'processes', 'sessions');

-- 检查备份状态
SELECT * FROM v$rman_backup_job_details ORDER BY end_time DESC;

-- 检查无效对象
SELECT owner, object_type, COUNT(*) AS count FROM dba_objects WHERE status = 'INVALID' GROUP BY owner, object_type ORDER BY count DESC;

-- 检查过期统计信息
SELECT owner, table_name, last_analyzed FROM dba_tab_statistics WHERE last_analyzed IS NULL OR last_analyzed < SYSDATE - 30;

性能检查脚本

sql
-- 数据库性能检查脚本
SET linesize 200
SET pagesize 100

-- 检查 top SQL (按执行时间)
SELECT sql_id, elapsed_time, executions, 
       ROUND(elapsed_time/executions/1000000, 2) AS avg_seconds,
       sql_text
FROM v$sql
WHERE executions > 0
ORDER BY elapsed_time DESC
FETCH FIRST 10 ROWS ONLY;

-- 检查 top SQL (按逻辑读)
SELECT sql_id, buffer_gets, executions, 
       ROUND(buffer_gets/executions, 2) AS avg_buffer_gets,
       sql_text
FROM v$sql
WHERE executions > 0
ORDER BY buffer_gets DESC
FETCH FIRST 10 ROWS ONLY;

-- 检查 top SQL (按物理读)
SELECT sql_id, disk_reads, executions, 
       ROUND(disk_reads/executions, 2) AS avg_disk_reads,
       sql_text
FROM v$sql
WHERE executions > 0
ORDER BY disk_reads DESC
FETCH FIRST 10 ROWS ONLY;

-- 检查游标使用情况
SELECT name, value FROM v$sysstat WHERE name LIKE '%cursor%';

-- 检查共享池使用情况
SELECT * FROM v$sgastat WHERE pool = 'shared pool' AND name IN ('free memory', 'sql area', 'PL/SQL procedure');

-- 检查缓冲区缓存使用情况
SELECT name, value FROM v$sysstat WHERE name LIKE '%buffer cache%';

-- 检查 PGA 使用情况
SELECT name, value FROM v$pgastat WHERE name IN ('aggregate PGA target parameter', 'aggregate PGA used by SQL workareas', 'maximum PGA allocated');

-- 检查 I/O 性能
SELECT file_name, phyrds, phywrts, phyblkrd, phyblkwrt FROM v$filestat fs, dba_data_files df WHERE fs.file# = df.file_id ORDER BY phyrds + phywrts DESC;

-- 检查等待事件
SELECT event, total_waits, time_waited_micro/1000000 AS time_waited_seconds
FROM v$system_event
WHERE event NOT LIKE 'SQL*Net%' AND event NOT LIKE 'rdbms%' AND total_waits > 0
ORDER BY time_waited_micro DESC
FETCH FIRST 10 ROWS ONLY;

安全检查脚本

sql
-- 数据库安全检查脚本
SET linesize 200
SET pagesize 100

-- 检查用户权限
SELECT grantee, privilege, admin_option
FROM dba_sys_privs
WHERE grantee NOT IN ('SYS', 'SYSTEM', 'DBSNMP', 'SYSMAN')
AND privilege IN ('CREATE USER', 'DROP USER', 'ALTER USER', 'CREATE ROLE', 'DROP ROLE', 'GRANT ANY PRIVILEGE', 'GRANT ANY ROLE', 'SELECT ANY TABLE', 'INSERT ANY TABLE', 'UPDATE ANY TABLE', 'DELETE ANY TABLE')
ORDER BY grantee, privilege;

-- 检查角色权限
SELECT role, privilege
FROM dba_sys_privs
WHERE grantee IN (SELECT role FROM dba_roles WHERE role NOT LIKE 'APEX_%' AND role NOT LIKE 'SELECT_CATALOG_ROLE' AND role NOT LIKE 'EXECUTE_CATALOG_ROLE')
ORDER BY role, privilege;

-- 检查用户密码策略
SELECT profile, resource_name, limit
FROM dba_profiles
WHERE resource_type = 'PASSWORD'
ORDER BY profile, resource_name;

-- 检查锁定用户
SELECT username, account_status, lock_date
FROM dba_users
WHERE account_status LIKE '%LOCKED%'
ORDER BY lock_date DESC;

-- 检查过期密码
SELECT username, account_status, expiry_date
FROM dba_users
WHERE account_status LIKE '%EXPIRED%'
ORDER BY expiry_date DESC;

-- 检查审计设置
SELECT * FROM v$parameter WHERE name LIKE '%audit%';

-- 检查监听日志配置
SELECT * FROM v$parameter WHERE name LIKE '%listener%';

-- 检查网络访问控制
SELECT * FROM dba_hidden_parameters WHERE name LIKE '%access%' OR name LIKE '%network%';

-- 检查加密设置
SELECT * FROM v$parameter WHERE name LIKE '%encrypt%';

-- 检查数据字典访问
SELECT grantee, privilege
FROM dba_tab_privs
WHERE table_name IN ('DBA_USERS', 'DBA_ROLES', 'DBA_SYS_PRIVS', 'DBA_TAB_PRIVS')
AND grantee NOT IN ('SYS', 'SYSTEM');

存储检查脚本

sql
-- 数据库存储检查脚本
SET linesize 200
SET pagesize 100

-- 检查表空间使用情况
SELECT tablespace_name, 
       ROUND(total_space, 2) AS total_mb,
       ROUND(free_space, 2) AS free_mb,
       ROUND((total_space - free_space), 2) AS used_mb,
       ROUND((total_space - free_space) / total_space * 100, 2) AS used_percent
FROM (
  SELECT tablespace_name,
         SUM(bytes) / 1024 / 1024 AS total_space
  FROM dba_data_files
  GROUP BY tablespace_name
) t1,
(
  SELECT tablespace_name,
         SUM(bytes) / 1024 / 1024 AS free_space
  FROM dba_free_space
  GROUP BY tablespace_name
) t2
WHERE t1.tablespace_name = t2.tablespace_name
ORDER BY used_percent DESC;

-- 检查临时表空间使用情况
SELECT tablespace_name, 
       ROUND(total_space, 2) AS total_mb,
       ROUND(free_space, 2) AS free_mb,
       ROUND((total_space - free_space), 2) AS used_mb,
       ROUND((total_space - free_space) / total_space * 100, 2) AS used_percent
FROM (
  SELECT tablespace_name,
         SUM(bytes) / 1024 / 1024 AS total_space
  FROM dba_temp_files
  GROUP BY tablespace_name
) t1,
(
  SELECT tablespace_name,
         SUM(bytes) / 1024 / 1024 AS free_space
  FROM dba_free_space
  WHERE tablespace_name IN (SELECT tablespace_name FROM dba_temp_files)
  GROUP BY tablespace_name
) t2
WHERE t1.tablespace_name = t2.tablespace_name
ORDER BY used_percent DESC;

-- 检查 UNDO 表空间使用情况
SELECT tablespace_name, 
       ROUND(total_space, 2) AS total_mb,
       ROUND(free_space, 2) AS free_mb,
       ROUND((total_space - free_space), 2) AS used_mb,
       ROUND((total_space - free_space) / total_space * 100, 2) AS used_percent
FROM (
  SELECT tablespace_name,
         SUM(bytes) / 1024 / 1024 AS total_space
  FROM dba_data_files
  WHERE tablespace_name IN (SELECT tablespace_name FROM dba_tablespaces WHERE contents = 'UNDO')
  GROUP BY tablespace_name
) t1,
(
  SELECT tablespace_name,
         SUM(bytes) / 1024 / 1024 AS free_space
  FROM dba_free_space
  WHERE tablespace_name IN (SELECT tablespace_name FROM dba_tablespaces WHERE contents = 'UNDO')
  GROUP BY tablespace_name
) t2
WHERE t1.tablespace_name = t2.tablespace_name
ORDER BY used_percent DESC;

-- 检查数据文件
SELECT file_name, tablespace_name, 
       ROUND(bytes/1024/1024, 2) AS size_mb,
       ROUND(maxbytes/1024/1024, 2) AS max_size_mb,
       autoextensible
FROM dba_data_files
ORDER BY tablespace_name, file_name;

-- 检查临时文件
SELECT file_name, tablespace_name, 
       ROUND(bytes/1024/1024, 2) AS size_mb,
       ROUND(maxbytes/1024/1024, 2) AS max_size_mb,
       autoextensible
FROM dba_temp_files
ORDER BY tablespace_name, file_name;

-- 检查大文件表空间
SELECT tablespace_name, bigfile
FROM dba_tablespaces
ORDER BY tablespace_name;

-- 检查表空间扩展
SELECT tablespace_name, COUNT(*) AS file_count
FROM dba_data_files
GROUP BY tablespace_name
ORDER BY file_count DESC;

-- 检查数据文件增长
SELECT file_name, tablespace_name, 
       increment_by * 8 / 1024 AS increment_mb
FROM dba_data_files
WHERE autoextensible = 'YES'
ORDER BY tablespace_name, file_name;

检查工具集成

监控系统集成

  • Zabbix 集成

    • 使用 Zabbix 监控 Oracle 数据库
    • 创建自定义监控项和触发器
    • 配置告警通知
  • Nagios 集成

    • 使用 Nagios 插件监控 Oracle 数据库
    • 配置服务检查和联系人
    • 设置告警阈值
  • Prometheus 集成

    • 使用 Prometheus 监控 Oracle 数据库
    • 使用 Grafana 创建监控仪表盘
    • 配置告警规则

自动化检查

  • 定时执行

    • 使用 crontab(Linux)或任务计划程序(Windows)定时执行检查脚本
    • 配置执行频率和时间
  • 邮件通知

    • 配置脚本执行结果通过邮件发送
    • 设置邮件接收人和发送条件
  • 报告生成

    • 自动生成检查报告
    • 保存报告到指定位置
    • 提供历史报告查询

最佳实践

检查频率

  • 日常检查:每天执行基本健康检查
  • 每周检查:每周执行详细性能检查
  • 每月检查:每月执行全面安全检查
  • 季度检查:每季度执行完整存储检查

检查内容

  • 基本健康:实例状态、表空间使用、数据文件状态等
  • 性能:SQL 性能、等待事件、资源使用等
  • 安全:用户权限、密码策略、审计设置等
  • 存储:表空间增长、数据文件配置、空间使用趋势等
  • 备份:备份状态、备份有效性、恢复时间等

检查流程

  1. 准备:确定检查范围和内容
  2. 执行:使用合适的工具和脚本执行检查
  3. 分析:分析检查结果,识别问题
  4. 报告:生成检查报告,包括发现的问题和建议
  5. 解决:根据报告解决发现的问题
  6. 跟踪:跟踪问题解决情况,验证解决方案的有效性

工具选择

  • 根据需求:根据具体检查需求选择合适的工具
  • 根据环境:考虑数据库环境和规模选择工具
  • 根据技能:考虑团队技能水平选择工具
  • 根据成本:考虑工具成本和 ROI 选择工具

常见问题(FAQ)

Q1: 如何选择合适的检查工具?

A1: 选择合适的检查工具的方法:

  • 根据检查目的:根据具体的检查目的选择工具,如性能检查、安全检查等
  • 根据数据库规模:大型数据库可能需要更强大的工具,如 OEM
  • 根据团队技能:选择团队熟悉的工具,或提供足够的培训
  • 根据预算:考虑工具的成本和 ROI
  • 根据集成需求:考虑与现有监控系统的集成需求

Q2: 如何自动化数据库检查?

A2: 自动化数据库检查的方法:

  • 使用脚本:编写自定义检查脚本
  • 定时执行:使用 crontab(Linux)或任务计划程序(Windows)定时执行脚本
  • 结果处理:配置脚本执行结果的处理方式,如邮件通知、报告生成等
  • 监控集成:将检查结果集成到监控系统中
  • 告警配置:设置基于检查结果的告警规则

Q3: 如何处理检查中发现的问题?

A3: 处理检查中发现问题的方法:

  • 问题分类:根据问题的严重程度和影响范围分类
  • 优先级确定:确定问题的优先级,优先处理高优先级问题
  • 解决方案:针对每个问题制定解决方案
  • 执行修复:执行解决方案,修复问题
  • 验证结果:验证问题是否已解决
  • 文档记录:记录问题的发现、解决过程和结果

Q4: 如何建立有效的数据库检查体系?

A4: 建立有效的数据库检查体系的方法:

  • 明确目标:明确检查的目标和范围
  • 制定计划:制定详细的检查计划,包括频率、内容、责任人和流程
  • 选择工具:选择合适的检查工具和脚本
  • 执行检查:按照计划执行检查
  • 分析结果:分析检查结果,识别问题和趋势
  • 持续改进:根据检查结果和反馈,持续改进检查体系
  • 培训团队:培训团队成员,提高检查能力和意识

Q5: 如何使用检查工具预防数据库故障?

A5: 使用检查工具预防数据库故障的方法:

  • 定期检查:定期执行数据库检查,及时发现潜在问题
  • 趋势分析:分析检查结果的趋势,预测可能出现的问题
  • 阈值设置:为关键指标设置合理的告警阈值
  • 自动告警:配置基于检查结果的自动告警
  • 预防性措施:根据检查结果采取预防性措施,如增加存储空间、优化 SQL 语句等
  • 应急准备:基于检查结果,准备相应的应急方案
  • 演练测试:定期演练故障处理流程,提高应急响应能力