Oracle清除离线数据文件记录

Oracle清除离线数据文件记录

测试前提:数据文件离线,系统上删除了该文件,需要删除在数据字典中,关于这条离线数据文件记录

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
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /opt/oracle/oradata/test/archivelog
Oldest online log sequence 210
Next log sequence to archive 212
Current log sequence 212
--数据库是归档模式
SQL> col file_name for a40
SQL> select file_id,file_name,bytes from dba_data_files order by 1;
FILE_ID FILE_NAME BYTES
---------- ---------------------------------------- ----------
1 /opt/oracle/oradata/test/system01.dbf 524288000
2 /opt/oracle/oradata/test/undotbs01.dbf 1289748480
3 /opt/oracle/oradata/test/sysaux01.dbf 377487360
4 /opt/oracle/oradata/test/users01.dbf 5242880
5 /opt/oracle/oradata/test/user32g.dbf 10485760
6 /opt/oracle/oradata/test/xifenfei01.dbf 20971520
7 /opt/oracle/oradata/test/user02.dbf 10485760
8 /opt/oracle/oradata/test/odu02.dbf 1.1283E+10
9 /opt/oracle/oradata/test/odu01.dbf 104857600
10 /opt/oracle/oradata/test/odu03.chf
10 rows selected.
SQL> col error for a20
SQL> select file#,ONLINE_STATUS,ERROR,CHANGE# from V$RECOVER_FILE order by 1;
FILE# ONLINE_ ERROR CHANGE#
---------- ------- -------------------- ----------
10 OFFLINE FILE NOT FOUND 0
SQL> !ls /opt/oracle/oradata/test/odu03.chf
ls: /opt/oracle/oradata/test/odu03.chf: No such file or directory
--说明该数据文件已经从硬盘上删除
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup nomount
ORACLE instance started.
Total System Global Area 209715200 bytes
Fixed Size 2082784 bytes
Variable Size 130025504 bytes
Database Buffers 71303168 bytes
Redo Buffers 6303744 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "TEST" NORESETLOGS ARCHIVELOG
2 MAXLOGFILES 16
3 MAXLOGMEMBERS 3
4 MAXDATAFILES 100
5 MAXINSTANCES 8
6 MAXLOGHISTORY 292
7 LOGFILE
8 GROUP 1 '/opt/oracle/oradata/test/redo01.log' SIZE 50M,
9 GROUP 2 '/opt/oracle/oradata/test/redo02.log' SIZE 50M,
10 GROUP 3 '/opt/oracle/oradata/test/redo03.log' SIZE 50M
11 DATAFILE
12 '/opt/oracle/oradata/test/system01.dbf',
13 '/opt/oracle/oradata/test/undotbs01.dbf',
14 '/opt/oracle/oradata/test/sysaux01.dbf',
15 '/opt/oracle/oradata/test/users01.dbf',
16 '/opt/oracle/oradata/test/user32g.dbf',
17 '/opt/oracle/oradata/test/xifenfei01.dbf',
18 '/opt/oracle/oradata/test/user02.dbf',
19 '/opt/oracle/oradata/test/odu02.dbf',
20 '/opt/oracle/oradata/test/odu01.dbf'
,'/opt/oracle/oradata/test/odu03.chf' --文件不存在,创建控制文件这条记录需要除掉
21 CHARACTER SET ZHS16GBK
22 ;
Control file created.
SQL> alter database open;
Database altered.
SQL> select file_id,file_name,bytes from dba_data_files order by 1;
FILE_ID FILE_NAME BYTES
---------- ---------------------------------------- ----------
1 /opt/oracle/oradata/test/system01.dbf 524288000
2 /opt/oracle/oradata/test/undotbs01.dbf 1289748480
3 /opt/oracle/oradata/test/sysaux01.dbf 377487360
4 /opt/oracle/oradata/test/users01.dbf 5242880
5 /opt/oracle/oradata/test/user32g.dbf 10485760
6 /opt/oracle/oradata/test/xifenfei01.dbf 20971520
7 /opt/oracle/oradata/test/user02.dbf 10485760
8 /opt/oracle/oradata/test/odu02.dbf 1.1283E+10
9 /opt/oracle/oradata/test/odu01.dbf 104857600
10 /opt/oracle/product/10.2.0/db_1/dbs/MISSING00010 --系统默认创建了自定义的数据文件名称
10 rows selected.
SQL> select file#,ONLINE_STATUS,ERROR,CHANGE# from V$RECOVER_FILE order by 1;
FILE# ONLINE_ ERROR CHANGE#
---------- ------- -------------------- ----------
10 OFFLINE FILE MISSING 0
--提示该文件是离线状态,需要恢复,结果同开始时候状态
SQL> select file#,STATUS$,TS#,RELFILE# from file$ order by 1;
FILE# STATUS$ TS# RELFILE#
---------- ---------- ---------- ----------
1 2 0 1
2 2 1 2
3 2 2 3
4 2 4 4
5 2 4 5
6 2 6 6
7 2 4 7
8 2 7 9
9 2 7 6
10 2 7 10
11 1
11 rows selected.
SQL> delete from file$ where file#=10; ---重要的就是这个操作
1 row deleted.
SQL> select file#,STATUS$,TS#,RELFILE# from file$ order by 1;
FILE# STATUS$ TS# RELFILE#
---------- ---------- ---------- ----------
1 2 0 1
2 2 1 2
3 2 2 3
4 2 4 4
5 2 4 5
6 2 6 6
7 2 4 7
8 2 7 9
9 2 7 6
11 1
10 rows selected.
SQL> col name for a40
SQL> select * from v$dbfile order by 1;
FILE# NAME
---------- ----------------------------------------
1 /opt/oracle/oradata/test/system01.dbf
2 /opt/oracle/oradata/test/undotbs01.dbf
3 /opt/oracle/oradata/test/sysaux01.dbf
4 /opt/oracle/oradata/test/users01.dbf
5 /opt/oracle/oradata/test/user32g.dbf
6 /opt/oracle/oradata/test/xifenfei01.dbf
7 /opt/oracle/oradata/test/user02.dbf
8 /opt/oracle/oradata/test/odu02.dbf
9 /opt/oracle/oradata/test/odu01.dbf
10 /opt/oracle/product/10.2.0/db_1/dbs/MISSING00010
10 rows selected.
--需要重建控制文件,删除不存在的数据文件
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> STARTUP NOMOUNT
ORACLE instance started.
Total System Global Area 209715200 bytes
Fixed Size 2082784 bytes
Variable Size 130025504 bytes
Database Buffers 71303168 bytes
Redo Buffers 6303744 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "TEST" NORESETLOGS ARCHIVELOG
2 MAXLOGFILES 16
3 MAXLOGMEMBERS 3
4 MAXDATAFILES 100
5 MAXINSTANCES 8
6 MAXLOGHISTORY 292
7 LOGFILE
8 GROUP 1 '/opt/oracle/oradata/test/redo01.log' SIZE 50M,
9 GROUP 2 '/opt/oracle/oradata/test/redo02.log' SIZE 50M,
10 GROUP 3 '/opt/oracle/oradata/test/redo03.log' SIZE 50M
11 DATAFILE
12 '/opt/oracle/oradata/test/system01.dbf',
13 '/opt/oracle/oradata/test/undotbs01.dbf',
14 '/opt/oracle/oradata/test/sysaux01.dbf',
15 '/opt/oracle/oradata/test/users01.dbf',
16 '/opt/oracle/oradata/test/user32g.dbf',
17 '/opt/oracle/oradata/test/xifenfei01.dbf',
18 '/opt/oracle/oradata/test/user02.dbf',
19 '/opt/oracle/oradata/test/odu02.dbf',
20 '/opt/oracle/oradata/test/odu01.dbf'
21 CHARACTER SET ZHS16GBK
22 ;
Control file created.
SQL> alter database open;
Database altered.
SQL> select file_id,file_name,bytes from dba_data_files order by 1;
FILE_ID FILE_NAME BYTES
---------- ---------------------------------------- ----------
1 /opt/oracle/oradata/test/system01.dbf 524288000
2 /opt/oracle/oradata/test/undotbs01.dbf 1289748480
3 /opt/oracle/oradata/test/sysaux01.dbf 377487360
4 /opt/oracle/oradata/test/users01.dbf 5242880
5 /opt/oracle/oradata/test/user32g.dbf 10485760
6 /opt/oracle/oradata/test/xifenfei01.dbf 20971520
7 /opt/oracle/oradata/test/user02.dbf 10485760
8 /opt/oracle/oradata/test/odu02.dbf 1.1283E+10
9 /opt/oracle/oradata/test/odu01.dbf 104857600
9 rows selected.
SQL> select * from v$dbfile order by 1;
FILE# NAME
---------- ----------------------------------------
1 /opt/oracle/oradata/test/system01.dbf
2 /opt/oracle/oradata/test/undotbs01.dbf
3 /opt/oracle/oradata/test/sysaux01.dbf
4 /opt/oracle/oradata/test/users01.dbf
5 /opt/oracle/oradata/test/user32g.dbf
6 /opt/oracle/oradata/test/xifenfei01.dbf
7 /opt/oracle/oradata/test/user02.dbf
8 /opt/oracle/oradata/test/odu02.dbf
9 /opt/oracle/oradata/test/odu01.dbf
9 rows selected.