Oracle如何报告问题,分类问题,以及诊断问题的工具。
自动诊断流程
automatic diagnostic repository,以下简称ADR。ADR是自动的,总是开启的,repository表示其存于固定位置。ADR中数据可打包发送到Oracle Support。
理解ADR
ADR基于文件,针对所有产品。例如数据库和ASM都有自己的ADR home目录,称为ADR base。RAC实例在ADR base下有子目录。
如果DIAGNOSTIC_DEST已设定,ADR base即为此值。如未设定,则ADR base设成ORACLE_BASE环境变量。
SQL> show parameter diag
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
diagnostic_dest string /opt/oracle
SQL> !echo $ORACLE_BASE
/opt/oracle
详细目录可查询:
SQL> select inst_id, name, value from v$diag_info;
INST_ID NAME VALUE
---------- ------------------------ ----------------------------------------------------------------------
1 Diag Enabled TRUE
1 ADR Base /opt/oracle
1 ADR Home /opt/oracle/diag/rdbms/orclcdb/ORCLCDB
1 Diag Trace /opt/oracle/diag/rdbms/orclcdb/ORCLCDB/trace
1 Diag Alert /opt/oracle/diag/rdbms/orclcdb/ORCLCDB/alert
1 Diag Incident /opt/oracle/diag/rdbms/orclcdb/ORCLCDB/incident
1 Diag Cdump /opt/oracle/diag/rdbms/orclcdb/ORCLCDB/cdump
1 Health Monitor /opt/oracle/diag/rdbms/orclcdb/ORCLCDB/hm
1 Default Trace File /opt/oracle/diag/rdbms/orclcdb/ORCLCDB/trace/ORCLCDB_ora_13259.trc
1 Active Problem Count 0
1 Active Incident Count 0
1 ORACLE_HOME /opt/oracle/product/19c/dbhome_1
12 rows selected.
注意inst_id,可区分RAC实例。另外,alert是XML格式,trace是平文件格式。
trace和dump的区别为,前者是连续的,后者是某一时间点的。
使用ADRCI工具
CI表示command interpreter。
ADRCI是用来查询ADR的,由于ADR基于文件系统,因此数据库宕机也可以使用,也不需要登录。
$ adrci
ADRCI: Release 19.0.0.0.0 - Production on Thu Dec 12 20:53:30 2019
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
ADR base = "/opt/oracle"
adrci> help
HELP [topic]
Available Topics:
CREATE REPORT
ECHO
ESTIMATE
EXIT
HELP
HOST
IPS
PURGE
RUN
SELECT
SET BASE
SET BROWSER
SET CONTROL
SET ECHO
SET EDITOR
SET HOMES | HOME | HOMEPATH
SET TERMOUT
SHOW ALERT
SHOW BASE
SHOW CONTROL
SHOW HM_RUN
SHOW HOMES | HOME | HOMEPATH
SHOW INCDIR
SHOW INCIDENT
SHOW LOG
SHOW PROBLEM
SHOW REPORT
SHOW TRACEFILE
SPOOL
There are other commands intended to be used directly by Oracle, type
"HELP EXTENDED" to see the list
adrci> show alert
Choose the home from which to view the alert log:
1: diag/rdbms/orclcdb/ORCLCDB
2: diag/rdbms/rcat/rcat
3: diag/tnslsnr/oracle-19c-vagrant/listener
Q: to quit
Please select option: 1
Output the results to file: /tmp/alert_14344_1404_ORCLCDB_1.ado
Please select option: Q
adrci>
OEM也可以实现同样的功能。
理解Alerts, Problems和 Incidents
problem是数据库的严重错误。incident是problem的单次出现。也就是说,problem有多个incident。
problem有problem key,incident有ID,存于ADR_HOME/incident/incdir_n。例如/opt/oracle/diag/rdbms/orclcdb/ORCLCDB/incident
incident发生时,会存入alert log,发送alert到EM,邮件alert到管理员,使用ID标记incident。在ADR_HOME下创建incident目录。
使用Health Monitor
Health Monitor可检测数据库健康状况。包括数据文件,内存,事务一致性,元数据,进程使用情况。
可使用EM或DBMS_HM包运行。一些检查要求数据库必须open,一些检查数据库可处于nomount状态。
可做的检查和要求可见下表:
SQL> select id, name, offline_capable, internal_check from v$hm_check;
ID NAME O I
---------- ---------------------------------------------------------------- - -
1 HM Test Check Y Y
2 DB Structure Integrity Check Y N
25 CF Block Integrity Check Y N
3 Data Block Integrity Check Y N
4 Redo Integrity Check Y N
5 Logical Block Check N Y
10 Transaction Integrity Check N N
11 Undo Segment Integrity Check N N
12 No Mount CF Check Y Y
31 Mount CF Check Y Y
13 CF Member Check Y Y
14 All Datafiles Check Y Y
15 Single Datafile Check Y Y
30 Tablespace Check Check Y Y
16 Log Group Check Y Y
17 Log Group Member Check Y Y
18 Archived Log Check Y Y
19 Redo Revalidation Check Y Y
20 IO Revalidation Check Y Y
21 Block IO Revalidation Check Y Y
34 Failover Check Y Y
22 Txn Revalidation Check N Y
23 Failure Simulation Check Y Y
24 Dictionary Integrity Check N N
26 ASM Mount Check Y Y
27 ASM Allocation Check Y N
28 ASM Disk Visibility Check Y Y
29 ASM File Busy Check Y Y
32 ASM Toomanyoff Check Y Y
33 ASM Insufficient Disks Check Y Y
35 ASM Insufficient Mem Check Y Y
36 ASM DGFDM Check No DG Name Y Y
37 ASM DG Force Dismount Check Y Y
38 ASM Sync IO Fail Check Y Y
34 rows selected.
ADRCI的show hm_run
可显示健康检查结果。
adrci> show hm_run;
ADR Home = /opt/oracle/diag/rdbms/orclcdb/ORCLCDB:
*************************************************************************
**********************************************************
HM RUN RECORD 1
**********************************************************
RUN_ID 1
RUN_NAME HM_RUN_1
CHECK_NAME DB Structure Integrity Check
NAME_ID 2
MODE 2
START_TIME 2019-11-28 20:46:25.394390 +08:00
RESUME_TIME <NULL>
END_TIME 2019-11-28 20:46:25.559960 +08:00
MODIFIED_TIME 2019-11-28 20:46:25.559960 +08:00
TIMEOUT 0
FLAGS 0
STATUS 5
SRC_INCIDENT_ID 0
NUM_INCIDENTS 0
ERR_NUMBER 0
REPORT_FILE <NULL>
CON_UID 1
CONTAINER_ID 1
CONTAINER_NAME CDB$ROOT
**********************************************************
HM RUN RECORD 2
**********************************************************
RUN_ID 21
RUN_NAME HM_RUN_21
CHECK_NAME DB Structure Integrity Check
NAME_ID 2
MODE 2
START_TIME 2019-11-29 21:05:34.960325 +08:00
RESUME_TIME <NULL>
END_TIME 2019-11-29 21:05:35.241737 +08:00
MODIFIED_TIME 2019-11-29 21:05:35.241737 +08:00
TIMEOUT 0
FLAGS 0
STATUS 5
SRC_INCIDENT_ID 0
NUM_INCIDENTS 0
ERR_NUMBER 0
REPORT_FILE <NULL>
CON_UID 1
CONTAINER_ID 1
CONTAINER_NAME CDB$ROOT
...
adrci> show hm_run -p run_id=1281
ADR Home = /opt/oracle/diag/rdbms/orclcdb/ORCLCDB:
*************************************************************************
**********************************************************
HM RUN RECORD 1
**********************************************************
RUN_ID 1281
RUN_NAME HM_RUN_1281
CHECK_NAME DB Structure Integrity Check
NAME_ID 2
MODE 2
START_TIME 2019-12-08 18:48:58.806901 +08:00
RESUME_TIME <NULL>
END_TIME 2019-12-08 18:48:59.075689 +08:00
MODIFIED_TIME 2019-12-08 18:48:59.075689 +08:00
TIMEOUT 0
FLAGS 0
STATUS 5
SRC_INCIDENT_ID 0
NUM_INCIDENTS 0
ERR_NUMBER 0
REPORT_FILE <NULL>
CON_UID 1
CONTAINER_ID 1
CONTAINER_NAME CDB$ROOT
1 row fetched
adrci> create report hm_run HM_RUN_1281
adrci> show report hm_run HM_RUN_1281;
手工执行健康检查:
SQL> exec dbms_hm.run_check(check_name=>'Dictionary Integrity Check', run_name=>'my_dd_check');
PL/SQL procedure successfully completed.
SQL> set long 1000
SQL> select dbms_hm.get_run_report('MY_DD_CHECK') from dual;
DBMS_HM.GET_RUN_REPORT('MY_DD_CHECK')
--------------------------------------------------------------------------------
Basic Run Information
Run Name : my_dd_check
Run Id : 2041
Check Name : Dictionary Integrity Check
Mode : MANUAL
Status : COMPLETED
Start Time : 2019-12-12 21:42:49.248667 +08:00
End Time : 2019-12-12 21:42:50.380532 +08:00
Error Encountered : 0
Source Incident Id : 0
Number of Incidents Created : 0
DBMS_HM.GET_RUN_REPORT('MY_DD_CHECK')
--------------------------------------------------------------------------------
Input Parameters for the Run
TABLE_NAME=ALL_CORE_TABLES
CHECK_MASK=ALL
Run Findings And Recommendations
Finding
Finding Name : Dictionary Inconsistency
Finding ID : 2042
处理块损坏
当数据库从数据文件中读取或写到数据文件时,会做以下的检查:
- 检查块版本与数据库版本一致
- cache中的数据块地址与block buffer中的地址一致
- 数据库校验和正确
块损坏
块损坏时会报ORA-01578错。大部分的块损坏都是由硬件引起的。
块检查可参数DB_BLOCK_CHECKSUM 和 DB_BLOCK_CHECKING控制。前者检查磁盘上的错误,后者检查内存中的错误。后者性能开销大。
SQL> show parameter block_check
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_block_checking string FALSE
db_block_checksum string TYPICAL
DB_BLOCK_CHECKSUM取值为OFF,TYPICAL和FULL。
TYPICAL在读取和写入数据文件时检查。FULL是每次发生改变时都检查。
B_BLOCK_CHECKING控制如何检查数据库逻辑结构。默认不检查。
不过,无论此两参数如何设置,SYSTEM表空间都是要检查的。
使用Block Media Recovery
如果发现少量块损坏,可考虑通过RMAN的Block Media Recovery恢复,而无需整个数据文件恢复。
除DB_BLOCK_CHECKING做的检查,RMAN BACKUP 和BACKUP VALIDATE也会将块损坏信息写到V$DATABASE_BLOCK_CORRUPTION
视图中
Block Media Recovery的好处
Block Media Recovery利用最近的备份,归档和online redo来恢复,产生的I/O少,恢复速度快。恢复时,数据文件在线,只有少量表或索引不可用。
运行命令RMAN RECOVER . . . BLOCK
时,RMAN会使用flashback log(如开启),level 0 或全备中的损坏数据库的正常拷贝进行restore,并结合redo log进行recovery。
V$DATABASE_BLOCK_CORRUPTION
可查询物理或逻辑损坏的数据库信息。RMAN backup,ANALYZE,dbv(OS命令),和遇到坏块的查询都会往此视图添加信息。
使用 Block Media Recovery的前提
必须开启归档。
必须有全备,level 0 增备或flashback log之一,flashback恢复速度最快。
使用RMAN RECOVER . . . BLOCK命令
块损坏报错来源于:
- RMAN LIST FAILURE, VALIDATE, 或BACKUP . . . VALIDATE 命令
- V$DATABASE_BLOCK_CORRUPTION视图
- SQL*Plus等客户端应用的报错
- alert log或trace文件
- ANALYZE TABLE 或 ANALYZE INDEX命令
- DBVERIFY命令 - dbv
恢复时,RMAN必须知道数据文件号和损坏块号。例如:
RMAN> recover datafile 6 block 123
如果坏块记录在V$DATABASE_BLOCK_CORRUPTION
中,可以一次性恢复:
RMAN> recover corruption list;
使用数据恢复建议器(Data Recovery Advisor)
可检测出坏块和一些影响数据库正常启动的错误。
定位错误
可以通过EM和命令行调用,可以在EM或RMAN中查看结果。
RMAN中的命令包括:
- LIST FAILURE:显示DRA记录的错误
- ADVISE FAILURE:显示修复建议
- REPAIR FAILURE:使用建议修复错误
- CHANGE FAILURE:关闭错误
实施恢复
RMAN ADVISE FAILURE显示修复建议,REPAIR FAILURE实施修复建议。
Data Recovery Advisor 视图
- V$IR_FAILURE
- V$IR_MANUAL_CHECKLIST
- V$IR_REPAIR
- V$IR_REPAIR_SET
示例,首先确认有全备:
RMAN> list backup of tablespace sysaux;
starting full resync of recovery catalog
full resync complete
List of Backup Sets
===================
BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
138 Full 68.00M DISK 00:00:45 03-DEC-19
BP Key: 162 Status: AVAILABLE Compressed: YES Tag: TAG20191203T211643
Piece Name: /u02/fra/backups/ORCLCDB_20191203_0fuihbts
List of Datafiles in backup set 138
File LV Type Ckp SCN Ckp Time Abs Fuz SCN Sparse Name
---- -- ---- ---------- --------- ----------- ------ ----
3 Full 3639262 03-DEC-19 NO /opt/oracle/oradata/ORCLCDB/sysaux01.dbf
BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
441 Full 67.30M DISK 00:00:23 07-DEC-19
BP Key: 451 Status: AVAILABLE Compressed: YES Tag: TAG20191207T110516
Piece Name: /u02/fra/backups/ORCLCDB_20191207_17uiqpje
List of Datafiles in backup set 441
File LV Type Ckp SCN Ckp Time Abs Fuz SCN Sparse Name
---- -- ---- ---------- --------- ----------- ------ ----
3 Full 3871655 07-DEC-19 NO /opt/oracle/oradata/ORCLCDB/sysaux01.dbf
BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
602 Incr 0 67.30M DISK 00:00:22 07-DEC-19
BP Key: 612 Status: AVAILABLE Compressed: YES Tag: TAG20191207T112347
Piece Name: /u02/fra/backups/ORCLCDB_20191207_1nuiqqm4
List of Datafiles in backup set 602
File LV Type Ckp SCN Ckp Time Abs Fuz SCN Sparse Name
---- -- ---- ---------- --------- ----------- ------ ----
3 0 Incr 3873478 07-DEC-19 NO /opt/oracle/oradata/ORCLCDB/sysaux01.dbf
如无,运行以下命令:
backup as backupset tablespace sysaux;
关闭数据库:
shutdown immediate;
删除文件:
rm /opt/oracle/oradata/ORCLCDB/sysaux01.dbf
启动数据库,会报错:
SQL> startup
ORACLE instance started.
Total System Global Area 1207955552 bytes
Fixed Size 9134176 bytes
Variable Size 452984832 bytes
Database Buffers 738197504 bytes
Redo Buffers 7639040 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 3 - see DBWR trace file
ORA-01110: data file 3: '/opt/oracle/oradata/ORCLCDB/sysaux01.dbf'
在RMAN中修复:
$ rman target / catalog rcat_owner/Welcome1@rcat
Recovery Manager: Release 19.0.0.0.0 - Production on Thu Dec 12 22:42:28 2019
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
connected to target database: ORCLCDB (DBID=2795391422, not open)
connected to recovery catalog database
RMAN> list failure;
starting full resync of recovery catalog
full resync complete
Database Role: PRIMARY
List of Database Failures
=========================
Failure ID Priority Status Time Detected Summary
---------- -------- --------- ------------- -------
2042 CRITICAL OPEN 12-DEC-19 SQL dictionary health check: seg$.type# 31 on object SEG$ failed
1282 HIGH OPEN 12-DEC-19 One or more non-system datafiles are missing
2062 HIGH OPEN 12-DEC-19 Online log member /opt/oracle/oradata/ORCLCDB/redo01.log is missing
2005 HIGH OPEN 12-DEC-19 Online log member /opt/oracle/oradata/ORCLCDB/redo03.log is missing
2002 HIGH OPEN 12-DEC-19 Online log member /opt/oracle/oradata/ORCLCDB/redo02_2.log is missing
RMAN> advise failure;
Database Role: PRIMARY
List of Database Failures
=========================
Failure ID Priority Status Time Detected Summary
---------- -------- --------- ------------- -------
2042 CRITICAL OPEN 12-DEC-19 SQL dictionary health check: seg$.type# 31 on object SEG$ failed
1282 HIGH OPEN 12-DEC-19 One or more non-system datafiles are missing
2062 HIGH OPEN 12-DEC-19 Online log member /opt/oracle/oradata/ORCLCDB/redo01.log is missing
2005 HIGH OPEN 12-DEC-19 Online log member /opt/oracle/oradata/ORCLCDB/redo03.log is missing
2002 HIGH OPEN 12-DEC-19 Online log member /opt/oracle/oradata/ORCLCDB/redo02_2.log is missing
analyzing automatic repair options; this may take some time
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=259 device type=DISK
allocated channel: ORA_DISK_2
channel ORA_DISK_2: SID=25 device type=DISK
allocated channel: ORA_DISK_3
channel ORA_DISK_3: SID=260 device type=DISK
allocated channel: ORA_DISK_4
channel ORA_DISK_4: SID=26 device type=DISK
analyzing automatic repair options complete
Mandatory Manual Actions
========================
1. If file /opt/oracle/oradata/ORCLCDB/redo01.log was unintentionally renamed or moved, restore it
2. Contact Oracle Support Services if the preceding recommendations cannot be used, or if they do not fix the failures selected for repair
3. Please contact Oracle Support Services to resolve failure 2042: SQL dictionary health check: seg$.type# 31 on object SEG$ failed
Optional Manual Actions
=======================
1. If file /opt/oracle/oradata/ORCLCDB/sysaux01.dbf was unintentionally renamed or moved, restore it
2. If file /opt/oracle/oradata/ORCLCDB/redo03.log was unintentionally renamed or moved, restore it
3. If file /opt/oracle/oradata/ORCLCDB/redo02_2.log was unintentionally renamed or moved, restore it
Automated Repair Options
========================
Option Repair Description
------ ------------------
1 Restore and recover datafile 3; Drop and re-create redo log group member /opt/oracle/oradata/ORCLCDB/redo03.log; Drop and re-create redo log group member /opt/oracle/oradata/ORCLCDB/redo02_2.log
Strategy: The repair includes complete media recovery with no data loss
Repair script: /opt/oracle/diag/rdbms/orclcdb/ORCLCDB/hm/reco_1309190323.hm
RMAN> repair failure;
Strategy: The repair includes complete media recovery with no data loss
Repair script: /opt/oracle/diag/rdbms/orclcdb/ORCLCDB/hm/reco_1309190323.hm
contents of repair script:
# restore and recover datafile
restore ( datafile 3 );
recover datafile 3;
sql 'alter database datafile 3 online';
# drop/recreate redo log group member
sql "begin sys.dbms_ir.execsqlscript(filename => ''/opt/oracle/diag/rdbms/orclcdb/ORCLCDB/hm/reco_1531385993.hm'' ); end;";
# drop/recreate redo log group member
sql "begin sys.dbms_ir.execsqlscript(filename => ''/opt/oracle/diag/rdbms/orclcdb/ORCLCDB/hm/reco_2846098454.hm'' ); end;";
Do you really want to execute the above repair (enter YES or NO)? YES
executing repair script
Starting restore at 12-DEC-19
using channel ORA_DISK_1
using channel ORA_DISK_2
using channel ORA_DISK_3
using channel ORA_DISK_4
channel ORA_DISK_1: restoring datafile 00003
input datafile copy RECID=5 STAMP=1026594939 file name=/u02/fra/backups/ORCLCDB_20191209_22uj161h
destination for restore of datafile 00003: /opt/oracle/oradata/ORCLCDB/sysaux01.dbf
channel ORA_DISK_1: copied datafile copy of datafile 00003, elapsed time: 00:00:15
output file name=/opt/oracle/oradata/ORCLCDB/sysaux01.dbf RECID=0 STAMP=0
Finished restore at 12-DEC-19
Starting recover at 12-DEC-19
using channel ORA_DISK_1
using channel ORA_DISK_2
using channel ORA_DISK_3
using channel ORA_DISK_4
starting media recovery
archived log for thread 1 with sequence 32 is already on disk as file /u02/fra/ORCLCDB/archivelog/2019_12_10/o1_mf_1_32_gyzdmsnf_.arc
archived log for thread 1 with sequence 33 is already on disk as file /u02/fra/ORCLCDB/archivelog/2019_12_10/o1_mf_1_33_gyzdmsq7_.arc
archived log for thread 1 with sequence 1 is already on disk as file /u02/fra/ORCLCDB/archivelog/2019_12_11/o1_mf_1_1_gz1vj598_.arc
archived log for thread 1 with sequence 2 is already on disk as file /u02/fra/ORCLCDB/archivelog/2019_12_12/o1_mf_1_2_gz43g4bn_.arc
archived log for thread 1 with sequence 3 is already on disk as file /u02/fra/ORCLCDB/archivelog/2019_12_12/o1_mf_1_3_gz44nv7h_.arc
archived log file name=/u02/fra/ORCLCDB/archivelog/2019_12_10/o1_mf_1_32_gyzdmsnf_.arc thread=1 sequence=32
archived log file name=/u02/fra/ORCLCDB/archivelog/2019_12_10/o1_mf_1_33_gyzdmsq7_.arc thread=1 sequence=33
archived log file name=/u02/fra/ORCLCDB/archivelog/2019_12_11/o1_mf_1_1_gz1vj598_.arc thread=1 sequence=1
media recovery complete, elapsed time: 00:00:01
Finished recover at 12-DEC-19
sql statement: alter database datafile 3 online
sql statement: begin sys.dbms_ir.execsqlscript(filename => ''/opt/oracle/diag/rdbms/orclcdb/ORCLCDB/hm/reco_1531385993.hm'' ); end;
starting full resync of recovery catalog
full resync complete
sql statement: begin sys.dbms_ir.execsqlscript(filename => ''/opt/oracle/diag/rdbms/orclcdb/ORCLCDB/hm/reco_2846098454.hm'' ); end;
starting full resync of recovery catalog
full resync complete
repair failure complete
RMAN> list failure;
Database Role: PRIMARY
List of Database Failures
=========================
Failure ID Priority Status Time Detected Summary
---------- -------- --------- ------------- -------
2042 CRITICAL OPEN 12-DEC-19 SQL dictionary health check: seg$.type# 31 on object SEG$ failed
2062 HIGH OPEN 12-DEC-19 Online log member /opt/oracle/oradata/ORCLCDB/redo01.log is missing
此时数据库可以启动。
还遗留一些不能自动修复的问题:
RMAN> list failure;
Database Role: PRIMARY
List of Database Failures
=========================
Failure ID Priority Status Time Detected Summary
---------- -------- --------- ------------- -------
2042 CRITICAL OPEN 12-DEC-19 SQL dictionary health check: seg$.type# 31 on object SEG$ failed
2062 HIGH OPEN 12-DEC-19 Online log member /opt/oracle/oradata/ORCLCDB/redo01.log is missing
RMAN> advise failure;
Database Role: PRIMARY
List of Database Failures
=========================
Failure ID Priority Status Time Detected Summary
---------- -------- --------- ------------- -------
2042 CRITICAL OPEN 12-DEC-19 SQL dictionary health check: seg$.type# 31 on object SEG$ failed
2062 HIGH OPEN 12-DEC-19 Online log member /opt/oracle/oradata/ORCLCDB/redo01.log is missing
analyzing automatic repair options; this may take some time
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=274 device type=DISK
allocated channel: ORA_DISK_2
channel ORA_DISK_2: SID=267 device type=DISK
allocated channel: ORA_DISK_3
channel ORA_DISK_3: SID=273 device type=DISK
allocated channel: ORA_DISK_4
channel ORA_DISK_4: SID=41 device type=DISK
analyzing automatic repair options complete
Mandatory Manual Actions
========================
1. If file /opt/oracle/oradata/ORCLCDB/redo01.log was unintentionally renamed or moved, restore it
2. Contact Oracle Support Services if the preceding recommendations cannot be used, or if they do not fix the failures selected for repair
3. Please contact Oracle Support Services to resolve failure 2042: SQL dictionary health check: seg$.type# 31 on object SEG$ failed
Optional Manual Actions
=======================
no manual actions available
Automated Repair Options
========================
no automatic repair options available
如下修复:
SQL> select group#, sequence#, archived, status from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
1 4 NO CURRENT
2 2 YES INACTIVE
3 3 YES INACTIVE
SQL> select group#, status, member from v$logfile;
GROUP# STATUS MEMBER
---------- ------- ----------------------------------------------------------------
3 INVALID /opt/oracle/oradata/ORCLCDB/redo03.log
2 /opt/oracle/oradata/ORCLCDB/redo02.log
1 /opt/oracle/oradata/ORCLCDB/redo01.log
1 /opt/oracle/oradata/ORCLCDB/redo01_2.log
2 INVALID /opt/oracle/oradata/ORCLCDB/redo02_2.log
3 /opt/oracle/oradata/ORCLCDB/redo03_2.log
6 rows selected.
3和2都是INACTIVE。并且已经归档。处理就简单了:
SQL> alter database clear logfile group 2;
Database altered.
SQL> alter database clear logfile group 3;
Database altered.
SQL> select group#, status, member from v$logfile;
GROUP# STATUS MEMBER
---------- ------- ----------------------------------------------------------------
3 /opt/oracle/oradata/ORCLCDB/redo03.log
2 /opt/oracle/oradata/ORCLCDB/redo02.log
1 /opt/oracle/oradata/ORCLCDB/redo01.log
1 /opt/oracle/oradata/ORCLCDB/redo01_2.log
2 /opt/oracle/oradata/ORCLCDB/redo02_2.log
3 /opt/oracle/oradata/ORCLCDB/redo03_2.log
6 rows selected.
不过错误还在:
RMAN> list failure;
Database Role: PRIMARY
List of Database Failures
=========================
Failure ID Priority Status Time Detected Summary
---------- -------- --------- ------------- -------
2042 CRITICAL OPEN 12-DEC-19 SQL dictionary health check: seg$.type# 31 on object SEG$ failed
2062 HIGH OPEN 12-DEC-19 Online log member /opt/oracle/oradata/ORCLCDB/redo01.log is missing
关闭错误:
RMAN> change failure 2062 closed;
Database Role: PRIMARY
List of Database Failures
=========================
Failure ID Priority Status Time Detected Summary
---------- -------- --------- ------------- -------
2062 HIGH OPEN 12-DEC-19 Online log member /opt/oracle/oradata/ORCLCDB/redo01.log is missing
Do you really want to change the above failures (enter YES or NO)? YES
closed 1 failures
RMAN> list failure;
Database Role: PRIMARY
List of Database Failures
=========================
Failure ID Priority Status Time Detected Summary
---------- -------- --------- ------------- -------
2042 CRITICAL OPEN 12-DEC-19 SQL dictionary health check: seg$.type# 31 on object SEG$ failed