1.人工误删除InnoDB ibdata数据文件恢复
使用rm -f ib*
删除数据文件和重做日志文件,此时mysql数据库还是可以继续工作,数据可以写入,此时千万不能把mysqld进程杀死,否则无法挽救.
- 先找到mysqld的进程pid
netstat -ntlp | grep mysqld
- 查看结果
ll /proc/进程id/fd | egrep 'ib_|ibdata'
,查看10,11,4,9为要恢复的文件 - 关闭业务,
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
- 查看状态确保一些值是正确的
- 查看transactions 确保后台purge进程把undo log全部清理掉,事务id 要一致
- 查看insert buffer and adaptive hash index 合并插入缓存等于1
- 查看log 确保log sequence…,log flushed…,log checkpoint… 这三个值不在变化
- 查看buffer pool and memory 确保脏页数据为0
- 查看row operations 确保插入更新删除为0
- 检验只读是否成功 ,让脏页尽快刷入到磁盘中
- 恢复数据,把之前看到的几个文件cp到原来的目录下
- 修改用户属性
chown mysql:mysql ib*
- 重启mysql测试 (千万不要在生产环境测试)
2.update忘加where条件误操作恢复
-
全量备份+增量binlog备份(弊端数据量大时,恢复麻烦)
-
模拟oracle闪回功能
-
将binlog日志设置为binlog_format=ROW,如果是statement则无效
-
执行语句但忘记加where条件导致数据都被修改
-
恢复,创建一个新的用户分配权限为只读
-