情景1:误删数据
背景描述
- 9点的时候,删除一个库或一张表数据
- 后来发现数据丢了,需紧急恢复
数据恢复思路
存在全量备份和binlog的情景
-
利用全量备份进行数据恢复
-
物理备份
- 库级别:使用xtrabackup进行库级别的恢复到一个新库即可
- 表级别:拷贝idb文件(innodb还需要执行alter table t discard/import tablespace命令)
-
逻辑备份
-
库级别:导入整库备份的SQL文件
-
表级别:恢复单个的sql文件
sed -e'/./{H;$!d;}' -e 'x;/CREATE TABLE `order`/!d;q' /backup/order.sql grep 'INSERT INTO `order`' /backup/dbname.sql > order_data.sql
-
-
-
利用增量的binlog文件恢复数据
没有全备和binlog的情景
1、恢复delete的数据
可以考虑percona-data-recovery-tool-for-innodb工具
2、恢复drop 表的数据
可以考虑使用undrop-for-innodb工具
3、有从库的话,考虑使用主从切换
四、对于rm类删除
在没有备份的情况下,如果服务器没有重启,可以复制/proc/$pid/fd文件来进行恢复
准备测试数据
create database devdb;
use devdb;
create table customers(
id int not null auto_increment,
name char(20) not null,
age int not null,
primary key(id)
)engine=InnoDB;
insert into customers values(1,"biu1","24");
insert into customers values(2,"biu2","22");
insert into customers values(3,"biu3","27");
commit;
全量备份
mysqldump -uroot -p -B -F -R -x --master-data=2 devdb|gzip >/tmp/devdb_$(date +%F).sql.gz
参数说明:
-B:指定数据库
-F:刷新日志
-R:备份存储过程等
-x:锁表
--master-data:在备份语句里添加CHANGE MASTER语句以及binlog文件及位置点信息
再次变更数据
insert into customers values(4,"biu4","21");
insert into customers values(5,"biu5","25");
insert into customers values(6,"biu6","29");
update customers set age=28 where id=4;
insert into customers values(7,"biu7","18");
delete from customers ;
commit;
drop database devdb;
恢复数据
当发现重要表数据删除时,立即锁表(可选)
flush tables with read lock; -- 给表加上读锁
在另一台机器或实例上恢复数据
解压备份文件(可选)
gzip -d /tmp/devdb_$(date +%F).sql.gz
确定上次全备的binlog文件名称及其位置
grep 'CHANGE' /tmp/devdb_$(date +%F).sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=106;
全备时刻的binlog文件位置:mysql-bin.000002的106行,因此在该文件之前的binlog文件中的数据都已经包含在全备中,该文件之后的数据是全备之后的增量数据
将全量备份文件及binlog文件拷贝到新机器
全量备份还原
mysql -uroot -proot < /tmp/devdb_$(date +%F).sql
还原增量数据
# 1. 将binlog日志转换成sql
mysqlbinlog --start-position=106 mysql-bin.000002 > incr002.sql
mysqlbinlog mysql-bin.000003 > incr003.sql
......
# 2. 定位到删除数据的行并将其注释
# 2.2 也可以通过时间和位置点恢复
# 3. 导入binlog中的增量数据
mysql -uroot -proot < incr002.sql
注意:
恢复全备数据之前必须将该binlog文件移出,否则恢复过程中,会继续写入语句到binlog
检查数据完整性
show databases;
select * from devdb.customers;