---------------------------- xtrabackup ------------------------------------
安裝8.0版本的xtrabackup
yum install -y libe
下載:https://www.percona.com/downloads/
wget https://downloads.percona.com/downloads/Percona-XtraBackup-LATEST/Percona-XtraBackup-8.0.26-18/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.26-18.1.el7.x86_64.rpm
yum localinstall percona-xtrabackup-80-8.0.26-18.1.el7.x86_64.rpm
注意這里的版本需要和MySQL數據庫的版本一致
xtrabackup -version
創建數據庫用戶並分配權限
Linux層面:
對於要備份的datadir,即數據目錄,需要rw權限;對於存放備份的目錄,即xtrabackup的輸出目錄,需要rwx
數據庫層面:
1.RELOAD,LOCK TABLES,這些權限用於實現備份鎖,例如執行flush tables with read lock和flush engine logs
2.BACKUP_ADMIN,此權限用於查詢performance_schema.log_status,和執行lock instance for backup,lock binlog for backup,lock tables for backup,針對MySQL8.0
3.replication client,用於查看binlog位點,擁有該權限可以執行show master status,show slave status,show binary logs
4.create tablespace,此權限用於導入表,在恢復單表或表級恢復時需要用到
5.process,用於執行show engine innodb status和show processlist
6.super,此權限用於控制復制線程
7.create,用於創建percona_schema.xtrabackup_history
8.insert,用於插入percona_schema.xtrabackup_history
9.select,用於在使用–incremental-history-name或–incremental-history-uuid時在PERCONA_SCHEMA.xtrabackup_history查詢innodb_to_lsn的值
例如:
CREATE USER 'backup'@'localhost' IDENTIFIED BY '備份用戶密碼';
GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'backup'@'localhost';
GRANT SELECT ON performance_schema.log_status TO 'backup'@'localhost';
FLUSH PRIVILEGES;
備份數據
xtrabackup -u'用戶名' -p'用戶密碼' --backup --target-dir=備份目錄_`date +%Y%m%d` #按日期分割
恢復數據
xtrabackup --prepare --target-dir=備份目錄_20211010
清空mysql的data目錄
xtrabackup --copy-back --target-dir=備份目錄_20211010
關於“預備”(Prepare)操作
使用 XtraBackup 產生的備份數據由於數據文件復制的時間點不同,數據會不一致而無法使用。直接恢復的話 InnoDB 會將這些數據文件視為損壞,將拒絕啟動。
所以,在恢復之前需要對數據進行“預備”(Prepare)操作(--prepare),使數據文件完全一致,然后才能用於數據恢復及在 InnoDB 中運行。
在預備操作時發生了什么?
在預備時,XtraBackup 將啟動內嵌的修改版 InnoDB 引擎,以處理復制的備份文件,使數據文件保持一致。
配置文件問題
在備份過程中,會在備份目錄生成 backup-my.cnf 文件,保存 InnoDB 配置信息。在預備操作時,需要該配置文件,會被自動加載。錯誤的配置文件會導致錯誤的恢復。
增量備份恢復問題
如果有增量備份,在恢復之前也需要通過prepare將增量備份的數據合並到全量備份數據中,然后再把合並后完整的數據進行恢復
增量備份
在已做全量備份的基礎上可以做增量備份,增量備份有兩種模式,一個是每次都在上一次增量備份的基礎上做增量備份,另一種是每次都在上一次全量備份的基礎上做增量備份
對應的恢復模式也有兩種,第一種需要恢復全量備份后,再依次把每個增量備份都恢復一次,另一種只需要恢復全量備份后,直接恢復最后一次增量備份就可以了
兩種方式的運作流程沒有本質區別,只是通過獲取incremental-basedir指定的目錄下的xtrabackup_checkpoints文件的結束點來獲知增量備份的起點而已
先做全量備份
xtrabackup -u'用戶名' -p'用戶密碼' --backup --target-dir=/backup/mysql/20211010/base
再做增量備份
方式1:
xtrabackup -u'用戶名' -p'用戶密碼' --backup --target-dir=/backup/mysql/20211010/incr1 --incremental-basedir=/backup/mysql/20211010/base/
xtrabackup -u'用戶名' -p'用戶密碼' --backup --target-dir=/backup/mysql/20211010/incr2 --incremental-basedir= /backup/mysql/20211010/incr1/
然后查看cat /backup/mysql/20211010/incr1/xtrabackup_checkpoints文件,就可以看到備份的起始點和結束點,后面的增量備份的起始點和結束點都需要銜接的上
方式2:
xtrabackup -u'用戶名' -p'用戶密碼' --backup --target-dir=/backup/mysql/20211010/incr1 --incremental-basedir=/backup/mysql/20211010/base/
xtrabackup -u'用戶名' -p'用戶密碼' --backup --target-dir=/backup/mysql/20211010/incr2 --incremental-basedir= /backup/mysql/20211010/base/
增量恢復
增量備份和全量備份的--prepare執行的方式是不一樣的。在全量備份中,可以通過兩種操作保持數據庫的一致性:已提交的事務將根據數據文件和日志文件進行重放操作,並回滾未提交的事務。
在准備增量備份時,必須跳過未提交事務的回滾,因為在備份的過程中,可能存在進行中且未提交的事務,並且這些事務很可能在下一次的增量備份中才進行提交,所以必須使用--apply-log-only選項來防止回滾操作。
方式1:
xtrabackup --prepare --apply-log-only --target-dir=/backup/mysql/20211010/base
xtrabackup --prepare --apply-log-only --target-dir=/backup/mysql/20211010/base --incremental-dir=/backup/mysql/20211010/incr1
xtrabackup --prepare --target-dir=/backup/mysql/20211010/base --incremental-dir=/backup/mysql/20211010/incr2
清空mysql的data目錄
xtrabackup --copy-back --target-dir=/backup/mysql/20211010/base
chown -R mysql:mysql 數據庫data目錄 #恢復數據庫data目錄權限,比如我們的數據庫data目錄在/data/mysql/data,那么就是 chown -R mysql:mysql /data/mysql/data
方式2:
xtrabackup --prepare --apply-log-only --target-dir=/backup/mysql/20211010/base
xtrabackup --prepare --target-dir=/backup/mysql/20211010/base --incremental-dir=/backup/mysql/20211010/incr2
清空mysql的data目錄
xtrabackup --copy-back --target-dir=/backup/mysql/20211010/base
chown -R mysql:mysql 數據庫data目錄 #恢復數據庫data目錄權限
注意:
--apply-log-only 命令應該用在所有增量備份,但最后一次增量備份除外 ,這就是為什么恢復腳本中,最后一次的命令不包含--apply-log-only。
即使--apply-log-only在最后一次增量備份時被使用,備份仍將是一致的,但在這種情況下,數據庫會執行回滾的操作。
參考:https://blog.csdn.net/ActionTech/article/details/101695649
多線程備份
xtrabackup -u'用戶名' -p'用戶密碼' --backup --parallel=4 --target-dir=/backup/mysql/20211010 #4線程備份
壓縮備份(壓縮解壓需要qpress,下載地址:https://pkgs.org/download/qpress)
yum localinstall https://repo.percona.com/yum/release/7/RPMS/x86_64/qpress-11-1.el7.x86_64.rpm #centos7直接安裝,其他版本請對應下載
xtrabackup -u'用戶名' -p'用戶密碼' --backup --compress --target-dir=/backup/mysql/20211010/compress
多線程壓縮
xtrabackup -u'用戶名' -p'用戶密碼' --backup --parallel=4 --compress --compress-threads=4 --target-dir=/backup/mysql/20211010/compress #4線程備份,4線程壓縮
解壓備份
xtrabackup --parallel=4 --decompress --target-dir=/backup/mysql/20211010/compress #4線程解壓
查看目錄文件,會發現壓縮文件和解壓文件共存,如果不想保留原壓縮文件,可以使用 --remove-original 命令
實例:
mkdir -p /backup/mysql/`date +%Y%m%d`/ && xtrabackup -u'backup' -p'xxxxxxx' --backup --parallel=4 --compress --compress-threads=4 --target-dir=/backup/mysql/`date +%Y%m%d`/base
xtrabackup -u'backup' -p'xxxxxxx' --backup --parallel=4 --compress --compress-threads=4 --target-dir=/backup/mysql/`date +%Y%m%d`/incr1 --incremental-basedir=/backup/mysql/`date +%Y%m%d`/base/
其他使用方法,如流式備份,備份加密,指定數據庫和表備份等,參考:http://blog.itpub.net/29812844/viewspace-2658452/
備份腳本
全量備份每周一次
#!/bin/bash
user=backup
passwd='備份用戶密碼'
backup_dir=`date +"%Y%W"` # 定義備份目錄
fullback=/backup/mysql/full/$backup_dir # 定義全量備份目錄
[ -d $fullback ] && exit # 如果當天已備份則退出
[ ! -d $fullback ] && mkdir $fullback -p # 創建目錄
xtrabackup --user=$user --password=$passwd --backup --parallel=4 --compress --compress-threads=4 --target-dir=$fullback &> /backup/mysql/backup.log
egrep ".* Backup created in directory.*" /backup/mysql/backup.log >> /backup/mysql/backup.info # 過濾出當前創建的目錄路徑
find /backup/mysql/full/ -ctime +14 -type d -exec rm -rf {} \; # 刪除超過14天的備份數據信息
增量備份每天一次
#!/bin/bash
user=backup
passwd='備份用戶密碼'
base_dir=$(tail -1 /backup/mysql/backup.info | cut -d\' -f2) # 提取最后一次備份的路徑
if [ $? -ne 0 ] || [ $base_dir = '' ]; then
exit # 如果之前沒有備份,則退出增量備份
fi
incrbackup_dir=/backup/mysql/incr/`date +"%Y%W/%m%d"`
[ -d $incrbackup_dir ] && exit # 如果當天已備份則退出
[ ! -d $incrbackup_dir ] && mkdir $incrbackup_dir -p
xtrabackup --user=$user --password=$passwd --backup --parallel=4 --compress --compress-threads=4 --target-dir=$incrbackup_dir --incremental-basedir=$base_dir &> /backup/mysql/backup.log
egrep ".* Backup created in directory.*" /backup/mysql/backup.log >> /backup/mysql/backup.info # 過濾出當前創建的目錄路徑
find /backup/mysql/incr/ -ctime +14 -type d -exec rm -rf {} \; # 刪除14天以前的數據
crontab -e
0 4 * * 0 /backup/fullbackup.sh # 每周第0天的凌晨4點進行全量備份
0 4 * * 1-6 /backup/incrbackup.sh # 每周第1-6天的凌晨4點進行增量備份
---------------------------- mysqldump ------------------------------------
導出數據
mysqldump --master-data=2 --single-transaction --no-create-db --set-gtid-purged=OFF --column-statistics=0 數據庫名 -u"用戶名" -p"用戶密碼" -h 數據庫地址 > 數據庫名.`date +%Y%m%d%H`.sql
--master-data 指定為2,會在備份文件中生成CHANGE MASTER的注釋,以便記錄binlog的狀態信息,包括MASTER_LOG_FILE和MASTER_LOG_POS,生成如下:
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=100;
如果設置為1,則生成的是CHANGE MASTER的命令,而不是注釋。
--single-transaction 獲取InnoDB表的一致性備份
--column-statistics=0 如是使用8.0版本的mysqldump導出低版本的數據庫,需要加上這個設置,因為低版本mysql的information_schema中沒有column-statistics數據表
如果導出指定表
mysqldump 數據庫名 數據表1 數據表2 數據表3 ......
如果導出需要排除指定表
mysqldump 數據庫名 --ignore-table=數據表1 --ignore-table=數據表2
導入數據
mysql -u"用戶名" -p"用戶密碼" -h 數據庫地址 數據庫名 < 數據庫.sql
mysqldump的執行過程和原理:https://www.modb.pro/db/28325
主要參數說明:
-A,--all-databases:該選項表示備份實例中的所有數據庫
-B,--databases:指定要備份的數據庫名稱,后面可以同時跟多個數據庫
-E,--events:表示備份過程中包括數據庫中的事件
-F,--flush-logs:表示備份完成之后刷新日志,滾動日志點,如果沒有開啟二進制日志,使用該選項會提示錯誤
--flush-privileges:表示備份最新的權限表數據
--hex-blob:表示備份過程中包括數據庫中的二進制數據(BINARY,VARBINARY,BLOG)
-x,--lock-all-tables:該選項的作用是在備份過程中鎖定所有的表,通常用於備份MyISAM存儲引擎類型的表數據
--single-transaction:該選項表示備份過程中保證數據的一致性,使用事務隔離狀態和一致性快照保證,目前只支持InnoDB類型的表
注:--lock-all-tables選項和--single-transaction選項同時只能用一個
--master-data=N:該選項用來設置在導出的數據中是否包括對二進制日志文件和日志點的記錄,常用的值有:1和2
1:表示在導出的sql文件中包括了"change master to master_log_file='',master_log_pos=N"內容,用來做快速主從復制
2:表示在導出的sql文件中不包括"change master to master_log_file='',master_log_pos=N"內容
-t,--no-create-info:表示只備份數據,不備份表的創建信息
-d,--no-data:表示只備份表結構,不備份任何數據
-R,--routines:表示備份中同時備份存儲過程和函數
--tables:如果不需要備份整個庫,只需要備份部分表,可以使用該選項指定
--triggers:表示備份中同時備份觸發器
-u:指定完成備份操作的用戶名
-p:指定完成備份操作的用戶密碼
-h:指定完成備份操作的域名或者ip地址
-P:指定完成備份操作的端口號。注意,是大寫的P