数据字典恢复mysql数据_恢复之数据字典和控制文件不一致的恢复(一)

在执行恢复后,应该检查数据库的alert文件,看是否出现控制文件中的数据文件名称和数据字典中数据文件名称无法一一对应的现象。

这篇文章描述通过RESETLOGS方式打开数据库时,如果发现不一致情况及解决方法。

如果是利用备份的控制文件,除了数据文件的新增和删除以外,不会出现不一致的情况。这种不一致的情况更多的是出现在手工重建控制文件过程中。

SQL> CONN /@TEST AS SYSDBA

已连接。

SQL> ALTER TABLESPACE INDX READ ONLY;

表空间已更改。

SQL> ALTER TABLESPACE TOOLS OFFLINE;

表空间已更改。

SQL> SELECT 'ALTER TABLESPACE ' || TABLESPACE_NAME || ' BEGIN BACKUP;'

2 FROM DBA_TABLESPACES WHERE CONTENTS != 'TEMPORARY' AND STATUS = 'ONLINE';

'ALTERTABLESPACE'||TABLESPACE_NAME||'BEGINBACKUP;'

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

ALTER TABLESPACE SYSTEM BEGIN BACKUP;

ALTER TABLESPACE UNDOTBS1 BEGIN BACKUP;

ALTER TABLESPACE USERS BEGIN BACKUP;

ALTER TABLESPACE YANGTK BEGIN BACKUP;

SQL> ALTER TABLESPACE SYSTEM BEGIN BACKUP;

表空间已更改。

SQL> ALTER TABLESPACE UNDOTBS1 BEGIN BACKUP;

表空间已更改。

SQL> ALTER TABLESPACE USERS BEGIN BACKUP;

表空间已更改。

SQL> ALTER TABLESPACE YANGTK BEGIN BACKUP;

表空间已更改。

SQL> HOST COPY F:ORACLEORADATATEST*.DBF F:ORACLEBACKUPTEST20060307

SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE RESETLOGS;

数据库已更改。

SQL> SELECT 'ALTER TABLESPACE ' || TABLESPACE_NAME || ' END BACKUP;'

2 FROM DBA_TABLESPACES WHERE CONTENTS != 'TEMPORARY' AND STATUS = 'ONLINE';

'ALTERTABLESPACE'||TABLESPACE_NAME||'ENDBACKUP;'

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

ALTER TABLESPACE SYSTEM END BACKUP;

ALTER TABLESPACE UNDOTBS1 END BACKUP;

ALTER TABLESPACE USERS END BACKUP;

ALTER TABLESPACE YANGTK END BACKUP;

SQL> ALTER TABLESPACE SYSTEM END BACKUP;

表空间已更改。

SQL> ALTER TABLESPACE UNDOTBS1 END BACKUP;

表空间已更改。

SQL> ALTER TABLESPACE USERS END BACKUP;

表空间已更改。

SQL> ALTER TABLESPACE YANGTK END BACKUP;

表空间已更改。

假设在恢复过程中,发现丢失了所有控制文件和备份的控制文件。那么需要手工重建控制文件,而这时候手工重建控制文件可能会遗漏部分数据文件。

创建控制文件的脚本应该如下:

CREATE CONTROLFILE REUSE DATABASE "TEST" RESETLOGSARCHIVELOG

MAXLOGFILES 50

MAXLOGMEMBERS 5

MAXDATAFILES 100

MAXINSTANCES 1

MAXLOGHISTORY 680

LOGFILE

GROUP 1 'F:ORACLEORADATATESTREDO01.LOG'SIZE 100M,

GROUP 2 'F:ORACLEORADATATESTREDO02.LOG'SIZE 100M,

GROUP 3 'F:ORACLEORADATATESTREDO03.LOG'SIZE 100M

DATAFILE

'F:ORACLEORADATATESTSYSTEM01.DBF',

'F:ORACLEORADATATESTUNDOTBS01.DBF',

'F:ORACLEORADATATESTUSERS01.DBF',

'F:ORACLEORADATATESTYANGTK01.DBF'

CHARACTER SET ZHS16GBK

;

但是由于没有将脚本保存到trace文件中,而完全通过手工创建。因此,在创建的时候丢失了USERS01.DBF。

SQL> SHUTDOWN IMMEDIATE

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> HOST DEL F:ORACLEORADATATEST*.CTL

SQL> HOST COPY F:ORACLEBACKUPTEST20060307* F:ORACLEORADATATEST

SQL> STARTUP NOMOUNT

ORACLE 例程已经启动。

Total System Global Area 76619308 bytes

Fixed Size 454188 bytes

Variable Size 50331648 bytes

Database Buffers 25165824 bytes

Redo Buffers 667648 bytes

SQL> CREATE CONTROLFILE REUSE DATABASE "TEST" RESETLOGS ARCHIVELOG

2 MAXLOGFILES 50

3 MAXLOGMEMBERS 5

4 MAXDATAFILES 100

5 MAXINSTANCES 1

6 MAXLOGHISTORY 680

7 LOGFILE

8 GROUP 1 'F:ORACLEORADATATESTREDO01.LOG' SIZE 100M,

9 GROUP 2 'F:ORACLEORADATATESTREDO02.LOG' SIZE 100M,

10 GROUP 3 'F:ORACLEORADATATESTREDO03.LOG' SIZE 100M

11 DATAFILE

12 'F:ORACLEORADATATESTSYSTEM01.DBF',

13 'F:ORACLEORADATATESTUNDOTBS01.DBF',

14 'F:ORACLEORADATATESTYANGTK01.DBF'

15 CHARACTER SET ZHS16GBK

16 ;

控制文件已创建

SQL> RECOVER DATABASE USING BACKUP CONTROLFILE

ORA-00279: ?? 46320665 (? 03/08/2006 02:49:29 ??) ???? 1 ????

ORA-00289: ??: F:ORACLEORADATATESTARCHIVEARC00001.001

ORA-00280: ?? 46320665 ???? 1 ???? # 1 ???

指定日志: {=suggested | filename | AUTO | CANCEL}

F:ORACLEORADATATESTREDO03.LOG

已应用的日志。

完成介质恢复。

SQL> ALTER DATABASE OPEN RESETLOGS;

数据库已更改。

SQL> SELECT NAME FROM V$DATAFILE;

NAME

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

F:ORACLEORADATATESTSYSTEM01.DBF

F:ORACLEORADATATESTUNDOTBS01.DBF

F:ORACLEORACLE920DATABASEMISSING00003

F:ORACLEORACLE920DATABASEMISSING00004

F:ORACLEORACLE920DATABASEMISSING00005

F:ORACLEORADATATESTYANGTK01.DBF

已选择6行。

SQL> COL FILE_NAME FORMAT A50

SQL> SELECT FILE_NAME, TABLESPACE_NAME FROM DBA_DATA_FILES;

FILE_NAME TABLESPACE_NAME

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

F:ORACLEORADATATESTSYSTEM01.DBF SYSTEM

F:ORACLEORADATATESTUNDOTBS01.DBF UNDOTBS1

F:ORACLEORACLE920DATABASEMISSING00003 INDX

F:ORACLEORACLE920DATABASEMISSING00004 TOOLS

F:ORACLEORACLE920DATABASEMISSING00005 USERS

F:ORACLEORADATATESTYANGTK01.DBF YANGTK

已选择6行。

从上面的数据字典可以看到,存在不正常的表空间和数据文件。也可以从alert日志中得到相应的信息。

Dictionary check beginning

Tablespace 'TEMP' #2 found in data dictionary,

but not in the controlfile. Adding to controlfile.

Tablespace 'INDX' #3 found in data dictionary,

but not in the controlfile. Adding to controlfile.

Tablespace 'TOOLS' #4 found in data dictionary,

but not in the controlfile. Adding to controlfile.

Tablespace 'USERS' #5 found in data dictionary,

but not in the controlfile. Adding to controlfile.

File #3 found in data dictionary but not in controlfile.

Creating OFFLINE file 'MISSING00003' in the controlfile.

File #4 found in data dictionary but not in controlfile.

Creating OFFLINE file 'MISSING00004' in the controlfile.

File #5 found in data dictionary but not in controlfile.

Creating OFFLINE file 'MISSING00005' in the controlfile.

This file can no longer be recovered so it must be dropped.

Dictionary check complete

由于TOOLS表空间在备份之前就正常脱机了。因此,TOOLS表空间不需要额外的恢复,将数据文件直接RENAME就可以了。

SQL> ALTER DATABASE RENAME FILE 'F:ORACLEORACLE920DATABASEMISSING00004'

2 TO 'F:ORACLEORADATATESTTOOLS01.DBF';

数据库已更改。

INDX表空间在备份之前就处于只读状态,因此不需要进行恢复,RENAME后ONLINE就可以了。

SQL> ALTER DATABASE RENAME FILE 'F:ORACLEORACLE920DATABASEMISSING00003'

2 TO 'F:ORACLEORADATATESTINDX01.DBF';

数据库已更改。

SQL> ALTER TABLESPACE INDX ONLINE;

表空间已更改。

SQL> SELECT STATUS FROM DBA_TABLESPACES WHERE TABLESPACE_NAME = 'INDX';

STATUS

---------

READ ONLY

对于临时表空间,直接增加临时文件就可以了。

SQL> ALTER TABLESPACE TEMP ADD TEMPFILE 'F:ORACLEORADATATESTTEMP01.DBF' SIZE 40M REUSE;

表空间已更改。

但是,对于表空间USERS,由于没有被添加到控制文件中,且数据库以RESETLOGS方式打开,用来恢复表空间的日志已经被重置,因此只能将表空间删除。

SQL> ALTER DATABASE RENAME FILE 'F:ORACLEORACLE920DATABASEMISSING00005'

2 TO 'F:ORACLEORADATATESTUSERS01.DBF';

数据库已更改。

SQL> ALTER TABLESPACE USERS ONLINE;

ALTER TABLESPACE USERS ONLINE

*

ERROR 位于第 1 行:

ORA-01190: ?????????5??????? RESETLOGS ??

ORA-01110: ???? 5: 'F:ORACLEORADATATESTUSERS01.DBF'

SQL> RECOVER TABLESPACE USERS;

ORA-00283: ??????????

ORA-01190: ?????????5??????? RESETLOGS ??

ORA-01110: ???? 5: 'F:ORACLEORADATATESTUSERS01.DBF'

SQL> DROP TABLESPACE USERS INCLUDING CONTENTS AND DATAFILES;

表空间已丢弃。

一旦重建控制文件中没有包含需要恢复的表空间,且以RESETLOGS方式打开了数据库,则被遗漏的表空间无法在正常联机,只能从数据库中删除。因此,控制文件的备份和重建操作一定要谨慎。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值