抄襲轉載的太多,請認準原文連結:xtrabackup 的介紹與使用
前言
在網上找到教程都是複製貼上抄襲的,而且還是陳舊資料,不得不說,當前中文網際網路環境真是每況愈下。
如果你在網上找 xtrabackup 的教程,大機率會為你介紹 innobackupex。但在最新的 2.4 版本中,innobackupex 已經廢棄,只是一個指向 xtrabackup 的軟連線,官方推薦使用 xtrabackup,原文地址:The innobackupex Program
本文教程使用的是 xtrabackup 2.4.28,是當前(本文釋出時)最新的 xtrabackup2.4 版本,可以備份 MySQL 5.1、5.5、5.6 和 5.7 伺服器上的 InnoDB、XtraDB 和 MyISAM 表的資料,以及帶有 XtraDB 的 Percona Server。
環境安裝
教程中使用 MySQL 5.7 版本,其安裝方式不多贅述,主要介紹 xtrabackup 的安裝,如果你已經準備好了環境可以略過此步,這裡介紹三種不同的方式。
Docker
個人推薦使用 docker 安裝的方式,這裡貼出完整的 docker-compose.yml,僅供參考:
version: "3.7"
services:
xtrabackup:
image: percona/percona-xtrabackup:2.4.28
container_name: xtrabackup
restart: "always"
command: bash -c "while true; do sleep 1; done"
volumes:
- "/home/docker/xtrabackup:/data"
# 這裡需要把 MySQL 的資料目錄對映到容器中,原因請檢視下文的注意事項
- "/home/docker/mysql/data/:/var/lib/mysql"
command 命令是一個簡單的 while 迴圈,用來保持容器執行,方便進入其中執行命令。
Debian/Ubuntu
從 Percona web 下載 deb 包
wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
安裝 dpkg,這一步需要 root 許可權
sudo dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb
啟用儲存庫
percona-release enable-only tools release
apt 安裝 xtrabackup
sudo apt install percona-xtrabackup-24
apt 安裝 qpress, qpress 用於壓縮備份
sudo apt install qpress
Red Hat/CentOs
安裝 percona-release:
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
RHEL | Centos5 不支援直接從遠端位置安裝軟體包,因此您需要先下載軟體包並使用 rpm 手動安裝:
wget https://repo.percona.com/yum/percona-release-latest.noarch.rpm
rpm -ivH percona-release-latest.noarch.rpm
啟用儲存庫:
percona-release enable-only tools release
yum 安裝 xtrabackup:
yum install percona-xtrabackup-24
yum 安裝 qpress, qpress 用於壓縮備份:
yum install qpress
注意事項
常用概念和引數
xtrabakcup 有幾個常見的概念:
- 完整備份:顧名思義,就是完整備份 o.O
- 恢復備份:顧名思義,就是恢復備份 O.o
- 準備備份:這個不能顧名思義了,它用來把完整備份出來的資料檔案進行一些處理,處理後的資料才能用於恢復備份
- 增量備份:每一次完整備份的資料檔案會很大,增量備份會在其基礎上做備份,這樣可以節省資源
- 壓縮備份:把備份檔案進行壓縮,以節省空間
這裡是幾個常用xtrabackup 命令引數,在後續不明白時,可以過來查詢
- --backup 製作一個備份並放在 --target-dir 中,這個是製作完整備份和增量備份的必要引數
- --prepare 建立準備備份
- --target-dir 指定備份檔案的目錄,不存在將自動建立
- --apply-log-only 這個選項在準備備份時使用,讓其只執行 redo 階段,一般用在增量備份上
- --host 指定 MySQL 的 host
- --port 指定 MySQL 的 port
- --password 指定 MySQL 的密碼
- --defaults-file 指定 my.cnf,不能是 my.cnf 的軟連結
- --datadir 指定 MySQL 的資料目錄,一般會從 my.cnf 中讀取
預備資料
我們先預備一下 MySQL 的測試資料,建立一個用於測試的資料庫:
CREATE DATABASE test;
建立一個表,並填充資料:
CREATE TABLE `user` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
INSERT INTO `user` (name) VALUES ("oldme");
INSERT INTO `user` (name) VALUES ("newton");
INSERT INTO `user` (name) VALUES ("watt");
完整備份
建立備份
xtrabackup --backup --host=mysql --password=12345678 --target-dir=/data/backups/base/
完成後的效果:
檢視備份出來的檔案:ls -l /data/backups/base
然後我們刪掉一條資料,以做恢復資料展示:
DELETE FROM `user` WHERE id=3
準備備份
必須先要準備備份後才能恢復資料:
xtrabackup --prepare --target-dir=/data/backups/base/
完成後的效果:
恢復備份
在恢復備份前需要關閉 MySQL 服務。
// base後面一定要帶/
rsync -avrP /data/backups/base/ /var/lib/mysql/
恢復資料後更改檔案所有權,如果是 docker 部署則略過:
chown -R mysql:mysql /var/lib/mysql
重啟 MySQL 服務,檢視恢復完成的資料:
SELECT* FROM `user`
id name
--------------
1 oldme
2 newton
3 watt
增量備份
建立備份
在建立增量備份前,我們需要有一個完整備份:
xtrabackup --backup --host=mysql --password=12345678 --target-dir=/data/backups/base/
給資料庫新增一條資料:
INSERT INTO `user` (name) VALUES ("Einstein");
然後以此為基礎進行增量:
xtrabackup --backup --host=mysql --password=12345678 --target-dir=/data/backups/inc1 --incremental-basedir=/data/backups/base
/data/backups/inc1/ 目錄現在應該包含增量檔案,例如 ibdata1.delta 和 test/user.ibd.delta。
還可以以 inc1 為基礎繼續增量:
xtrabackup --backup --host=mysql --password=12345678 --target-dir=/data/backups/inc2 --incremental-basedir=/data/backups/inc1
刪除資料,準備恢復:
DELETE FROM `user` WHERE id in (3,4)
準備備份與恢復
準備備份與完整備份不同,需要使用 --apply-log-only
選項來保持資料庫一致。
先準備基礎備份:
xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base/
將增量備份應用到基礎備份中:
xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base --incremental-dir=/data/backups/inc1
然後執行同樣的恢復備份命令,這點與完整備份的步驟一樣,停止 MySQL 服務,執行命令,重啟 MySQL:
// base後面一定要帶/
rsync -avrP /data/backups/base/ /var/lib/mysql/
最後即可看到恢復的資料:
id name
--------------
1 oldme
2 newton
3 watt
4 Einstein
壓縮備份
建立壓縮備份
xtrabackup --backup --compress --host=mysql --password=12345678 --target-dir=/data/backups/compressed/
可以使用 --compress-threads
配置多執行緒壓縮,例如啟用四個執行緒壓縮:
xtrabackup --backup --compress --host=mysql --password=12345678 --compress-threads=4 --target-dir=/data/backups/compressed/
準備備份
在準備備份之前需要解壓備份:
xtrabackup --decompress --target-dir=/data/backups/compressed/
解壓完成後使用和完整備份一樣的方式就可以恢復備份資料了。