人工误删除了MYSQL的InnoDB ibdata数据文件,如何快速恢复

最近看了一本 mysql管理之道的书,有关于人工不小心删除 mysql的表空间文件和重做日志文件时该如何恢复,

这里笔记一下以防用的上。


查看目前MYSQL数据目录文件情况:

[root@myDBserver data]# ls -al
总用量 110704
drwxr-xr-x. 5 mysql mysql     4096 7月   3 14:29 .
drwxr-xr-x. 4 mysql mysql     4096 6月   4 22:56 ..
....
-rw-rw----. 1 mysql mysql 12582912 7月   3 14:29 ibdata1
-rw-rw----. 1 mysql mysql 50331648 7月   3 14:29 ib_logfile0
-rw-rw----. 1 mysql mysql 50331648 6月   4 23:08 ib_logfile1
....
然后使用 rm -f ib* 删除数据文件ibdata1和redo日志文件ib_logfile0、ib_logfile1


恢复过程:
(1) 确保mysqld进程还存在,切勿 pkill掉该进程
[root@myDBserver /]# netstat -ntlp | grep mysqld
tcp  0    0 :::3306   :::*    LISTEN    3415/mysqld  
注意最后信息 "3415/mysqld"


(2) 查看刚才被删除的文件
[root@myDBserver /]# ll  /proc/3415/fd | egrep 'ib_|ibdata'
lrwx------ 1 root root 64 7月   3 14:33 10 -> /opt/mysql/data/ib_logfile1
lrwx------ 1 root root 64 7月   3 14:33 4 -> /opt/mysql/data/ibdata1
lrwx------ 1 root root 64 7月   3 14:33 9 -> /opt/mysql/data/ib_logfile0


其中 10,4,9就是需要恢复的文件


(3) 关闭前端业务或执行 FLUSH TABLES WITH READ LOCK;


(4) 验证是否此刻数据库已经没有写入操作了
mysql> set global innodb_max_dirty_pages_pct = 0;


【4.1】查看InoDB 目前的状态,确保脏数据已经刷入磁盘
mysql> show engine innodb status\G;
------------
TRANSACTIONS
------------
Trx id counter 6435
Purge done for trx's n:o < 6435 undo n:o < 0 state: running but idle
## 确保事务号一致
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 0, seg size 2, 0 merges
## 确保insert buffer 合并插入缓存等于1
---
LOG
---
Log sequence number 1721029
Log flushed up to   1721029
Last checkpoint at  1721029
## 确保这三个值不变
----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 274726912; in additional pool allocated 0
Dictionary memory allocated 76753
Buffer pool size   16383
Free buffers       16181
Database pages     202
Old database pages 0
Modified db pages  0
## 确保脏页数量为0
--------------
ROW OPERATIONS
--------------
0 queries inside InnoDB, 0 queries in queue
0 read views open inside InnoDB
Main thread process no. 3415, id 140701545637632, state: sleeping
Number of rows inserted 0, updated 0, deleted 0, read 5
0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s
## 确保插入、更新、删除为0


【4.2】查看主库目前的状态,确保已经不再发生变化
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000016 |      120 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

1 row in set (0.00 sec)


mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000016 |      120 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

1 row in set (0.00 sec)




(5) 恢复数据文件和日志文件
[root@myDBserver /]# ll  /proc/3415/fd | egrep 'ib_|ibdata'
lrwx------ 1 root root 64 7月   3 14:33 10 -> /opt/mysql/data/ib_logfile1
lrwx------ 1 root root 64 7月   3 14:33 4 -> /opt/mysql/data/ibdata1
lrwx------ 1 root root 64 7月   3 14:33 9 -> /opt/mysql/data/ib_logfile0
[root@myDBserver /]# cd /proc/3415/fd
[root@myDBserver fd]# pwd
/proc/3415/fd


[root@myDBserver fd]# cp 10 /opt/mysql/data/ib_logfile1
[root@myDBserver fd]# cp 4 /opt/mysql/data/ibdata1
[root@myDBserver fd]# cp 9 /opt/mysql/data/ib_logfile0


[root@myDBserver fd]# cd  /opt/mysql/data/
[root@myDBserver data]# chown mysql:mysql ib*


(6) 重启mysql 即可完成
[root@myDBserver /]# /etc/init.d/mysql restart;
Shutting down MySQL.. SUCCESS! 
Starting MySQL.. SUCCESS! 
[root@myDBserver /]# 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值