oracle修复数据字典,修复ora-21700数据字典错误

在一次升级12c的过程中,由于之前有些问题,每修复一个问题,就需要重新执行一次升级脚本。由于重复多次执行了升级脚本,当再次执行升级脚本到phase 65的时候,dbms_stats_internal这个包创建不了了。

我们在$ORACLE_HOME/diagnostics/catupgrd0.log的日志中可以看到:

……

18:26:17 SQL> create or replace package dbms_stats_internal wrapped

18:26:17 2 a000000

18:26:17 3 1

18:26:17 4 abcd

18:26:17 5 abcd

18:26:17 6 abcd

18:26:17 7 abcd

18:26:17 8 abcd

18:26:17 9 abcd

18:26:17 10 abcd

18:26:17 11 abcd

18:26:17 12 abcd

18:26:17 13 abcd

18:26:17 14 abcd

18:26:17 15 abcd

18:26:17 16 abcd

18:26:17 17 abcd

18:26:17 18 abcd

18:26:17 19 9

18:26:17 20 18cc6 5c16

18:26:17 21 cxYivjWOIihPTnK17IB9s8TlEHAwg80Q9rcFYPGPEAD5noqT/S6D9a63VfFDjQXzyqbxadam

18:26:17 22 RuGjVbxThDB+zaP9h9kXocTE806GlgNBkwIV1lViBez3YO+2ZzzVD42NjY1cQLNcUwysLLWS

...

18:26:17 338 Hvuy9wx/RPMZ5z3lt2i/H72Ir7v//gQkqCKk9Y40jUf25YSI8OrzMjeV0NJSbRwOx1COHN2x

18:26:17 339 fU18+TOFe1vOHLb3cOykfEMri99rfLokd0ADt6dnBFQwMR0k9iru7DaXITL9Zcfw9M5VwGSQ

18:26:17 340 vtNnusA7E+QUULCkUFe96EH0b2bMflyGSLpmR6DHY8ZVSxQGjGmdEykJQf1MQq5OdXCSjbvv

18:26:17 341 lr4cPr4zxV7VHQUd1PqvoKXmKYhJx9Rb42gDKjR85/W8tqRorRxAZig8EiusacGJBau5eN+u

18:26:17 342 3LZfbMPlVCyWSDTG9BMLFzKAXuvoua9ofUr0ZchmMraMP391G0fcwK8BHL8Ki9zA8PhAsqMI

18:26:17 343 oXoYgq2JZo+wLYhrCDKcblDtTzGi/zwWevBuqCNN7+b5Dos2dwrGrU6KnXOq/ie4ng==

18:26:17 344

18:26:17 345 /

Warning: Package created with compilation errors.

Elapsed: 00:00:00.50

18:26:18 SQL> show errors

Errors for PACKAGE DBMS_STATS_INTERNAL:

LINE/COL ERROR

-------- -----------------------------------------------------------------

0/0 ORA-21700: object does not exist or is marked for delete

18:26:18 SQL>

……

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

……

18:26:17SQL>createorreplacepackagedbms_stats_internalwrapped

18:26:172a000000

18:26:1731

18:26:174abcd

18:26:175abcd

18:26:176abcd

18:26:177abcd

18:26:178abcd

18:26:179abcd

18:26:1710abcd

18:26:1711abcd

18:26:1712abcd

18:26:1713abcd

18:26:1714abcd

18:26:1715abcd

18:26:1716abcd

18:26:1717abcd

18:26:1718abcd

18:26:17199

18:26:172018cc65c16

18:26:1721cxYivjWOIihPTnK17IB9s8TlEHAwg80Q9rcFYPGPEAD5noqT/S6D9a63VfFDjQXzyqbxadam

18:26:1722RuGjVbxThDB+zaP9h9kXocTE806GlgNBkwIV1lViBez3YO+2ZzzVD42NjY1cQLNcUwysLLWS

...

18:26:17338Hvuy9wx/RPMZ5z3lt2i/H72Ir7v//gQkqCKk9Y40jUf25YSI8OrzMjeV0NJSbRwOx1COHN2x

18:26:17339fU18+TOFe1vOHLb3cOykfEMri99rfLokd0ADt6dnBFQwMR0k9iru7DaXITL9Zcfw9M5VwGSQ

18:26:17340vtNnusA7E+QUULCkUFe96EH0b2bMflyGSLpmR6DHY8ZVSxQGjGmdEykJQf1MQq5OdXCSjbvv

18:26:17341lr4cPr4zxV7VHQUd1PqvoKXmKYhJx9Rb42gDKjR85/W8tqRorRxAZig8EiusacGJBau5eN+u

18:26:173423LZfbMPlVCyWSDTG9BMLFzKAXuvoua9ofUr0ZchmMraMP391G0fcwK8BHL8Ki9zA8PhAsqMI

18:26:17343oXoYgq2JZo+wLYhrCDKcblDtTzGi/zwWevBuqCNN7+b5Dos2dwrGrU6KnXOq/ie4ng==

18:26:17344

18:26:17345/

Warning:Packagecreatedwithcompilationerrors.

Elapsed:00:00:00.50

18:26:18SQL>showerrors

ErrorsforPACKAGEDBMS_STATS_INTERNAL:

LINE/COLERROR

-------------------------------------------------------------------------

0/0ORA-21700:objectdoesnotexistorismarkedfordelete

18:26:18SQL>

……

报错是ora-21700,这是一个非常头疼的报错。这个报错常常意味着数据字典不一致,需要手动修复。

在Doc ID 2046611.1中提到,可以通过drop+重建解决。

sqlplus `/ as sysdba'

alter session set container = CUSTPDB;

exec dbms_pdb.exec_as_oracle_script('drop package dbms_stats');

exec dbms_pdb.exec_as_oracle_script('drop package dbms_stats_internal');

@?/rdbms/admin/dbmsstat.sql

@?/rdbms/admin/prvtstas.plb

@?/rdbms/admin/prvtstat.plb

@?/rdbms/admin/prvtstai.plb

1

2

3

4

5

6

7

8

sqlplus`/assysdba'

alter session set container = CUSTPDB;

exec dbms_pdb.exec_as_oracle_script('droppackagedbms_stats');

exec dbms_pdb.exec_as_oracle_script('droppackagedbms_stats_internal');

@?/rdbms/admin/dbmsstat.sql

@?/rdbms/admin/prvtstas.plb

@?/rdbms/admin/prvtstat.plb

@?/rdbms/admin/prvtstai.plb

文档说的是PDB,但是我估计non-cdb的数据库应该也可以类似解决,所以我决定采用:

drop package dbms_stats;

drop package dbms_stats_internal;

@?/rdbms/admin/dbmsstat.sql

@?/rdbms/admin/prvtstas.plb

@?/rdbms/admin/prvtstat.plb

@?/rdbms/admin/prvtstai.plb

1

2

3

4

5

6

droppackagedbms_stats;

droppackagedbms_stats_internal;

@?/rdbms/admin/dbmsstat.sql

@?/rdbms/admin/prvtstas.plb

@?/rdbms/admin/prvtstat.plb

@?/rdbms/admin/prvtstai.plb

但是发现drop dbms_stats_internal的时候,也报错ora-21700了:

SQL> drop package dbms_stats;

Package dropped.

SQL> drop package dbms_stats_internal;

drop package dbms_stats_internal

*

ERROR at line 1:

ORA-21700: object does not exist or is marked for delete

1

2

3

4

5

6

7

8

9

SQL>droppackagedbms_stats;

Packagedropped.

SQL>droppackagedbms_stats_internal;

droppackagedbms_stats_internal

*

ERRORatline1:

ORA-21700:objectdoesnotexistorismarkedfordelete

看来只能手工修复数据字典了。

对drop dbms_stats_internal的过程做了10046,发现是在drop 一个type的时候遭遇ora-21700的:

PARSING IN CURSOR #18446744071425138736 len=32 dep=0 uid=0 oct=96 lid=0 tim=7819265336298 hv=3484713138 ad='ffffffff77d1fdf0' sqlid='apvgpzm7v905k'

drop package dbms_stats_internal

END OF STMT

PARSE #18446744071425138736:c=2652,e=2653,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,plh=0,tim=7819265336295

……

PARSING IN CURSOR #18446744071423920880 len=47 dep=1 uid=0 oct=78 lid=0 tim=7819266312750 hv=366365679 ad='ffffffff77d1f9f8' sqlid='41x6bchaxckzg'

drop type "SYS".SYS_PLSQL_15AD49DF_1971_1 force

END OF STMT

PARSE #18446744071423920880:c=1771,e=1771,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,plh=0,tim=7819266312747

BINDS #18446744071455720616:

Bind#0

……

WAIT #18446744071423918224: nam='db file sequential read' ela= 1894 file#=1 block#=104924 blocks=1 obj#=338 tim=7819266321638

EXEC #18446744071423920880:c=7572,e=9191,p=1,cr=21,cu=0,mis=0,r=0,dep=1,og=4,plh=0,tim=7819266322114

ERROR #18446744071423920880:err=21700 tim=7819266322144

CLOSE #18446744071423920880:c=12,e=12,dep=1,type=0,tim=7819266322482

EXEC #18446744071425138736:c=291884,e=984932,p=504,cr=1760,cu=0,mis=0,r=0,dep=0,og=1,plh=0,tim=7819266322568

ERROR #18446744071425138736:err=21700 tim=7819266322612

……

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

PARSINGINCURSOR#18446744071425138736 len=32 dep=0 uid=0 oct=96 lid=0 tim=7819265336298 hv=3484713138 ad='ffffffff77d1fdf0' sqlid='apvgpzm7v905k'

droppackagedbms_stats_internal

ENDOFSTMT

PARSE#18446744071425138736:c=2652,e=2653,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,plh=0,tim=7819265336295

……

PARSINGINCURSOR#18446744071423920880 len=47 dep=1 uid=0 oct=78 lid=0 tim=7819266312750 hv=366365679 ad='ffffffff77d1f9f8' sqlid='41x6bchaxckzg'

droptype"SYS".SYS_PLSQL_15AD49DF_1971_1force

ENDOFSTMT

PARSE#18446744071423920880:c=1771,e=1771,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,plh=0,tim=7819266312747

BINDS#18446744071455720616:

Bind#0

……

WAIT#18446744071423918224: nam='db file sequential read' ela= 1894 file#=1 block#=104924 blocks=1 obj#=338 tim=7819266321638

EXEC#18446744071423920880:c=7572,e=9191,p=1,cr=21,cu=0,mis=0,r=0,dep=1,og=4,plh=0,tim=7819266322114

ERROR#18446744071423920880:err=21700 tim=7819266322144

CLOSE#18446744071423920880:c=12,e=12,dep=1,type=0,tim=7819266322482

EXEC#18446744071425138736:c=291884,e=984932,p=504,cr=1760,cu=0,mis=0,r=0,dep=0,og=1,plh=0,tim=7819266322568

ERROR#18446744071425138736:err=21700 tim=7819266322612

……

查了一下这个type:

SQL> select object_id from dba_objects where owner='SYS_PLSQL_15AD49DF_1971_1';

no rows selected

SQL>

SQL> select name ,obj# from obj$ where name='SYS_PLSQL_15AD49DF_1971_1'

SQL> /

NAME OBJ#

-------------------------------------------------------------------------------- ----------

SYS_PLSQL_15AD49DF_1971_1 429029

SQL> --这里已经看到dba_objects和obj$出现不一致。一个没记录一个有记录。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

SQL>selectobject_idfromdba_objectswhereowner='SYS_PLSQL_15AD49DF_1971_1';

norowsselected

SQL>

SQL>selectname,obj# from obj$ where name='SYS_PLSQL_15AD49DF_1971_1'

SQL>/

NAMEOBJ#

------------------------------------------------------------------------------------------

SYS_PLSQL_15AD49DF_1971_1429029

SQL>--这里已经看到dba_objects和obj$出现不一致。一个没记录一个有记录。

我们开始手动修复数据字典。

--这里开始第一轮修复数据字典的过程:

SQL> set transaction use rollback segment system;

Transaction set.

SQL> delete from type$ where tvoid=(select oid$ from obj$ where obj# = 429029);

0 rows deleted.

SQL> delete from type_misc$ where obj#=429029;

1 row deleted.

SQL> delete from source$ where obj#=429029;

2 rows deleted.

SQL> delete from idl_ub1$ where obj#=429029;

3 rows deleted.

SQL> delete from idl_char$ where obj#=429029;

1 row deleted.

SQL> delete from idl_ub2$ where obj#=429029;

2 rows deleted.

SQL> delete from idl_sb4$ where obj#=429029;

3 rows deleted.

SQL> delete from settings$ where obj# = 429029;

8 rows deleted.

SQL> delete from dependency$ where d_obj#=429029;

1 row deleted.

SQL> delete from oid$ where oid$=(select oid$ from obj$ where obj# = 429029);

0 rows deleted.

SQL> delete from obj$ where obj# = 429029;

1 row deleted.

SQL> commit;

Commit complete.

SQL>

SQL> shutdown abort

ORACLE instance shut down.

SQL> exit

Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production

With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

z4cs2011:t2gpolp > cd $ORACLE_HOME/rdbms/admin

z4cs2011:t2gpolp > sqlplus "/ as sysdba"

SQL*Plus: Release 12.1.0.2.0 Production on Fri Sep 30 15:09:57 2016

Copyright (c) 1982, 2014, Oracle. All rights reserved.

Connected to an idle instance.

SQL> startup UPGRADE

ORACLE instance started.

Total System Global Area 4211081216 bytes

Fixed Size 6067648 bytes

Variable Size 3640658496 bytes

Database Buffers 536870912 bytes

Redo Buffers 27484160 bytes

Database mounted.

Database opened.

SQL>

SQL>

SQL>

--第一轮修复数据字典过程完毕

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

--这里开始第一轮修复数据字典的过程:

SQL>settransactionuserollbacksegmentsystem;

Transactionset.

SQL>deletefromtype$wheretvoid=(selectoid$fromobj$whereobj# = 429029);

0rowsdeleted.

SQL>deletefromtype_misc$whereobj#=429029;

1rowdeleted.

SQL>deletefromsource$whereobj#=429029;

2rowsdeleted.

SQL>deletefromidl_ub1$whereobj#=429029;

3rowsdeleted.

SQL>deletefromidl_char$whereobj#=429029;

1rowdeleted.

SQL>deletefromidl_ub2$whereobj#=429029;

2rowsdeleted.

SQL>deletefromidl_sb4$whereobj#=429029;

3rowsdeleted.

SQL>deletefromsettings$whereobj# = 429029;

8rowsdeleted.

SQL>deletefromdependency$whered_obj#=429029;

1rowdeleted.

SQL>deletefromoid$whereoid$=(selectoid$fromobj$whereobj# = 429029);

0rowsdeleted.

SQL>deletefromobj$whereobj# = 429029;

1rowdeleted.

SQL>commit;

Commitcomplete.

SQL>

SQL>shutdownabort

ORACLEinstanceshutdown.

SQL>exit

DisconnectedfromOracleDatabase12cEnterpriseEditionRelease12.1.0.2.0-64bitProduction

WiththePartitioning,OLAP,AdvancedAnalyticsandRealApplicationTestingoptions

z4cs2011:t2gpolp>cd$ORACLE_HOME/rdbms/admin

z4cs2011:t2gpolp>sqlplus"/ as sysdba"

SQL*Plus:Release12.1.0.2.0ProductiononFriSep3015:09:572016

Copyright(c)1982,2014,Oracle.Allrightsreserved.

Connectedtoanidleinstance.

SQL>startupUPGRADE

ORACLEinstancestarted.

TotalSystemGlobalArea4211081216bytes

FixedSize6067648bytes

VariableSize3640658496bytes

DatabaseBuffers536870912bytes

RedoBuffers27484160bytes

Databasemounted.

Databaseopened.

SQL>

SQL>

SQL>

--第一轮修复数据字典过程完毕

修复完成后,再次尝试dbms_stats_internal,还是报错ora-21700。继续做10046的trace,发现还有另外的一个type SYS_PLSQL_15AD49DF_1984_1,顺便也查了一下,类似的type有几个,发现如下:

SQL > select name,obj# from obj$ where name like 'SYS_PLSQL_15AD49DF%'

NAME OBJ#

------------------------------------------------ ----------

SYS_PLSQL_15AD49DF_1984_1 429030

SYS_PLSQL_15AD49DF_4613_1 429026

SYS_PLSQL_15AD49DF_4641_1 429028

SYS_PLSQL_15AD49DF_DUMMY_1 429027

SQL>

1

2

3

4

5

6

7

8

9

10

SQL>selectname,obj# from obj$ where name like 'SYS_PLSQL_15AD49DF%'

NAMEOBJ#

----------------------------------------------------------

SYS_PLSQL_15AD49DF_1984_1429030

SYS_PLSQL_15AD49DF_4613_1429026

SYS_PLSQL_15AD49DF_4641_1429028

SYS_PLSQL_15AD49DF_DUMMY_1429027

SQL>

虽然我很想一次性的删除所有的这些type,但是我还是谨慎点,用删除dbms_stats_internal,如果遇到报错,再10046,再找到对应的type,再修复数据字典。

最后的结果是,这些type都需要删除,所以我一共做了5轮数据字典的手工修复。

修复完成后,可以顺利drop dbms_stats_internal了,可以重建dbms_stats了。重建后dbms_stats_internal状态为valid。

SQL> shutdown abort

ORACLE instance shut down.

SQL> startup UPGRADE

ORACLE instance started.

Total System Global Area 4211081216 bytes

Fixed Size 6067648 bytes

Variable Size 3640658496 bytes

Database Buffers 536870912 bytes

Redo Buffers 27484160 bytes

Database mounted.

Database opened.

SQL> drop package dbms_stats;

Package dropped.

SQL> drop package dbms_stats_internal;

Package dropped.

SQL> @?/rdbms/admin/dbmsstat.sql

Session altered.

Package created.

No errors.

Synonym created.

Grant succeeded.

Role created.

Grant succeeded.

Grant succeeded.

Grant succeeded.

Role created.

Grant succeeded.

Grant succeeded.

Library created.

Session altered.

SQL>

SQL> @?/rdbms/admin/prvtstas.plb

Session altered.

Type created.

Synonym created.

Grant succeeded.

Type created.

No errors.

Synonym created.

Synonym created.

Type created.

Synonym created.

Synonym created.

Type dropped.

Type created.

No errors.

Synonym created.

Synonym created.

Type created.

Synonym created.

Synonym created.

Type created.

Synonym created.

Synonym created.

No errors.

Type created.

No errors.

Synonym created.

Synonym created.

Type created.

Synonym created.

Synonym created.

Type created.

No errors.

Synonym created.

Synonym created.

Type created.

Synonym created.

Synonym created.

No errors.

Package created.

No errors.

Session altered.

SQL>

SQL> @?/rdbms/admin/prvtstat.plb

Session altered.

Type body created.

No errors.

Package body created.

No errors.

Session altered.

SQL>

SQL> @?/rdbms/admin/prvtstai.plb

Session altered.

Package body created.

No errors.

Session altered.

SQL>

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

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

SQL>shutdownabort

ORACLEinstanceshutdown.

SQL>startupUPGRADE

ORACLEinstancestarted.

TotalSystemGlobalArea4211081216bytes

FixedSize6067648bytes

VariableSize3640658496bytes

DatabaseBuffers536870912bytes

RedoBuffers27484160bytes

Databasemounted.

Databaseopened.

SQL>droppackagedbms_stats;

Packagedropped.

SQL>droppackagedbms_stats_internal;

Packagedropped.

SQL>@?/rdbms/admin/dbmsstat.sql

Sessionaltered.

Packagecreated.

Noerrors.

Synonymcreated.

Grantsucceeded.

Rolecreated.

Grantsucceeded.

Grantsucceeded.

Grantsucceeded.

Rolecreated.

Grantsucceeded.

Grantsucceeded.

Librarycreated.

Sessionaltered.

SQL>

SQL>@?/rdbms/admin/prvtstas.plb

Sessionaltered.

Typecreated.

Synonymcreated.

Grantsucceeded.

Typecreated.

Noerrors.

Synonymcreated.

Synonymcreated.

Typecreated.

Synonymcreated.

Synonymcreated.

Typedropped.

Typecreated.

Noerrors.

Synonymcreated.

Synonymcreated.

Typecreated.

Synonymcreated.

Synonymcreated.

Typecreated.

Synonymcreated.

Synonymcreated.

Noerrors.

Typecreated.

Noerrors.

Synonymcreated.

Synonymcreated.

Typecreated.

Synonymcreated.

Synonymcreated.

Typecreated.

Noerrors.

Synonymcreated.

Synonymcreated.

Typecreated.

Synonymcreated.

Synonymcreated.

Noerrors.

Packagecreated.

Noerrors.

Sessionaltered.

SQL>

SQL>@?/rdbms/admin/prvtstat.plb

Sessionaltered.

Typebodycreated.

Noerrors.

Packagebodycreated.

Noerrors.

Sessionaltered.

SQL>

SQL>@?/rdbms/admin/prvtstai.plb

Sessionaltered.

Packagebodycreated.

Noerrors.

Sessionaltered.

SQL>

SQL> select status from dba_objects where object_name='DBMS_STATS_INTERNAL';

STATUS

-------

VALID

VALID

SQL>

1

2

3

4

5

6

7

8

SQL>selectstatusfromdba_objectswhereobject_name='DBMS_STATS_INTERNAL';

STATUS

-------

VALID

VALID

SQL>

参考:Doc ID 437558.1 INTERNAL

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值