1. 程式人生 > >使用 mysql binlog 恢復資料

使用 mysql binlog 恢復資料

【mysqlbinlog】
從binlog裡面摘出需要恢復執行的SQL
mysqlbinlog   --start-position="$startpos"  --stop-datetime="$stoptime"    --database="$db"    "$binlog_xxxxxx"   >   recover.sql
/$homedir/bin/mysql  --defaults-extra-file=/$homedir/etc/user.root.cnf   <  recover.sql           // 或者 source  /$path/recover.sql                      
【例子1,按position匯出】mysqlbinlog --start-position=xxx --stop-position=xxx  mysql-bin.000xxx > all.sql
【例子2,按position,只匯出某個庫的SQL】mysqlbinlog --start-position=xxx  --stop-position=xxx  --database=dbname     mysql-bin.000xxx  > dbname.sql
【例子3,同樣可以處理relay-log】mysqlbinlog --start-position=253 --stop-position=6731   relay-log.000146 > sql
【手動主從切換,需要補資料的時候】
當主庫異常,從庫沒有都停在同一個點上,如果主庫還可以連上繼續同步(從庫還能繼續拉binlog),那麼就等待從庫同步完成,再主從切換
當主庫異常,從庫沒有都停在同一個點上,如果從庫已經不能繼續直接通過主從同步拉binlog,但是主庫機器沒死,可以手動去主庫機器上把binlog找出來恢復(根據從庫slave staus點和主庫master status點的差異,或者說根據從庫slave staus點和主庫最後一條binlog的position點的差異)
當主庫異常,從庫沒有都停在同一個點上,如果從庫已經不能繼續直接通過主從同步拉binlog,並且主庫機器死了,那麼可以選擇已經同步完成,並且拉取的binlog最多那個從庫作為新主庫,
先切中間層入口,讓其提供寫服務,然後把其它從庫“向新主看齊”(通過其它從庫relay-log最後一條SQL,找到新主relay-log中相應位置position_A,然後把position_A往後的所有relay-log抓出來
 去從庫上進行恢復,注意每個從庫與新主庫之間的relay-log可能都是不一樣的,要分別抓取不同的relay-log段)
【例子4,按 時間 匯出】
可以在mysqlbinlog語句中通過--start-date和--stop-date選項指定DATETIME格式的起止時間
./mysqlbinlog --stop-date="2009-04-10 17:41:28"    /$path/mysql-bin.000002 > xxx.sql
【例子5,如果按時間匯出的時候跨越多個binlog,中間用空格隔開,打上完全路徑】
./mysqlbinlog --start-date="2009-04-10 17:30:05" --stop-date="2009-04-10 17:41:28" /$path/mysql-bin.000002  /$path/mysql-bin.0000023>  xxx.sql
【ROW模式下從binlog裡面擷取SQL並重新執行的方法---基本和STATEMENT模式一樣】
 mysqlbinlog   -vv   mysql-bin.000xxx|less       // 檢視ROW格式binlog的時候加上 -vv ,可以把SQL語句部分資訊打印出來,方便辨認,方便找到 start-position 和 stop-position
 mysqlbinlog  --start-position=xxx      --stop-position=xxx     mysql-bin.000xxx > recover.sql       //和STATEMENT模式一樣
 mysql.local   <   recover.sql     //和STATEMENT模式一樣
【其它,檢視row格式的binlog的相關語句】
mysqlbinlog --base64-output="decode-rows" –vv mysqlbinlog    |less 
1、show binlog/relaylog  events in mysql-bin.xxxxxx   from posxxx   limit xxx;
2、mysqlbinlog --base64-output="decode-rows" --verbose -v   --datebase -D --start-position --start-datetime