如何在CentOS7上使用PerconaXtraBackup创建MySQL数据库的热备份

来自菜鸟教程
跳转至:导航、​搜索

介绍

使用活动数据库系统时遇到的一个非常常见的挑战是执行热备份,即在不停止数据库服务或使其只读的情况下创建备份。 简单地复制活动数据库的数据文件通常会导致内部不一致的数据库副本,即 它将无法使用,或者会丢失复制期间发生的事务。 另一方面,停止数据库以进行计划备份会使应用程序中依赖于数据库的部分变得不可用。 Percona XtraBackup 是一个开源实用程序,可用于规避此问题,并为正在运行的 MySQL、MariaDB 和 Percona Server 数据库创建一致的完整或增量备份,也称为热备份。

与 mysqldump 等实用程序生成的 逻辑备份 不同,XtraBackup 创建数据库文件的 物理备份 - 它制作数据文件的副本。 然后它应用事务日志(又名 redo log) 到物理备份,以回填在创建备份期间未完成的任何活动事务,从而对正在运行的数据库进行一致的备份。 然后可以使用 rsyncBaculaDigitalOcean backups 等备份系统将生成的数据库备份备份到远程位置。

本教程将向您展示如何在 CentOS 7 上使用 Percona XtraBackup 对 MySQL 或 MariaDB 数据库执行完整的热备份。 还介绍了从备份还原数据库的过程。 本指南的 Ubuntu 版本可在 此处 找到。

先决条件

要学习本教程,您必须具备以下条件:

  • CentOS 7 系统上的超级用户权限
  • 正在运行的 MySQL 或 MariaDB 数据库
  • 访问数据库的管理员用户 (root)

此外,要执行数据库的热备份,您的数据库系统必须使用 InnoDB 存储引擎。 这是因为 XtraBackup 依赖于 InnoDB 维护的事务日志。 如果您的数据库使用 MyISAM 存储引擎,您仍然可以使用 XtraBackup,但数据库将在备份结束时锁定一小段时间。

检查存储引擎

如果您不确定您的数据库使用哪种存储引擎,您可以通过多种方法进行查找。 一种方法是使用 MySQL 控制台选择有问题的数据库,然后输出每个表的状态。

首先,进入 MySQL 控制台:

mysql -u root -p

然后输入您的 MySQL 根密码。

在 MySQL 提示符下,选择要检查的数据库。 请务必在此处替换您自己的数据库名称:

USE database_name;

然后打印它的表状态:

SHOW TABLE STATUS\G;

应为数据库中的每一行指示引擎:

Example Output:...
*************************** 11. row ***************************
           Name: wp_users
         Engine: InnoDB
...

完成后,离开控制台:

exit

让我们安装 Percona XtraBackup。

安装 Percona XtraBackup

安装 Percona XtraBackup 最简单的方法是使用 yum,因为 Percona 的存储库提供了 RPM。

sudo yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm

然后,您可以运行此命令来安装 XtraBackup:

sudo yum install percona-xtrabackup

接受任何确认提示以完成安装。

XtraBackup 主要由 XtraBackup 程序和 innobackupex Perl 脚本组成,我们将使用它来创建数据库备份。

第一次准备

在第一次使用 XtraBackup 之前,我们需要准备 XtraBackup 将使用的系统和 MySQL 用户。 本节介绍初步准备。

系统用户

除非您打算使用系统 root 用户,否则您必须进行一些基本准备以确保 XtraBackup 可以正常执行。 我们将假设您以运行 XtraBackup 的用户身份登录,并且它具有超级用户权限。

将您的系统用户添加到“mysql”组(替换为您的实际用户名):

sudo gpasswd -a username mysql

在此过程中,让我们创建将用于存储 XtraBackup 创建的备份的目录:

sudo mkdir -p /data/backups
sudo chown -R username: /data

chown 命令确保用户能够写入备份目录。

MySQL 用户

XtraBackup 需要在创建备份时使用的 MySQL 用户。 现在让我们创建一个。

使用以下命令进入 MySQL 控制台:

mysql -u root -p

提供 MySQL root 密码。

在 MySQL 提示符下,创建一个新的 MySQL 用户并为其分配密码。 在此示例中,用户名为“bkpuser”,密码为“bkppassword”。 将这两个都更改为安全的东西:

CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 'bkppassword';

接下来,授予新 MySQL 用户对所有数据库的重新加载、锁定和复制权限:

GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost';
FLUSH PRIVILEGES;

这些是 XtraBackup 创建数据库完整备份所需的最低权限。

完成后,退出 MySQL 控制台:

exit

现在我们准备创建数据库的完整备份。

执行完全热备份

本节介绍使用 XtraBackup 创建 MySQL 数据库的完整热备份所需的步骤。 确保数据库文件权限正确后,我们将使用XtraBackup 创建一个备份,然后准备它。

更新数据目录权限

在 CentOS 7 上,MySQL 的数据文件存储在 /var/lib/mysql 中,有时也称为 datadir。 默认情况下,对 datadir 的访问仅限于 mysql 用户。 XtraBackup 需要访问这个目录来创建它的备份,所以让我们运行一些命令来确保我们之前设置的系统用户 - 作为 mysql 组的成员 - 具有适当的权限:

sudo chown -R mysql: /var/lib/mysql
sudo find /var/lib/mysql -type d -exec chmod 775 "{}" \;

这些命令确保 mysql 组可以访问 datadir 中的所有目录,并且应该在每次备份之前运行。

If you added your user to the mysql group in the same session, you will need to login again for the group membership changes to take effect.

创建备份

现在我们准备创建备份。 在 MySQL 数据库运行的情况下,使用 innobackupex 实用程序来执行此操作。 在更新用户和密码以匹配您的 MySQL 用户登录后运行此命令:

innobackupex --user=bkpuser  --password=bkppassword --no-timestamp /data/backups/new_backup

这将在指定位置创建数据库备份,/data/backups/new_backup

innobackupex outputinnobackupex: Backup created in directory '/data/backups/new_backup'
150420 13:50:10  innobackupex: Connection to database server closed
150420 13:50:10  innobackupex: completed OK!

或者,你可以省略--no-timestamp让XtraBackup根据当前时间戳创建一个备份目录,像这样:

innobackupex --user=bkpuser  --password=bkppassword /data/backups

这将在自动生成的子目录中创建数据库的备份,如下所示:

innobackupex output — no timestampinnobackupex: Backup created in directory '/data/backups/2015-04-20_13-50-07'
150420 13:50:10  innobackupex: Connection to database server closed
150420 13:50:10  innobackupex: completed OK!

您决定的任何一种方法都应输出“innobackupex: completed OK!” 在其输出的最后一行。 一个成功的备份会产生一个数据库datadir的副本,它必须先prepared才能使用。

准备备份

使用 XtraBackup 创建热备份的最后一步是 准备 它。 这涉及“重播”事务日志以将任何未提交的事务应用于备份。 准备备份将使其数据保持一致,并可用于还原。

按照我们的示例,我们将准备在 /data/backups/new_backup 中创建的备份。 将其替换为实际备份的路径:

innobackupex --apply-log /data/backups/new_backup

同样,您应该会看到“innobackupex:已完成,OK!” 作为输出的最后一行。

您的数据库备份已创建并准备好用于恢复您的数据库。 此外,如果您有一个文件备份系统,例如 Bacula,则此数据库备份应包含在您的备份选择中。

下一节将介绍如何从我们刚刚创建的备份中恢复数据库。

执行备份恢复

使用 XtraBackup 恢复数据库需要停止数据库,并且其 datadir 为空。

使用以下命令停止 MySQL 服务:

sudo systemctl stop mariadb

然后移动或删除 datadir (/var/lib/mysql) 的内容。 在我们的示例中,我们将简单地将其移动到一个临时位置:

mkdir /tmp/mysql
mv /var/lib/mysql/* /tmp/mysql/

现在我们可以从备份“new_backup”中恢复数据库:

innobackupex --copy-back /data/backups/new_backup

如果成功,最后一行输出应该是“innobackupex: completed OK!”

datadir 中恢复的文件可能属于您运行恢复过程的用户。 将所有权更改回 mysql,以便 MySQL 可以读取和写入文件:

sudo chown -R mysql: /var/lib/mysql

现在我们准备启动 MySQL:

sudo systemctl start mariadb

就是这样! 您恢复的 MySQL 数据库应该已启动并正在运行。

结论

现在您可以使用 Percona XtraBackup 创建 MySQL 数据库的热备份,您应该考虑设置几件事。

首先,建议自动化该过程,以便您可以根据计划创建备份。 其次,您应该使用 rsyncBaculaDigitalOcean 等网络文件备份系统来制作备份的远程副本,以防数据库服务器出现问题备份。 之后,您将需要查看 轮换 备份(按计划删除旧备份)并创建增量备份(使用 XtraBackup)以节省磁盘空间。

祝你好运!