顺带来聊聊MySQL误删ibdata数据文件的恢复

看腻了就来听听视频演示吧:https://www.bilibili.com/video/BV1m34y1A7tV/

在MySQL进程未重启时可以恢复

# 误删数据文件和重做日志文件
[root@dba ~]# cd /mysqldata/data/
[root@dba data]# ll ib*
-rw-r----- 1 mysql mysql      809 Nov 19 03:22 ib_buffer_pool
-rw-r----- 1 mysql mysql 79691776 Feb 23 07:17 ibdata1
-rw-r----- 1 mysql mysql 50331648 Feb 23 07:18 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 Feb 23 07:18 ib_logfile1
-rw-r----- 1 mysql mysql 12582912 Feb 23 07:06 ibtmp1
[root@dba data]# rm -f ib*
[root@dba data]# ll ib*
ls: cannot access ib*: No such file or directory

# 查找MySQL进程pid
[root@dba data]# netstat -ntlp | grep mysqld
tcp6       0      0 :::3306                 :::*                    LISTEN      7424/mysqld         
# 确认进程具柄还没释放
[root@dba data]# ll /proc/7424/fd | egrep 'ib_|ibdata'
lrwx------ 1 root root 64 Feb 23 07:33 10 -> /mysqldata/data/ibdata1 (deleted)
lrwx------ 1 root root 64 Feb 23 07:33 4 -> /mysqldata/data/ib_logfile0 (deleted)
lrwx------ 1 root root 64 Feb 23 07:33 9 -> /mysqldata/data/ib_logfile1 (deleted)

# 前端关闭业务或甚至只读模式
flush tables with read lock;
# 将脏页尽快刷入磁盘
set global innodb_max_dirty_pages_pct = 0;
# 查看binlog日志写入情况,确保File和Position值没变化
show master status;
# 查看InnoDB状态信息确保脏页已刷入磁盘
show engine innodb status\G;

# 将未释放的具柄号复制回原目录文件
[root@dba data]# cp /proc/7424/fd/10 /mysqldata/data/ibdata1
[root@dba data]# cp /proc/7424/fd/4 /mysqldata/data/ib_logfile0
[root@dba data]# cp /proc/7424/fd/9 /mysqldata/data/ib_logfile1
# 修改用户属性
[root@dba data]# chown mysql.mysql ib*
[root@dba data]# ll /mysqldata/data/ib*
-rw-r----- 1 mysql mysql 79691776 Feb 23 07:41 /mysqldata/data/ibdata1
-rw-r----- 1 mysql mysql 50331648 Feb 23 07:41 /mysqldata/data/ib_logfile0
-rw-r----- 1 mysql mysql 50331648 Feb 23 07:41 /mysqldata/data/ib_logfile1

# 解锁,看是否需要重启MySQL服务
mysql> unlock tables;

原理:利用操作系统对误删除文件进程的具柄尚未释放

# 窗口一:创建文件,有进程一直在使用该文件
[root@dba ~]# echo  "hello  py" > /tmp/testdelete.py
[root@dba ~]# cat  >> /tmp/testdelete.py

# 窗口二:删除文件
[root@dba ~]# ll /tmp/testdelete.py 
-rw-r--r-- 1 root root 10 Feb 23 07:51 testdelete.py
[root@dba ~]# rm -f /tmp/testdelete.py 
[root@dba ~]# ll /tmp/testdelete.py 
ls: cannot access testdelete.py: No such file or directory

# 找到还没删除的进程进行文件cp恢复,PID为服务进程
[root@dba ~]# lsof | grep deleted | grep testdelete.py
cat       15276           root    1w      REG              253,0        10   35364283 /tmp/testdelete.py (deleted)
[root@dba ~]# ll /proc/15276/fd
total 0
lrwx------ 1 root root 64 Feb 23 07:53 0 -> /dev/pts/1
l-wx------ 1 root root 64 Feb 23 07:53 1 -> /tmp/testdelete.py (deleted)
lrwx------ 1 root root 64 Feb 23 07:53 2 -> /dev/pts/1

# 恢复
[root@dba ~]# cp /proc/15276/fd/1 /tmp/testdelete.py

# 验证
[root@dba ~]# ll /tmp/testdelete.py 
-rw-r--r-- 1 root root 10 Feb 23 08:03 /tmp/testdelete.py
[root@dba ~]# cat /tmp/testdelete.py 
hello  py

MySQL的binlog系列和奇技操作:

先来聊聊MySQL的binlog文件解析
接着说说mysqlbinlog解析工具如何做数据恢复
再来谈谈如何从binlog文件恢复误update的数据,模拟Oracle的闪回功能
接着聊聊如何从binlog文件恢复误delete的数据,模拟Oracle的闪回功能
借用binlog2sql工具轻松解析MySQL的binlog文件,再现Oracle的闪回功能
再来介绍另一个binlog文件解析的第三方工具my2sql
顺带来聊聊MySQL误删ibdata数据文件的恢复
MySQL大表直接复制文件的copy方式

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值