undo数据文件丢失的恢复

undo数据文件丢失的恢复试验

从自己的错误中学到知识是聪明,从别人的错误中学到知识是智慧

坛子里看到一个帖子,讨论的是undo表空间对应的数据文件丢失之后的恢复问题,为了加深印象,自己模拟一下:

1.关闭数据库

2.将undotbs1对应的数据文件重命名,或者删除,随便你,(测试库,可不要在生产库上做这个实验,当然,你最好有之前的一个备份再做删除操作)

3.重新启动数据库,会报找不到数据文件错:

sys@baal> startup
ORACLE 例程已经启动。

Total System Global Area  159383552 bytes
Fixed Size                  1295608 bytes
Variable Size              92277512 bytes
Database Buffers           62914560 bytes
Redo Buffers                2895872 bytes
数据库装载完毕。
ORA-01157: 无法标识/锁定数据文件 2 – 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 2: ‘E:\ORA10G\ORADATA\BAAL\BAAL\UNDOTBS01.DBF’

4.但此时数据库已经mount,所以可以从v$datafile中查看undo表空间的详细目录信息等。

sys@baal> select name from v$datafile;

NAME
———————————————-
E:\ORA10G\ORADATA\BAAL\BAAL\SYSTEM01.DBF
E:\ORA10G\ORADATA\BAAL\BAAL\UNDOTBS01.DBF
E:\ORA10G\ORADATA\BAAL\BAAL\SYSAUX01.DBF
E:\ORA10G\ORADATA\BAAL\BAAL\USERS01.DBF
E:\ORA10G\ORADATA\BAAL\BAAL\BAAL.DBF
E:\ORA10G\ORADATA\BAAL\BAAL\BIGTBS.DBF
E:\ORA10G\ORADATA\BAAL\BAAL\BAAL1.DBF
E:\ORA10G\ORADATA\BAAL\BAAL\TEST.DBF

5.将undo数据文件offline drop,随后打开数据库此操作可能导致数据库的数据不一致,因为undo表空间中可能还有要恢复的数据。

sys@baal> alter database datafile ‘E:\ORA10G\ORADATA\BAAL\BAAL\UNDOTBS01.DBF’ offline drop;

数据库已更改。

已用时间:  00: 00: 00.31
sys@baal> alter database open;

数据库已更改。

6.为系统创建新的undo表空间,并且切换

sys@baal> create undo tablespace undotbs2 datafile ‘E:\ORA10G\ORADATA\BAAL\BAAL\UNDOTBS02.DBF’ size 500m autoextend off;

表空间已创建。

已用时间:  00: 00: 12.67
sys@baal> alter system set undo_tablespace=undotbs2;

系统已更改。

7.如果你认为此时工作已经完成,那就乐观太早了,因为尝试删除undotbs1会报错,而且此时尝试查询需要恢复操作的表时也会报错。

sys@baal> drop tablespace undotbs1 including contents and datafiles;
drop tablespace undotbs1 including contents and datafiles
*
第 1 行出现错误:
ORA-01548: 已找到活动回退段 ‘_SYSSMU1$’, 终止删除表空间

8.可以查看一下回退段此时的状态,可以看到undotbs1的状态是need recovery

sys@baal> SELECT SEGMENT_NAME, OWNER, TABLESPACE_NAME, STATUS           FROM DBA_ROLLBACK_SEGS;

SEGMENT_NAME                   OWNER  TABLESPACE_NAME                STATUS
—————————— —— —————————— —————-
SYSTEM                         SYS    SYSTEM                         ONLINE
_SYSSMU1$                      PUBLIC UNDOTBS1                       NEEDS RECOVERY
_SYSSMU2$                      PUBLIC UNDOTBS1                       NEEDS RECOVERY
_SYSSMU3$                      PUBLIC UNDOTBS1                       NEEDS RECOVERY
_SYSSMU4$                      PUBLIC UNDOTBS1                       NEEDS RECOVERY
_SYSSMU5$                      PUBLIC UNDOTBS1                       NEEDS RECOVERY
_SYSSMU6$                      PUBLIC UNDOTBS1                       NEEDS RECOVERY
_SYSSMU7$                      PUBLIC UNDOTBS1                       NEEDS RECOVERY
_SYSSMU8$                      PUBLIC UNDOTBS1                       NEEDS RECOVERY
_SYSSMU9$                      PUBLIC UNDOTBS1                       NEEDS RECOVERY
_SYSSMU10$                     PUBLIC UNDOTBS1                       NEEDS RECOVERY
_SYSSMU11$                     PUBLIC UNDOTBS2                       ONLINE
_SYSSMU12$                     PUBLIC UNDOTBS2                       ONLINE
_SYSSMU13$                     PUBLIC UNDOTBS2                       ONLINE
_SYSSMU14$                     PUBLIC UNDOTBS2                       ONLINE
_SYSSMU15$                     PUBLIC UNDOTBS2                       ONLINE
_SYSSMU16$                     PUBLIC UNDOTBS2                       ONLINE
_SYSSMU17$                     PUBLIC UNDOTBS2                       ONLINE
_SYSSMU18$                     PUBLIC UNDOTBS2                       ONLINE
_SYSSMU19$                     PUBLIC UNDOTBS2                       ONLINE
_SYSSMU20$                     PUBLIC UNDOTBS2                       ONLINE

9.此时在没有备份的情况下,可以尝试使用隐含参数将数据库打开,不过这个过程会破坏数据库的一致性,而且可能造成数据库出现逻辑错误。采用下面的方法打开数据库后,应该马上执行EXP备份,建数据后,再导入。

10.重新创建pfile

sys@baal> create pfile=’E:\ora10g\database\initbaal1.ora’ from spfile;

文件已创建。

11.关闭实例并且手工编辑pfile,修改或添加以下隐含参数,用修改后的pfile打开数据库。

*.undo_management=’MANUAL’
_offline_rollback_segments=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$)

sys@baal> startup pfile=E:\ora10g\database\initbaal1.ora
ORACLE 例程已经启动。

Total System Global Area  159383552 bytes
Fixed Size                  1295608 bytes
Variable Size              92277512 bytes
Database Buffers           62914560 bytes
Redo Buffers                2895872 bytes
数据库装载完毕。
数据库已经打开。

12.可以先查看一下数据库中回滚段的状态,发现undotbs2的回退段也变成offline了。由于设置了隐含参数,现在可以删除这些回滚段了。

sys@baal> SELECT SEGMENT_NAME, OWNER, TABLESPACE_NAME, STATUS           FROM DBA_ROLLBACK_SEGS;

SEGMENT_NAME                   OWNER  TABLESPACE_NAME                STATUS
—————————— —— —————————— —————-
SYSTEM                         SYS    SYSTEM                         ONLINE
_SYSSMU1$                      PUBLIC UNDOTBS1                       NEEDS RECOVERY
_SYSSMU2$                      PUBLIC UNDOTBS1                       NEEDS RECOVERY
_SYSSMU3$                      PUBLIC UNDOTBS1                       NEEDS RECOVERY
_SYSSMU4$                      PUBLIC UNDOTBS1                       NEEDS RECOVERY
_SYSSMU5$                      PUBLIC UNDOTBS1                       NEEDS RECOVERY
_SYSSMU6$                      PUBLIC UNDOTBS1                       NEEDS RECOVERY
_SYSSMU7$                      PUBLIC UNDOTBS1                       NEEDS RECOVERY
_SYSSMU8$                      PUBLIC UNDOTBS1                       NEEDS RECOVERY
_SYSSMU9$                      PUBLIC UNDOTBS1                       NEEDS RECOVERY
_SYSSMU10$                     PUBLIC UNDOTBS1                       NEEDS RECOVERY
_SYSSMU11$                     PUBLIC UNDOTBS2                       OFFLINE
_SYSSMU12$                     PUBLIC UNDOTBS2                       OFFLINE
_SYSSMU13$                     PUBLIC UNDOTBS2                       OFFLINE
_SYSSMU14$                     PUBLIC UNDOTBS2                       OFFLINE
_SYSSMU15$                     PUBLIC UNDOTBS2                       OFFLINE
_SYSSMU16$                     PUBLIC UNDOTBS2                       OFFLINE
_SYSSMU17$                     PUBLIC UNDOTBS2                       OFFLINE
_SYSSMU18$                     PUBLIC UNDOTBS2                       OFFLINE
_SYSSMU19$                     PUBLIC UNDOTBS2                       OFFLINE
_SYSSMU20$                     PUBLIC UNDOTBS2                       OFFLINE

sys@baal> drop rollback segment “_SYSSMU1$”;

回退段已删除。

。。。。。

但是undotbs2中的回退段不能删除

sys@baal> drop rollback segment “_SYSSMU11$”;
drop rollback segment “_SYSSMU11$”
*
第 1 行出现错误:
ORA-30025: 不允许删除段 ‘_SYSSMU11$’ (在还原表空间中)

13.删除undotbs1

sys@baal> DROP TABLESPACE UNDOTBS1 INCLUDING CONTENTS AND DATAFILES;

表空间已删除。

14.重启一下,去掉隐含参数

sys@baal> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
sys@baal> startup
ORACLE 例程已经启动。

Total System Global Area  159383552 bytes
Fixed Size                  1295608 bytes
Variable Size              92277512 bytes
Database Buffers           62914560 bytes
Redo Buffers                2895872 bytes
数据库装载完毕。
数据库已经打开。
sys@baal> show parameter undo

NAME                                 TYPE        VALUE
———————————— ———– ——————————
undo_management                      string      AUTO
undo_retention                       integer     900
undo_tablespace                      string      UNDOTBS2
sys@baal> SELECT SEGMENT_NAME, OWNER, TABLESPACE_NAME, STATUS           FROM DBA_ROLLBACK_SEGS;

SEGMENT_NAME                   OWNER  TABLESPACE_NAME                STATUS
—————————— —— —————————— —————-
SYSTEM                         SYS    SYSTEM                         ONLINE
_SYSSMU11$                     PUBLIC UNDOTBS2                       ONLINE
_SYSSMU12$                     PUBLIC UNDOTBS2                       ONLINE
_SYSSMU13$                     PUBLIC UNDOTBS2                       ONLINE
_SYSSMU14$                     PUBLIC UNDOTBS2                       ONLINE
_SYSSMU15$                     PUBLIC UNDOTBS2                       ONLINE
_SYSSMU16$                     PUBLIC UNDOTBS2                       ONLINE
_SYSSMU17$                     PUBLIC UNDOTBS2                       ONLINE
_SYSSMU18$                     PUBLIC UNDOTBS2                       ONLINE
_SYSSMU19$                     PUBLIC UNDOTBS2                       ONLINE
_SYSSMU20$                     PUBLIC UNDOTBS2                       ONLINE

已选择11行。

已用时间:  00: 00: 00.31


很郁闷的是我模拟了半天,却一直没有模拟出回滚段需要recovery needed状态。如果 哪位大侠知道请给我留言,谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL数据恢复是一个关键任务,特别是在数据丢失或系统故障的情况下。MySQL提供了几种方法来尝试恢复数据,包括: 1. **二进制日志(Binary Log)**:MySQL会记录所有对数据库的更改,如果在服务器意外关闭前,已经开启了二进制日志,可以通过binlog工具如`mysqlbinlog`来恢复到某个时间点的数据状态。 2. **InnoDB引擎的事务日志(Transaction Logs, ib_logfile*)**:InnoDB存储引擎有其自身的redo log和undo log,用于事务处理和恢复。可以通过检查和应用这些日志文件来还原因崩溃导致的数据。 3. **MyISAM或ARCHIVE引擎表的恢复**:这类表通常没有事务日志,但MyISAM表可以使用`myisamchk`工具进行检查和修复,而ARCHIVE表需要基于表结构重建数据。 4. **数据转储(Backup and Restore)**:定期备份数据库是最基本的防护措施,如果数据损坏,可以通过备份恢复到最近的一个完整备份点。 5. **第三方工具**:市面上有一些商业工具,如Percona XtraBackup、Navicat Data Recovery等,提供高级的数据恢复功能。 6. **物理文件操作**:如果严重到硬盘损坏,可能需要直接对.ibd文件(InnoDB表的数据文件)或frm文件(表结构文件)进行操作,但这通常仅限于非常高级的用户,且风险较高。 相关问题: 1. 如何启用MySQL的二进制日志? 2. InnoDB引擎的redo log和undo log分别用于什么? 3. 如何使用Percona XtraBackup进行数据恢复? 4. 对于MyISAM表的检查和修复,myisamchk有哪些常用选项? 5. 物理文件操作恢复数据的风险有哪些?

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值