顺带来聊聊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方式

你可能感兴趣的:(MySQL,mysql,数据库)