Oracle恢复一例--ORA-03113ORA-24324,ORA-01041错误

背景:

 

    今天晚上上完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备份