文档说明:在日常工作中,因不熟悉InnoDB引擎,很多人误删除了InnoDB ibdata(数据文件)和ib_logfile(redo log重做事务日志文件),结果导致了杯具的发生。如果你有做主从复制同步,那还好,如果是单机呢?如何恢复?此教程为误删除innodb数据文件后的一些恢复方案。
如需做测试前,请先确定mysql没关闭。若正式库发生误操作时,请确认mysql没有关闭。切记,这时千万别把mysqld进程杀死,否则你只有跳楼了,神仙都没法救你(有个朋友就误删重启结果悲剧了)。
测试:手动删除掉ibdata1和ib_logfile0、ib_logfile1.
1. 通过ps –ef|grep mysql命令或netstat -ntlp | grep mysql得到mysql当前的进程号。
2. 通过ll /proc/8721/fd | egrep'ib_|ibdata' 命令找到删除掉的几个文件。如图所示10、4、9就是我们需要恢复的文件。
3. 你执行FLUSH TABLES WITH READ LOCK锁表;这一步的作用是让数据库没有写入操作,以便后面的恢复工作。
进入mysql中,锁表。ps:这里有一点需要注意的,若误删时不建议停业务(有部分推荐停业务,然后不锁表恢复,若不锁表恢复异常,故一定要锁表刷脏页)
锁表:flush tables with read lock;
让脏页尽快刷入到磁盘里:setglobal innodb_max_dirty_pages_pct=0;
通过show master status; 确定File和Position值不在变化
show engine innodb status\G;# 查看是否有写入操作
复制内容到剪贴板
代码:
*************************** 1. row ***************************
Type: InnoDB
Name:
Status:
BACKGROUND THREAD
------------
TRANSACTIONS
------------
Trx id counter E4B
Purge done for trx's n:o < C1F undo n:o < 0
#确保后台Purge进程把undo log全部清除掉,事务ID要一致。
History list length 431
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0, not started
MySQL thread id 8, OS thread handle 0x7fe50c567700, query id 1009 localhost root
show engine innodb status
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 0, seg size 2, 0 merges
# insert buffer合并插入缓存等于1
merged operations:
insert 0, delete mark 0, delete 0
discarded operations:
insert 0, delete mark 0, delete 0
Hash table size 276671, node heap has 1 buffer(s)
0.00 hash searches/s, 0.00 non-hash searches/s
---
LOG
---
Log sequence number 1795007130
Log flushed up to 1795007130
Last checkpoint at 1795007130
#这三个值要相同
0 pending log writes, 0 pending chkp writes
10 log i/o's done, 0.00 log i/o's/second
----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 137363456; in additional pool allocated 0
Dictionary memory allocated 496199
Buffer pool size 8191
Free buffers 0
Database pages 8190
Old database pages 3003
Modified db pages 0(确保脏页数是0)
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 21480, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 31184, created 0, written 1
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer pool page gets since the last printout
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 8190, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]
--------------
ROW OPERATIONS
--------------
0 queries inside InnoDB, 0 queries in queue
1 read views open inside InnoDB
Main thread process no. 8721, id 140621742786304, state: waiting for server activity
Number of rows inserted 0, updated 0, deleted 0, read 2352505
0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 0.00 reads/s
#确保插入、更新、删除为0
1 row in set (0.00 sec)
再次找到这几个文件,重新恢复。
对数据库重新赋权(复制过来时是root权限。)
chown -R mysql:mysql /var/lib/mysql
重启mysql后发现一切正常。
