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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM