資料庫對企業來說最重要的莫過於其中的資料,所以做好資料庫的備份是一個不可或缺的工作。資料庫及時備份可以幫助我們在資料庫出現異常當機時及時的使用備份資料進行恢復工作,將因為資料庫當機產生的影響降低到最小。所以,本篇文章主要資料庫資料備份與恢復進行介紹。由於MyISAM儲存引擎中備份資料是將表儲存到單獨的檔案所以比較簡單,所以這裡我主要針對InnoDB儲存引擎介紹備份與恢復機制。
全量備份與增量備份的區別
全量備份:
每次備份都進行全量備份,所以如果資料量大的情況下,進行全量備份會消耗較多的時間且對資料庫壓力比較大,但是由於全量備份每次都是最新的備份,所以恢復資料的時候效率更快。
增量備份:
只備份每天增量的日誌,所以備份時效率更高對資料庫壓力也較小,但是恢復回覆資料時就需要從全量備份日誌加上每天的增量日誌去進行恢復資料,所以恢復資料效率比較低。
Mysql資料備份大致分為2類:物理備份與邏輯備份。本篇文章我們先看看物理備份。
物理備份
物理備份分為熱備份和冷備份。
冷備份
冷備份是最簡單的備份方式,其實就是在備份資料時停掉Mysql服務,然後將data目錄下的資料檔案拷貝到備份地址進行儲存。當Mysql出現當機時,將備份檔案拷貝到data目錄替換即可完成資料恢復。但是一般情況下不使用冷備份的方式,因為生產環境下一般都有業務在跑,所以不可能每次備份都停止Mysql服務去進行備份工作。
熱備份
快照備份
物理備份一般還有一種方式就是熱備份,熱備份相比於冷備份的好處在哪呢?熱備份可以在Mysql服務開啟的情況下執行備份操作,只是在熱備份時會新增只讀這型別的限制。熱備份第一種介紹的備份方式就是快照備份。快照備份其實就是將所有的資料檔案放置在同一個分割槽,然後對這個分割槽進行快照備份,但是快照備份只能儲存在本地磁碟,如果本地磁碟出現故障,則可能出現快照備份資料的丟失。正是由於可能存在磁碟損壞導致資料丟失的情況下,所以生產環境下一般也不會使用熱備份去備份資料。
xtrabackup備份
熱備份另一種方式就是xtrabackup工具備份。xtrabackup工具2.3版本以下無法備份MyISAM儲存引擎,它可以備份5.1到5.7之間版本的InnoDB儲存引擎的資料。xtrabackup工具是基於InnoDB儲存引擎的crash-recovery功能,先複製物理檔案,再根據log進行恢復,保證資料一致性。接下來我們可以一起看看xtrabackup工具如何進行備份工作。
- 使用wget下載xtrabackup工具並使用yum命令安裝:
- 使用xtrabackup備份,命令為:
- xtrabackup --backup --user=root --password='123' --target-dir=/backups/**
可以看到,全量備份完成會顯示當前備份的lsn號,下次進行增量備份就只會備份lsn大於此頁的資料。我們可以檢視下我們剛才全量備份的資料:
可以發現目錄剛好和我們的資料庫一一對應,每個資料夾中實際上就是對應資料庫的備份資料。我們可以注意到根目錄下還有幾個檔案,接下來我們來看下這幾個檔案的具體用途:
- ibdata1:共享表空間檔案,建立資料庫時如果開啟innodbfileper_table引數,才可以使用xtrabackup工具備份單個資料庫,否則預設都是全部資料庫都進行備份。
- backup-my.cnf:此檔案儲存一些my.cnf的有關於備份的配置資訊。
- xtrabackupbinloginfo:這個檔案是用來記錄備份開始時二進位制檔案的位置。
- xtrabackup_checkpoints:這個檔案記錄備份的一些基本資訊:比如備份開始和結束的lsn號,是全量備份還是增量備份等資訊。
- xtrabackup_info:這個檔案記錄備份的概要資訊。
- xtrabackup_logfile:備份的日誌。
- 將經過backup的資料進行prepare得到完整可用的資料,使用命令:
- xtrabackup --prepare --use-memory=100M --target-dir=/backups
這裡對命令幾個引數做下解釋:--use-memory:該引數不帶則預設prepare操作佔用100M記憶體,如果資料量大我們可以將use-memory指定更大的記憶體加快prepare工作。
--target-dir:備份檔案所在路徑,我是放在/backups/。
- 恢復資料,恢復資料必須保證mysql中data目錄不能存在任何資料,否則會報錯。恢復資料實際上就是將備份資料拷貝到Mysql的data目錄下,恢復資料使用--copy-back引數。使用命令:
- xtrabackup --copy-back --datadir=/var/lib/mysql --target-dir=/backups/
這裡對命令幾個引數做下解釋:
--datadir:--datadir有兩個方法進行配置:可以在my.cnf檔案中指定,如果my.cnf檔案沒有指定該引數則恢復檔案時必須指定--datadir引數。--target-dir:備份檔案所在路徑,我是放在/backups/。
接下來演示下如何進行資料恢復:停止資料庫服務並且清掉data目錄下所有資料:systemctl stop mysqld.service && rm -rf /var/lib/mysql/*
恢復資料:
- xtrabackup --copy-back --datadir=/var/lib/mysql --target-dir=/backups/
最後,重啟資料庫:
- systemctl start mysqld.service
到這裡備份資料就成功進行恢復到資料庫中了。當然更常用的備份方式其實是邏輯備份,使用Mysql自帶mysqldump工具進行備份操作,關於邏輯備份的知識將在下一篇進行講解。
歡迎關注公眾號:程式猿周先森。
歡迎關注公眾號:程式猿周先森。文章原創於微信公眾號,本平臺不定時更新。