使用Docker版Percona Xtrabackup備份恢復(fù)MySQL8.0.x方式
記錄一下常用的Docker版Percona Xtrabackup備份恢復(fù)命令
場景說明
- Linux系統(tǒng)
- Docker環(huán)境
- 要備份的目標(biāo)數(shù)據(jù)庫
MySQL 8.0.x(x的值一般 22 ~ 44) - 使用Percona Xtrabackup的docker鏡像版本是
8.0.35-34.1,該版本可以最高至8.0.44 - 要備份的目標(biāo)數(shù)據(jù)庫和Percona Xtrabackup的容器
在同一個物理服務(wù)器上
為什么要使用docker版本的Xtrabackup ? 注意是考慮Linux版本不一樣對應(yīng)的Xtrabackup程序版本也不一樣,為了操作運維一致性/便捷性因此選用Docker版本的Xtrabackup。
先決條件
需要在目標(biāo)數(shù)據(jù)庫(準(zhǔn)備要被備份的數(shù)據(jù)庫)創(chuàng)建用于備份數(shù)據(jù)讀取的賬號 xtrabackup
CREATE USER 'xtrabackup'@'%' IDENTIFIED WITH mysql_native_password BY 'yourbackpassword'; GRANT SELECT, RELOAD, PROCESS, LOCK TABLES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO `xtrabackup`@`%`; GRANT BACKUP_ADMIN ON *.* TO `xtrabackup`@`%`; FLUSH PRIVILEGES;
一、全量備份與恢復(fù)
只全量備份,適合業(yè)務(wù)量比較小的業(yè)務(wù)場景
1.1 創(chuàng)建一個全量備份并且立刻 prepare
prepare目的是使備份可用于恢復(fù)
docker run --name pxb -u root --rm \
--volumes-from mysql8 \
-v /data/apps/xtrabackup/backup:/backup \
-it --user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
xtrabackup --backup \
--datadir=/var/lib/mysql/ \
--target-dir=/backup/full_backup \
--host=172.17.0.1 \
--port=3309 \
--user=xtrabackup \
--password=yourbackpassword;
xtrabackup --prepare \
--target-dir=/backup/full_backup
"
要點說明:
- –volumes-from mysql8: 將名為 mysql8 的容器的所有卷掛載到當(dāng)前容器中。這意味著 pxb 容器可以訪問 mysql8 容器的數(shù)據(jù)目錄
- -v /data/apps/xtrabackup/backup:/backup: 將宿主機(運行 Docker 的機器)上的 /data/apps/xtrabackup/backup 目錄掛載到容器內(nèi)的 /backup 目錄。這是備份文件將存儲的位置。
- –datadir=/var/lib/mysql/: 指定目標(biāo) MySQL 數(shù)據(jù)目錄在容器內(nèi)的路徑。
- –target-dir=/backup/full_backup: 指定備份文件將存儲在容器內(nèi)的 /backup/full_backup 目錄
- xtrabackup --prepare …: 這是在備份完成后執(zhí)行準(zhǔn)備操作的命令
- –host post user password 是要被備份的目標(biāo)數(shù)據(jù)庫的信息
執(zhí)行完成后在 /data/apps/xtrabackup/backup/full_backup 查詢?nèi)缦聜浞菪畔ⅲ?/p>
drwxr-xr-x 7 root root 4096 12月 1 16:04 ./ drwxr-xr-x 7 root root 4096 12月 1 17:43 ../ drwxr-x--- 2 root root 12288 12月 1 16:04 'api@002drcms@002dfactory@002dprod'/ drwxr-x--- 2 root root 4096 12月 1 16:04 'api@002drcms@002dheadoffice@002dprod'/ -rw-r--r-- 1 root root 448 12月 1 16:04 backup-my.cnf -rw-r--r-- 1 root root 7051 12月 1 16:04 ib_buffer_pool -rw-r--r-- 1 root root 1073741824 12月 1 16:04 ibdata1 drwxr-x--- 2 root root 4096 12月 1 16:04 mysql/ -rw-r--r-- 1 root root 196 12月 1 16:04 mysql-bin.000782 -rw-r--r-- 1 root root 19 12月 1 16:04 mysql-bin.index -rw-r--r-- 1 root root 33554432 12月 1 16:04 mysql.ibd drwxr-x--- 2 root root 4096 12月 1 16:04 performance_schema/ drwxr-x--- 2 root root 4096 12月 1 16:04 sys/ -rw-r--r-- 1 root root 37748736 12月 1 16:04 undo_001 -rw-r--r-- 1 root root 117440512 12月 1 16:04 undo_002 -rw-r--r-- 1 root root 70 12月 1 16:04 xtrabackup_binlog_info -rw-r----- 1 root root 146 12月 1 15:06 xtrabackup_checkpoints -rw-r--r-- 1 root root 654 12月 1 16:04 xtrabackup_info -rw-r--r-- 1 root root 128512 12月 1 16:04 xtrabackup_logfile -rw-r--r-- 1 root root 39 12月 1 16:04 xtrabackup_tablespaces
1.2 使用全量備份恢復(fù)操作
假設(shè)之前你已經(jīng)做完了上面的備份操作,現(xiàn)在開始恢復(fù)操作,就在原來的物理服務(wù)器上!
- 【步驟1】
創(chuàng)建一個新的mysql容器恢復(fù)到一個新創(chuàng)建的目錄下,假設(shè)準(zhǔn)備要做恢復(fù)容器的MySQL目錄地址如下:
/data/apps/xtrabackup/mysqlrecover/conf/my.cnf /data/apps/xtrabackup/mysqlrecover/files /data/apps/xtrabackup/mysqlrecover/data
docker run -u root \ --cap-add=SYS_NICE \ --network=host \ --restart=always \ --name mysqlrecover8 \ -v /data/apps/xtrabackup/mysqlrecover/conf/my.cnf:/etc/mysql/my.cnf \ -v /data/apps/xtrabackup/mysqlrecover/files:/var/lib/mysql-files \ -v /data/apps/xtrabackup/mysqlrecover/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=yourbackpassword \ -d mysql:8.0.22
記得將原來的my.cnf 復(fù)制到 /data/apps/xtrabackup/mysqlrecover/conf/my.cnf 記得端口修改 如果不修改端口則需要確認(rèn)原來MySQL服務(wù)已經(jīng)停止!
這里不建議在原來的目標(biāo)數(shù)據(jù)庫目錄下操作,以便分析數(shù)據(jù)庫損壞的原因。
- 【步驟2】 暫停 mysqlrecover8
docker stop mysqlrecover8
- 【步驟3】 清空 mysqlrecover8 數(shù)據(jù)目錄
docker run \
--volumes-from mysqlrecover8 \
-v /data/apps/xtrabackup/backup:/backup \
-it --rm \
--user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
rm -rf /var/lib/mysql/*
"
這里一定要使用上面的刪除方式,確保容器內(nèi)mysql數(shù)據(jù)目錄是/var/lib/mysql/
- 【步驟4】 Restore backup
docker run \
--volumes-from mysqlrecover8 \
-v /data/apps/xtrabackup/backup:/backup \
-it --rm \
--user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
xtrabackup --copy-back \
--datadir=/var/lib/mysql/ \
--target-dir=/backup/full_backup
"
**要點說明:**切記不要使用copy命令復(fù)制備份文件,一定使用 xtrabackup --copy-back命令。
- 【步驟5】 Change the owner of the files in mysqlrecover8 from root to mysql
docker run \
--volumes-from mysqlrecover8 \
-v /data/apps/xtrabackup/backup:/backup \
-it --rm \
--user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
chown -R mysql:mysql /var/lib/mysql/
"
- 【步驟6】 重新啟動 mysqlrecover8
docker start mysqlrecover8
然后客戶端連接測試一下,到此全量備份和恢復(fù)測試完畢!
二、全量壓縮備份與恢復(fù)
這種方式同前面的操作,只不過暫時不要prepare。
【步驟1】 創(chuàng)建一個全量備份并且壓縮
docker run --name pxb -u root --rm \
--volumes-from mysql8 \
-v /data/apps/xtrabackup/backup:/backup \
-it --user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
xtrabackup --backup --compress --compress-threads=4 \
--datadir=/var/lib/mysql/ \
--target-dir=/backup/full_backup \
--host=172.17.0.1 \
--port=3309 \
--user=xtrabackup \
--password=yourbackpassword
"
【步驟2】 解壓縮全量備份 + 清理壓縮的文件
docker run --name pxb -u root --rm \
-v /data/apps/xtrabackup/backup:/backup \
-it --user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
xtrabackup --parallel=4 --remove-original --decompress \
--target-dir=/backup/full_backup
"
【步驟3】 prepare,使備份可用于恢復(fù)
docker run --name pxb -u root --rm \
-v /data/apps/xtrabackup/backup:/backup \
-it --user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
xtrabackup --prepare \
--target-dir=/backup/full_backup
"
【步驟4】恢復(fù)操作
參考上面 1.2 使用全量備份恢復(fù)操作 章節(jié)
三、增量備份與恢復(fù)
一次全量備份多次增量備份,可以1小時一次增量也可以一天一次備份,每隔7天重新進(jìn)行全量備份。
假設(shè)用于存儲全量和增量的文件目錄如下:
/data/apps/xtrabackup/backup/full_backup /data/apps/xtrabackup/backup/inc1 /data/apps/xtrabackup/backup/inc2 /data/apps/xtrabackup/backup/inc3
- 【步驟1】 創(chuàng)建一個全量備份
docker run --name pxb1 -u root --rm \
--volumes-from mysql8 \
-v /data/apps/xtrabackup/backup:/backup \
-it --user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
xtrabackup --backup \
--datadir=/var/lib/mysql/ \
--target-dir=/backup/full_backup \
--host=172.17.0.1 \
--port=3309 \
--user=xtrabackup \
--password=yourbackpassword
"
**要點說明:**切記不要附帶 xtrabackup --prepare命令,因為后面要基于這個全量備份做增量備份!
- 【步驟2】 創(chuàng)建第一個增量備份
docker run --name pxb2 -u root --rm \
--volumes-from mysql8 \
-v /data/apps/xtrabackup/backup:/backup \
-it --user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
xtrabackup --backup \
--datadir=/var/lib/mysql/ \
--target-dir=/backup/inc1 \
--incremental-basedir=/backup/full_backup \
--host=172.17.0.1 \
--port=3309 \
--user=xtrabackup \
--password=yourbackpassword
"
注意查看 --target-dir 和 --incremental-basedir 參數(shù)!
- 【步驟2】 創(chuàng)建第二個增量備份
docker run --name pxb2 -u root --rm \
--volumes-from mysql8 \
-v /data/apps/xtrabackup/backup:/backup \
-it --user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
xtrabackup --backup \
--datadir=/var/lib/mysql/ \
--target-dir=/backup/inc2 \
--incremental-basedir=/backup/inc1 \
--host=172.17.0.1 \
--port=3309 \
--user=xtrabackup \
--password=yourbackpassword
"
注意查看 --target-dir 和 --incremental-basedir 參數(shù)!
- 【步驟3】 創(chuàng)建第三個增量備份
docker run --name pxb3 -u root --rm \
--volumes-from mysql8 \
-v /data/apps/xtrabackup/backup:/backup \
-it --user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
xtrabackup --backup \
--datadir=/var/lib/mysql/ \
--target-dir=/backup/inc3 \
--incremental-basedir=/backup/inc2 \
--host=172.17.0.1 \
--port=3309 \
--user=xtrabackup \
--password=yourbackpassword
"
注意查看 --target-dir 和 --incremental-basedir 參數(shù)!
- 【步驟4】 prepare全量備份
docker run --name pxb4 -u root --rm \
-v /data/apps/xtrabackup/backup:/backup \
-it --user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
xtrabackup --prepare --apply-log-only \
--target-dir=/backup/full_backup
"
注意查看 --target-dir 和 是否攜帶 --apply-log-only 參數(shù)!
- 【步驟5】 prepare 增量inc1
docker run --name pxb5 -u root --rm \
-v /data/apps/xtrabackup/backup:/backup \
-it --user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
xtrabackup --prepare --apply-log-only \
--target-dir=/backup/full_backup \
--incremental-basedir=/backup/inc1
"
注意查看 --target-dir 和 --incremental-basedir 和 是否攜帶 --apply-log-only 參數(shù)!
- 【步驟6】 prepare 增量inc2
docker run --name pxb6 -u root --rm \
-v /data/apps/xtrabackup/backup:/backup \
-it --user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
xtrabackup --prepare --apply-log-only \
--target-dir=/backup/full_backup \
--incremental-basedir=/backup/inc2
"
注意查看 --target-dir 和 --incremental-basedir 和 是否攜帶 --apply-log-only 參數(shù)!
- 【步驟7】 prepare 增量最后一個inc3
docker run --name pxb7 -u root --rm \
-v /data/apps/xtrabackup/backup:/backup \
-it --user root \
percona/percona-xtrabackup:8.0.35-34.1 \
/bin/bash -c "
xtrabackup --prepare \
--target-dir=/backup/full_backup \
--incremental-basedir=/backup/inc3
"
注意查看 --target-dir 和 --incremental-basedir 和 是否攜帶 --apply-log-only 參數(shù)!,最后一次不要–apply-log-only參數(shù)!
–apply-log-only 應(yīng)該在合并增量備份時使用,除了最后一個增量備份。這就是為什么前一行(指合并最后一個增量備份之前的操作)不包含 --apply-log-only 選項。即使在最后一步使用了 --apply-log-only,備份仍然會保持一致性,但在那種情況下,服務(wù)器將執(zhí)行回滾階段。
簡單來說:
(1)在合并除了最后一個增量備份時,你需要使用 --apply-log-only 選項。
(2)合并最后一個增量備份時,不要使用 --apply-log-only。
(3)如果你在合并最后一個增量備份時也使用了 --apply-log-only,備份仍然是有效的,但數(shù)據(jù)庫在恢復(fù)時會執(zhí)行一個額外的回滾操作。
- 【步驟8】恢復(fù)操作
參考上面 1.2 使用全量備份恢復(fù)操作 章節(jié)
參考官方文檔:
- https://docs.percona.com/percona-xtrabackup/8.0/quickstart-docker.html
- https://docs.percona.com/percona-xtrabackup/8.0/create-full-backup.html
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Docker網(wǎng)絡(luò)代理設(shè)置詳解
在一些實驗室環(huán)境,服務(wù)器沒有直接連接外網(wǎng)的權(quán)限,需要通過網(wǎng)絡(luò)代理。本篇文章主要介紹了Docker網(wǎng)絡(luò)代理設(shè)置詳解,有興趣的可以了解一下。2017-02-02
docker容器直接退出如何進(jìn)入容器調(diào)試模式
這篇文章主要介紹了docker容器直接退出,如何進(jìn)入容器調(diào)試,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09
docker網(wǎng)絡(luò),docker-compose?network問題
這篇文章主要介紹了docker網(wǎng)絡(luò),docker-compose?network問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
Docker 默認(rèn)bridge網(wǎng)絡(luò)中配置DNS的方法
這篇文章主要介紹了Docker 默認(rèn)bridge網(wǎng)絡(luò)中配置DNS的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03
docker無法通過宿主機IP訪問容器內(nèi)服務(wù)的問題解決
在宿主機上宿主機IP無法訪問容器內(nèi)的7861端口服務(wù),但通過localhost可以訪問,下面就來詳細(xì)的介紹一下該問題的解決,具有一定的參考價值,感興趣的可以了解一下2026-04-04

