Mysql

mysql通过mysqlbinlog恢复数据

温馨提示: 操作数据库请先备份数据库!!!!!!!!!

什么是mysqlbinlog?

MySQL的binlog就是大家经常所说的Binary Log,即bin-log,是MySQL存储对数据库改动的二进制文件,也就是记录了所有DDL与DML(select除外)语句,利用它主要可以做两件事:

  • 数据恢复:通过mysqlbinog工具进行恢复;
  • 数据复制:MySQL Replication在Master端开启binlog,Mster把它的二进制日志传递给slaves来达到master-slave数据一致的目的。

如何查看MySQL的日志情况(是否开启等),当MySQL还没开启时候,通过命令:show variables like ‘log_bin%'查看

mysql> show variables like 'log_bin%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| log_bin                         | OFF   |
| log_bin_basename                |       |
| log_bin_index                   |       |
| log_bin_trust_function_creators | OFF   |
| log_bin_use_v1_row_events       | OFF   |
+---------------------------------+-------+
5 rows in set

查看binlog文件的内容

mysqlbinlog命令语法格式

mysqlbinlog mysql-bin.0000xx | mysql -u用户名 -p密码 数据库名

刷新log日志,自此刻开始产生一个新编号的binlog日志文件

mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)

查找pos点

mysql> flush logs;
Query OK, 0 rows affected (0.03 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 |      107 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

mysql数据一般存放在/var/lib/mysql目录,通过mysqlbinlog打开日志文件

/usr/local/mysql/bin/mysqlbinlog /var/lib/mysql/mysql-bin.000001

常用用到的命令

--start-position=875 起始pos点
--stop-position=954 结束pos点
--start-datetime="2019-10-22 22:01:08" 起始时间点
--stop-datetime="2019-10-23 22:09:46" 结束时间点

如何恢复数据

第一步:找到当前mysql记录的binlog文件,执行show master status;

第二步:查看binlog,定位误操作的pos或者时间段。执行show binlog events in 'mysql_bin.000001';

第三步: 通过命令把特定时间的binlog转成sql文件,再执行sql文件

转化命令

mysqlbinlog --start-position=219 --stop-position=681 mysql-bin.000001 > /www/data/sql/test.sql

或者

mysqlbinlog --start-datetime="2019-10-22 22:01:08" --stop-datetime="2019-10-23 22:09:46" mysql-bin.000001 > /www/data/sql/test.sql

恢复命令,或者使用数据库工具执行sql文件

mysql> mysql -uroot -p123456 -v < /www/data/sql/test.sql

其实还有更直接的方法,就是感觉太危险了

一条命令直接回复数据

mysqlbinlog --start-datetime="2019-10-22 22:01:08" --stop-datetime="2019-10-23 22:09:46" --database=数据库 /var/lib/mysql/mysql-bin.000001 | mysql -uroot -p123456 -v 数据库

使用mysqlbinlog的命令路径必须准确,如linux宝塔的命令为/www/server/mysql/bin/mysqlbinlog

类似文章