外观
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 );监控统计信息状态:
sqlSELECT 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. 索引维护
检查索引状态:
sqlSELECT 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. 表空间维护
检查表空间使用情况:
sqlSELECT 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. 日志文件维护
检查重做日志状态:
sqlSELECT group#, member, status FROM v$logfile ORDER BY group#, member;检查归档日志空间:
bashdf -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. 数据库参数优化
内存参数
SGA 大小:
sqlALTER SYSTEM SET sga_target = 16G SCOPE=SPFILE;PGA 大小:
sqlALTER SYSTEM SET pga_aggregate_target = 4G SCOPE=SPFILE;共享池大小:
sqlALTER SYSTEM SET shared_pool_size = 2G SCOPE=SPFILE;缓冲区缓存大小:
sqlALTER SYSTEM SET db_cache_size = 8G SCOPE=SPFILE;
写入参数
日志缓冲区大小:
sqlALTER SYSTEM SET log_buffer = 16M SCOPE=SPFILE;提交写入模式:
sqlALTER SYSTEM SET commit_write = 'BATCH,ASYNC' SCOPE=SPFILE;DBW 进程数:
sqlALTER SYSTEM SET db_writer_processes = 4 SCOPE=SPFILE;
读取参数
多块读取大小:
sqlALTER SYSTEM SET db_file_multiblock_read_count = 16 SCOPE=SPFILE;优化器模式:
sqlALTER 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 审核流程:
- 开发人员提交 SQL
- DBA 审核 SQL
- 优化 SQL 语句
- 部署到生产环境
使用 SQL 审核工具:如 Oracle SQL Developer、Toad 等
3. 存储优化
表空间设计
合理规划表空间:根据数据类型和使用模式创建表空间
使用本地管理表空间:
sqlCREATE 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;使用大文件表空间:
sqlCREATE BIGFILE TABLESPACE big_users DATAFILE '/u01/app/oracle/oradata/ORCL/big_users01.dbf' SIZE 10G AUTOEXTEND ON NEXT 1G MAXSIZE 100G;
数据压缩
表压缩:
sqlCREATE TABLE employees ( employee_id NUMBER, first_name VARCHAR2(50), last_name VARCHAR2(50) ) COMPRESS;索引压缩:
sqlCREATE 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. 访问控制
用户管理
创建用户:
sqlCREATE USER app_user IDENTIFIED BY password DEFAULT TABLESPACE users QUOTA UNLIMITED ON users;授权用户:
sqlGRANT CONNECT, RESOURCE TO app_user;回收权限:
sqlREVOKE RESOURCE FROM app_user;锁定用户:
sqlALTER USER app_user ACCOUNT LOCK;
角色管理
创建角色:
sqlCREATE ROLE app_role;授权角色:
sqlGRANT SELECT, INSERT, UPDATE, DELETE ON app_schema.employees TO app_role;分配角色:
sqlGRANT 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. 认证管理
密码策略
配置密码策略:
sqlALTER 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. 审计管理
启用审计
配置审计参数:
sqlALTER SYSTEM SET audit_trail = 'DB,EXTENDED' SCOPE=SPFILE; SHUTDOWN IMMEDIATE; STARTUP;创建审计策略:
sqlCREATE 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;
审计数据分析
分析审计数据:
sqlSELECT username, action_name, object_name, timestamp FROM dba_audit_trail WHERE object_schema = 'APP_SCHEMA' ORDER BY timestamp DESC;定期审计报告:生成定期审计报告,分析异常访问
4. 加密管理
透明数据加密
配置加密钱包:
sqlALTER SYSTEM SET encryption wallet open identified by "wallet_password";加密表空间:
sqlCREATE TABLESPACE encrypted_ts DATAFILE '/u01/app/oracle/oradata/ORCL/encrypted_ts.dbf' SIZE 10G ENCRYPTION USING 'AES256' DEFAULT STORAGE(ENCRYPT);
网络加密
配置网络加密:在 sqlnet.ora 中配置 SSL/TLS
验证网络加密:
sqlSELECT 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. 恢复演练
定期恢复演练
每月恢复演练:
- 在测试环境中恢复数据库
- 验证恢复结果
- 记录恢复时间和过程
年度灾难恢复演练:
- 模拟灾难场景
- 执行完整的灾难恢复流程
- 验证业务连续性
恢复时间目标
- 设置 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 等
- 培训和分享:培训团队成员使用文档,分享文档知识
