abstract:1、开启mysql的二进制日志 在mysql的配置文件my.ini中添加: log-bin=mysql-bin(这个名称可以随便取,英文,不知道中文可不可以,没试过)2、重启mysql 重启后,假如在mysql的存储数据的目录中出现一下文件,则已经二进制日志已经开启 mysql-bin.000001是mysql的二进制日志文件,不可以直接查看,可以通过导出数据查看,导出数据的语句为 解释
1、开启mysql的二进制日志
在mysql的配置文件my.ini中添加:
log-bin=mysql-bin(这个名称可以随便取,英文,不知道中文可不可以,没试过)
2、重启mysql
重启后,假如在mysql的存储数据的目录中出现一下文件,则已经二进制日志已经开启
mysql-bin.000001是mysql的二进制日志文件,不可以直接查看,可以通过导出数据查看,导出数据的语句为
解释一下:红色下划线的是mysql二进制mysql-bin.000001文件所在的目录,要进入这里执行后面的语句,这是我的情况
mysqlbinlog的语法:
mysqlbinlog 二进制日志文件 > 目标文件
要导出到哪里自己决定,但一定先要有这个目录,导出的文件则mysql会自动生成,所以不必新建
3、查看二进制日志状态
show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 349 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
4、测试两个例子
第一个:
create table bin_test( id int, name char(32) )engine myisam charset utf8; drop table bin_test;
注意,下面的语句前面已经说过,必须开启另一个cmd,然后进入mysql-bin.000001的二进制文件的目录中执行
E:\itcast\GZClass14\GZBasicClass14\web\mysql\data\data>mysqlbinlog mysql-bin.000001 >D:/binlog/binlog.txt
查看binlog.txt文件
E:\itcast\GZClass14\GZBasicClass14\web\mysql\data\data>mysqlbinlog mysql-bin.000001 --stop_pos=239 | mysql -uroot -p
Enter password: ****
解释一下:--stop_pos=239是上面create语句的位置,mysql二进制恢复数据的原理就是让mysql重新执行二进制里面的sql语句,我们执行限制它的执行位置,让它在哪个位置停止不往下执行
第二个例子:
因为刚才的bin_test已经恢复,所以向它插入数据
mysql> select * from bin_test; Empty set (0.00 sec) mysql> insert into bin_test values(1,'hello'); Query OK, 1 row affected (0.08 sec) mysql> insert into bin_test values(default,'hi'); Query OK, 1 row affected (0.00 sec) mysql> insert into bin_test values(default,'guangzhou'); Query OK, 1 row affected (0.00 sec) mysql> insert into bin_test values(default,'lonely'); Query OK, 1 row affected (0.00 sec)
mysql> select * from bin_test;
+------+-----------+
| id | name |
+------+-----------+
| 1 | hello |
| NULL | hi |
| NULL | guangzhou |
| NULL | lonely |
+------+-----------+
mysql> delete from bin_test; Query OK, 4 rows affected (0.08 sec) mysql> select * from bin_test; Empty set (0.00 sec)
查看二进制日志
create table bin_test(id int,name char(32))engine myisam charset utf8 /*!*/; # at 481 #160917 15:27:45 server id 1 end_log_pos 549 Query thread_id=2 exec_time=0 error_code=0 SET TIMESTAMP=1474097265/*!*/; BEGIN /*!*/; # at 549 #160917 15:27:45 server id 1 end_log_pos 650 Query thread_id=2 exec_time=0 error_code=0 SET TIMESTAMP=1474097265/*!*/; insert into bin_test values(1,'hello') /*!*/; # at 650 #160917 15:27:45 server id 1 end_log_pos 719 Query thread_id=2 exec_time=0 error_code=0 SET TIMESTAMP=1474097265/*!*/; COMMIT /*!*/; # at 719 #160917 15:28:00 server id 1 end_log_pos 787 Query thread_id=2 exec_time=0 error_code=0 SET TIMESTAMP=1474097280/*!*/; BEGIN /*!*/; # at 787 #160917 15:28:00 server id 1 end_log_pos 891 Query thread_id=2 exec_time=0 error_code=0 SET TIMESTAMP=1474097280/*!*/; insert into bin_test values(default,'hi') /*!*/; # at 891 #160917 15:28:00 server id 1 end_log_pos 960 Query thread_id=2 exec_time=0 error_code=0 SET TIMESTAMP=1474097280/*!*/; COMMIT /*!*/; # at 960 #160917 15:28:09 server id 1 end_log_pos 1028 Query thread_id=2 exec_time=0 error_code=0 SET TIMESTAMP=1474097289/*!*/; BEGIN /*!*/; # at 1028 #160917 15:28:09 server id 1 end_log_pos 1139 Query thread_id=2 exec_time=0 error_code=0 SET TIMESTAMP=1474097289/*!*/; insert into bin_test values(default,'guangzhou') /*!*/; # at 1139 #160917 15:28:09 server id 1 end_log_pos 1208 Query thread_id=2 exec_time=0 error_code=0 SET TIMESTAMP=1474097289/*!*/; COMMIT /*!*/; # at 1208 #160917 15:28:17 server id 1 end_log_pos 1276 Query thread_id=2 exec_time=0 error_code=0 SET TIMESTAMP=1474097297/*!*/; BEGIN /*!*/; # at 1276 #160917 15:28:17 server id 1 end_log_pos 1384 Query thread_id=2 exec_time=0 error_code=0 SET TIMESTAMP=1474097297/*!*/; insert into bin_test values(default,'lonely') /*!*/; # at 1384 #160917 15:28:17 server id 1 end_log_pos 1453 Query thread_id=2 exec_time=0 error_code=0 SET TIMESTAMP=1474097297/*!*/; COMMIT /*!*/; # at 1453 #160917 15:29:11 server id 1 end_log_pos 1521 Query thread_id=2 exec_time=0 error_code=0 SET TIMESTAMP=1474097351/*!*/; BEGIN /*!*/; # at 1521 #160917 15:29:11 server id 1 end_log_pos 1604 Query thread_id=2 exec_time=0 error_code=0 SET TIMESTAMP=1474097351/*!*/; delete from bin_test
另一个cmd窗口执行下面的语句
上面的at 1521的对应点:
不过这个时候恢复数据报错,那是因为我们再恢复数据的时候给了一个终点,没有给起点,所以mysql会从开始一直回复到终点的地方,而二进制文件中已经存在
这个可以对比上面二进制文件的内容
而此刻mysql数据库中已经存在bin_test数据表了,这个是我们前面恢复的,所以sql会报这个错误:
针对这个问题,我们可以给它设置一个恢复数据的启点来解决:
E:\itcast\GZClass14\GZBasicClass14\web\mysql\data\data>mysqlbinlog mysql-bin.000001 --start_pos=549 --stop_pos=1521 | mysql -uroot -p
Enter password: ****
E:\itcast\GZClass14\GZBasicClass14\web\mysql\data\data>
这里的起点位置就是第一次开始插入sql语句的位置,可以对比前面的二进制日志的时间点,这里就不再截图,这里没有报错表示已经成功了