MySQL備份--xtrabackup與mysqldump工具使用

MySQL備份----xtrabackup與mysqldump工具的使用

1、Xtrabackup8.0:

一個用於MySQL數據庫物理熱備的備份工具,支持MySQL、Percona server和MariaDB,開源免費,是目前較爲受歡迎的主流備份工具。xtrabackup只能備份innoDB和xtraDB兩種數據引擎的表,而不能備份MyISAM數據表。mysql

備份原理:

Percona XtraBackup的工做原理是在啓動時記住日誌序列號(LSN),而後複製數據文件。同時,Percona XtraBackup運行一個後臺檢測進程,該進程監視mysq redo事務日誌文件,並從其中複製更改,記入後臺日誌文件xtrabackup_log中。以後複製innodb的數據文件一系統表空間文件ibdatax,複製結束後,將執行flush tables with readlock,而後複製.frm MYI MYD等文件,最後執行unlock tables,最終中止xtrabackup_logsql

Xtrabackup(centos/redhat)安裝:

方法一(官方推薦):
1.下載相應的rpm安裝包
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-8.0.4/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.4-1.el7.x86_6 4.rpm數據庫

2.安裝已下載的rpm安裝包
yum localinstall percona-xtrabackup-80-8.0.4-1.el7.x86_64.rpmcentos

3.查看是否已安裝成功
rpm -qa | grep -i xtrabackup
相關文件查詢
rpm -ql percona-xtrabackup-80緩存

4.建立備份目錄服務器

5.修改mysql配置文件 開啓bin-log日誌,添加或修改數據庫目錄併發

方法二(官方推薦):app

  1. 安裝Percona yum存儲庫
    yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpmsocket

  2. 安裝Percona XtraBackup
    yum install percona-xtrabackup-80工具

方法三:

  1. 下載二進制包
    wget https://www.percona.com/downloads/Percona-XtraBackup-LATEST/Percona-XtraBackup-8.0-7/binary/tarball/percona-xtrabackup-8.0.7-Linux-x86_64.libgcrypt20.tar.gz

  2. 解壓
    tar zxvf percona-xtrabackup-8.0.7-Linux-x86_64.libgcrypt20.tar.gz mv percona-xtrabackup-8.0.7-Linux-x86_64 xtrabackup cp -r xtrabackup /usr/local/xtrabackup

  3. 添加環境變量
    echo "export PATH=$PATH:/usr/local/xtrabackup/bin" > /etc/profile.d/xtrabackup.sh

  4. 讓環境變量生效
    source /etc/profile.d/xtrabackup.sh

Xtrabackup優勢:

  1. 備份速度快,物理備份可靠
  2. 備份過程不會打斷正在執行的事務(無需鎖表)
  3. 可以基於壓縮等功能節約磁盤空間和流量
  4. 自動備份校驗
  5. 還原速度快(不須要執行任何的mysql語句,不須要構建索引,innoDB表無需徹底緩存到內存)
  6. 能夠流傳將備份傳輸到另一臺機器上
  7. 在不增長服務器負載的狀況備份數據

Xtrabackup缺點:

  1. 文件大
  2. 不老是能夠跨平臺、操做系統和MySQL版本

#####注意新版本8.0: (1)移除了innobackupex命令;
(2)Percona XtraBackup 8.0 支持MySQL8.0的版本;
(3)mysql8.0以前的版本須要使用xtrabackup2.4備份和恢復.

Xtrabackup權限:

Xtrabackup一個以徹底備份所需的最低特權建立數據庫用戶:
mysql> CREATE USER ‘bkpuser'@'localhost' IDENTIFIED BY 's3cr%T';
mysql> GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON . TO 'bkpuser'@'localhost';
mysql> GRANT SELECT ON performance_schema.log_status TO 'bkpuser'@'localhost';
mysql> FLUSH PRIVILEGES;
#####注意: 一旦鏈接到服務器,在服務器執行備份你對datadir須要READ和EXECUTE的文件系統級權限。 若是有多個服務器實例,則必須指定正確的鏈接參數(port, socket, host),以便xtrabackup與正確的服務器通訊。

Xtrabackup全量備份:

xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --user=root --password=xxxyyy --port=3306 --backup --target-dir=/backup/full/

#####選項優化:
--rsync
使用rsync實用程序優化本地文件傳輸。指定此選項後,xtrabackup將使用rsync複製全部非InnoDB文件,而不是爲每一個文件生成單獨的cp,這對於具備大量數據庫或表的服務器而言能夠更快。此選項不能與--stream一塊兒使用。
--use-memory
此選項會影響分配多少內存以使用進行備份
--parallel=#
此選項指定建立備份時用於同時複製多個數據文件的線程數。默認值爲1(即無併發傳輸)。

Xtrabackup全量恢復:

  1. 在恢復備份以前,datadir必須爲空。一樣重要的是,在執行恢復以前,MySQL服務器須要關閉。不能還原到正在運行的mysqld實例的datadir(導入部分備份時除外)。

  2. 準備一個全量備份,主要做用正是經過回滾未提交的事務及同步已經提交的事務至數據文件也使用得數據文件處於一致性狀態。 xtrabackup --defaults-file=/etc/my.cnf --user=root --password=xxxyyy --prepare (--apply-log-only)--target-dir=/backup/full/

  3. 當數據恢復至數據目錄之後,您應該檢查恢復的文件是否具備正確的全部權和權限。因爲文件屬性將被保留,在大多數狀況下,在啓動數據庫服務器以前,您須要將文件的全部權更改成mysql,由於它們將由建立備份的用戶擁有:
    xtrabackup --defaults-file=/etc/my.cnf --user=root --password=xxxyyy --copy-back --target-dir=/backup/full/
    chown -R mysql:mysql /var/lib/mysql

  4. 從新啓動mysql服務

注意:

若是您打算將備份做爲進一步增量備份的基礎,那麼在準備備份時應該使用—apply-log-only選項,不然將沒法對其應用增量備份

Xtrabackup參數介紹:

--defaults-file
指定mysql配置文件:只能從給定的文件中讀取默認選項。 且必須做爲命令行上的第一個選項;必須是一個真實的文件,它不能是一個符號連接。

--target-dir
指定備份數據目錄

--prepare
數據文件在準備好以前不是時間點一致的,由於它們是在程序運行的不一樣時間複製的,而且在此過程當中可能已經被更改,此步驟使文件在同一時刻徹底一致

--backup
作一個備份,放入--target-dir

--copy-back
拷貝先前備份全部文件到它們的原始路徑。但原路徑下不能有任何文件或目錄,除非指定 --force-non-empty-directories 選項。

指定數據庫備份:

xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --user=root --password=xxxyyy --port=3306 --databases=」xxx」 --backup --target-dir=/part/single

指定數據庫恢復:

prepare部分備份的過程相似於導出表的過程,要使用--export選項進行,還原部分備份的過程跟導入表的過程相同。固然,也能夠經過直接複製prepared狀態的備份直接至數據目錄中實現還原,不要此時要求數據目錄處於一致狀態。

  1. xtrabackup --defaults-file=/etc/my.cnf --prepare --export --target-dir=/part/single
  2. 建立好對應的數據庫和表結構
  3. 丟棄表空間
    alter table dbname.tbname discard tablespace
  4. 將導出的表文件複製到目標服務器的對應數據庫目錄的子目錄中
    cp /part/single/dbname/*.ibd /var/bin/mysql/dbname/
  5. 將文件從新受權
    chown -R mysql:mysql /var/lib/mysql
  6. 加載表空間
    alter table dbname.tbname import tablespace;

--export
建立導出表所需的文件

注意:

要將innodb_file_per_table開啓,數據要是innodb存儲引擎,若是是delete數據的話,datadir目錄下仍是會有.ibd、.frm文件,若是是drop的數據,那麼咱們的手動執行要恢復表的建表語句,.cfg文件是用來和數據字典進行匹配的。

Xtrabackup增量備份:

增量備份主要是經過拷貝innodb中有變動的頁(指的是LSN大於xtrabackup_checkpoints中的LSN號)。文件xtrabackup_checkpoints會記錄備份完成時檢查點的LSN,增量備份是基於全備的,第一次增量備份的數據是基於上一次全備,以後的每一次增備都是基於上一次的增備,最終達到一致性的增備,增備的過程當中,和全備很相似,區別在於第二步

第一次增量備份:

xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --port=3306 --user=root --password=123456 --backup --target-dir=/incr/incr1 --incremental-basedir=/data/backup/

第二次增量備份:

xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --port=3306 --user=root --password=123456 --backup --target-dir=/part/incr2 --incremental-basedir=/incr/incr1

注意:

須要注意的是,增量備份僅能應用於InooDB或XtraDB表,對於MyISAM表,增量與全備相同.

Xtrabackup增量恢復:

  1. 準備徹底備份,確保全備數據目錄數據的一致性
    xtrabackup --defaults-file=/etc/my.cnf --prepare --apply-log-only --target-dir=/data/backup

  2. 恢復增量備份到徹底備份(開始恢復的增量備份要添加--apply-log-only參數,到最後一次的增量備份要去掉--apply-log-only),即便--apply-log-only在最後一次的增量備份中使用了,備份仍將保持一致,但在這種狀況下,服務器將執行回滾階段。
    xtrabackup --defaults-file=/etc/my.cnf --prepare --apply-log-only --target-dir=/data/backup/ --incremental-dir=/incr/incr1
    xtrabackup --defaults-file=/etc/my.cnf --prepare --target-dir=/data/backup/ --incremental-dir=/incr/incr2

  3. 最終數據會在/data/backup/上,對應用了增量備份的新備份進行恢復
    xtrabackup --user=root --password=xxxyyy --copy-back --target-dir=/data/backup/
    chown -R mysql:mysql /var/lib/mysql

注意:

--prepare增量備份的步驟與徹底備份的步驟不一樣。在徹底備份中,執行兩種類型的操做以使數據庫保持一致:已提交的事務相對於數據文件從日誌文件中重放,未提交的事務被回滾。在準備增量備份時,必須跳過未提交事務的回滾,由於在備份時未提交的事務可能正在進行中,而且頗有可能將在下一個增量備份中提交。您應該使用該 --apply-log-only選項來防止回滾階段。

Xtrabackup參數介紹:

--apply-log-only
此選項只致使在準備備份時執行重作階段。這對於增量備份很是重要。

--target-dir
備份:增量備份目錄
恢復:在準備增量備份時,這是增量備份與完整備份相結合以建立新的完整備份的目錄。

--incremental-basedir
在建立增量備份時,此目錄包含完整備份,即增量備份的基本數據集。

—apply-log-only
防止事務回滾階段

備份目錄各文件說明:

(1)xtrabackup_checkpoints —— 備份類型(如徹底或增量)、備份狀態(如是否已經爲prepared狀態)和LSN(日誌序列號)範圍信息。
每一個InnoDB頁(一般爲16k大小)都會包含一個日誌序列號,即LSN。LSN是整個數據庫系統的系統版本號,每一個頁面相關的LSN可以代表此頁面最近是如何發生改變的。
(2)xtrabackup_binlog_info —— mysql服務器當前正在使用的二進制日誌文件及至備份這一刻爲止二進制日誌事件的位置。
(3)xtrabackup_info —— 記錄的是你備份的時候的一些參數,腳本版本,數據庫版本,備份時間,binlog,是否壓縮,備份增量仍是全量等信息。
(4)backup-my.cnf —— 包含了my.cnf中備份時須要的信息。
(5)xtrabackup_logfile——記錄了備份過程當中的日誌,在對數據進行prepare時須要經過日誌將數據還原成一致的可用的數據。
(6)其餘一些數據庫文件信息
有時您能夠看到to_lsn (最後一個檢查點LSN)和last_lsn(最後一個複製的LSN)之間存在差別,這意味着在備份過程當中服務器上有一些流量

xtrabackup全備份過程:

  1. 實時備份redo log
  • xtrabackup開啓xtrabackup_log監控線程
  • 記錄開始的LSN,並實時監測redo log文件的變化
  • 將備份過程當中新寫入到事務日誌中的日誌頁拷貝至xtrabackup_logfile文件中;
  1. 拷貝innodb文件
  • 開啓redo log備份後,同時開啓xtrabackup拷貝線程,開始拷貝innodb文件。
  • 拷貝順序:
  • ibdata1, sys_config.ibd, mysql.ibd,以及其餘datadir目錄的ibd文件
  • 數據庫目錄下的ibd,test庫、employees、sakila等
  • undo文件
  1. 複製innodb文件結束後,LOCK TABLES FOR BACKUP
  • 鎖定非innodb表
  1. 拷貝非innodb文件
  • 拷貝mysql、p_s和其餘庫下的.frm,.MRG,.MYD,.MYI,.ARM,.ARZ,.CSM,.CSV,.sdi 和.par等類型的文件。
  1. 獲取LSN和binary log position
  • 此時文件備份結束,須要獲取LSN和binlog位置
  • LOCK BINLOG FOR BACKUP
  • 用於阻止全部可能更改binlog位置的操做
  • 而後完成複製REDO日誌文件並獲取binlog座標
  • 從p_s.log_status中獲取信息
  • binlog記錄到xtrabackup_binlog_info文件中
  • LSN記錄到xtrabackup_checkpoints
  1. FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS
  • 關閉並從新打開,已安裝存儲引擎的任何可刷新日誌,不記錄到binlog。
  • 這會致使InnoDB將其日誌刷新到磁盤。
  1. 中止xtrabackup_log線程
  2. 解鎖tables、binlog
  3. 備份其餘信息
  • Copying ib_buffer_pool
  • Writing backup-my.cnf
  • Writing xtrabackup_info
  1. binlog位置將打印到STDERR,若是一切正常,xtrabackup將退出返回0。

2、mysqldump:

備份原理:

導出SQLy語句文件

mysqldump優勢:

  1. 恢復簡單,可使用管道將他們輸入到mysql
  2. 與存儲引擎無關,由於是從MySQL服務器中提取數據而生成的,因此消除了底層數據存儲的不一樣
  3. 有助於避免數據損壞。若磁盤驅動器有故障而要複製原始文件時,此時將獲得一個損壞的備份

mysqldump缺點:

  1. 必須有數據庫服務器完成邏輯工做,須要更多地cpu週期
  2. 邏輯備份還原速度慢:須要MySQL加載和解釋語句、轉化存儲格式、重建引擎

mysqldump全量備份:

mysqldump命令必須帶上--flush-logs選項以生成新的二進制日誌文件 mysqldump -h127.0.0.1 -P3306 -uroot -p --single-transaction --flush-logs --master-data=2 --all-database > /backup/all.sql ####參數介紹 對於MyISAM將–single-transaction替換爲–lock-all-tables
--flush-logs爲結束當前日誌,生成新日誌文件;
--master-data=2 選項將會在輸出SQL中記錄下徹底備份後新日誌文件的名稱;以及其開始的pos位置
--all-database 全部數據庫
--master-data=[0|1|2]
0 : 不記錄
1 : 記錄爲CHANGE MASTER語句
2 : 記錄爲註釋的CHANGE MASTER語句
--single-transaction 該選項在導出數據以前提交一個BEGIN SQL語句,BEGIN 不會阻塞任何應用程序且能保證導出時數據庫的一致性狀態。它只適用於多版本存儲引擎,僅InnoDB

mysqldump全量恢復:

mysql -h127.0.0.1 -P3306 -uroot -p < /backup/all.sql

mysqldump指定庫備份:

mysqldump -h127.0.0.1 -P3306 -uroot -p --single-transaction --flush-logs --master-data=2 dbname > /backup/part.sql

mysqldump指定庫恢復:

mysql -h127.0.0.1 -P3306 -uroot -pxxxx < /backup/part.sql

mysqldump增量備份:

增量備份的數據是從上次全量備份以後更新的數據,對mysql來講binlog日誌文件存儲着增量備份的數據。binlog是一個二進制格式的文件,用於記錄用戶對數據庫更新的SQL語句信息。

mysqladmin -uroot -pxxxx flush-logs

注意:

執行增量備份的前提條件是MySQL打開binlog日誌功能,在mysql配置文件my.cnf中加入log-bin=mysql-bin

mysqldump增量恢復:
mysqlbinlog mysql-bin.0000xx | mysql -uroot -p

mysqldump數據恢復指定的時間點或位置:
--start-datetime=YYYY-mm-dd HH:MM:SS
--stop-datetime=YYYY-mm-dd HH:MM:SS
上邊一組參數用於指定恢復開始時間點和結束時間點,能夠一塊兒或單獨給出

--start-position=xxxxx
--stop-position=xxxxx
上邊一組參數用於指定恢復開始位置和結束位置,能夠一塊兒或單獨給出

兩組參數也能夠結合使用

3、mysqldump與xtrabackup對比

4、全量備份與恢復性能測試對比:

工具 mysqldump xtrabackup
數據量 1G左右 1G左右
全備時間 平均1m15s 平均20s
恢復全備時間 平均8m 平均18s
佔用空間 617MB 930MB
工具 mysqldump xtrabackup
數據量 5G左右 5G左右
全備時間 平均3m50s 平均1m10s
恢復全備時間 平均45m 平均1m5s
佔用空間 3.3GB 4G

5、備份時期:

一週作一次全量備份,其他時間增量備份或者一個月作一次全量備份,一週一次增量備份,依靠系統定時任務,在業務壓力比較小的時間點凌晨(0--5點),定時執行備份腳本

6、備份文件維護

若全量備份,能夠天爲單位進行刪除 若全量+增量備份,按期刪除(建議週期一個月)已過期備份文件

相關文章
相關標籤/搜索