abstract:1、開(kāi)啟mysql的二進(jìn)制日志 在mysql的配置文件my.ini中添加: log-bin=mysql-bin(這個(gè)名稱可以隨便取,英文,不知道中文可不可以,沒(méi)試過(guò))2、重啟mysql 重啟后,假如在mysql的存儲(chǔ)數(shù)據(jù)的目錄中出現(xiàn)一下文件,則已經(jīng)二進(jìn)制日志已經(jīng)開(kāi)啟 mysql-bin.000001是mysql的二進(jìn)制日志文件,不可以直接查看,可以通過(guò)導(dǎo)出數(shù)據(jù)查看,導(dǎo)出數(shù)據(jù)的語(yǔ)句為 解釋
1、開(kāi)啟mysql的二進(jìn)制日志
在mysql的配置文件my.ini中添加:
log-bin=mysql-bin(這個(gè)名稱可以隨便取,英文,不知道中文可不可以,沒(méi)試過(guò))
2、重啟mysql
重啟后,假如在mysql的存儲(chǔ)數(shù)據(jù)的目錄中出現(xiàn)一下文件,則已經(jīng)二進(jìn)制日志已經(jīng)開(kāi)啟
mysql-bin.000001是mysql的二進(jìn)制日志文件,不可以直接查看,可以通過(guò)導(dǎo)出數(shù)據(jù)查看,導(dǎo)出數(shù)據(jù)的語(yǔ)句為
解釋一下:紅色下劃線的是mysql二進(jìn)制mysql-bin.000001文件所在的目錄,要進(jìn)入這里執(zhí)行后面的語(yǔ)句,這是我的情況
mysqlbinlog的語(yǔ)法:
mysqlbinlog 二進(jìn)制日志文件 > 目標(biāo)文件
要導(dǎo)出到哪里自己決定,但一定先要有這個(gè)目錄,導(dǎo)出的文件則mysql會(huì)自動(dòng)生成,所以不必新建
3、查看二進(jìn)制日志狀態(tài)
show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 349 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
4、測(cè)試兩個(gè)例子
第一個(gè):
create table bin_test( id int, name char(32) )engine myisam charset utf8; drop table bin_test;
注意,下面的語(yǔ)句前面已經(jīng)說(shuō)過(guò),必須開(kāi)啟另一個(gè)cmd,然后進(jìn)入mysql-bin.000001的二進(jìn)制文件的目錄中執(zhí)行
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語(yǔ)句的位置,mysql二進(jìn)制恢復(fù)數(shù)據(jù)的原理就是讓mysql重新執(zhí)行二進(jìn)制里面的sql語(yǔ)句,我們執(zhí)行限制它的執(zhí)行位置,讓它在哪個(gè)位置停止不往下執(zhí)行
第二個(gè)例子:
因?yàn)閯偛诺腷in_test已經(jīng)恢復(fù),所以向它插入數(shù)據(jù)
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)
查看二進(jìn)制日志
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
另一個(gè)cmd窗口執(zhí)行下面的語(yǔ)句
上面的at 1521的對(duì)應(yīng)點(diǎn):
不過(guò)這個(gè)時(shí)候恢復(fù)數(shù)據(jù)報(bào)錯(cuò),那是因?yàn)槲覀冊(cè)倩謴?fù)數(shù)據(jù)的時(shí)候給了一個(gè)終點(diǎn),沒(méi)有給起點(diǎn),所以mysql會(huì)從開(kāi)始一直回復(fù)到終點(diǎn)的地方,而二進(jìn)制文件中已經(jīng)存在
這個(gè)可以對(duì)比上面二進(jìn)制文件的內(nèi)容
而此刻mysql數(shù)據(jù)庫(kù)中已經(jīng)存在bin_test數(shù)據(jù)表了,這個(gè)是我們前面恢復(fù)的,所以sql會(huì)報(bào)這個(gè)錯(cuò)誤:
針對(duì)這個(gè)問(wèn)題,我們可以給它設(shè)置一個(gè)恢復(fù)數(shù)據(jù)的啟點(diǎn)來(lái)解決:
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>
這里的起點(diǎn)位置就是第一次開(kāi)始插入sql語(yǔ)句的位置,可以對(duì)比前面的二進(jìn)制日志的時(shí)間點(diǎn),這里就不再截圖,這里沒(méi)有報(bào)錯(cuò)表示已經(jīng)成功了