深入探索Oracle数据库维护与故障排查
立即解锁
发布时间: 2025-08-21 02:09:21 阅读量: 3 订阅数: 6 

### 深入探索 Oracle 数据库维护与故障排查
#### 1. 数据库维护前期准备
在进行 Oracle 数据库维护时,有几个关键的前期准备工作需要完成。
- **备份策略**:建议进行多份备份,以防其中一份损坏。就像跳伞者会携带备用降落伞一样,数据库备份也是应对数据修改后可能出现问题的重要手段。在大量数据被修改后,如果没有备份,可能无法恢复数据。此外,还需要与应用程序开发人员合作,考虑数据库外其他需要撤销的更改,例如 DNS 网络更改可能需要数小时才能生效,若向数千个客户端工作站推送更改,必要时如何回滚也是需要考虑的问题。
- **支持人员准备**:数据库维护通常在周末或深夜进行,因此需要确保相关人员能够提供支持。具体包括:
- 拥有所有相关人员的电话号码。
- 确认他们愿意且能够在凌晨 3 点问题出现时提供帮助,在开始工作前应告知他们可能需要其协助。
- 确认他们是否有权限进行更改。
- **验证计划**:需要确定谁来测试并确认修复是否有效。制定测试计划并安排测试人员或有经验的用户参与是个不错的选择,特别是在需要进行数据或应用程序更改时。在执行计划前,应先进行预演,避免发现与要修复问题无关的应用程序故障。同时,要确保测试人员在维护工作完成后能够及时到位。
- **最终备份**:在完成技术修复的开发、测试、应用和验证后,在将系统交付给用户之前,通常需要进行一次完整的数据库或系统备份。这样,在出现无关问题需要恢复时,无需重复之前的修复步骤。
#### 2. 利用 Oracle 数据库日志进行故障排查
要深入了解 Oracle 日志本身,每个数据库都有一组存储关键日志、跟踪和转储文件的目录。
- **数据库日志基础设施**:使用日志文件诊断问题是数据库管理员(DBA)的日常工作,因此了解 Oracle 如何管理这一关键资源非常重要。Oracle 日志文件的结构和管理由自动诊断存储库(ADR)负责,它提供以下日志管理功能:
- 集成日志管理,不仅适用于数据库,还适用于其他 Oracle 产品。目前,自动存储管理和监听器也会写入新的日志基础设施。
- 以事件为单位进行日志记录,包含诊断数据并存储在 zip 文件中,可进行查看并发送给 Oracle 支持。这样可以更好地划分错误事件并进行打包,方便直接发送给支持团队。
- 事件洪流控制,智能限制跟踪文件的创建和大小。如果事件以超过定义阈值的极高频率重复发生,仅记录事件的发生情况。
关键诊断文件的位置如下:
- 诊断子目录(diag)的位置是 ADR_BASE,通常位于 ORACLE_BASE 下。
- 日志子目录的基础位置是 ADR_HOME,由数据库参数 DIAGNOSTIC_DEST 定义。
- ADR_HOME 位于 ADR_BASE 位置之下,在数据库 SID 目录中。
数据库的 ADR_HOME 结构如下:
```plaintext
$ADR_BASE/diag/rdbms/DATABASE NAME/DATABASE SID
```
例如,dev12c 数据库的结构如下:
```plaintext
$ ls $ORACLE_BASE/diag/rdbms/dev12c/dev12c
alert hm incpkg lck metadata metadata_pv sweep
cdump incident ir log metadata_dgif stage trace
```
ADR_HOME 位置是完整路径,直到并包括第二次引用 dev12c。可以通过 V$DIAG_INFO 查询数据库中存储的相关信息:
```sql
SQL> select name, value from v$diag_info;
NAME VALUE
----------- ---------------------------------
Diag Enabled TRUE
ADR Base /u01/app/oracle
ADR Home /u01/app/oracle/diag/rdbms/dev12c/dev12c
Diag Trace /u01/app/oracle/diag/rdbms/dev12c/dev12c/trace
Diag Alert /u01/app/oracle/diag/rdbms/dev12c/dev12c/alert
Diag Incident /u01/app/oracle/diag/rdbms/dev12c/dev12c/incident
Diag Cdump /u01/app/oracle/diag/rdbms/dev12c/dev12cl/cdump
Health Monitor /u01/app/oracle/diag/rdbms/dev12c/dev12c/hm
Default Trace File
/u01/app/oracle/diag/rdbms/dev12c/dev12c/trace/dev12c_ora_23293.trc
Active Problem Count 0
Active Incident Count 0
11 rows selected.
```
每个数据库目录中都有存储不同文件的子目录,主要目录及其用途如下表所示:
| 目录 | 用途 |
| ---- | ---- |
| alert | 存储非常重要的数据库 XML 格式警报日志 |
| cdump | 进程失败时内存堆栈的核心转储位置 |
| incident | 与单个事件或事件相关的子目录 |
| trace | 后台和用户进程的跟踪和转储文件,也包含文本格式的警报日志 |
这些目录可能会被大量文件填满,占用磁盘空间。因此,需要制定清理跟踪、cdump 和事件目录的流程,以避免磁盘空间被占满,并便于管理。
- **数据库警报日志**:数据库警报日志是审查数据库时最重要的文件,它记录数据库级别的错误以及启动、关闭等操作和其他事件。Oracle 在数据库运行时按时间顺序写入这个基于文本的文件。警报日志位于 alert 子目录中,名为 log.xml。
- 每当出现问题时,应查看警报日志文件。
- DBA 应每天审查警报日志文件,确保未检测到的错误不会被遗漏。
许多 DBA 会编写脚本扫描警报日志以查找错误,并在检测到关键事件时发送电子邮件通知。此外,为防止警报日志过大,许多 DBA 会每周备份一次。
以下是一个 XML 格式的警报日志文件示例:
```xml
<msg time='2013-07-19T13:22:18.955-04:00' org_id='oracle' comp_id='rdbms'
msg_id='opiexe:3292:2802784106' type='NOTIFICATION' group='admin_ddl'
level='16' host_id='oralinux1' host_addr='192.168.1.66'
module='sqlplus@oralinux1 (TNS V1-V3)' pid='24286'>
<txt>Completed: CREATE DATABASE "dev12c"
MAXINSTANCES 8
MAXLOGHISTORY 1
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
DATAFILE '/u01/app/oracle/oradata/dev12c/system01.dbf' SIZE 700M REUSE
AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL
SYSAUX DATAFILE '/u01/app/oracle/oradata/dev12c/sysaux01.dbf'
SIZE 550M REUSE AUTOEXTEND ON NEXT 10240K MAXSIZE UNLIMITED
SMALLFILE DEFAULT TEMPORARY TABLESPACE TEMP TEMPFILE '/u01/app/oracle/orada
ta/dev12c/temp01.dbf' SIZE 20M REUSE AUTOEXTEND ON NEXT 640K
MAXSIZE UNLIMITED
SMALLFILE UNDO TABLESPACE "UNDOTBS1" DATAFILE '
/u01/app/oracle/o
radata/dev12c/undotbs01.dbf' SIZE 200M REUSE AUTOEXTEND ON NEXT 5120K
MAXSIZE UNLIMITED
CHARACTER SET WE8MSWIN1252
NATIONAL CHARACTER SET AL16UTF16
LOGFILE GROUP 1 ('/u01/app/oracle/oradata/dev12c/redo01.log') SIZE
50M,
GROUP 2 ('/u01/app/oracle/oradata/dev12c/redo02.log') SIZE 50M,
GROUP 3 ('/u01/app/oracle/oradata/dev12c/redo03.log') SIZE 50M
USER SYS IDENTIFIED BY USER SYSTEM IDENTIFIED BY
</txt>
</msg>
<msg time='2013-07-19T13:22:19.033-04:00' org_id='oracle' comp_id='rdbms'
msg_id='opiexe:3209:4222364190' type='NOTIFICATION' group='admin_ddl'
level='16' host_id='oralinux1' host_addr='192.168.1.66'
module='sqlplus@oralinux1 (TNS V1-V3)' pid='24311'>
<txt>CREATE SMALLFILE TABLESPACE "USERS" LOGGING DATAFILE '/u0
1/app/oracle/oradata/dev12c/users0
```
0
0
复制全文