Mysql備份與恢復(2)---邏輯備份

數據庫及時備份能夠幫助咱們在數據庫出現異常宕機時及時的使用備份數據進行恢復工做,將由於數據庫宕機產生的影響下降到最小。上一篇針對使用xtrabackup工具進行物理備份和數據恢復作了一個詳細講解,本篇主要談談如何使用mysql自帶的備份工具mysqldump進行邏輯備份和數據恢復。若是還圍觀看過上一篇文章的能夠先行查詢上一篇文章關於使用xtrabackup進行數據備份與恢復:Mysql備份與恢復(1)---物理備份。mysql

前言
上一篇可能存在一個問題,最後一步恢復數據到/var/lib/mysql目錄成功,可是最後重啓數據庫啓動不起來,數據庫日誌通常存放路徑爲:/var/log/mysqld.log,通過定位日誌能夠查看到錯誤日誌緣由:sql

  • 2019-10-14T07:43:22.351861Z 0 [ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable數據庫

  • 2019-10-14T07:43:22.351885Z 0 [ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable微信

  • 2019-10-14T07:43:22.351892Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error函數

  • 2019-10-14T07:43:22.952508Z 0 [ERROR] Plugin 'InnoDB' init function returned error.工具

  • 2019-10-14T07:43:22.952596Z 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.ui

  • 2019-10-14T07:43:22.952606Z 0 [ERROR] Failed to initialize builtin plugins.編碼

  • 2019-10-14T07:43:22.952613Z 0 [ERROR] Aborting日誌

很明顯是由於共享表文件ibdata1不可寫,因此解決方案很簡單:將/var/lib/mysql下的文件權限改爲可寫,使用命令:server

  • chmod -R 777 /var/lib/mysql

而後重啓mysql服務,能夠發現mysql服務已經成功啓動,並且備份數據也成功進行恢復了。
file

物理備份和邏輯備份的區別

邏輯備份

優勢:

  • 備份成sql文件,恢復數據很簡單。

  • 邏輯備份與存儲引擎無關,因此能夠通用備份。

  • 有助於避免數據損壞。

缺點:

  • 數據恢復速度較慢。

  • 須要數據庫服務正常時安排cpu去進行還原操做。

物理備份

優勢:

  • 容易跨平臺,基於文件的物理備份。

  • 恢復數據很快,實際上就是將備份文件拷貝回原路徑。

缺點:

  • 數據量大的話文件大。

  • 備份文件存儲在磁盤本地,若是磁盤出問題容易形成備份文件丟失。

mysqldump邏輯備份

mysqldump是mysql自帶的一個簡單的備份工具,因爲操做簡單並且對不一樣的存儲引擎通用,因此比較受歡迎。邏輯備份其實是將數據庫的數據被分紅一個sql文件,而後恢復數據時只須要用圖形化工具導入這個sql文件或者dos下使用source命令引入就可恢復數據。首先咱們先看下mysqldump的基本語法:

  • mysqldump -uroot -proot -h127.0.0.1 -P3306 test test> test.sql

命令還有幾個可傳參數:

  • --all-databases:備份所有數據庫。

  • -t:不導出建立表的語句。

  • -d:不導出數據。

  • -R:導出存儲過程和函數。

  • --default-character-set:指定編碼

  • --result-file:指定導出文件路徑及文件名。

  • --skip-triggers:不導出觸發器。

1. 備份前踩坑

若是系統中存在兩個mysql版本,執行mysqldump命令就會報錯,報錯信息以下:

  • mysqldump: Couldn't execute 'SET OPTION SQL_QUOTE_SHOW_CREATE=1': You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'OPTION SQL_QUOTE_SHOW_CREATE=1' at line 1 (1064)

首先使用mysqldump --version命令查看mysqldump當前版本,看是否和mysql版本一致:

  • mysqldump Ver 10.13 Distrib 5.5.29, for Win64 (x86)

再使用rpm -qa | grep -i mysql命令查看mysql版本

  • mysql-community-libs-5.7.27-1.el7.x86_64
  • mysql-community-server-5.7.27-1.el7.x86_64
  • mysql57-community-release-el7-8.noarch
  • mysql-community-common-5.7.27-1.el7.x86_64
  • mysql-community-libs-compat-5.7.27-1.el7.x86_64
  • perl-DBD-MySQL-4.023-6.el7.x86_64
  • mysql-community-client-5.7.27-1.el7.x86_64

能夠看到mysql版本與mysqldump版本不一致形成的報錯緣由,使用whereis mysqld查看mysql安裝路徑:

  • /usr/local/mysql/bin/mysqld

而後將同處於bin目錄下的mysqldump拷貝到/usr/bin/目錄下覆蓋舊版本的mysqldump便可解決版本不一致的問題:

  • cp /usr/local/mysql/bin/mysqldump /usr/bin/mysqldump

2. 數據備份

剛纔說過了命令,咱們使用mysqldump是能夠進行多種不一樣方案的備份的。接下來咱們簡單看幾種備案方案:

(1) 全庫備份:使用全庫備份會將全部數據庫中的數據所有備份到同一個sql文件中。

  • mysqldump -uroot -proot -h49.235.28.88 -P3306 --all-databases> /usr/local/all.sql

(2) 備份單個數據庫:將lxy數據庫中的數據備份到sql文件lxy.sql中。

  • mysqldump -uroot -proot -h49.235.28.88 -P3306 lxy> /usr/local/lxy.sql

(3) 備份lxy數據庫中的users表到user_test.sql文件。

  • mysqldump -uroot -proot -h49.235.28.88 -P3306 lxy users> /usr/local/user_test.sql

(4) 只備份lxy數據庫的表結構,不備份數據到lxy1.sql文件中。

  • mysqldump -uroot -proot -h49.235.28.88 -P3306 lxy -d> /usr/local/lxy1.sql

(5) 備份lxy數據庫的表結構和存儲過程,不備份數據到lxy2.sql中。

  • mysqldump -uroot -proot -h49.235.28.88 -P3306 lxy -d -R> /usr/local/lxy2.sql

(6) 不備份表結構,只備份數據到lxy3.sql。

  • mysqldump -uroot -proot -h49.235.28.88 -P3306 lxy -t> /usr/local/lxy3.sql

數據恢復

表級恢復

(1) 登陸mysql,選擇對應的數據庫,而後設置編碼。

(2) 使用source命令導入備份數據。

  • source /usr/local/all.sql

單庫恢復

(1) 登陸Mysql,刪除要恢復的舊數據庫。

(2) 使用source命令導入備份數據。

全庫恢復

(1) 退出mysql,使用mysql命令恢復數據。

  • mysql < /usr/local/all.sql -p

而後在控制檯輸入密碼,密碼不會顯示別覺得沒有輸入成功。

mysqldump全量備份 + mysqlbinlog增量備份

剛纔已經將mysql全量備份及數據恢復的方式講完了,能夠發現mysqldump的使用方式很簡單,可是使用mysqldump進行數據備份會存在一個問題:恢復數據時會丟失掉從備份點開始的更新數據,因此咱們須要結合mysqlbinlog進行二進制日誌增量備份,首先修改/etc/my.cnf文件,在[mysqld]下啓用二進制日誌:

  • log_bin=mysql-bin

開啓二進制日誌,數據庫的任何更新操做都會記錄到二進制日誌中。接下來看下mysqldump全量備份 + mysqlbinlog增量備份如何進行操做:

首先進行全量備份,添加--flush-logs參數生成新的二進制日誌文件:

  • mysqldump --single-transaction --flush-logs --master-data=2 > /usr/local/all1.sql

因此說實際上備份有兩個文件:mysqldump全量備份生成的/usr/local/all1.sql以及二進制日誌文件/var/lib/mysql/mysql-bin.000003文件。因此恢復數據時,咱們須要分紅兩部分去進行恢復數據:

先恢復全量備份的數據:

  • mysql < /usr/local/all1.sql -p

而後輸入密碼確認恢復數據。

而後恢復增量備份:

  • mysqlbinlog /var/lib/mysql/mysql-bin.000003 | mysql -p

這樣就能夠將數據恢復到恢復點時的數據。並且mysqlbinlog能夠經過時間間隔來精確地恢復某個時刻的數據,咱們看看bonlog幾個可傳參數:

  • --start-datetime:從某個時間點開始恢復數據

  • --stop-datetime:恢復截止到某個時間內的數據

  • --start-position:開始恢復數據的位置信息,位置信息能夠從日誌文件的log_pos中獲取。

  • --end-position:截止恢復數據的位置信息,位置信息能夠從日誌文件的log_pos中獲取。

好比咱們須要恢復2019-01-01到2019-09-09的數據,咱們在恢復增量日誌時就能夠這麼書寫mysqlbinlog命令:

  • mysqlbinlog --start-datetime="2019-01-01 00:00:00" --stop-datetime="2019-09-09 23:59:59" /var/lib/mysql/mysql-bin.000003 | mysql -p

歡迎關注公衆號:程序猿周先森。

file

歡迎關注公衆號:程序猿周先森。文章原創於微信公衆號,本平臺不定時更新。

相關文章
相關標籤/搜索