一、Mysql日志
mysql 有两个重要的日志模块 redo log (重做日志) 和 binlog (归档日志),
当有一条数据需要更新时,InnoDB引擎会在系统空闲的时候,将记录更新到磁盘中。会先将记录存放到 redo log 里,在更新内存,这个时候更新就完成了,InnoDB引擎会在系统空闲的时候,将记录更新到磁盘中,redo log是物理日志,记录在某个数据做了什么修改, redo log 是InnoDB引擎中特有的日志,换句话说 redo log 是InnoDB引擎为了提高系统效率,用来做日志缓冲的。
binlog 是记录所有数据库表结构变更以及表数据修改的二进制日志(不会记录 SELECT和SHOW 这类操作),binlog 是逻辑日志,记录语句的原始逻辑。
数据恢复: 可以通过 mysqlbinlog工具进行数据恢复。
二、数据恢复
1、查看是否开启binlog日志备份
mysql> show variables like 'log_bin%';
+---------------------------------+----------------------------------------------------------------------+
| Variable_name | Value |
+---------------------------------+----------------------------------------------------------------------+
| log_bin | ON |
| log_bin_basename | C:\ProgramData\MySQL\MySQL Server 8.0\Data\DESKTOP-RGVMCFU-bin |
| log_bin_index | C:\ProgramData\MySQL\MySQL Server 8.0\Data\DESKTOP-RGVMCFU-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
+---------------------------------+----------------------------------------------------------------------+
如果log_bin状态是off,可以退出了,此方法无法恢复。。。。。。。
2、查看binlog日志文件
找到当前 MySQL 记录的 binlog 文件,在 C:\ProgramData\MySQL\MySQL Server 8.0\Data 目录,这里看到当前的日志是*****.000001 这个文件,后缀是0000001或者000002的。
3、定位需要恢复的数据区间
查看 binlog,定位误操作的pos或者时间段,我这里是在 binlog.000001 阶段删除的,注意下面的
Pos: 开始节点
Event_type: 类型
End_log_pos: 结束节点
Info: 描述
mysql> show binlog events in 'binlog.000001';
+---------------+------+----------------+-----------+-------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+---------------+------+----------------+-----------+-------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| binlog.000001 | 4 | Format_desc | 1 | 124 | Server ver: 8.0.19, Binlog ver: 4 |
| binlog.000001 | 124 | Previous_gtids | 1 | 155 | |
| binlog.000001 | 155 | Anonymous_Gtid | 1 | 232 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| binlog.000001 | 232 | Query | 1 | 351 | CREATE DATABASE `mp_test` /* xid=288 */ |
| binlog.000001 | 351 | Anonymous_Gtid | 1 | 430 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| binlog.000001 | 430 | Query | 1 | 735 | use `mp_test`; CREATE TABLE `mp_test`.`user` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
`name` varchar(255) NULL COMMENT '名字',
`create_time` datetime NULL COMMENT '创建时间',
PRIMARY KEY (`id`)
) /* xid=320 */ |
| binlog.000001 | 735 | Anonymous_Gtid | 1 | 814 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| binlog.000001 | 814 | Query | 1 | 900 | BEGIN |
| binlog.000001 | 900 | Table_map | 1 | 963 | table_id: 208 (mp_test.user) |
| binlog.000001 | 963 | Write_rows | 1 | 1023 | table_id: 208 flags: STMT_END_F |
| binlog.000001 | 1023 | Xid | 1 | 1054 | COMMIT /* xid=371 */ |
| binlog.000001 | 1054 | Anonymous_Gtid | 1 | 1133 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| binlog.000001 | 1133 | Query | 1 | 1219 | BEGIN |
| binlog.000001 | 1219 | Table_map | 1 | 1282 | table_id: 208 (mp_test.user) |
| binlog.000001 | 1282 | Write_rows | 1 | 1339 | table_id: 208 flags: STMT_END_F |
| binlog.000001 | 1339 | Xid | 1 | 1370 | COMMIT /* xid=374 */ |
| binlog.000001 | 1370 | Anonymous_Gtid | 1 | 1449 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| binlog.000001 | 1449 | Query | 1 | 1535 | BEGIN |
| binlog.000001 | 1535 | Table_map | 1 | 1598 | table_id: 208 (mp_test.user) |
| binlog.000001 | 1598 | Write_rows | 1 | 1655 | table_id: 208 flags: STMT_END_F |
| binlog.000001 | 1655 | Xid | 1 | 1686 | COMMIT /* xid=377 */ |
| binlog.000001 | 1686 | Anonymous_Gtid | 1 | 1765 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| binlog.000001 | 1765 | Query | 1 | 1860 | BEGIN |
| binlog.000001 | 1860 | Table_map | 1 | 1923 | table_id: 208 (mp_test.user) |
| binlog.000001 | 1923 | Update_rows | 1 | 2003 | table_id: 208 flags: STMT_END_F |
| binlog.000001 | 2003 | Xid | 1 | 2034 | COMMIT /* xid=380 */ |
| binlog.000001 | 2034 | Anonymous_Gtid | 1 | 2111 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| binlog.000001 | 2111 | Query | 1 | 2246 | use `mp_test`; DROP TABLE `user` /* generated by server */ /* xid=454 */ |
+---------------+------+----------------+-----------+-------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
通过 info 看到 我在 Pos 2034 End_los_pos 2246 删除了 user表
4、日志文件转换sql文件进行数据恢复
先来到MySQL下的bin目录,这个目录有个 mysqlbinlog.exe,后面我们可以通过它来进行恢复,打开cmd进入下面目录
C:\Program Files\MySQL\MySQL Server 8.0\bin
在 C:\Program Files\MySQL\MySQL Server 8.0\bin 目录, cmd 运行下面命令,读取 binlog.000001从开始位置351,到结束位置2034,并输出到F:盘下 0917.sql 这个文件,binlog 在 C:\ProgramData\MySQL\MySQL Server 8.0\Data\目录里面
mysqlbinlog --start-position=351 --stop-position=2034 "C:\ProgramData\MySQL\MySQL Server 8.0\Data\binlog.000001" --result-file= D:\\mysql.sql
打开 MySQL 8.0 Command Line Client,就是 MySQL 自带的小黑窗口,运行下面命令
source D:\\mysql.sql