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

以上代码将会将数据库全量备份到/home/back/这个目录下

3.2 增量备份

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

/backup/inc1为增量备份目录, /backup/fullbackup为全备份目录

四、恢复

保证要还原的数据库服务器的 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 * * * 备份脚本路径

查看任务是否被加入定时器

crontab -l