背景:
今天晚上上完OCM的课程后,有个OCP和高可用学员求助于麦老师。他的库是Windows 10.2.0.1的数据库,然后因为病毒问题,学员对数据库做了冷备,然后做了恢复操作,结果启动的时候不能启动,报错ORA-03113、ORA-24324,ORA-01041错误。经过微信简单指导后还是不能启动,于是只能TEAMVIEWER或向日葵来远程协助解决了。TV用了一段时间后断开了,只能用向日葵了。
首先发现第一个问题,就是数据库服务估计是用的以前的,所以需要用oradim重建服务:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | Microsoft Windows [版本 5.2.3790] (C) 版权所有 1985-2003 Microsoft Corp. C:\Documents and Settings\Administrator>sqlplus / as sysdba SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 8月 1 22:21:19 2019 Copyright (c) 1982, 2005, Oracle. All rights reserved. 已连接。 SQL> select open_mode from v$database; select open_mode from v$database * 第 1 行出现错误: ORA-01012: not logged on SQL> conn / as sysdba 已连接到空闲例程。 SQL> startup nomount ORA-01081: cannot start already-running ORACLE - shut it down first SQL> shutdown abort ORA-03113: 通信通道的文件结束 SQL> startup nomount ORA-24324: 未初始化服务句柄 ORA-01041: 内部错误, hostdef 扩展名不存在 SQL> SQL> shutdown abort ORA-24324: 未初始化服务句柄 ORA-01041: 内部错误, hostdef 扩展名不存在 SQL> SQL> exit 已断开连接 C:\Documents and Settings\Administrator> C:\Documents and Settings\Administrator>sqlplus / as sysdba SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 8月 1 22:22:42 2019 Copyright (c) 1982, 2005, Oracle. All rights reserved. ERROR: ORA-12560: TNS: 协议适配器错误 请输入用户名: ERROR: ORA-12560: TNS: 协议适配器错误 请输入用户名: ERROR: ORA-12560: TNS: 协议适配器错误 SP2-0157: 在 3 次尝试之后无法连接到 ORACLE, 退出 SQL*Plus C:\Documents and Settings\Administrator>sc delete oracleserviceorcl [SC] DeleteService 成功 C:\Documents and Settings\Administrator>oradim ORADIM: [options]。请参阅手册。 输入以下命令之一: 通过指定以下选项创建实例: -NEW -SID sid | -SRVC srvc | -ASMSID sid | -ASMSRVC srvc [-SYSPWD pass] [-STARTMODE auto|manual] [-SRVCSTART system|demand] [-PFILE file | -SPFILE] [-SHUTMODE normal|immediate|abort] [-TIMEOUT secs] [-RUNAS osusr/ospass] 通过指定以下选项编辑实例: -EDIT -SID sid | -ASMSID sid [-SYSPWD pass] [-STARTMODE auto|manual] [-SRVCSTART system|demand] [-PFILE file | -SPFILE] [-SHUTMODE normal|immediate|abort] [-SHUTTYPE srvc|inst] [-RUNAS osusr/ospass] 通过指定以下选项删除实例: -DELETE -SID sid | -ASMSID sid | -SRVC srvc | -ASMSRVC srvc 通过指定以下选项启动服务和实例: -STARTUP -SID sid | -ASMSID sid [-SYSPWD pass] [-STARTTYPE srvc|inst|srvc,inst] [-PFILE filename | -SPFILE] 通过指定以下选项关闭服务和实例: -SHUTDOWN -SID sid | -ASMSID sid [-SYSPWD pass] [-SHUTTYPE srvc|inst|srvc,inst] [-SHUTMODE normal|immediate|abort] 通过指定以下参数查询帮助: -? | -h | -help C:\Documents and Settings\Administrator>oradim -new -sid ORCL -pfile E:\oracle\p roduct\10.2.0\db_1\database\initorcl.ora 实例已创建。 C:\Documents and Settings\Administrator>sqlplus / as sysdba SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 8月 1 22:32:21 2019 Copyright (c) 1982, 2005, Oracle. All rights reserved. 已连接到空闲例程。 SQL> startup nomount ORACLE 例程已经启动。 Total System Global Area 612368384 bytes Fixed Size 1332348 bytes Variable Size 174762884 bytes Database Buffers 432013312 bytes Redo Buffers 4259840 bytes SQL> alter database mount; 数据库已更改。 SQL> alter database open; alter database open * 第 1 行出现错误: ORA-03113: 通信通道的文件结束 SQL> |
终于可以使用startup命令了,但是open时还是报错,然后通过告警日志发现了pfile里很多的路径错误,还有redo日志也报错:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | orcl.__db_cache_size=432013312 orcl.__java_pool_size=4194304 orcl.__large_pool_size=4194304 orcl.__shared_pool_size=163577856 orcl.__streams_pool_size=0 *.audit_file_dest='E:\oracle\product\10.2.0/admin/orcl/adump' *.background_dump_dest='E:\oracle\product\10.2.0/admin/orcl/bdump' *.compatible='10.2.0.1.0' *.control_files='E:\oracle\product\10.2.0/oradata/orcl/\control01.ctl','E:\oracle\product\10.2.0/oradata/orcl/\control02.ctl','E:\oracle\product\10.2.0/oradata/orcl/\control03.ctl' *.core_dump_dest='E:\oracle\product\10.2.0/admin/orcl/cdump' *.db_block_size=8192 *.db_domain='' *.db_file_multiblock_read_count=16 *.db_name='orcl' *.db_recovery_file_dest='E:\oracle\product\10.2.0/flash_recovery_area' *.db_recovery_file_dest_size=2147483648 *.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)' *.job_queue_processes=10 *.nls_language='SIMPLIFIED CHINESE' *.nls_territory='CHINA' *.open_cursors=300 *.pga_aggregate_target=203423744 *.processes=1000 *.remote_login_passwordfile='EXCLUSIVE' *.sessions=1105 *.sga_target=612368384 *.undo_management='AUTO' *.undo_tablespace='UNDOTBS1' *.user_dump_dest='E:\oracle\product\10.2.0/admin/orcl/udump' |
于是,我修改为如下模式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | orcl.__db_cache_size=432013312 orcl.__java_pool_size=4194304 orcl.__large_pool_size=4194304 orcl.__shared_pool_size=163577856 orcl.__streams_pool_size=0 *.audit_file_dest='E:\oracle\product\10.2.0\admin\orcl\adump' *.background_dump_dest='E:\oracle\product\10.2.0\admin\orcl\bdump' *.compatible='10.2.0.1.0' *.control_files='E:\oracle\product\10.2.0\oradata\orcl\control01.ctl','E:\oracle\product\10.2.0\oradata\orcl\control02.ctl','E:\oracle\product\10.2.0\oradata\orcl\control03.ctl' *.core_dump_dest='E:\oracle\product\10.2.0\admin\orcl\cdump' *.db_block_size=8192 *.db_domain='' *.db_file_multiblock_read_count=16 *.db_name='orcl' *.db_recovery_file_dest='E:\oracle\product\10.2.0\flash_recovery_area' *.db_recovery_file_dest_size=2147483648 *.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)' *.job_queue_processes=10 *.nls_language='SIMPLIFIED CHINESE' *.nls_territory='CHINA' *.open_cursors=300 *.pga_aggregate_target=203423744 *.processes=1000 *.remote_login_passwordfile='EXCLUSIVE' *.sessions=1105 *.sga_target=612368384 *.undo_management='AUTO' *.undo_tablespace='UNDOTBS1' *.user_dump_dest='E:\oracle\product\10.2.0\admin\orcl\udump' |
然后重启数据库,启动到mount阶段,继续查看redo日志文件:
1 2 3 4 5 6 7 8 9 10 11 | SQL> select * from v$log; GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS ---------- ---------- ---------- ---------- ---------- --- ---------- FIRST_CHANGE# FIRST_TIME ------------- -------------- 1 1 19103 52428800 1 NO INACTIVE 471044279 07-6月 -19 3 1 19102 52428800 1 NO INACTIVE 471009748 06-6月 -19 2 1 19104 52428800 1 NO CURRENT 471095223 07-6月 -19 |
我尝试清空损坏的日志文件,但是成功执行前提:一致性关闭,很显然这个命令不行,而且尝试rman也不行:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | SQL> startup force mount ORACLE 例程已经启动。 Total System Global Area 612368384 bytes Fixed Size 1332348 bytes Variable Size 174762884 bytes Database Buffers 432013312 bytes Redo Buffers 4259840 bytes 数据库装载完毕。 SQL> ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 2; ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 2 * 第 1 行出现错误: ORA-01624: 日志 2 是紧急恢复实例 orcl (线程 1) 所必需的 ORA-00312: 联机日志 2 线程 1: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG' SQL> ALTER DATABASE CLEAR LOGFILE GROUP 2; ALTER DATABASE CLEAR LOGFILE GROUP 2 * 第 1 行出现错误: ORA-01624: 日志 2 是紧急恢复实例 orcl (线程 1) 所必需的 ORA-00312: 联机日志 2 线程 1: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG' SQL> alter system switch logfile; alter system switch logfile * 第 1 行出现错误: ORA-01109: 数据库未打开
SQL> recover database until cancel; ORA-00279: 更改 471095223 (在 06/07/2019 20:22:28 生成) 对于线程 1 是必需的 ORA-00289: 建议: E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2019_08_01\O1_MF_1_ 19104_%U_.ARC ORA-00280: 更改 471095223 (用于线程 1) 在序列 #19104 中 指定日志: { auto ORA-00308: 无法打开归档日志 'E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2019_08_01\O1_MF_1 _19104_%U_.ARC' ORA-27041: 无法打开文件 OSD-04002: 无法打开文件 O/S-Error: (OS 2) 系统找不到指定的文件。 ORA-00308: 无法打开归档日志 'E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2019_08_01\O1_MF_1 _19104_%U_.ARC' ORA-27041: 无法打开文件 OSD-04002: 无法打开文件 O/S-Error: (OS 2) 系统找不到指定的文件。 ORA-01547: 警告: RECOVER 成功但 OPEN RESETLOGS 将出现如下错误 ORA-01194: 文件 1 需要更多的恢复来保持一致性 ORA-01110: 数据文件 1: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF' SQL> alter database open noresetlogs; alter database open noresetlogs * 第 1 行出现错误: ORA-03113: 通信通道的文件结束 SQL> startup force ORA-24324: 未初始化服务句柄 ORA-01041: 内部错误, hostdef 扩展名不存在 SQL> exit 从 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options 断开 C:\Documents and Settings\Administrator> C:\Documents and Settings\Administrator> C:\Documents and Settings\Administrator>sqlplus / as sysdba SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 8月 1 22:58:16 2019 Copyright (c) 1982, 2005, Oracle. All rights reserved. 已连接到空闲例程。 SQL> create spfile from pfile; 文件已创建。 SQL> startup mount ORACLE 例程已经启动。 Total System Global Area 612368384 bytes Fixed Size 1332348 bytes Variable Size 174762884 bytes Database Buffers 432013312 bytes Redo Buffers 4259840 bytes 数据库装载完毕。 SQL> alter database open; alter database open * 第 1 行出现错误: ORA-03113: 通信通道的文件结束 SQL> startup foree mount SP2-0714: 无效的 STARTUP 选项组合 SQL> startup force mount ORA-24324: 未初始化服务句柄 ORA-01041: 内部错误, hostdef 扩展名不存在 SQL> exit 从 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options 断开 C:\Documents and Settings\Administrator> C:\Documents and Settings\Administrator> C:\Documents and Settings\Administrator> C:\Documents and Settings\Administrator>sqlplus / as sysdba SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 8月 1 22:59:52 2019 Copyright (c) 1982, 2005, Oracle. All rights reserved. 已连接到空闲例程。 SQL> startup force mount ORACLE 例程已经启动。 Total System Global Area 612368384 bytes Fixed Size 1332348 bytes Variable Size 174762884 bytes Database Buffers 432013312 bytes Redo Buffers 4259840 bytes 数据库装载完毕。 SQL> exit 从 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options 断开 C:\Documents and Settings\Administrator> C:\Documents and Settings\Administrator>rman target / 恢复管理器: Release 10.2.0.1.0 - Production on 星期四 8月 1 23:00:08 2019 Copyright (c) 1982, 2005, Oracle. All rights reserved. 已连接到目标数据库: ORCL (DBID=1313825522, 未打开) RMAN> list backupset; 使用目标数据库控制文件替代恢复目录 RMAN> list archivelog all; 说明与恢复目录中的任何存档日志均不匹配 RMAN> exit 恢复管理器完成。 |
最后尝试用recover database until cancel;来解决:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | C:\Documents and Settings\Administrator>sqlplus / as sysdba SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 8月 1 23:00:58 2019 Copyright (c) 1982, 2005, Oracle. All rights reserved. 连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options SQL> archive log list; 数据库日志模式 非存档模式 自动存档 禁用 存档终点 USE_DB_RECOVERY_FILE_DEST 最早的联机日志序列 19102 当前日志序列 19104 SQL> SQL> recover database until cancel; ORA-00279: 更改 471095223 (在 06/07/2019 20:22:28 生成) 对于线程 1 是必需的 ORA-00289: 建议: E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2019_08_01\O1_MF_1_ 19104_%U_.ARC ORA-00280: 更改 471095223 (用于线程 1) 在序列 #19104 中 指定日志: { E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO02.LOG 已应用的日志。 完成介质恢复。 SQL> SQL> select * from v$log; GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS ---------- ---------- ---------- ---------- ---------- --- ---------------- FIRST_CHANGE# FIRST_TIME ------------- -------------- 1 1 19103 52428800 1 NO INACTIVE 471044279 07-6月 -19 3 1 19102 52428800 1 NO INACTIVE 471009748 06-6月 -19 2 1 19104 52428800 1 NO CURRENT 471095223 07-6月 -19 SQL> alter database open; alter database open * 第 1 行出现错误: ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项 SQL> alter database open noresetlogs; 数据库已更改。 SQL> select open_mode from v$database; OPEN_MODE ---------- READ WRITE C:\Documents and Settings\Administrator>sqlplus / as sysdba SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 8月 1 23:18:30 2019 Copyright (c) 1982, 2005, Oracle. All rights reserved. 已连接到空闲例程。 SQL> startup ORACLE 例程已经启动。 Total System Global Area 612368384 bytes Fixed Size 1332348 bytes Variable Size 174762884 bytes Database Buffers 432013312 bytes Redo Buffers 4259840 bytes 数据库装载完毕。 数据库已经打开。 SQL> select open_mode from v$database; OPEN_MODE ---------- READ WRITE |
最后再重启一次数据库:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | C:\Documents and Settings\Administrator>sqlplus / as sysdba SQL*Plus: Release 10.2.0.1.0 - Production on 星期四 8月 1 23:18:30 2019 Copyright (c) 1982, 2005, Oracle. All rights reserved. 已连接到空闲例程。 SQL> startup ORACLE 例程已经启动。 Total System Global Area 612368384 bytes Fixed Size 1332348 bytes Variable Size 174762884 bytes Database Buffers 432013312 bytes Redo Buffers 4259840 bytes 数据库装载完毕。 数据库已经打开。 SQL> select open_mode from v$database; OPEN_MODE ---------- READ WRITE |
总结:
1、打开告警日志,从告警日志中会获取很多有用的信息
2、pfile和spfile里的内容不能出错
3、oradim用于创建windows下的oracle服务,至少要保证在sqlplus中可以使用startup或shutdown命令
4、redo损坏的话可以尝试在SQL下进行恢复,使用命令: recover database until cancel;
---最后的建议:
1、修改为归档模式
2、及时做RMAN备份