Mysql二進制日誌(binlog)恢復數據

開啓binlog

show binary logs 檢查bin log是否開啓,Mac OS系統安裝完Mysql沒有my.cnf配置文件,須要本身新建,個人Mysql配置文件放在/etc/my.cnf,將binlog開啓,默認若是不給值的話,log-bin 的會以mysqld-bin 爲索引,建立mysqld-bin.00001等;重啓mysql。mysql

定時備份與還原

通常咱們會對mysql數據庫作定時備份,可是不可以知足咱們的需求,由於可能會丟失數據,若是咱們在天天的早上4點進行定時數據備份,在當天晚上9點,數據庫掛了,此時數據庫只能備份到當天4點以前的全部數據,4點-9點的數據沒辦法經過這種方式恢復,丟失了,這確定是不能容忍的,經過二進制日誌文件能夠知足咱們的需求,只要不是服務器、硬盤問題,都能經過這種方式,進行數據恢復。咱們先來看下對數據庫的徹底備份。git

mysqldump -uroot -ppassword test > /Users/ksmaster/GitHub/mysql_backup/test_DB0722-10:16.sql

本地生成test_DB0722-10:16.sql文件以後,假如數據庫數據被人爲無心損壞或是數據表或庫被誤刪,咱們都可以經過生成的sql文件進行數據恢復,恢復當天4點以前的數據狀態。假如此處是把整個庫誤刪了,恢復以下:github

mysql -uroot -ppassword test < /Users/ksmaster/GitHub/mysql_backup/test_DB0722-10:16.sql

利用二進制日誌(binlog)還原

我預先建立了一個新的數據庫test,表user,以後查看二進制日誌文件,由於個人是本地數據庫,二進制日誌存放在/usr/local/mysql/data/目錄下,如mysql-bin.000001
image
我這裏有兩個二進制文件,mysql-bin.000001和mysql-bin.000002,若是你沒有執行過flush logs或者沒有重啓mysql,通常來講只有一個mysql-bin.000001,咱們先查看下mysql-bin.000001sql

sudo mysqlbinlog --no-defaults mysql-bin.000001

截圖以下:image
能夠看到有建立數據庫、建表、插入數據等sql語句,還有at 417等,咱們插入一些髒數據或者是錯誤數據,甚至是把數據庫刪除均可以,以後咱們如何利用二進制文件進行數據恢復呢?數據庫

mysqlbinlog --no-defaults --stop-position="3263" mysql-bin.000001 > /Users/ksmaster/GitHub/mysql_backup/test_backup0722-11:30.sql

咱們將mysql-bin.000001的sql語句導出到本地,這裏咱們只導出位於3263以前的語句,由於以後的數據是錯誤的咱們不想要;而後進行恢復,咱們先來看下處處到本地的sql語句是怎樣的:image
這裏貼代碼的話,無用的代碼太多,只截取部分看看是什麼樣子的,其實就是執行過的sql語句,若是咱們把數據誤刪了,咱們能夠利用導出的sql語句進行數據恢復:服務器

mysql -uroot -ppassword < /Users/ksmaster/GitHub/mysql_backup/test_backup0722-11\:30.sql

經過這種方式咱們能夠比較靈活的恢復本身想要的數據,而且沒有丟失數據,只要二進制文件在硬盤沒有損壞,都能恢復咱們想要的數據。spa

總結

若是容許數據丟失,能夠直接使用mysqldump直接恢復,不然能夠經過二進制文件進行恢復。在這裏忽然想到我去年還在實習的時候,當時項目剛開始,主力成員加上我和技術經理就三我的,有次我打開了mysql workbench,有多是我不當心碰到鍵盤了仍是別人搞得,整個數據庫表全沒了...慶幸的是還好是開發環境,不是生產環境..究竟是不是我搞的我到如今也不知道是否是我搞得,而後另外一個同事就着急了,工做這麼忙項目一個月以後上線,建表造數據這又得浪費一些時間,攤誰身上誰都不樂意,因而他去找另外一個同事,看能不能恢復,最後也沒搞定。如今看來其實也很是簡單了,找到開發服務器上的二進制日誌文件就能恢復了,最後他又一個一個表開始建的,誰叫我當初又蠢又笨...日誌

相關文章
相關標籤/搜索