1.事前准备
- linux环境(我是宝塔集成环境)
- mysql的root账号一枚
- 开启mysqlbin-log日志
- 找到mysqlbinlog命令完整路径(系统默认mysqlbinlog命令最好不要使用)
- 找到mysql二进制文件位置,find / -name mysql-bin*
- 数据库附件一份,https://download.csdn.net/download/wash2017/11663105
2.进实操
cd /data/
#备份数据库(全备)
mysqldump -u root -p --master-data=2 --single-transaction --routines --triggers --events mc_orderdb > mc_orderdb.sql
#模拟在生产环境中进行数据操作
#连接mysql
mysql -u root -p
mysql>use mc_orderdb
###必须加上,否在在进行最后一步数据恢复的时候会报错Table 't' already exists,因为根据日志文件恢复时,运行到创建t表的sql语句时,由于已经存在t表,所以失败。
mysql>DROP TABLE IF EXISTS `t`;
#创建临时测试数据表
mysql> create table t(id int auto_increment not null,uid int ,cnt decimal(8,2),primary key (id));
#存储测试数据,代码直接复制粘贴即可,这里快速过
mysql>insert into t(uid,cnt) select customer_id,sum(order_money) from order_master group by customer_id;
#目前有6314条数据
mysql>select count(*) from t;
#删除部分数据 目前有6214条数据
mysql>delete from t limit 100;
#恢复最近的备份数据
mysql -u root -p mc_orderdb < mc_orderdb.sql
#查看备份文件时二进制文件名(mysql-bin.000025)和时间点(11099532)
more mc_orderdb.sql
#找到-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000025', MASTER_LOG_POS=11099532;
#恢复这个时间点之后到删除之前的那一部分数据(每个人这里数据都不一样,注意)
#找到数据库二进制文件进行分析(如果不知道二进制文件位置,find / -name mysql-bin*)
cd /www/server/data/
ls -lh
#可以看到最后一个mysql-bin日志
#使用mysqlbinlog命令 可以看到最后一次删除操作以及时间节点,我们要恢复到这个节点之前
/www/server/mysql/bin/mysqlbinlog --base64-output=decode-rows -vv --start-position=11099532 --database=mc_orderdb mysql-bin.000025 | grep -B3 DELETE | more
#使用mysqlbinlog 命令恢复 5610753到5697129 两个时间节点之间的日志 > mc_order_diff.sql文件
/www/server/mysql/bin/mysqlbinlog --start-position=11099532 --stop-position=11185754 --database=mc_orderdb mysql-bin.000025 > mc_order_diff.sql
#恢复至数据库
mysql -u root -p mc_orderdb < mc_order_diff.sql
#这个时候
再去看看数据表t有多少条数据,目前本人测试已完成,有问题私我