前言
某一天, 天朗气清; 突然传来消息: 数据库被删库了! 这简直不亚于 8 级大地震呀; 一找原因, 服务器宕机造成了数据库数据丢失. 于是, 通过日志恢复数据的救援开始了.
正文
在数据库开启 binlog 功能
找到 / etc/my.cnf 并编辑 (没有 my.cnf 的时候就找 my.INI); 添加
- log-bin=MySQL-bin
- expire_logs_days=7(日志保留天数)
然后重启 MySQL
注意: log_bin 是生成的 bin-log 的文件名, 后缀则是 6 位数字的自增编码, 从 000001 开始:
- mysql_bin.000001
- mysql_bin.000002
- ......
操作日志
1, 查看日志文件:
- MySQL> show master logs;
- +------------------+--------------+
- | Log_name | File_size |
- +------------------+-----------+
- | MySQL-bin.000001 | 120 |
- | MySQL-bin.000002 | 4249 |
- | MySQL-bin.000003 | 1110 |
- +------------------+--------------+
2, 查看最后一个 binlog 日志的编号名称 (就是最后一个操作事件的值):
- MySQL> show master status;
- +------------------+----------+--------------+------------------+-------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
- +------------------+----------+--------------+------------------+-------------------+
- | MySQL-bin.000003 | 1110 | | | |
- +------------------+----------+--------------+------------------+-------------------+
3, 产生一个新的日志文件
- MySQL> flush logs;
- Query OK, 0 rows affected (0.01 sec)
- MySQL> show master status;
- +--------------+---------------+
- | Log_name | File_size |
- +--------------+---------------+
- | MySQL-bin.000004 | 106 |
- +-----------------+------------+
- 4 rows in set (0.01 sec)
4, 删除所有 binlog 日志, 重新记录
- MySQL> reset master;
- Query OK, 0 rows affected (0.01 sec)
- MySQL> show master status;
- +--------------+---------------+
- | Log_name | File_size |
- +--------------+---------------+
- | MySQL-bin.000001 | 106 |
- +-----------------+------------+
- 1 rows in set (0.01 sec)
恢复数据
恢复数据的方式有很多种, 可以根据自己具体的情况来选择用哪种.
1, 如果想全部恢复, 先执行之前的备份恢复, 再执行自备份后产生的二进制日志文件
MySQL localhost MySQL-bin.000001 | MySQL -uroot -p( 这样数据库就可以恢复到删除数据前的状态)
2, 根据时间点来恢复, 如果确认被删的时间点为 2019-03-25 09:00:00, 那么就可以如下
mysqlbinlog --stop-date='2019-03-25 8:59:59' MySQL-bin.000001 | MySQL -uroot -p 然后跳过数据被删的时间点, 继续执行后面的 binlog # mysqlbinlog --start-date='2019-03-25 09:01:00' MySQL-bin.000001 | MySQL -uroot -p
其中 --stop-date='2019-03-25 08:59:59' 和 --start-date='2019-03-25 09:01:00'
3, 如果知道两个时间点, 就按如下操作
mysqlbinlog --start-datetime="2019-03-25 10:30:30" --stop-datetime="2019-03-25 11:10:10" MySQL-bin.000001 | MySQL -u root -p
4, 通过查看日志文件信息确认 (假如操作点为 6200-6300)
- mysqlbinlog --stop-position=6200 MySQL-bin.000001 | MySQL -uroot -p
- mysqlbinlog --start-position=6300 MySQL-bin.000001 | MySQL -uroot -p
注意
因为 MySQL 的 binlog 是二进制文件, 一定要用 mysqlbinlog 命令才可以操作.
> 举例, 导出 sql 文件:# mysqlbinlog MySQL-bin.000001>test.sql
后续
通过这一次经历, 知道了以后一定要做好数据库的备份; 这很重要!
来源: https://www.cnblogs.com/nikeodong/p/10615058.html