MySQL的binlog日志对于mysql数据库来说是十分重要的。在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全量备份+binlog日志恢复增量数据部分)。

一、关于binlog
MySQL的二进制日志binlog可以说是MySQL数据库服务最重要的日志,它记录了所有的DDL和DML语句(除了数据查询语句select),以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。

DDL:
- Data Definition Language 数据库定义语言
主要的命令有CREATE、ALTER、DROP等,DDL主要是用在定义或改变表(TABLE)的结构,数据类型,表之间的链接和约束等初始化工作上,他们大多在建立表时使用。

DML:
- Data Manipulation Language 数据操纵语言
主要的命令是SELECT、UPDATE、INSERT、DELETE,就像它的名字一样,这4条命令是用来对数据库里的数据进行操作的语言。

mysqlbinlog常见的选项有以下几个:
--start-datetime:从二进制日志中读取指定等于时间戳或者晚于本地服务器的时间。
--stop-datetime:从二进制日志中读取指定小于时间戳或者等于本地服务器的时间取值和上述一样。
--start-position:从二进制日志中读取指定position 事件位置作为开始。
--stop-position:从二进制日志中读取指定position 事件位置作为截止。

一般来说,开启MySQL数据库的binlog日志功能大概会有1%的性能损耗。

binlog日志有两个最重要的使用场景:

(1)MySQL主从复制:MySQL Replication在Master端开启binlog,Master把它的二进制日志传递给slaves来达到master-salve 数据一致的目的。
(2)自然就是数据恢复,通过使用mysqlbinlog工具来恢复数据。

binlog日志包括两类文件:
(1)二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件。
(2)二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句select)语句事件。

二、开启binlog日志功能
(1) 编辑打开mysql配置文件/etc/my.cnf
[root@localhost ~]# vim /etc/my.cnf
在[mysqld] 块添加
log-bin=mysql-bin 确认是打开状态(mysql-bin 是日志的基本名或前缀名)

注意:每次服务器(数据库)重启,服务器会调用flush logs;,新创建一个binlog日志!

(2) 重启mysqld服务使配置生效

[root@localhost /]# /etc/init.d/mysql stop
Shutting down MySQL. SUCCESS!
[root@localhost /]# /etc/init.d/mysql start
Starting MySQL.. SUCCESS!
[root@localhost /]# /etc/init.d/mysql restart
Shutting down MySQL. SUCCESS!
Starting MySQL.. SUCCESS!

(3) 查看binlog日志是否开启

mysql> show variables like 'log_%';
+---------------------------------+------------------------------------------------+
| Variable_name | Value |
+---------------------------------+------------------------------------------------+
| log_bin | ON |
| log_bin_trust_function_creators | OFF |
| log_error | /usr/local/mysql/var/localhost.localdomain.err |
| log_output | FILE |
| log_queries_not_using_indexes | OFF |
| log_slave_updates | OFF |
| log_slow_queries | OFF |
| log_warnings | 1 |
+---------------------------------+------------------------------------------------+
8 rows in set (0.00 sec)

三、常用的binlog日志操作命令

(1) 查看所有binlog日志列表

mysql> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 966 |
| mysql-bin.000002 | 1033 |
| mysql-bin.000003 | 1827 |
| mysql-bin.000004 | 126 |
| mysql-bin.000005 | 126 |
| mysql-bin.000006 | 107 |
+------------------+-----------+
6 rows in set (0.00 sec)

(2) 查看master状态,即最后(最新)一个binlog日志的编号名称,及其最后一个操作事件pos结束点(Position)值

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

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

mysql> flush logs;
Query OK, 0 rows affected (0.00 sec) mysql> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 966 |
| mysql-bin.000002 | 1033 |
| mysql-bin.000003 | 1827 |
| mysql-bin.000004 | 126 |
| mysql-bin.000005 | 126 |
| mysql-bin.000006 | 150 |
| mysql-bin.000007 | 107 |
+------------------+-----------+
7 rows in set (0.00 sec)

注意:每当mysql服务重启时,会自动执行此命令,刷新binlog日志;在执行mysqldump备份数据时加 -F 选项也会刷新binlog日志;

(4)重置(清空)所有binlog日志

mysql> reset master;
Query OK, 0 rows affected (0.01 sec) mysql> show master logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 107 |
+------------------+-----------+
1 row in set (0.00 sec)

四、查看binlog日志内容

常用有两种方式:

1)使用MySQL自带命令mysqlbinlog查看:
注意:
-->binlog是二进制文件,普通文件查看器cat、more、vim等都无法打开,必须使用自带的mysqlbinlog命令查看.
-->binlog日志与数据库文件在同目录中.
-->在MySQL5.5以下版本使用mysqlbinlog命令时如果报错,就加上 “--no-defaults”选项.

查看mysql的数据存放目录,从下面结果可知是/usr/local/mysql/var

[root@localhost /]# ps -ef |grep mysql |grep -v 'grep'
root 4191 1 0 15:05 pts/0 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/usr/local/mysql/var --pid-file=/usr/local/mysql/var/localhost.localdomain.pid
mysql 4504 4191 0 15:05 pts/0 00:00:00 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/var --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/var/localhost.localdomain.err --pid-file=/usr/local/mysql/var/localhost.localdomain.pid --socket=/tmp/mysql.sock --port=3306
root 4525 2789 0 15:06 pts/0 00:00:00 mysql

[root@localhost var]# cd /usr/local/mysql/var/
[root@localhost var]# ls
ibdata1 localhost.localdomain.err mysql-bin.000002 mysql-bin.000006 mysql-bin.000010 mysql-bin.000014 performance_schema
ib_logfile0 localhost.localdomain.pid mysql-bin.000003 mysql-bin.000007 mysql-bin.000011 mysql-bin.000015  test
ib_logfile1 mysql mysql-bin.000004 mysql-bin.000008 mysql-bin.000012 mysql-bin.000016  ultrax
jiaowu mysql-bin.000001 mysql-bin.000005 mysql-bin.000009 mysql-bin.000013  mysql-bin.index

使用mysqlbinlog命令查看binlog日志内容。

2)另外一种更为方便的查询命令:
命令格式:
mysql> show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];
参数解释:
IN 'log_name' :指定要查询的binlog文件名(不指定就是第一个binlog文件)
FROM pos :指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算)
LIMIT [offset,] :偏移量(不指定就是0)
row_count :查询总条数(不指定就是所有行)
上面这条语句可以将指定的binlog日志文件,分成有效事件行的方式返回,并可使用limit指定pos点的起始偏移,查询条数!

如下操作示例:
(a)查询第一个(最早)的binlog日志:
mysql> show binlog events\G;

(b)指定查询 mysql-bin.000002这个文件:
mysql> show binlog events in 'mysql-bin.000002'\G;

(c)指定查询 mysql-bin.000002这个文件,从pos点624开始查起:
mysql> show binlog events in 'mysql-bin.000002' from 624\G;

(d)指定查询 mysql-bin.000002这个文件,从pos点:624开始查起,查询10条(即10条语句)
mysql> show binlog events in 'mysql-bin.000002' from 624 limit 10\G;

(e)指定查询 mysql-bin.000002这个文件,从pos点:624开始查起,偏移2行(即中间跳过2个),查询10条
mysql> show binlog events in 'mysql-bin.000002' from 624 limit 2,10\G;

五、利用binlog日志恢复mysql数据

以下对jiaowu库的member表进行操作
mysql> create database jiaowu;
Query OK, 1 row affected (0.00 sec)
mysql> use jiaowu;
Database changed
mysql> CREATE TABLE IF NOT EXISTS `member` (
-> `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-> `name` varchar(16) NOT NULL,
-> `sex` enum('m','w') NOT NULL DEFAULT 'm',
-> `age` tinyint(3) unsigned NOT NULL,
-> `classid` char(6) DEFAULT NULL,
-> PRIMARY KEY (`id`)
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.10 sec) mysql> show tables;
+------------------+
| Tables_in_jiaowu |
+------------------+
| member |
+------------------+
1 row in set (0.00 sec) mysql> desc member;
+---------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(16) | NO | | NULL | |
| sex | enum('m','w') | NO | | m | |
| age | tinyint(3) unsigned | NO | | NULL | |
| classid | char(6) | YES | | NULL | |
+---------+---------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

插入两条数据:

mysql> insert into member(`name`,`sex`,`age`,`classid`) values('zhangsan','m',27,'class1'),('lisi','w',28,'class2');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0 mysql> select * from member;
+----+----------+-----+-----+---------+
| id | name | sex | age | classid |
+----+----------+-----+-----+---------+
| 1 | zhangsan | m | 27 | class1 |
| 2 | lisi | w | 28 | class2 |
+----+----------+-----+-----+---------+
2 rows in set (0.00 sec)

假设有如下场景:

(1)jiaowu 库会在每天的凌晨1点进行一次完全备份的定时任务计划,如下:

[root@localhost /]# crontab -u root -l
0 1 * * * /usr/bin/mysqldump -uroot -p -B -F -R -x --master-data=2 jiaowu|gzip >/opt/backup/jiaowu_$(date +%F).sql.gz

这里我们手动执行,将 jiaowu 数据库备份到/opt/backup 目录下:

[root@localhost /]# mysqldump  -u root -p -B -F -R -x --master-data=2  jiaowu |gzip >/opt/backup/jiaowu_$(date +%F).sql.gz
Enter password:
[root@localhost /]# ls /opt/backup/
jiaowu_2019-09-10.sql.gz

参数说明:

-B :指定数据库

-F :刷新日志

-R :备份存储过程等

-x  :锁表

--master-data:在备份语句里添加CHANGE MASTER语句以及binlog文件及位置点信息,参数为:0|1|2
0:表示不记录
1:表示记录并打开的状态
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000019', MASTER_LOG_POS=107;
2:表示记录但是以注释的方式
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000019', MASTER_LOG_POS=107;

由于上面在完全备份的时候使用了-F选项,那么当数据备份操作刚开始的时候系统就会自动刷新log,这样就会自动产生一个新的binlog 日志,这个新的binlog日志就会用来记录备份之后的数据库的‘增删改’操作。

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

mysql-bin.000002 是用来记录完全备份之后(凌晨1点以后)对数据库的所有“增删改”操作。

(2)由于需求,现需要对数据库进行第二次的 ‘增删改’ 操作;

比如:在jiaowu 库的member表中插入,修改了数据等等;

首先是执行了插入数据的操作:

mysql> insert into jiaowu.member(`name`,`sex`,`age`,`classid`) values('wangwu','w',20,'class3'),('zhaoliu','m',22,'class4'),('hongqi','w',21,'cls5'),('bajie','m',20,'class6');
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0 mysql> select * from member;
+----+----------+-----+-----+---------+
| id | name | sex | age | classid |
+----+----------+-----+-----+---------+
| 1 | zhangsan | m | 27 | class1 |
| 2 | lisi | w | 28 | class2 |
| 3 | wangwu | w | 20 | class3 |
| 4 | zhaoliu | m | 22 | class4 |
| 5 | hongqi | w | 21 | cls5 |
| 6 | bajie | m | 20 | class6 |
+----+----------+-----+-----+---------+
6 rows in set (0.00 sec)

(3)接着继续执行修改数据的操作

mysql> update jiaowu.member set classid='class5' where name ='hongqi';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> update jiaowu.member set name='李四' where id='2';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> update jiaowu.member set name='洪七' where id='5';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from member;
+----+----------+-----+-----+---------+
| id | name | sex | age | classid |
+----+----------+-----+-----+---------+
| 1 | zhangsan | m | 27 | class1 |
| 2 | 李四 | w | 28 | class2 |
| 3 | wangwu | w | 20 | class3 |
| 4 | zhaoliu | m | 22 | class4 |
| 5 | 洪七 | w | 21 | class5 |
| 6 | bajie | m | 20 | class6 |
+----+----------+-----+-----+---------+
6 rows in set (0.00 sec)

(4)最后模拟数据库损坏,这里直接drop掉数据库;

mysql> drop database  jiaowu;
Query OK, 1 row affected (0.01 sec)

(5)查看最后一个binlog日志,并记录关键的pos点,确定是哪个pos点的操作执行了数据库的删除操作;

先备份一下最后一个binlog日志文件

[root@localhost backup]# ls
jiaowu_2019-09-10.sql.gz
[root@localhost backup]# cd /usr/local/mysql/var/
[root@localhost var]# ls
ibdata1 ib_logfile0 ib_logfile1 localhost.localdomain.err localhost.localdomain.pid mysql mysql-bin.000001 mysql-bin.000002 mysql-bin.index performance_schema test ultrax
[root@localhost var]# cp -v mysql-bin.000002 /opt/backup/
`mysql-bin.000002' -> `/opt/backup/mysql-bin.000002'
[root@localhost var]# ls /opt/backup/
jiaowu_2019-09-10.sql.gz mysql-bin.000002

接着执行一次刷新日志操作,重新开始新的binlog日志记录文件。此时mysql-bin.000002这个文件不会再有后续写入了,因为便于分析原因及查找jiaowu节点,以后所有数据库操作都会写入到下一个日志文件。

mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 880 |
| mysql-bin.000002 | 1199 |
+------------------+-----------+
2 rows in set (0.00 sec) mysql> flush logs;
Query OK, 0 rows affected (0.01 sec) mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 107 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

(6) 读取binlog 日志文件,并分析日志

方 法 一 :使用mysqlbinlog 读取binlog 日志:

[root@localhost var]# cd /usr/local/mysql/var/
[root@localhost var]# mysqlbinlog mysql-bin.000002

方 法 二 :登录MySQL服务器,并查看(推荐此方法)

mysql> show binlog events in 'mysql-bin.000002';
+------------------+------+-------------+-----------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+------+-------------+-----------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| mysql-bin.000002 | 4 | Format_desc | 1 | 107 | Server ver: 5.5.42-log, Binlog ver: 4 |
| mysql-bin.000002 | 107 | Query | 1 | 177 | BEGIN |
| mysql-bin.000002 | 177 | Intvar | 1 | 205 | INSERT_ID=3 |
| mysql-bin.000002 | 205 | Query | 1 | 437 | use `jiaowu`; insert into jiaowu.member(`name`,`sex`,`age`,`classid`) values('wangwu','w',20,'class3'),('zhaoliu','m',22,'class4'),('hongqi','w',21,'cls5'),('bajie','m',20,'class6') |
| mysql-bin.000002 | 437 | Xid | 1 | 464 | COMMIT /* xid=101 */ |
| mysql-bin.000002 | 464 | Query | 1 | 534 | BEGIN |
| mysql-bin.000002 | 534 | Query | 1 | 661 | use `jiaowu`; update jiaowu.member set classid='class5' where name ='hongqi' |
| mysql-bin.000002 | 661 | Xid | 1 | 688 | COMMIT /* xid=103 */ |
| mysql-bin.000002 | 688 | Query | 1 | 758 | BEGIN |
| mysql-bin.000002 | 758 | Query | 1 | 874 | use `jiaowu`; update jiaowu.member set name='李四' where id='2' |
| mysql-bin.000002 | 874 | Xid | 1 | 901 | COMMIT /* xid=104 */ |
| mysql-bin.000002 | 901 | Query | 1 | 971 | BEGIN |
| mysql-bin.000002 | 971 | Query | 1 | 1086 | use `jiaowu`; update jiaowu.member set name='洪七'where id='5' |
| mysql-bin.000002 | 1086 | Xid | 1 | 1113 | COMMIT /* xid=105 */ |
| mysql-bin.000002 | 1113 | Query | 1 | 1199 | drop database jiaowu |
| mysql-bin.000002 | 1199 | Rotate | 1 | 1242 | mysql-bin.000003;pos=4 |
+------------------+------+-------------+-----------+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
16 rows in set (0.00 sec)

或者:

mysql> show binlog events in 'mysql-bin.000002'\G;
*************************** 1. row ***************************
Log_name: mysql-bin.000002
Pos: 4
Event_type: Format_desc
Server_id: 1
End_log_pos: 107
Info: Server ver: 5.5.42-log, Binlog ver: 4
*************************** 2. row ***************************
Log_name: mysql-bin.000002
Pos: 107
Event_type: Query
Server_id: 1
End_log_pos: 177
Info: BEGIN
*************************** 3. row ***************************
Log_name: mysql-bin.000002
Pos: 177
Event_type: Intvar
Server_id: 1
End_log_pos: 205
Info: INSERT_ID=3
*************************** 4. row ***************************
Log_name: mysql-bin.000002
Pos: 205
Event_type: Query
Server_id: 1
End_log_pos: 437
Info: use `jiaowu`; insert into jiaowu.member(`name`,`sex`,`age`,`classid`) values('wangwu','w',20,'class3'),('zhaoliu','m',22,'class4'),('hongqi','w',21,'cls5'),('bajie','m',20,'class6')
*************************** 5. row ***************************
Log_name: mysql-bin.000002
Pos: 437
Event_type: Xid
Server_id: 1
End_log_pos: 464
Info: COMMIT /* xid=101 */
*************************** 6. row ***************************
Log_name: mysql-bin.000002
Pos: 464
Event_type: Query
Server_id: 1
End_log_pos: 534
Info: BEGIN
*************************** 7. row ***************************
Log_name: mysql-bin.000002
Pos: 534
Event_type: Query
Server_id: 1
End_log_pos: 661
Info: use `jiaowu`; update jiaowu.member set classid='class5' where name ='hongqi'
*************************** 8. row ***************************
Log_name: mysql-bin.000002
Pos: 661
Event_type: Xid
Server_id: 1
End_log_pos: 688
Info: COMMIT /* xid=103 */
*************************** 9. row ***************************
Log_name: mysql-bin.000002
Pos: 688
Event_type: Query
Server_id: 1
End_log_pos: 758
Info: BEGIN
*************************** 10. row ***************************
Log_name: mysql-bin.000002
Pos: 758
Event_type: Query
Server_id: 1
End_log_pos: 874
Info: use `jiaowu`; update jiaowu.member set name='李四' where id='2'
*************************** 11. row ***************************
Log_name: mysql-bin.000002
Pos: 874
Event_type: Xid
Server_id: 1
End_log_pos: 901
Info: COMMIT /* xid=104 */
*************************** 12. row ***************************
Log_name: mysql-bin.000002
Pos: 901
Event_type: Query
Server_id: 1
End_log_pos: 971
Info: BEGIN
*************************** 13. row ***************************
Log_name: mysql-bin.000002
Pos: 971
Event_type: Query
Server_id: 1
End_log_pos: 1086
Info: use `jiaowu`; update jiaowu.member set name='洪七'where id='5'
*************************** 14. row ***************************
Log_name: mysql-bin.000002
Pos: 1086
Event_type: Xid
Server_id: 1
End_log_pos: 1113
Info: COMMIT /* xid=105 */
*************************** 15. row ***************************
Log_name: mysql-bin.000002
Pos: 1113
Event_type: Query
Server_id: 1
End_log_pos: 1199
Info: drop database jiaowu
*************************** 16. row ***************************
Log_name: mysql-bin.000002
Pos: 1199
Event_type: Rotate
Server_id: 1
End_log_pos: 1242
Info: mysql-bin.000003;pos=4
16 rows in set (0.00 sec)

通过查看,造成数据库删除的pos点是介于1113--1199(这是按照日志区间的pos节点算的),只要恢复到1113之前的位置即可、

(7)先把凌晨1点的完全备份数据恢复至数据库jiaowu

[root@localhost var]# cd /opt/backup/
[root@localhost backup]# ls
jiaowu_2019-09-10.sql.gz mysql-bin.000002
[root@localhost backup]# gzip -d jiaowu_2019-09-10.sql.gz
[root@localhost backup]# mysql -u root -p -v <jiaowu_2019-09-10.sql
Enter password:
--------------
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */
-------------- --------------
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */
-------------- --------------
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */
-------------- --------------
/*!40101 SET NAMES utf8 */
-------------- --------------
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */
-------------- --------------
/*!40103 SET TIME_ZONE='+00:00' */
-------------- --------------
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */
-------------- --------------
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */
-------------- --------------
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */
-------------- --------------
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */
-------------- --------------
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `jiaowu` /*!40100 DEFAULT CHARACTER SET utf8 */
-------------- --------------
DROP TABLE IF EXISTS `member`
-------------- --------------
/*!40101 SET @saved_cs_client = @@character_set_client */
-------------- --------------
/*!40101 SET character_set_client = utf8 */
-------------- --------------
CREATE TABLE `member` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(16) NOT NULL,
`sex` enum('m','w') NOT NULL DEFAULT 'm',
`age` tinyint(3) unsigned NOT NULL,
`classid` char(6) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
-------------- --------------
/*!40101 SET character_set_client = @saved_cs_client */
-------------- --------------
LOCK TABLES `member` WRITE
-------------- --------------
/*!40000 ALTER TABLE `member` DISABLE KEYS */
-------------- --------------
INSERT INTO `member` VALUES (1,'zhangsan','m',27,'class1'),(2,'lisi','w',28,'class2')
-------------- --------------
/*!40000 ALTER TABLE `member` ENABLE KEYS */
-------------- --------------
UNLOCK TABLES
-------------- --------------
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */
-------------- --------------
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */
-------------- --------------
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */
-------------- --------------
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */
-------------- --------------
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */
-------------- --------------
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */
-------------- --------------
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */
-------------- --------------
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */
--------------

这样就恢复了截止到凌晨1点的备份:

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| jiaowu |
| mysql |
| performance_schema |
| test |
| ultrax |
+--------------------+
6 rows in set (0.00 sec) mysql> use jiaowu;
Database changed
mysql> select * from member;
+----+----------+-----+-----+---------+
| id | name | sex | age | classid |
+----+----------+-----+-----+---------+
| 1 | zhangsan | m | 27 | class1 |
| 2 | lisi | w | 28 | class2 |
+----+----------+-----+-----+---------+
2 rows in set (0.00 sec)

凌晨1点之后的数据还没有恢复回来,这个如何操作? 根据上述提到的,我们可以利用mysql-bin.000002日志进行恢复操作。

(8) 从binlog 日志恢复数据

恢复命令的语法格式:
mysqlbinlog mysql-bin.0000xx | mysql -u用户名 -p密码 数据库名

----------------------------------------------------------------------------------------------------------------
常用参数选项解释:
--start-position=875 起始pos点
--stop-position=954 结束pos点
--start-datetime="2019-9-10 22:01:08"   起始时间点
--stop-datetime="2019-9-10 22:09:46"   结束时间点
--database=jiaowu 指定只恢复 jiaowu 数据库(一台主机上往往有多个数据库,只限本地log日志)
---------------------------------------------------------------------------------------------------------------- 
不常用选项: 
-u --user=name 连接到远程主机的用户名
-p --password[=name] 连接到远程主机的密码
-h --host=name 从远程主机上获取binlog日志
--read-from-remote-server 从某个MySQL服务器上读取binlog日志

A 、 完全恢复(需要手动vim编辑mysql-bin.000002,将那条drop语句剔除掉)

[root@localhost backup]# cp /usr/local/mysql/var/mysql-bin.000002  /opt/backup
[root@localhost backup]# mysqlbinlog /opt/backup/mysql-bin.000002 > /opt/backup/000002.sql
[root@localhost backup]# vim /opt/backup/000002.sql #删除里面的drop语句
[root@localhost backup]# mysql -uroot -p -v < /opt/backup/000002.sql

B、指定pos结束点恢复(部分恢复)

当前表数据:

mysql> select * from jiaowu.member;
+----+----------+-----+-----+---------+
| id | name | sex | age | classid |
+----+----------+-----+-----+---------+
| 1 | zhangsan | m | 27 | class1 |
| 2 | lisi | w | 28 | class2 |
+----+----------+-----+-----+---------+
2 rows in set (0.00 sec)

b1.恢复介于‘member表原始数据’  到 增加‘wangwu’ ,'zhaoliu','hongqi','bajie' 之间的数据;

[root@localhost ~]# /usr/local/mysql/bin/mysqlbinlog --stop-position=464 --database=jiaowu  /usr/local/mysql/var/mysql-bin.000002 | /usr/local/mysql/bin//mysql -uroot -p123456 -v jiaowu
--------------
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/
-------------- --------------
/*!40019 SET @@session.max_insert_delayed_threads=0*/
-------------- --------------
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/
-------------- --------------
BINLOG '
VmB3XQ8BAAAAZwAAAGsAAAAAAAQANS41LjQyLWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAEzgNAAgAEgAEBAQEEgAAVAAEGggAAAAICAgCAA==
'
-------------- --------------
SET TIMESTAMP=1568104614
-------------- --------------
SET @@session.pseudo_thread_id=3
-------------- --------------
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1
-------------- --------------
SET @@session.sql_mode=1075838976
-------------- --------------
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1
-------------- --------------
/*!*/
-------------- --------------
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33
-------------- --------------
SET @@session.lc_time_names=0
-------------- --------------
SET @@session.collation_database=DEFAULT
-------------- --------------
BEGIN
-------------- --------------
SET INSERT_ID=3
-------------- --------------
SET TIMESTAMP=1568104614
-------------- --------------
insert into jiaowu.member(`name`,`sex`,`age`,`classid`) values('wangwu','w',20,'class3'),('zhaoliu','m',22,'class4'),('hongqi','w',21,'cls5'),('bajie','m',20,'class6')
-------------- --------------
COMMIT
-------------- --------------
ROLLBACK
-------------- --------------
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/
-------------- --------------
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/
--------------

再次查看数据库:

mysql> select * from jiaowu.member;
+----+----------+-----+-----+---------+
| id | name | sex | age | classid |
+----+----------+-----+-----+---------+
| 1 | zhangsan | m | 27 | class1 |
| 2 | lisi | w | 28 | class2 |
| 3 | wangwu | w | 20 | class3 |
| 4 | zhaoliu | m | 22 | class4 |
| 5 | hongqi | w | 21 | cls5 |
| 6 | bajie | m | 20 | class6 |
+----+----------+-----+-----+---------+
6 rows in set (0.00 sec)

数据已全部恢复。

b2. 恢复截止到更改hongqi 的classid =class5 的数据;按照事务区间算开始区间是464 结束区间是688)

[root@localhost ~]# /usr/local/mysql/bin/mysqlbinlog --start-position=464 --stop-position=688 --database=jiaowu  /usr/local/mysql/var/mysql-bin.000002 | /usr/local/mysql/bin//mysql -uroot -p123456 -v jiaowu

b3. 单独恢复到name='李四' 这步操作,可这样:

[root@localhost ~]# /usr/local/mysql/bin/mysqlbinlog --start-position=688 --stop-position=901 --database=jiaowu  /usr/local/mysql/var/mysql-bin.000002 | /usr/local/mysql/bin//mysql -uroot -p123456 -v jiaowu

b4.单独恢复到name= '洪七‘  这步操作,可这样:

[root@localhost ~]# /usr/local/mysql/bin/mysqlbinlog --start-position=901 --stop-position=1113 --database=jiaowu  /usr/local/mysql/var/mysql-bin.000002 | /usr/local/mysql/bin//mysql -uroot -p123456 -v jiaowu

查看数据库:

mysql> select * from jiaowu.member;
+----+----------+-----+-----+---------+
| id | name | sex | age | classid |
+----+----------+-----+-----+---------+
| 1 | zhangsan | m | 27 | class1 |
| 2 | 李四 | w | 28 | class2 |
| 3 | wangwu | w | 20 | class3 |
| 4 | zhaoliu | m | 22 | class4 |
| 5 | 洪七 | w | 21 | class5 |
| 6 | bajie | m | 20 | class6 |
+----+----------+-----+-----+---------+
6 rows in set (0.00 sec)

这样,就恢复了删除前的状态了!

MySQL二进制binlog日志说明以及利用binlog日志恢复数据的更多相关文章

  1. Mysql之binlog日志说明及利用binlog日志恢复数据操作记录

    众所周知,binlog日志对于mysql数据库来说是十分重要的.在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷! 一 ...

  2. 【转】Mysql之binlog日志说明及利用binlog日志恢复数据操作记录

    众所周知,binlog日志对于mysql数据库来说是十分重要的.在数据丢失的紧急情况下,我们往往会想到用binlog日志功能进行数据恢复(定时全备份+binlog日志恢复增量数据部分),化险为夷! 废 ...

  3. Mysql ibdata 丢失或损坏如何通过frm&ibd 恢复数据

    mysql存储在磁盘中,各种天灾人祸都会导致数据丢失.大公司的时候我们常常需要做好数据冷热备,对于小公司来说要做好所有数据备份需要支出大量的成本,很多公司也是不现实的.万一还没有做好备份,数据被误删除 ...

  4. MySQL表结构为InnoDB类型从ibd文件恢复数据

    客户的机器系统异常关机,重启后mysql数据库不能正常启动,重装系统后发现数据库文件损坏,悲催的是客户数据库没有进行及时备份,只能想办法从数据库文件当中恢复,查找资料,试验各种方法,确认下面步骤可行: ...

  5. 误删mysql表物理文件的解决方法(不涉及恢复数据)

    该方法只介绍了如何救回这个表名(数据不恢复) 如果想要恢复原来数据 直接用extundelete把文件恢复后放回去即可 并且是适用于平时没有全备的情况下  如果有全备 直接那全备的frm和idb文件放 ...

  6. 亲測Mysql表结构为InnoDB类型从ibd文件恢复数据

    客户的机器系统异常关机,重新启动后mysql数据库不能正常启动,重装系统后发现数据库文件损坏,悲催的是客户数据库没有进行及时备份,仅仅能想办法从数据库文件其中恢复,查找资料,试验各种方法,确认以下步骤 ...

  7. Mysql利用binlog日志恢复数据操作(转)

    a.开启binlog日志:1)编辑打开mysql配置文件/etc/mys.cnf[root@vm-002 ~]# vim /etc/my.cnf在[mysqld] 区块添加 log-bin=mysql ...

  8. mysql利用binlog进行数据恢复

    目录 mysql利用binlog进行数据恢复 binlog基本配置和格式 binlog基本配置 查看binlog状态 binlog的三种格式 转换成sql mysql自带的mysqlbinlog 利用 ...

  9. mysql数据库通过二进制 -【恢复数据记录】

    1.修改配置文件 vi /etc/my.cnf log-bin = binlog systemctl restart mysqld mysql -uroot -p123456 mysql> sh ...

随机推荐

  1. Maven获取resources的文件路径、读取resources的文件

    路径问题一切要看编译后的文件路径 比如,源文件路径是: 而编译后的文件路径为: 也就是说,resources文件夹下的文件在编译后,都是为根目录,这种情况下,比如我要读取resources 文件夹下的 ...

  2. Linux vi 命令 – 文本编辑器

    vi命令是linux系统字符界面下的最常用的文本编辑器. vi编辑器是所有linux的标准编辑器,用于编辑任何ASCⅡ文本,对于编辑源程序尤其有用.iv编辑器功能非常强大,可以对文本进行创建,查找,替 ...

  3. ubuntu关机和重启

    本博客旨在自我学习使用,如有任何疑问请及时联系博主 linux下常用的关机命令有:shutdown.halt.poweroff.init:重启命令有:reboot.下面本文就主要介绍一些常用的关机命令 ...

  4. Solution -「AGC 013E」「AT 2371」Placing Squares

    \(\mathcal{Description}\)   Link.   给定一个长度为 \(n\) 的木板,木板上有 \(m\) 个标记点,第 \(i\) 个标记点距离木板左端点的距离为 \(x_i\ ...

  5. MySQL数据备份/导出 创建用户及其删除

    Mysql DCL 创建用户 create user '用户名'@'localhost(本机访问)/%(通配符任何ip地址都可访问本机) 分配权限 grant 权限 on 数据库.表名 to '用户名 ...

  6. 【高频Java面试题】简单说说JVM堆的内存结构和GC回收流程

    目录 前言 JVM堆内存结构简述 JVM堆内存结构图 堆初体验 结构详情 新生代 老年代 永久代/元空间 GC回收流程 GC回收流程图 GC回收详细流程 查看JDK自带可视化堆空间图 总结 前言 我们 ...

  7. Spark学习记录

    SpringStrongGuo Hadoop与Spark Hadoop主要解决,海量数据的存储和海量数据的分析计算. Spark主要解决海量数据的分析计算. Spark运行模式 1)Local:运行在 ...

  8. python的字符串切片技术

    听说过python的字符串切片技术吗?是不是听着超高级的?实际上,也不用想得太难,python的字符串切片技术就是将字符串的某些字符提取出来而已~ 字符串切片 字符串是一种序列类型,可以按序号访问其中 ...

  9. 【C# 线程】 volatile 关键字和Volatile类、Thread.VolatileRead|Thread.VolatileWrite 详细 完整

    overview 同步基元分为用户模式和内核模式 用户模式:Iterlocked.Exchange(互锁).SpinLocked(自旋锁).易变构造(volatile关键字.volatile类.Thr ...

  10. 二叉树的N中遍历方式和拓展应用

    (一)创建二叉树,如下图所示,一个标准的二叉树是所有位于根节点的左侧的子节点都是比根节点小的,右侧则都是大于根节点的. public class BinaryNode { public int val ...