您的位置:首页 > 数据库 > MySQL

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

2016-07-05 21:47 936 查看
最近看了一本 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 /]#
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql ibdata 删除 恢复