前言

CentOS 7 下 MySQL 5.7 配置 Percona Xtrabackup ,记录一下大致的安装和配置过程。

Percona XtraBackup 的备份工具支持热备份(即不必停止 MySQL 服务而进行备份)。热备份方式主要是通过文件系统级别的文件拷贝,当需要执行崩溃恢复时,可以实现数据集内的一致性。

参考文档使用的操作系统为 Ubuntu 16.04,本例将操作系统改为 CentOS 7,命令基本一致,主要示例一下数据库的全备份,增量备份以及数据恢复。

环境说明

CentOS 7(Minimal Install)

$ cat /etc/redhat-release

CentOS Linux release 7.3.1611 (Core)

MySQL 5.7

$ mysql --version

mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64) using EditLine wrapper

本系统初始有两个用户

超级管理员: root

管理组用户: admin,本例中 ${USER} 就是这个用户

安装 Percona Xtrabackup 工具

安装 yum 源

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

查询一下安装包

$ sudo yum list | grep xtrabackup

percona-xtrabackup.x86_64 2.3.8-1.el7 percona-release-x86_64

percona-xtrabackup-22.x86_64 2.2.13-1.el7 percona-release-x86_64

percona-xtrabackup-22-debuginfo.x86_64 2.2.13-1.el7 percona-release-x86_64

percona-xtrabackup-24.x86_64 2.4.7-1.el7 percona-release-x86_64

percona-xtrabackup-24-debuginfo.x86_64 2.4.7-1.el7 percona-release-x86_64

percona-xtrabackup-debuginfo.x86_64 2.3.8-1.el7 percona-release-x86_64

percona-xtrabackup-test.x86_64 2.3.8-1.el7 percona-release-x86_64

percona-xtrabackup-test-22.x86_64 2.2.13-1.el7 percona-release-x86_64

percona-xtrabackup-test-24.x86_64 2.4.7-1.el7 percona-release-x86_64

安装 Xtrabackup 和 qpress 压缩工具。

$ sudo yum update

$ sudo yum install percona-xtrabackup-24 qpress

安装之后,innobackupex, xtrabackup, xbstream, 和 qpress 命令将可以使用,本例的脚本会使用这些命令进行数据的备份和恢复。

配置一个 MySQL 备份用户并且添加测试数据

首先使用 MySQL 的 root 用户登录。

$ mysql -u root -p

创建一个 MySQL 用户并且授权

在 MySQL 中创建一个用户名为 backup 的用户,并且分配备份的相关权限给它。

mysql> CREATE USER 'backup'@'localhost' IDENTIFIED BY 'password';

授予备份的相关权限

mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT, CREATE TABLESPACE, PROCESS, SUPER, CREATE, INSERT, SELECT ON *.* TO 'backup'@'localhost';

mysql> FLUSH PRIVILEGES;

创建测试数据,创建一个 playground 的数据库,创建一个 equipment 的表,并且添加一条记录到这个表里。

mysql> CREATE DATABASE playground;

mysql> CREATE TABLE playground.equipment ( id INT NOT NULL AUTO_INCREMENT, type VARCHAR(50), quant INT, color VARCHAR(25), PRIMARY KEY(id));

mysql> INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue");

此后我们将用这个数据库查看测试备份和恢复的效果。

mysql> SELECT * FROM playground.equipment;

+----+-------+-------+-------+

| id | type | quant | color |

+----+-------+-------+-------+

| 1 | slide | 2 | blue |

+----+-------+-------+-------+

1 row in set (0.00 sec)

在我们退出 MySQL 会话前,我们先检查一下 datadir 变量。因为我们还要创建一个操作系统的 backup 用户,而且这个需要有权限访问这个目录。

mysql> SELECT @@datadir;

+-----------------+

| @@datadir |

+-----------------+

| /var/lib/mysql/ |

+-----------------+

1 row in set (0.00 sec)

记住这个目录,现在可以退出 MySQL 了。

mysql> exit

Bye

配置操作系统的备份用户并授权

创建 backup 用户,不需要登录系统,没有 home 目录

$ sudo useradd -M -s /sbin/nologin backup

确认一下 backup 用户和组

$ grep backup /etc/passwd /etc/group

/etc/passwd:backup:x:1001:1001::/home/backup:/sbin/nologin

/etc/group:backup:x:1001:

MySQL 的数据目录 /var/lib/mysql 的所有者和所有组是 mysql。

我们需要将 backup 加入到 mysql 组里,这样 backup 就可以访问 mysql 组的目录和文件。

我们需要将 sudo 加入到 backup 组里,这样我们就可以访问 backup 用户和组权限的目录和文件。

命令执行如下

$ sudo usermod -aG mysql backup

$ sudo usermod -aG backup ${USER}

此时我们再检查一下 backup 的组

$ grep backup /etc/group

mysql:x:27:backup

backup:x:1001:admin

新加入的组不会立即生效,需要执行如下命令

$ exec su - ${USER}

执行之后,可以使用如下命令确认

$ id -nG

admin wheel backup

注意: admin 是 admin 的组,wheel 是 CentOS 默认的 sudo 组,backup 是新增的 mysql 备份的组。

创建备份相关的资源

现在我们已经有了 Mysql 用户 backup, 系统用户 backup,我们需要创建配置文件,密钥文件和其他脚本,这样我们就可以创建并保护备份的安全。

创建 MySQL 备份的配置文件

我们将 MySQL 备份用户 backup 的用户名和密码放到配置中。

$ sudo mkdir /etc/mysql

$ sudo vi /etc/mysql/backup.cnf

加入如下内容:

[client]

user=backup

password=password

保存并退出 :wq,这样 MySQL 的配置文件就创建完毕,以后备份用户就会使用这个文件的配置登录 MySQL ,注意 password=password 这个密码是 MySQL 里面的用户 backup 的密码。

创建备份的根目录

本例使用 /backups/mysql 为备份文件的根目录,使用如下命令创建:

$ sudo mkdir -p /backups/mysql

对这个目录的所有者和所有组进行分配, 所有者为 backup,所有组为 mysql

$ sudo chown backup:mysql /backups/mysql

CentOS 7 默认启用了 SELinux,这也需要进行授权,可以先查看一下

$ ls -lh -Zd /backups/mysql/

drwxr-x--x. backup mysql unconfined_u:object_r:var_lib_t:s0 /backups/mysql/

授权命令如下: 只更改类型即可

$ sudo chcon -R -u system_u -t mysqld_db_t /backups/mysql/

查看一下

$ ls -lh -Zd /backups/mysql/

drwxr-x--x. backup mysql system_u:object_r:mysqld_db_t:s0 /backups/mysql/

此时,SELinux 授权完成。

这样 backup 用户就可以进入并操作这个目录了

创建密钥保护备份文件安全

因为数据库文件是非常重要的文件,所以安全非常重要。 innobackupex 工具提供了加密和解密的功能。为此,我们只需要提供一个密钥即可。

我们使用 openssl 命令来创建一个密钥

$ printf '%s' "$(openssl rand -base64 24)" | sudo tee /backups/mysql/encryption_key && echo

修改这个文件的权限,保证这个文件只能 backup 用户可以使用。

$ sudo chown backup:backup /backups/mysql/encryption_key

$ sudo chmod 600 /backups/mysql/encryption_key

创建备份和恢复的脚本

目前安全方面的准备已经完成,我们需要创建 3 个脚本,来执行备份(加密备份),释放(解密)和恢复准备的工作。

backup-mysql.sh: 这个脚本完成备份数据库,对备份的文件进行加密和压缩,他会根据日期创建全量和增量的备份,默认保存 3 天的备份。

extract-mysql.sh: 这个脚本会解压并解密备份文件,并将文件放到指定的文件夹中。

prepare-mysql.sh: 这个脚本为恢复做最后的准备,将增量文件合并到全备份中。并且记录执行的日志,如果这个脚本执行完,那么剩下的就是将恢复的数据库替换即可。

创建 backup-mysql.sh 脚本

$ sudo vi /usr/local/bin/backup-mysql.sh

脚本内容如下:

#!/bin/bash

export LC_ALL=C

days_of_backups=3 # Must be less than 7

backup_owner="backup"

parent_dir="/backups/mysql"

defaults_file="/etc/mysql/backup.cnf"

todays_dir="${parent_dir}/$(date +%a)"

log_file="${todays_dir}/backup-progress.log"

encryption_key_file="${parent_dir}/encryption_key"

now="$(date +%m-%d-%Y_%H-%M-%S)"

processors="$(nproc --all)"

# Use this to echo to standard error

error () {

printf "%s: %s\n" "$(basename "${BASH_SOURCE}")" "${1}" >&2

exit 1

}

trap 'error "An unexpected error occurred."' ERR

sanity_check () {

# Check user running the script

if [ "$USER" != "$backup_owner" ]; then

error "Script can only be run as the \"$backup_owner\"user"

fi

# Check whether the encryption key file is available

if [ ! -r "${encryption_key_file}" ]; then

error "Cannot read encryption key at ${encryption_key_file}"

fi

}

set_options () {

# List the innobackupex arguments

#declare -ga innobackupex_args=(

innobackupex_args=(

"--defaults-file=${defaults_file}"

"--extra-lsndir=${todays_dir}"

"--compress"

"--stream=xbstream"

"--encrypt=AES256"

"--encrypt-key-file=${encryption_key_file}"

"--parallel=${processors}"

"--compress-threads=${processors}"

"--encrypt-threads=${processors}"

"--slave-info"

"--incremental"

)

backup_type="full"

# Add option to read LSN (log sequence number) if a full backup has been

# taken today.

if grep -q -s "to_lsn" "${todays_dir}/xtrabackup_checkpoints"; then

backup_type="incremental"

lsn=$(awk '/to_lsn/ {print $3;}' "${todays_dir}/xtrabackup_checkpoints")

innobackupex_args+=( "--incremental-lsn=${lsn}" )

fi

}

rotate_old () {

# Remove the oldest backup in rotation

day_dir_to_remove="${parent_dir}/$(date --date="${days_of_backups}days ago" +%a)"

if [ -d "${day_dir_to_remove}" ]; then

rm -rf "${day_dir_to_remove}"

fi

}

take_backup () {

# Make sure today's backup directory is available and take the actual backup

mkdir -p

mysql 5.7 xbackup_CentOS 7 下 MySQL 5.7 配置 Percona Xtrabackup相关推荐

  1. linux上mysql允许远程连接,linux下mysql允许远程连接

    1. MySql安装教程 https://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html 默认情况下mysq的 roo ...

  2. linux如何mysql实现导出数据库,Linux下MySQL导入导出数据库

    linux下 一.导出数据库用mysqldump命令(注意mysql的安装路径,即此命令的路径): 1.导出数据和表结构: mysqldump -u用户名 -p密码 数据库名 > 数据库名.sq ...

  3. centos mysql拒绝连接失败_CentOS下mysql远程连接的失败的解决方法

    mysql远程连接失败的解决方法(CentOS版) (1)先将mysql服务停掉 # /etc/init.d/mysqld stop (2)查看mysql配置文件 # vi /etc/my.cnf 特 ...

  4. linux mysql设置数据库utf_Linux系统下MySQL数据库服务器字符集设置

    Linux认证考试:Linux系统下的MySQL数据库服务器字符集设置 启动MySQL后,以root登录mysql isher@isher-ubuntu:~$ mysql -u root >sh ...

  5. mac mysql utf 8编码_MacOS下MySQL设置UTF8编码问题

    1,检查默认安装的MySQL的字符集 mysql> show variables like '%char%'; +--------------------------+------------- ...

  6. ubantu mysql允许外部链接_ubuntu 下mysql 设置允许远程连接

    ubuntu: 安装mysql-server,sudo apt-get install mysql-server mysql 安装成功后查看mysql状态:/etc/init.d/mysql stat ...

  7. 查看linux mysql 账户权限设置_Linux下mysql新建账号及权限设置各种方式总结

    来自:http://justcoding.iteye.com/blog/1941116 1.权限赋予 说明:mysql部署在服务器A上,内网上主机B通过客户端工具连接服务器A以进行数据库操作,需要服务 ...

  8. windows下配置mysql数据库_mysql数据库1-windows下mysql安装及配置

    1.下载: 地址:http://dev.mysql.com/downloads/mysql/ 2.安装: 将下载的mysql-5.7.16-winx64压缩包解压后的整个目录放在自己喜欢的位置,我的放 ...

  9. centos7 mysql安装教程_centos7环境下MySQL安装教程

    Linux centos7环境下安装MySQL步骤的详细介绍 安装MySQL mysql 有两个跟windows不同的地方 1).my.ini 保存到/etc/my.ini 2).用户权限,单独用户执 ...

最新文章

  1. python框架之Flask基础篇(一)
  2. python学起来难不难-零基础学Python爬虫难不难?要怎么学?
  3. 数据库编程入门培训(二)
  4. NEO智能合约黑盒测试框架
  5. 查看sqlserver版本
  6. H3C PPP基本概念
  7. [java]内部类的总结
  8. 深度学习 --- 优化入门五(Batch Normalization(批量归一化)二)
  9. windows7系统怎么内录
  10. 华为交换机学习指南基于端口划分VLAN的四种方案
  11. 带拼音计算机语言翻译软件,拼音转换汉字翻译器
  12. 利用ace.js编写一个JavaScript编辑器(带智能补全)
  13. JQuery文件上传插件Uploadify
  14. 修改图片exif信息
  15. c语言的字符串不是存放,在C语言中,字符串不存放在一个变量中,而是存放在一个中...
  16. python列表的使用_python列表的使用
  17. lcd显示数字+0x30
  18. 小白的Construct 2(伪)技术博客
  19. 技术债务研究综述X4
  20. Hyperledger Fabric 实战(十二): Fabric 源码本地调试

热门文章

  1. 深入理解 Embedding层的本质
  2. 深入理解BP神经网络的细节
  3. LeetCode简单题之旋转字符串
  4. TensorFlow算子融合
  5. 用户自定义协议client/server代码示例
  6. 2021年大数据ELK(十九):使用FileBeat采集Kafka日志到Elasticsearch
  7. 2021年大数据Spark(四十一):SparkStreaming实战案例六 自定义输出 foreachRDD
  8. Python:Selenium和PhantomJS
  9. 怎么查找执行比较慢的sql语句
  10. Only the original thread that created a view hierarchy can touch its views