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語句的位置,可以對比前面的二進制日志的時間點,這里就不再截圖,這里沒有報錯表示已經成功了