如何在 Ubuntu 14.04 上使用 Percona XtraBackup 创建 MySQL 数据库热备份

介绍

在与活动数据库系统合作时遇到的一个非常常见的挑战是进行热备份,即创建备份而不停止数据库服务或使其只读. 简单地复制一个活动数据库的数据文件,往往会造成一个内部不一致的数据库副本,即无法使用,或者在复制过程中发生的交易缺失。 另一方面,停止用于预定备份的数据库使得您的应用程序中依赖数据库的部分变得无法使用。 Percona XtraBackup是一个开源工具,可用于绕过这个问题,并为运行MySQL,MariaDB,和Percona Server数据库创建一致的完整或递增备份,也被称为热备份.

与 Mysqldump 等工具生成的_逻辑备份相相对的是, XtraBackup 创建了_物理备份_数据库文件—— 它提供了数据文件的副本 。 然后它将交易日志(a.k.a. redo log)应用于物理备份,以回填任何在创建备份过程中未完成的活性交易,从而导致运行的数据库的一致备份. 由此产生的数据库备份然后可以使用rsync,Bacula等备份系统,或数字海洋备份等远程位置备份.

本教程将向您展示如何使用Percona XtraBackup在Ubuntu 14.04上执行MySQL或MariaDB数据库的完整热备份,还包括从备份中恢复数据库的过程。本指南的CentOS 7版本可以找到(https://andsky.com/tech/tutorials/how-to-create-hot-backups-of-mysql-databases-with-percona-xtrabackup-on-centos-7).

前提条件

要遵循这个教程,你必须有以下内容:

  • Ubuntu 14.04 系统上的超级用户权限 * 运行 MySQL 或 MariaDB 数据库 * 访问您的数据库的管理员用户(根)

此外,要执行数据库的热备份,您的数据库系统必须使用 InnoDB 存储引擎. 这是因为XtraBackup依靠InnoDB维护的交易日志。

检查存储引擎

如果您不确定您的数据库使用哪个存储引擎,您可以通过各种方法查找它,其中一种方法是使用MySQL控制台选择所涉及的数据库,然后输出每个表的状态。

首先,输入 MySQL 控制台:

1mysql -u root -p

然后输入您的MySQL root密码。

在 MySQL 提示中,选择您要检查的数据库. 请确保在这里更换您自己的数据库名称:

1USE database_name;

然后打印其桌面状态:

1SHOW TABLE STATUS\G;

引擎应为数据库中的每个行表示:

1[secondary_label Example Output:]
2...
3*************************** 11. row ***************************
4           Name: wp_users
5         Engine: InnoDB
6...

一旦完成,请离开控制台:

1exit

让我们安装 Percona XtraBackup。

安装 Percona XtraBackup

安装 Percona XtraBackup 最简单的方法是使用 apt-get。

使用此命令添加 Percona 存储库密钥:

1sudo apt-key adv --keyserver keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A

然后将 Percona 存储库添加到您的 apt 源:

1sudo sh -c "echo 'deb http://repo.percona.com/apt trusty main' > /etc/apt/sources.list.d/percona.list"
2sudo sh -c "echo 'deb-src http://repo.percona.com/apt trusty main' >> /etc/apt/sources.list.d/percona.list"

运行此命令来更新 apt 源:

1sudo apt-get update

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

1sudo apt-get install percona-xtrabackup

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

第一次准备

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

系统用户

除非您计划继续使用系统根用户,否则您必须进行一些基本的准备,以确保 XtraBackup 可以正确执行。

将您的系统用户添加到):

1sudo gpasswd -a username mysql

虽然我们正在进行,让我们创建将用于存储XtraBackup创建的备份的目录:

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

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

MySQL 用户

XtraBackup需要一个MySQL用户,它会在创建备份时使用。

用这个命令输入 MySQL 控制台:

1mysql -u root -p

请输入MySQL root密码。

在 MySQL 提示中,创建一个新的 MySQL 用户并分配一个密码. 在这个例子中,用户被称为bkpuser,密码是bkppassword

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

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

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

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

完成后,离开 MySQL 控制台:

1exit

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

执行全热备份

本节涵盖了使用 XtraBackup 创建 MySQL 数据库的完整热备份所需的步骤. 确保数据库文件权限正确后,我们将使用 XtraBackup 创建备份,然后 准备** 。

更新数据库权限

在Ubuntu 14.04,MySQL的数据文件存储在 /var/lib/mysql中,有时被称为 datadir . 默认情况下,访问 datadir 仅限于'mysql' 用户。

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

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

1If 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用户的登录:

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

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

1[secondary_label innobackupex output]
2innobackupex: Backup created in directory '/data/backups/new_backup'
3150420 13:50:10 innobackupex: Connection to database server closed
4150420 13:50:10 innobackupex: completed OK!

或者 ,您可以省略 --no-timestamp 以便 XtraBackup 根据当前时间标签创建备份目录,如下:

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

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

1[secondary_label innobackupex output — no timestamp]
2innobackupex: Backup created in directory '/data/backups/2015-04-20_13-50-07'
3150420 13:50:10 innobackupex: Connection to database server closed
4150420 13:50:10 innobackupex: completed OK!

您选择的任何方法都应该在输出最后一行输出时输出innobackupex:完成了OK! 成功的备份将导致数据库数据库的副本,该数据库必须 准备好 才能使用。

准备备份

使用 XtraBackup 创建热备份的最后一步是 **准备它,这涉及重播交易日志,以便将任何未承诺的交易应用到备份中。

按照我们的例子,我们将准备在 /data/backups/new_backup 中创建的备份。

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

再次,您应该看到innobackupex:完成了OK!作为最后的输出行。

您的数据库备份已创建并准备好用于恢复您的数据库. 此外,如果您有文件备份系统,如 Bacula,此数据库备份应包括在您的备份选择的一部分。

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

执行备份恢复

使用 XtraBackup 恢复数据库需要停止该数据库,并且其数据库是空的。

用此命令停止 MySQL 服务:

1sudo service mysql stop

然后移动或删除 datadir 的内容(/var/lib/mysql)。

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

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

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

如果成功,最后一行输出应该说innobackupex:完成了!

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

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

现在我们已经准备好开始MySQL了:

1sudo service mysql start

你的恢复的MySQL数据库应该在运行。

结论

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

首先,最好实现进程自动化,以便您能够根据时间表创建备份。 其次,您应该远程复制备份,以防您的数据库服务器出现问题,使用类似rsync,像Bacula,或DigitalOcean备份这样的网络文件备份系统. 之后,您会想要查看 旋转 您的备份( 在日程中删除旧的备份) , 并创建递增备份( 带有 XtraBackup) 来保存磁盘空间 .

好运!

Published At
Categories with 技术
comments powered by Disqus