天天看點

mysql的資料備份和還原 - 如何使用mysqldump和mysqlbinlog

       最近在學習mysql,在做相關練習中遇到了一些問題,以下是本人對所遇到的問題提出的解決辦法,曬出來希望能對大家有所幫助,有不足之處望各位老鐵給予斧正~

        資料的備份和還原可以借助mysqldump語句和mysqlbinlog語句,以下主要對這兩種方法進行哔哔

mysql的資料備份和還原 - 如何使用mysqldump和mysqlbinlog

~

        我的開發環境:mysql5.7.17

mysqldump:

    mysqldump是mysql用于轉存儲資料庫的實用語句塊,可在指定位置生成.sql檔案,sql檔案裡面存放了資料庫中各Table的建立語句和插值語句等等,當然有些.sql檔案裡的語句并不是那麼直覺,比如通過mysqlbinlog生成的.sql檔案,後面會進行講解~

mysqldump 備份指定資料庫:

      mysqldump -u root -pdatabase_name  > E:/filename.sql

        database_name 是你想備份的資料庫名稱,filename是你儲存的.sql檔案的檔案名(盡量不使用中文,此時選擇的是E盤的根目錄)

    例如:将資料庫testdb備份到 E:/backup.sql

mysql的資料備份和還原 - 如何使用mysqldump和mysqlbinlog

  咦?為什麼報錯?

 原因是  mysqldump 語句是這樣用滴:

 exit 出 mysql 在cmd下直接鍵入mysqldump -u root -p testdb > E:/backup.sql語句,切記,此時末尾不加分号!回車後輸入 root  密碼(也就是進入mysql的密碼),若不提示錯誤,便說明備份完成!

mysql的資料備份和還原 - 如何使用mysqldump和mysqlbinlog

   下面我們來看看備份的sql檔案内容是什麼樣子的:我是用Notepad打開的,sql檔案也可以用記事本打開的~

mysql的資料備份和還原 - 如何使用mysqldump和mysqlbinlog

      當我們再調用該sql檔案時,mysql便可借助其中的資料庫資訊将資料庫還原進mysql,用法如下:

      mysql  -u root -p database_name  < E:/filename.sql

     同樣注意的是該語句在cmd下鍵入,而非mysql服務中!還有一點是此時的database_name是mysql中已存在的資料庫,即該語句不能生成新的資料庫!不妨試上一試,我先drop掉資料庫testdb:

mysql的資料備份和還原 - 如何使用mysqldump和mysqlbinlog

   不負衆望,它報錯了~哈哈! 錯誤是testdb資料庫未知,因為之前我們已近drop掉它了!

   下面我将目标資料庫改為mysql(mysql服務自帶的資料庫),嘿嘿,順利通過~ 

   之後可以在資料庫mysql中輸入:show tables;便會發現名為chinesetest的表~select * from chinesetest;便會發現表裡的資訊和之前testdb中的一木一樣!神奇的mysql~

mysql的資料備份和還原 - 如何使用mysqldump和mysqlbinlog

常用的mysqldump語句還有:

 mysqldump -u root -pdatabase_name table1 table2 ...  > E:/filename.sql

  這是選擇性的備份database_name資料庫中的 table1,table2表...

 mysqldump -u root -p --all-databases >E:/filename.sql

  這是備份所有database,此處要注意文法,--all-databases 為英文輸入,“-” 不要忘記加

  網上還有好多關于mysqldump的大神部落格,老鐵們想深入學習可以去看看哈,有好的文章老鐵們可以留言給我啊,共同學習共同進步,

mysql的資料備份和還原 - 如何使用mysqldump和mysqlbinlog

~

mysqlbinlog:

    binlog是二進制日志,簡單的了解就是将資料庫中的資料以二進制的形式記錄下來,預設形式是hostname.00000x(x=1,2,3...)。此外,mysqlbinlog生成的備份檔案是動态備份!mysqlbinlog生成備份檔案後,我們再對database進行更改,但是此次更改操作由于發生在mysqldump後不會被記錄在.sql檔案中,這樣就很尴尬了。。。但是,binlog日志會将我們對資料的所有操作都記錄下來,它就像是一個工作在背景的螢幕,以一定的時間間隔檢視我們在此段時間内執行的操作,并将之記錄下來~

   其實吧,重點是如何開啟log_bin,這是最傷的,哎~~

如何開啟log_bin?  請見文章: 如何開啟log_bin?

利用mysqlbinlog還原資料庫:

  在确定log_bin打開後,在mysql下輸入  show master status;便可檢視目前logbin檔案的位置戳:

mysql的資料備份和還原 - 如何使用mysqldump和mysqlbinlog

  wangbo-bin.000006為logbin的檔案,wangbo也就是hostname,position值為716,也就是目前操作完成時位置戳指向716

  那麼如何借助position來還原操作呢?

  假設我們現在向 testdb 資料庫下的表chinesetset中插入資料段('遊戲','男','2017-4-3'),然後再删除這一段資料,再借助mysqlbinlog恢複到删除之前的狀态~

  插入資料段:

mysql的資料備份和還原 - 如何使用mysqldump和mysqlbinlog

   可見插入新的資料段在位置戳2285到2564之間,現在我們删掉('遊戲','男','2017-4-3') :

mysql的資料備份和還原 - 如何使用mysqldump和mysqlbinlog

  用mysqlbinlog恢複到删除資料段之前:

   mysqlbinlog   --start-position = P1  --stop-position=P2  E:/hostname.00000x >E:/filename.sql

     mysql -u root -pdatabase_name <E:/filename.sql

  P1,P2為E:/hostname.00000x中位置戳的開始點和結束點,該語句就是将P1到P2之間的操作轉存為 E:/filename.sql ,注意此時要指明logbin的檔案路徑。實踐走一波:

mysql的資料備份和還原 - 如何使用mysqldump和mysqlbinlog

  最後要說的是,mysqlbinlog還有有很多用法,比如 :利用時間戳,利用xid等,敬請期待~

繼續閱讀