利用mysql的binlog恢復數據

MySQL Binary Log也就是常說的bin-log, ,是mysql執行改動產生的二進制日誌文件,其主要做用有兩個:
* 數據回覆
* 主從數據庫。用於slave端執行增刪改,保持與master同步。

1.開啓binary log功能

     須要修改mysql的配置文件,本篇的實驗環境是win7,配置文件爲mysql安裝目錄\MySQL Server 5.1下的my.ini,添加一句log_bin = mysql_bin便可
     eg:
     [mysqld]
             ......
             log_bin = mysql_bin
             ......
       log_bin是生成的bin-log的文件名,後綴則是6位數字的編碼,從000001開始,按照上面的配置,生成的文件則爲:
             mysql_bin.000001
             mysql_bin.000002
             ......
 
    配置保存之後重啓mysql的服務器,用show variables like  '%bin%'查看bin-log是否開啓,如圖: 


2.查看產生的binary log

   bin-log由於是二進制文件,不能經過記事本等編輯器直接打開查看,mysql提供兩種方式查看方式,在介紹以前,咱們先對數據庫進行一下增刪改的操做,不然log裏邊數據有點空。
   create table bin( id int(10) primary key auto_increment,name varchar(255));(測試前我已經建表)
   insert into bin(name) values ('orange');

     1.在客戶端中使用  show binlog events in 'mysql_bin.000001'  語句進行查看,爲了排序美觀,能夠在結尾加\G使結果橫變縱,此時結尾無需加;語句結束符。
      eg:
mysql> show binlog events in 'mysql_bin.000001'\G
...............省略...............
*************************** 3. row ***************************
   Log_name: mysql_bin.000001
        Pos: 174
Event_type: Intvar
  Server_id: 1
End_log_pos: 202
      Info: INSERT_ID=2
*************************** 4. row ***************************
   Log_name: mysql_bin.000001
        Pos: 202
Event_type: Query
  Server_id: 1
End_log_pos: 304
       Info: use `test`; insert into bin(name) values ('orange')
*************************** 5. row ***************************
...............省略...............
Log_name:此條log存在那個文件中,從上面能夠看出這2條log皆存在與mysql_bin.000001文件中。
Pos:log在bin-log中的開始位置
Event_type:log的類型信息
Server_id:能夠查看配置中的server_id,表示log是那個服務器產生
End_log_pos:log在bin-log中的結束位置
Info:log的一些備註信息,能夠直觀的看出進行了什麼操做

2.用mysql自帶的工具mysqlbinlog,這是咱們就須要知道bin-log存在硬盤的什麼位置,win7默認存在 C:\ProgramData\MySQL\MySQL Server 5.1\data文件夾下面,若是沒有此文件夾,那咱們能夠經過配置文件中的  datadir="C:/ProgramData/MySQL/MySQL Server 5.1/Data/" 定位,若是尚未,那我就會說「各個系統的搜索功能都作的不錯!」。這種查看方式就沒那個美觀了,以下

C:\ProgramData\MySQL\MySQL Server 5.1\data>mysqlbinlog mysql_bin.000001
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#121015 16:35:56 server id 1  end_log_pos 106   Start: binlog v 4, server v 5.1.51-community-log created 121015 16:35:56 at startup
ROLLBACK/*!*/;
BINLOG '
7Mp7UA8BAAAAZgAAAGoAAAAAAAQANS4xLjUxLWNvbW11bml0eS1sb2cAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADsyntQEzgNAAgAEgAEBAQEEgAAUwAEGggAAAAICAgC
'/*!*/;
# at 106
#121015 16:36:51 server id 1  end_log_pos 174   Query   thread_id=2     exec_time=0     error_code=0
SET TIMESTAMP=1350290211/*!*/;
SET @@session.pseudo_thread_id=2/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1344274432/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
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
/*!*/;
# at 174
#121015 16:36:51 server id 1  end_log_pos 202   Intvar
SET INSERT_ID=3/*!*/;
# at 202
#121015 16:36:51 server id 1  end_log_pos 309   Query   thread_id=2     exec_time=0     error_code=0
use test/*!*/;
SET TIMESTAMP=1350290211/*!*/;
insert into bin(name) values('xishizhaohua')
/*!*/;
# at 309
#121015 16:36:51 server id 1  end_log_pos 336   Xid = 28
COMMIT/*!*/;
# at 336
#121015 16:37:25 server id 1  end_log_pos 379   Rotate to mysql_bin.000002  pos: 4
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;

雖然排版有點亂,但從圖中咱們能夠獲得更多信息,如時間戳,自增的偏移,是否自動提交事務等信息。以下圖爲從中提取的一部分。


3.利用bin_log恢復數據

    1.最長用的就是回覆指定數據端的數據了,能夠直接恢復到數據庫中:
    mysqlbinlog  --start-date="2012-10-15 16:30:00" --stop-date="2012-10-15 17:00:00" mysql_bin.000001 |mysql -uroot -p123456
      亦可導出爲sql文件,再導入至數據庫中:
      mysqlbinlog  --start-date="2012-10-15 16:30:00" --stop-date="2012-10-15 17:00:00" mysql_bin.000001 >d:\1.sql
      source d:\1.sql
      2.指定開始\結束位置,從上面的查看產生的binary log咱們能夠知道某個log的開始到結束的位置,咱們能夠在恢復的過程當中指定回覆從A位置到B位置的log.須要用下面兩個參數來指定:
    --start-positon="50" //指定從50位置開始
    --stop-postion="100"//指定到100位置結束

   最後介紹幾個bin_log的操做:
   1.產看最後一個bin日誌文件是那個,如今位置

  2.啓用新的日誌文件,通常備份完數據庫後執行

3.清空現有的所用bin-log

mysql

相關文章
相關標籤/搜索