Mariabackup是MariaDB提供的一個開源工具,用於對InnoDB,Aria和MyISAM表進行物理在線備份。這個工具是基於Percona的XtraBackup(版本2.3.8)的解決方案。
這裡有一點需要注意,在MariaDB10.3.x及以上的版本用Percona XtraBackup工具會有問題。原因可能是MariaDB10.3以上版本的redo日誌格式和之前不同了。
Percona的官方文檔:https://www.percona.com/doc/percona-xtrabackup/2.4/index.html
Mariabackup的官方文檔:https://mariadb.com/kb/en/library/mariabackup-overview/
Percona XtraBackup:https://blog.csdn.net/L835311324/article/details/83628339

 

一、安裝

yum install MariaDB-backup
apt-get install mariadb-backup
zypper install MariaDB-backup

二、使用

2.1、語法格式:

mariabackup [--defaults-file=#] [--backup | --prepare | --copy-back | --move-back] [OPTIONS]

2.2、常用選項

  • -backup
    備份數據庫。
    使用此命令選項,Mariabackup會對您的數據庫執行備份操作。備份將寫入目標目錄,由- -target-dir選項設置。
  • -copy-back
    將備份還原到數據目錄。
    使用此命令,Mariabackup將備份從目標目錄複製到數據目錄,如- -datadir選項所定義。您必須在運行此命令之前停止MariaDB服務器。數據目錄必須為空。如果要使用備份覆蓋數據目錄,請使用該- -force-non-empty-directories選項。
    請記住,在恢復備份之前,首先需要使用該- -prepare選項運行Mariabackup 。在完全備份的情況下,這使得文件的時間點保持一致。使用增量備份,這會將增量應用於基本備份。準備好備份後,您可以運行- -copy-back將其應用於MariaDB Server。
    運行該- -copy-back命令會將備份文件複製到數據目錄。如果要保存備份以供日後使用,請使用此命令。如果您不想保存備份以供日後使用,請使用該- -move-back命令。
  • -defaults-file
    定義包含默認配置的文件的路徑。
    -H, –host
    定義要備份的MariaDB服務器的主機
  • -incremental-basedir
    定義是否要增加備份
  • -incremental-dir
    定義是否要增加準備好的備份
    將此選項與- -prepare命令選項一起使用會導致Mariabackup增加準備好的備份,而不是從頭開始復制。增量將. delta文件和日誌文件應用到目標目錄中。
  • -move-back
    將備份還原到數據目錄。
    使用此命令,Mariabackup將備份從目標目錄移動到數據目錄,如–datadir選項所定義。您必須在運行此命令之前停止MariaDB服務器。數據目錄必須為空。如果要使用備份覆蓋數據目錄,請使用該–force-non-empty-directories選項。
    請記住,在恢復備份之前,首先需要使用該–prepare選項運行Mariabackup 。在完全備份的情況下,這使得文件的時間點保持一致。使用增量備份,這會將增量應用於基本備份。準備好備份後,您可以運行–move-back將其應用於MariaDB Server。
    -p, –password
    定義用於連接MariaDB Server的密碼。
    -P, –port
    定義要連接的服務器端口
  • -prepare
    準備現有備份以還原到MariaDB服務器。
    Mariabackup –backup在目標目錄中的操作期間生成的文件尚未準備好在服務器上使用。在將數據還原到MariaDB之前,首先需要準備備份。
    在完全備份的情況下,文件不是時間點一致的,因為它們是在不同時間拍攝的。如果您嘗試在未先準備數據的情況下還原數據庫,InnoDB會將新數據拒絕為損壞。使用該–prepare命令運行Mariabackup會使數據準備就緒,因此您可以將其還原到MariaDB Server。使用增量備份時,需要使用–prepare命令和–incremental-dir選項通過增量備份中的增量更新基本備份。
    -S, –socket
    定義用於連接本地數據庫的套接字
  • -user
    定義用於連接MariaDB服務器的用戶名
  • -version-check
    啟用版本檢查。
    使用此選項,您可以啟用Mariabackup版本檢查
  • -version
    打印版本信息。

三、備份

3.1 全量備份

mariabackup --backup --target-dir /home/back/$(date '+%y-%m-%d')_fullbackup --user root --password 123456

3.2 增量備份

mariabackup --backup --target-dir /backup/inc1 --incremental-basedir /backup/fullbackup --user root --password centos

四、恢復

保證要還原的數據庫服務器的data 目錄為空

4.1 全量恢復

  • 準備全備數據
    mariabackup --prepare --target-dir 全量備份目錄 --user 用戶名 --password 密碼
  • 還原數據(保證要還原的數據庫服務器的data 目錄為空)
    mariabackup --copy-back --target-dir 全量備份目錄 --user 用戶名 --password 密碼
  • 修改data目錄權限
    因為備份的用戶是root,還原過去的時候屬主沒有變化,所以要吧還原過去的數據的屬主和屬組修改一下

    chown -R mysql:mysql /usr/local/mariadb/data

4.2 增量恢復

  • 準備全備數據
    mariabackup --prepare --target-dir 全量備份目錄 --user 用戶名 --password 密碼  --apply-log-only
  • 將增量備份與全備合併
    如果有多個增量備份,則多次執行該命令

    mariabackup --prepare --target-dir 全量備份目錄 \
       --user 用戶名 --password 密碼  \
       --incremental-dir 增量備份目錄 --apply-log-only
  • 還原數據(保證要還原的數據庫服務器的data 目錄為空)
    mariabackup --copy-back --target-dir 全量備份目錄 --user 用戶名  --password 密碼
  • 修改data目錄權限
    因為備份的用戶是root,還原過去的時候屬主沒有變化,所以要吧還原過去的數據的屬主和屬組修改一下

    chown -R mysql:mysql /usr/local/mariadb/data

五、備份腳本

每隔7天將增量備份合併為全量備份

5.1 備份腳本

#!/bin/bash
dst="/var/db/back/full_back"
xbk="/usr/bin/mariabackup"
user="root"
password="123456"
# 1 base + `max' incrementals
max=7
mkdir -p $dst || exit 1
if [ ! -d $dst/0 ]; then
    # create base, 0/
    echo "first"
# $xbx --backup --target-dir ${dst} --user ${user} --password ${password}
    $xbk --backup --target-dir ${dst}/0 --user ${user} --password ${password} || exit $?
    $xbk --prepare --apply-log-only --target-dir ${dst}/0 --user ${user} --password ${password} || { ret=$?; rm -rf ${dst}/0; exit $ret; }
    exit 0
fi
IFS=$'\n'; for x in $(ls -1 -t $dst); do
    unset IFS
    # create incremental, 1/, 2/, ..., $max/
    echo "merge"
    $xbk --backup --target-dir ${dst}/$((x+1)) --incremental-basedir ${dst}/$x --user ${user} --password ${password} || { ret=$?; rm -rf ${dst}/$((x+1)); exit $ret; }
    if (($x+1 >= $max)); then
        break
    fi
    exit 0
done
# apply the deltas to the base
errdir="error_$(date +%Y%m%d_%H%M%S)"
IFS=$'\n'; for x in $(ls -1 -t -r $dst); do
    echo "error"
    unset IFS
    if (($x == 0)); then
        continue
    fi
    $xbk --prepare --apply-log-only --target-dir ${dst}/0 --incremental-dir ${dst}/$x --user ${user} --password ${password}
    if [ $? -ne 0 ]; then
        # error occurs and cleanup
        mkdir -p $dst/$errdir && mv $dst/[0-9]* $dst/$errdir
        exit 1
    else
        rm -rf ${dst}/$x
    fi
done

5.2 創建定時任務

crontab -e

輸入以下內容

* 0 * * * 備份腳本路徑

查看任務是否被加入定時器

corntab -l