mysql 5.7 xbackup_CentOS 7 下 MySQL 5.7 配置 Percona Xtrabackup
前言
CentOS 7 下 MySQL 5.7 配置 Percona Xtrabackup ,記錄一下大致的安裝和配置過(guò)程。
Percona XtraBackup 的備份工具支持熱備份(即不必停止 MySQL 服務(wù)而進(jìn)行備份)。熱備份方式主要是通過(guò)文件系統(tǒng)級(jí)別的文件拷貝,當(dāng)需要執(zhí)行崩潰恢復(fù)時(shí),可以實(shí)現(xiàn)數(shù)據(jù)集內(nèi)的一致性。
參考文檔使用的操作系統(tǒng)為 Ubuntu 16.04,本例將操作系統(tǒng)改為 CentOS 7,命令基本一致,主要示例一下數(shù)據(jù)庫(kù)的全備份,增量備份以及數(shù)據(jù)恢復(fù)。
環(huán)境說(shuō)明
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
本系統(tǒng)初始有兩個(gè)用戶
超級(jí)管理員: root
管理組用戶: admin,本例中?${USER}?就是這個(gè)用戶
安裝 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?命令將可以使用,本例的腳本會(huì)使用這些命令進(jìn)行數(shù)據(jù)的備份和恢復(fù)。
配置一個(gè) MySQL 備份用戶并且添加測(cè)試數(shù)據(jù)
首先使用 MySQL 的?root?用戶登錄。
$ mysql -u root -p
創(chuàng)建一個(gè) MySQL 用戶并且授權(quán)
在 MySQL 中創(chuàng)建一個(gè)用戶名為?backup?的用戶,并且分配備份的相關(guān)權(quán)限給它。
mysql> CREATE USER 'backup'@'localhost' IDENTIFIED BY 'password';
授予備份的相關(guān)權(quán)限
mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT, CREATE TABLESPACE, PROCESS, SUPER, CREATE, INSERT, SELECT ON *.* TO 'backup'@'localhost';
mysql> FLUSH PRIVILEGES;
創(chuàng)建測(cè)試數(shù)據(jù),創(chuàng)建一個(gè) playground 的數(shù)據(jù)庫(kù),創(chuàng)建一個(gè) equipment 的表,并且添加一條記錄到這個(gè)表里。
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");
此后我們將用這個(gè)數(shù)據(jù)庫(kù)查看測(cè)試備份和恢復(fù)的效果。
mysql> SELECT * FROM playground.equipment;
+----+-------+-------+-------+
| id | type | quant | color |
+----+-------+-------+-------+
| 1 | slide | 2 | blue |
+----+-------+-------+-------+
1 row in set (0.00 sec)
在我們退出 MySQL 會(huì)話前,我們先檢查一下?datadir?變量。因?yàn)槲覀冞€要?jiǎng)?chuàng)建一個(gè)操作系統(tǒng)的?backup?用戶,而且這個(gè)需要有權(quán)限訪問(wèn)這個(gè)目錄。
mysql> SELECT @@datadir;
+-----------------+
| @@datadir |
+-----------------+
| /var/lib/mysql/ |
+-----------------+
1 row in set (0.00 sec)
記住這個(gè)目錄,現(xiàn)在可以退出 MySQL 了。
mysql> exit
Bye
配置操作系統(tǒng)的備份用戶并授權(quán)
創(chuàng)建 backup 用戶,不需要登錄系統(tǒng),沒(méi)有 home 目錄
$ sudo useradd -M -s /sbin/nologin backup
確認(rèn)一下 backup 用戶和組
$ grep backup /etc/passwd /etc/group
/etc/passwd:backup:x:1001:1001::/home/backup:/sbin/nologin
/etc/group:backup:x:1001:
MySQL 的數(shù)據(jù)目錄?/var/lib/mysql?的所有者和所有組是?mysql。
我們需要將 backup 加入到 mysql 組里,這樣 backup 就可以訪問(wèn) mysql 組的目錄和文件。
我們需要將?sudo?加入到 backup 組里,這樣我們就可以訪問(wèn) backup 用戶和組權(quán)限的目錄和文件。
命令執(zhí)行如下
$ sudo usermod -aG mysql backup
$ sudo usermod -aG backup ${USER}
此時(shí)我們?cè)贆z查一下 backup 的組
$ grep backup /etc/group
mysql:x:27:backup
backup:x:1001:admin
新加入的組不會(huì)立即生效,需要執(zhí)行如下命令
$ exec su - ${USER}
執(zhí)行之后,可以使用如下命令確認(rèn)
$ id -nG
admin wheel backup
注意:?admin?是 admin 的組,wheel?是 CentOS 默認(rèn)的 sudo 組,backup?是新增的 mysql 備份的組。
創(chuàng)建備份相關(guān)的資源
現(xiàn)在我們已經(jīng)有了 Mysql 用戶?backup, 系統(tǒng)用戶?backup,我們需要?jiǎng)?chuàng)建配置文件,密鑰文件和其他腳本,這樣我們就可以創(chuàng)建并保護(hù)備份的安全。
創(chuàng)建 MySQL 備份的配置文件
我們將 MySQL 備份用戶?backup?的用戶名和密碼放到配置中。
$ sudo mkdir /etc/mysql
$ sudo vi /etc/mysql/backup.cnf
加入如下內(nèi)容:
[client]
user=backup
password=password
保存并退出?:wq,這樣 MySQL 的配置文件就創(chuàng)建完畢,以后備份用戶就會(huì)使用這個(gè)文件的配置登錄 MySQL ,注意?password=password?這個(gè)密碼是 MySQL 里面的用戶?backup?的密碼。
創(chuàng)建備份的根目錄
本例使用?/backups/mysql?為備份文件的根目錄,使用如下命令創(chuàng)建:
$ sudo mkdir -p /backups/mysql
對(duì)這個(gè)目錄的所有者和所有組進(jìn)行分配, 所有者為 backup,所有組為 mysql
$ sudo chown backup:mysql /backups/mysql
CentOS 7 默認(rèn)啟用了 SELinux,這也需要進(jìn)行授權(quán),可以先查看一下
$ ls -lh -Zd /backups/mysql/
drwxr-x--x. backup mysql unconfined_u:object_r:var_lib_t:s0 /backups/mysql/
授權(quán)命令如下: 只更改類型即可
$ 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/
此時(shí),SELinux 授權(quán)完成。
這樣 backup 用戶就可以進(jìn)入并操作這個(gè)目錄了
創(chuàng)建密鑰保護(hù)備份文件安全
因?yàn)閿?shù)據(jù)庫(kù)文件是非常重要的文件,所以安全非常重要。?innobackupex?工具提供了加密和解密的功能。為此,我們只需要提供一個(gè)密鑰即可。
我們使用?openssl?命令來(lái)創(chuàng)建一個(gè)密鑰
$ printf '%s' "$(openssl rand -base64 24)" | sudo tee /backups/mysql/encryption_key && echo
修改這個(gè)文件的權(quán)限,保證這個(gè)文件只能?backup?用戶可以使用。
$ sudo chown backup:backup /backups/mysql/encryption_key
$ sudo chmod 600 /backups/mysql/encryption_key
創(chuàng)建備份和恢復(fù)的腳本
目前安全方面的準(zhǔn)備已經(jīng)完成,我們需要?jiǎng)?chuàng)建 3 個(gè)腳本,來(lái)執(zhí)行備份(加密備份),釋放(解密)和恢復(fù)準(zhǔn)備的工作。
backup-mysql.sh: 這個(gè)腳本完成備份數(shù)據(jù)庫(kù),對(duì)備份的文件進(jìn)行加密和壓縮,他會(huì)根據(jù)日期創(chuàng)建全量和增量的備份,默認(rèn)保存 3 天的備份。
extract-mysql.sh: 這個(gè)腳本會(huì)解壓并解密備份文件,并將文件放到指定的文件夾中。
prepare-mysql.sh: 這個(gè)腳本為恢復(fù)做最后的準(zhǔn)備,將增量文件合并到全備份中。并且記錄執(zhí)行的日志,如果這個(gè)腳本執(zhí)行完,那么剩下的就是將恢復(fù)的數(shù)據(jù)庫(kù)替換即可。
創(chuàng)建 backup-mysql.sh 腳本
$ sudo vi /usr/local/bin/backup-mysql.sh
腳本內(nèi)容如下:
#!/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
總結(jié)
以上是生活随笔為你收集整理的mysql 5.7 xbackup_CentOS 7 下 MySQL 5.7 配置 Percona Xtrabackup的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php ajax mysql 分页查询_
- 下一篇: 在内网中使用maven_maven构建d