xtrabackup 2.4 的介紹與使用

燈火消逝的碼頭發表於2023-10-30

抄襲轉載的太多,請認準原文連結: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

注意事項

xtrabackup 在備份時需要訪問 MySQL 的資料目錄,且具備操作它的許可權,所以 MySQL 和 xtrabackup 不在同一主機的情況下,需要把 MySQL 的資料複製到 xtrabakcup 所在的主機上。

常用概念和引數

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/

完成後的效果:

xtrabackup 2.4 的介紹與使用

檢視備份出來的檔案:ls -l /data/backups/base

xtrabackup 2.4 的介紹與使用

然後我們刪掉一條資料,以做恢復資料展示:

DELETE FROM `user` WHERE id=3

準備備份

必須先要準備備份後才能恢復資料:

xtrabackup --prepare --target-dir=/data/backups/base/

完成後的效果:

xtrabackup 2.4 的介紹與使用

恢復備份

在恢復備份前需要關閉 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/

解壓完成後使用和完整備份一樣的方式就可以恢復備份資料了。

相關文章