数据恢复:如何恢复Linux中意外删除的Oracle和MySQL数据库

张乐奕

云和恩墨副总经理,Oracle ACE总监,ACOUG 联合创始人

没有删除过数据库的DBA职业生涯是不完整的,删除过数据库还能幸存的DBA一定是订阅了“Oracle”公众号。

昨晚有朋友在微信群中求助讨论,误删除了一个MySQL的数据库,整个恢复过程和以下文章中提到的步骤完全相同,只要MySQL主进程还没有退出,从文件句柄中可以恢复文件最终挽回损失。类似的lsof找到那些被标记为Deleted的文件(以下是参考示意图)。

让我们完整的再复习一下这篇文章的步骤,一定要记住这种方法:

今天有客户的数据库意外被删除了整个目录中的数据文件,操作系统级别的删除,然而幸运的是这个数据库没有崩溃,仍然处于 open 状态的时候,客户就发现了问题,求助到我们,最终完整地恢复了所有数据文件。

在 Linux 下大致重新演示一下恢复的过程,恢复的步骤与数据库版本没有太大关系,与操作系统的不同会有所不同。

1. 在数据库 open 的时候,直接删除 users 表空间中的数据文件。

2. 尝试在 users 表空间中创建表,开始报错。

在告警日志中,同样也可以看到类似信息。

3. 检查 dbwr 的进程 PID

4. dbwr 会打开所有数据文件的句柄。在 proc 目录中可以查到,目录名是进程 PID,fd 表示文件描述符。

注意其中“/app/oracle/oradata/ORCL/datafile/o1_mf_users_555wrj4o_.dbf (deleted)”字样,表示该文件已经被删除,如果是 Solaris 操作系统,ls 命令不会有如此清晰的显示,为了在 Solaris 系统中确认哪个句柄对应哪个文件,则需要使用 lsof 程序。

5. 直接 cp 该句柄文件名回原位置。

6. 进行数据文件 recover

完成数据文件恢复。

恢复的原理是,在 Linux 操作系统中,如果文件从操作系统级别被rm掉,之前打开该文件的进程仍然持有相应的文件句柄,所指向的文件仍然可以读写,并且该文件的文件描述符可以从 /proc 目录中获得。但是要注意的是,此时如果关闭数据库,则此句柄会消失,那么除了扫描磁盘进行文件恢复之外就没有其它方法了,因此在数据库出现问题的时候,如果不确认情况的复杂程度,千万不要随便关闭数据库。重启数据库往往是没有意义的,甚至是致命的。

当然,客户的操作系统是Solaris,并且客户删除的文件还包括 current online redo log,因此还有其它更复杂的操作,不在这里描述。

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2016-04-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术博文

linux下查看所有用户及所有用户组

groups 查看当前登录用户的组内成员 groups gliethttp 查看gliethttp用户所在的组,以及组内成员 whoami 查看当前登录用户名 ...

3354

在Ubuntu 16.04上安装MongoDB(Xenial)

在本数据库教程中,我们将一步步指导您在Ubuntu 16.04上安装MongoDB,然后再介绍MongoDB一些基本特性和功能。

903
来自专栏Linux运维学习之路

企业级memcached缓存数据库结合php使用与web管理memcached

环境 [root@cache01 ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Cor...

2006
来自专栏一名合格java开发的自我修养

storm0.9.5集群安装

        nohup ./storm nimbus 1>/dev/null 2>&1 &

552
来自专栏张善友的专栏

linux下增加磁盘改变指定文件路径分区挂载点和迁移数据

1565
来自专栏后端之路

redis迁移数据

背景 由于一些原因 现在需要将redis作为基础组建迁移出来redis无法获取连接Could not get a resource from the pool ...

2784
来自专栏IT可乐

Linux系列教程(十八)——Linux文件系统管理之文件系统常用命令

  通过前面两篇博客,我们介绍了Linux系统的权限管理。Linux权限管理之ACL权限 介绍了通过设定 ACL 权限,我们为某个用户指定某个文件的特定权限,这...

17710
来自专栏JadePeng的技术博客

ELK日志套件安装与使用

1、ELK介绍 ELK不是一款软件,而是elasticsearch+Logstash+kibana三款开源软件组合而成的日志收集处理套件,堪称神器。其中Logs...

2784
来自专栏Java技术分享

调整JVM内存大小

JAVA程序启动时JVM都会分配一个初始内存和最大内存给这个应用程序。这个初始内存和最大内存在一定程度都会影响程序的性能;Tomcat默认可以使用的内存为128...

1875
来自专栏北京马哥教育

15 分钟掌握 15 个 Docker 小窍门

1. 获取最近运行容器的id 这是我们经常会用到的一个操作,按照官方示例,你可以这样做(环境ubuntu): $ ID=$(docker run ubuntu...

2745

扫描关注云+社区