idb文件被误删除了,如何恢复
解决思路:实例在没有重启的状况下可以根据lsof恢复,这也是linux常用文件恢复的方法
恢复步骤(网络上有较多解决思路,这里简单记录,便于下次使用):
1、ps -ef|grep mysqld 找到mysql对应的进程号,这个时候访问出问题最好给mysql加个全局的锁(flush tables with read lock;)
2、lsof|grep deleted|grep *.ibd 看下这个文件还有木有
3、找到这个对应的文件拷贝回去
根据进程号找到目录
cd /proc/123940/fd (ps:123940就是ps -ef|grep mysqld 查到的进程号)
这个时候执行ll会出现文件号指向不同的文件,找到想要恢复的文件cp回去
cp /proc/123940/fd/70 > /data/mysql/data/xxx.ibd
4、修改文件权限到mysql,重启即可
具体操作
1、mysql进程还在
mysql进程存在的情况下,操作系统还保留进程打开的文件句柄,可以进入/proc/$进程pid/fd 目录下查到文件对应的句柄文件,通过cp 拷贝到原路径下
模拟故障,mysql正常运行,查看fd状态
删除ibdata文件
查看mysql的进程还在
fd指向的文件已经变成delete状态
登录数据库:
1、添加全局读锁同时开启super_read_only
2、修改强制脏页刷新,调整innodb_io_capacity 增加io刷新参数
3、查找链接并组成kill 语句
确认脏页是否刷新完成
1、确保insert buffer 合并插入缓存等于1
2、确保这三个值不变
3、确保脏页数量为0确保插入、更新、删除为0
备份数据目录
cp -rf data data_bak
拷贝文件句柄
cp 10 /data/3306/data/ibdata1
赋权
chown mysql:mysql ibdata1
重启数据库
mysqld_safe --defaults-file=/etc/my.cnf