Skip to content

Oracle 预防性措施

日常维护措施

1. 数据库健康检查

定期健康检查

  • 每周健康检查

    sql
    -- 检查数据库状态
    SELECT status, instance_name FROM v$instance;
    
    -- 检查表空间使用情况
    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;
    
    -- 检查数据文件状态
    SELECT file_name, status FROM dba_data_files;
    
    -- 检查重做日志状态
    SELECT group#, status FROM v$log;
    
    -- 检查归档日志状态
    SELECT sequence#, status FROM v$archived_log ORDER BY sequence# DESC;
  • 每月健康检查

    • 生成 AWR 报告,分析数据库性能
    • 检查数据库配置参数
    • 检查用户权限
    • 检查数据库链接

2. 统计信息维护

  • 定期收集统计信息

    sql
    -- 收集模式级统计信息
    EXEC DBMS_STATS.GATHER_SCHEMA_STATS(
      ownname => 'SCOTT',
      estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
      method_opt => 'FOR ALL COLUMNS SIZE AUTO',
      degree => 4,
      cascade => TRUE
    );
    
    -- 收集数据库级统计信息
    EXEC DBMS_STATS.GATHER_DATABASE_STATS(
      estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
      method_opt => 'FOR ALL COLUMNS SIZE AUTO',
      degree => 4,
      cascade => TRUE
    );
  • 监控统计信息状态

    sql
    SELECT owner, 
           table_name,
           last_analyzed
    FROM dba_tab_statistics
    WHERE owner NOT IN ('SYS', 'SYSTEM')
    AND last_analyzed IS NULL
    ORDER BY owner, table_name;

3. 索引维护

  • 检查索引状态

    sql
    SELECT owner, 
           index_name,
           table_name,
           status
    FROM dba_indexes
    WHERE status != 'VALID'
    ORDER BY owner, index_name;
  • 重建碎片化索引

    sql
    -- 检查索引碎片
    SELECT owner, 
           index_name,
           table_name,
           ROUND((del_lf_rows / lf_rows) * 100, 2) AS fragmentation_percent
    FROM index_stats
    WHERE lf_rows > 0
    AND (del_lf_rows / lf_rows) * 100 > 20
    ORDER BY fragmentation_percent DESC;
    
    -- 重建索引
    ALTER INDEX owner.index_name REBUILD;

4. 表空间维护

  • 检查表空间使用情况

    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
    AND (total_space - free_space) / total_space * 100 > 80
    ORDER BY used_percent DESC;
  • 扩展表空间

    sql
    -- 添加数据文件
    ALTER TABLESPACE users ADD DATAFILE '/u01/app/oracle/oradata/ORCL/users02.dbf' SIZE 500M AUTOEXTEND ON NEXT 100M MAXSIZE 2048M;
    
    -- 扩展数据文件
    ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf' RESIZE 1000M;

5. 日志文件维护

  • 检查重做日志状态

    sql
    SELECT group#, 
           member,
           status
    FROM v$logfile
    ORDER BY group#, member;
  • 检查归档日志空间

    bash
    df -h <归档日志目>
  • 清理归档日志

    sql
    -- 使用 RMAN 清理归档日志
    RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';

监控告警措施

1. 监控工具配置

Oracle Enterprise Manager

  • 配置监控目标:添加数据库实例、监听器等监控目标
  • 设置告警阈值:为关键指标设置告警阈值
  • 配置通知方式:邮件、短信、SNMP 等
  • 创建监控仪表盘:创建自定义监控仪表盘

自定义监控脚本

  • 创建监控脚本

    bash
    #!/bin/bash
    
    # 检查数据库状态
    sqlplus -s / as sysdba << EOF
    set feedback off
    set heading off
    select status from v$instance;
    EOF
    
    # 检查表空间使用率
    sqlplus -s / as sysdba << EOF
    set feedback off
    set heading off
    SELECT tablespace_name || ',' || ROUND((total_space - free_space) / total_space * 100, 2)
    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
    AND (total_space - free_space) / total_space * 100 > 80;
    EOF
  • 设置定时任务

    bash
    # 每 10 分钟执行一次监控脚本
    */10 * * * * /path/to/monitor.sh

2. 关键指标监控

性能指标

  • CPU 使用率:监控数据库服务器 CPU 使用率
  • 内存使用率:监控数据库服务器内存使用率
  • I/O 性能:监控磁盘 I/O 性能
  • 网络性能:监控网络连接和吞吐量
  • 数据库等待事件:监控数据库等待事件

空间指标

  • 表空间使用率:监控表空间使用率
  • 数据文件大小:监控数据文件大小和增长
  • 临时表空间使用率:监控临时表空间使用率
  • UNDO 表空间使用率:监控 UNDO 表空间使用率
  • 归档日志空间:监控归档日志空间使用情况

安全指标

  • 登录失败次数:监控登录失败次数
  • 特权用户活动:监控特权用户活动
  • 权限变更:监控权限变更
  • 数据访问:监控敏感数据访问

3. 告警管理

  • 告警分级

    • 紧急:需要立即处理的告警
    • 重要:需要尽快处理的告警
    • 警告:需要关注的告警
    • 信息:仅供参考的信息
  • 告警处理流程

    1. 接收告警
    2. 分析告警原因
    3. 采取相应措施
    4. 验证告警是否解决
    5. 记录告警处理过程
  • 告警抑制

    • 避免告警风暴
    • 对重复告警进行抑制
    • 对非工作时间的非紧急告警进行延迟

性能优化措施

1. 数据库参数优化

内存参数

  • SGA 大小

    sql
    ALTER SYSTEM SET sga_target = 16G SCOPE=SPFILE;
  • PGA 大小

    sql
    ALTER SYSTEM SET pga_aggregate_target = 4G SCOPE=SPFILE;
  • 共享池大小

    sql
    ALTER SYSTEM SET shared_pool_size = 2G SCOPE=SPFILE;
  • 缓冲区缓存大小

    sql
    ALTER SYSTEM SET db_cache_size = 8G SCOPE=SPFILE;

写入参数

  • 日志缓冲区大小

    sql
    ALTER SYSTEM SET log_buffer = 16M SCOPE=SPFILE;
  • 提交写入模式

    sql
    ALTER SYSTEM SET commit_write = 'BATCH,ASYNC' SCOPE=SPFILE;
  • DBW 进程数

    sql
    ALTER SYSTEM SET db_writer_processes = 4 SCOPE=SPFILE;

读取参数

  • 多块读取大小

    sql
    ALTER SYSTEM SET db_file_multiblock_read_count = 16 SCOPE=SPFILE;
  • 优化器模式

    sql
    ALTER SYSTEM SET optimizer_mode = 'ALL_ROWS' SCOPE=SPFILE;

2. SQL 语句优化

识别慢查询

  • 使用 AWR 报告:查看 TOP SQL
  • 使用 V$SQL 视图
    sql
    SELECT sql_id, 
           elapsed_time, 
           disk_reads, 
           buffer_gets,
           sql_text
    FROM v$sql
    ORDER BY elapsed_time DESC
    FETCH FIRST 10 ROWS ONLY;

优化 SQL 语句

  • 使用索引:为频繁查询的列创建索引
  • 避免全表扫描:使用 WHERE 子句过滤数据
  • **避免 SELECT ***:只选择需要的列
  • 使用绑定变量:减少硬解析
  • 优化 JOIN 操作:选择合适的 JOIN 类型

SQL 审核

  • 建立 SQL 审核流程

    1. 开发人员提交 SQL
    2. DBA 审核 SQL
    3. 优化 SQL 语句
    4. 部署到生产环境
  • 使用 SQL 审核工具:如 Oracle SQL Developer、Toad 等

3. 存储优化

表空间设计

  • 合理规划表空间:根据数据类型和使用模式创建表空间

  • 使用本地管理表空间

    sql
    CREATE TABLESPACE users DATAFILE '/u01/app/oracle/oradata/ORCL/users01.dbf' SIZE 500M AUTOEXTEND ON NEXT 100M MAXSIZE 2048M EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
  • 使用大文件表空间

    sql
    CREATE BIGFILE TABLESPACE big_users DATAFILE '/u01/app/oracle/oradata/ORCL/big_users01.dbf' SIZE 10G AUTOEXTEND ON NEXT 1G MAXSIZE 100G;

数据压缩

  • 表压缩

    sql
    CREATE TABLE employees (
      employee_id NUMBER,
      first_name VARCHAR2(50),
      last_name VARCHAR2(50)
    ) COMPRESS;
  • 索引压缩

    sql
    CREATE INDEX emp_last_name_idx ON employees(last_name) COMPRESS;

分区表

  • 范围分区
    sql
    CREATE TABLE sales (
      sale_id NUMBER,
      sale_date DATE,
      amount NUMBER
    ) PARTITION BY RANGE (sale_date) (
      PARTITION sales_q1 VALUES LESS THAN (TO_DATE('2024-04-01', 'YYYY-MM-DD')),
      PARTITION sales_q2 VALUES LESS THAN (TO_DATE('2024-07-01', 'YYYY-MM-DD')),
      PARTITION sales_q3 VALUES LESS THAN (TO_DATE('2024-10-01', 'YYYY-MM-DD')),
      PARTITION sales_q4 VALUES LESS THAN (TO_DATE('2025-01-01', 'YYYY-MM-DD'))
    );

安全管理措施

1. 访问控制

用户管理

  • 创建用户

    sql
    CREATE USER app_user IDENTIFIED BY password DEFAULT TABLESPACE users QUOTA UNLIMITED ON users;
  • 授权用户

    sql
    GRANT CONNECT, RESOURCE TO app_user;
  • 回收权限

    sql
    REVOKE RESOURCE FROM app_user;
  • 锁定用户

    sql
    ALTER USER app_user ACCOUNT LOCK;

角色管理

  • 创建角色

    sql
    CREATE ROLE app_role;
  • 授权角色

    sql
    GRANT SELECT, INSERT, UPDATE, DELETE ON app_schema.employees TO app_role;
  • 分配角色

    sql
    GRANT app_role TO app_user;

权限管理

  • 最小权限原则:只授予用户必要的权限
  • 定期权限审计
    sql
    SELECT grantee, 
           privilege,
           admin_option
    FROM dba_sys_privs
    WHERE grantee NOT IN ('SYS', 'SYSTEM', 'DBSNMP', 'SYSMAN')
    ORDER BY grantee, privilege;

2. 认证管理

密码策略

  • 配置密码策略

    sql
    ALTER PROFILE DEFAULT LIMIT
      PASSWORD_LIFE_TIME 90
      PASSWORD_GRACE_TIME 7
      PASSWORD_REUSE_MAX 5
      PASSWORD_VERIFY_FUNCTION ora12c_strong_verify_function
      FAILED_LOGIN_ATTEMPTS 3
      PASSWORD_LOCK_TIME 1;
  • 使用强密码:使用包含字母、数字和特殊字符的强密码

  • 定期更改密码:定期更改数据库用户密码

多因素认证

  • 配置多因素认证:使用 Oracle Advanced Security 配置多因素认证
  • 集成企业认证系统:集成 LDAP、Active Directory 等企业认证系统

3. 审计管理

启用审计

  • 配置审计参数

    sql
    ALTER SYSTEM SET audit_trail = 'DB,EXTENDED' SCOPE=SPFILE;
    SHUTDOWN IMMEDIATE;
    STARTUP;
  • 创建审计策略

    sql
    CREATE AUDIT POLICY app_audit_policy
      ACTIONS CREATE, ALTER, DROP ON app_schema.employees,
      SELECT, INSERT, UPDATE, DELETE ON app_schema.employees;
    
    AUDIT POLICY app_audit_policy;

审计数据分析

  • 分析审计数据

    sql
    SELECT username, 
           action_name,
           object_name,
           timestamp
    FROM dba_audit_trail
    WHERE object_schema = 'APP_SCHEMA'
    ORDER BY timestamp DESC;
  • 定期审计报告:生成定期审计报告,分析异常访问

4. 加密管理

透明数据加密

  • 配置加密钱包

    sql
    ALTER SYSTEM SET encryption wallet open identified by "wallet_password";
  • 加密表空间

    sql
    CREATE TABLESPACE encrypted_ts 
      DATAFILE '/u01/app/oracle/oradata/ORCL/encrypted_ts.dbf' 
      SIZE 10G 
      ENCRYPTION USING 'AES256' 
      DEFAULT STORAGE(ENCRYPT);

网络加密

  • 配置网络加密:在 sqlnet.ora 中配置 SSL/TLS

  • 验证网络加密

    sql
    SELECT network_service_banner 
    FROM v$session_connect_info 
    WHERE sid = SYS_CONTEXT('USERENV', 'SID');

备份恢复措施

1. 备份策略

备份类型

  • 全库备份:每周执行一次全库备份
  • 增量备份:每天执行一次增量备份
  • 归档日志备份:每小时执行一次归档日志备份
  • 控制文件备份:每次结构变更后备份控制文件
  • 参数文件备份:定期备份参数文件

备份工具

  • RMAN:Oracle 推荐的备份工具
  • 用户管理的备份:适用于特定场景
  • 第三方备份工具:如 NetBackup、Commvault 等

备份存储

  • 本地存储:快速恢复,但有单点故障风险
  • 远程存储:避免单点故障
  • 云存储:如 AWS S3、Azure Blob Storage 等
  • 磁带存储:长期归档

2. 恢复演练

定期恢复演练

  • 每月恢复演练

    1. 在测试环境中恢复数据库
    2. 验证恢复结果
    3. 记录恢复时间和过程
  • 年度灾难恢复演练

    1. 模拟灾难场景
    2. 执行完整的灾难恢复流程
    3. 验证业务连续性

恢复时间目标

  • 设置 RTO:根据业务需求设置恢复时间目标
  • 监控 RTO:确保恢复时间符合 RTO 要求
  • 优化 RTO:通过优化备份策略和恢复流程,减少恢复时间

3. 数据保护

高可用性方案

  • Oracle RAC:实时应用集群,提供高可用性
  • Oracle Data Guard:数据守护,提供灾难恢复能力
  • Oracle GoldenGate:数据复制,提供实时数据同步

数据验证

  • 定期数据验证

    sql
    -- 验证表数据
    SELECT COUNT(*) FROM app_schema.employees;
    
    -- 验证索引
    ANALYZE TABLE app_schema.employees VALIDATE STRUCTURE;
  • 备份验证

    sql
    -- 使用 RMAN 验证备份
    RMAN> VALIDATE BACKUPSET <backup_set_id>;

文档管理措施

1. 数据库文档

配置文档

  • 数据库配置:记录数据库参数配置
  • 存储配置:记录存储配置
  • 网络配置:记录网络配置
  • 安全配置:记录安全配置

架构文档

  • 数据库架构:记录数据库架构设计
  • 应用架构:记录应用与数据库的交互
  • 集成架构:记录数据库与其他系统的集成

操作文档

  • 日常操作:记录日常操作流程
  • 故障处理:记录故障处理流程
  • 备份恢复:记录备份恢复流程
  • 变更管理:记录变更管理流程

2. 知识管理

知识库

  • 创建知识库:建立数据库知识库
  • 分类管理:按主题分类管理知识
  • 定期更新:定期更新知识库内容
  • 分享机制:建立知识分享机制

经验教训

  • 记录经验教训:记录故障处理的经验教训
  • 分析原因:分析故障原因和解决方案
  • 预防措施:制定预防类似故障的措施
  • 案例研究:进行故障案例研究

3. 变更管理

变更流程

  • 变更申请:提交变更申请
  • 变更评估:评估变更影响
  • 变更审批:审批变更申请
  • 变更实施:实施变更
  • 变更验证:验证变更结果
  • 变更回滚:准备变更回滚计划

变更记录

  • 记录变更:记录所有数据库变更
  • 变更历史:维护变更历史记录
  • 变更影响:评估变更对系统的影响
  • 变更审计:审计变更流程的合规性

常见问题(FAQ)

Q1: 如何制定有效的预防性维护计划?

A1: 制定有效的预防性维护计划的方法:

  • 评估需求:评估数据库的重要性和业务需求
  • 识别风险:识别潜在的故障风险
  • 确定频率:根据风险等级确定维护频率
  • 制定计划:制定详细的维护计划,包括任务、频率、负责人
  • 执行计划:按照计划执行维护任务
  • 评估效果:定期评估维护计划的效果,进行调整

Q2: 如何平衡预防性维护和系统可用性?

A2: 平衡预防性维护和系统可用性的方法:

  • 选择合适的维护时间:在业务低峰期进行维护
  • 分批进行维护:将维护任务分批执行,减少单次维护时间
  • 使用在线维护:尽可能使用在线维护操作,减少停机时间
  • 提前通知:提前通知业务部门维护计划
  • 快速恢复:准备快速恢复方案,确保出现问题时能够快速恢复

Q3: 如何监控数据库的性能趋势?

A3: 监控数据库性能趋势的方法:

  • 使用 AWR 报告:定期生成 AWR 报告,分析性能趋势
  • 使用 Enterprise Manager:使用 Enterprise Manager 的性能监控功能
  • 建立性能基准:建立正常状态下的性能基准
  • 设置性能告警:为关键性能指标设置告警阈值
  • 分析性能数据:定期分析性能数据,识别性能下降趋势

Q4: 如何确保备份的有效性?

A4: 确保备份有效性的方法:

  • 定期验证备份:使用 RMAN 的 VALIDATE 命令验证备份
  • 定期恢复演练:定期在测试环境中恢复备份
  • 检查备份日志:检查备份操作的日志,确保备份成功
  • 监控备份存储:确保备份存储的可用性和可靠性
  • 多重备份:使用多重备份策略,如本地备份和远程备份

Q5: 如何处理数据库性能突然下降的情况?

A5: 处理数据库性能突然下降的情况的方法:

  • 快速诊断:使用 AWR、ASH 报告快速诊断性能问题
  • 识别瓶颈:识别性能瓶颈,如 I/O、CPU、内存等
  • 采取措施:根据瓶颈类型采取相应的措施
  • 验证效果:验证措施的效果
  • 预防措施:制定预防类似问题的措施

Q6: 如何建立完善的数据库文档体系?

A6: 建立完善的数据库文档体系的方法:

  • 确定文档范围:确定需要创建的文档类型和范围
  • 制定文档模板:制定标准化的文档模板
  • 分配责任:分配文档创建和维护的责任
  • 定期更新:定期更新文档,确保文档的准确性
  • 使用文档管理工具:使用文档管理工具,如 Confluence 等
  • 培训和分享:培训团队成员使用文档,分享文档知识