使用ansible和xtrabackup对目标mysql数据库进行物理热备份,备份后把备份数据从目标mysql数据库主机回传到本机。
- 本机: 安装了ansible的控制主机, 也是备份机。
- 远程mysql数据库:需要备份的mysql数据库,也叫目标mysql数据库。
- 本软件运行在centos 7, 并且ansible 2.4+, Python 2.7 已安装, sshd服务已启动。
- 目标mysql数据库服务器的操作系统也是centos 7,Python 2.7 已安装,sshd服务已启动。
- 对本机和目标mysql数据服务器都有超级用户权限。
在本机的root用户HOME目录/root/下,以root用户执行下列步骤:
git clone https://github.com/tjnh05/mysqlbackup.git
下面命令创建数据备份目录/data/backups/full和日志目录/var/log/xtrabackup。出于安全考虑,需要设置相关目录和文件的访问权限。
chown 0700 ~/mysqlbackup/scripts && \
chmod 0600 ~/mysqlbackup/scripts/*.yml && \
chmod 0700 ~/mysqlbackup/scripts/xtrabackup.sh && \
mkdir -p /data/backups/full && \
chmod -R 0750 /data/backups && \
mkdir -p /var/log/xtrabackup && \
chmod 0755 /var/log/xtrabackup
配置包括ansible的配置,修改配置文件以配置目标mysql数据库的root用户密码,备份用户名和密码,数据库数据目录, 备份基础目录,以及备份数据过期天数。
修改配置文件/etc/ansible/hosts, 增加mysql数据库服务器配置。 示例如下:
vi /etc/ansible/hosts
[mysqldbserv]
10.13.1.103 ansible_user=root ansible_password=password
把IP地址10.13.1.103修改成目标mysql数据库服务器的IP地址或域名
ansible_user设置为root
ansible_password修改为ansible_user对应用户的密码
备注:
如果是通过无密码ssh访问方式,则需要修改/etc/ansible/ansible.cfg, 并设置私钥文件。
示例如下:
vi /etc/ansible/ansible.cfg
private_key_file=/root/.ssh/id_rsa
如果RSA密钥对没有,可以运行如下命令:
ssl-keygen -t rsa
具体过程请参考以下链接:
https://www.centos.org/docs/5/html/5.2/Deployment_Guide/s3-openssh-rsa-keys-v2.html
修改配置文件~/mysqlbackup/scripts/tdbvars.yml,设置目标mysql数据库的root用户,用于后续创建备份用户,如果备份用户已存在,可以不修改该文件。
mysql_root_password: "8f2370778b445915157a"
修改配置文件~/mysqlbackup/scripts/dbavars.yml。
#目标mysql数据库的备份用户
backup_user: backup
#备份用户的密码
backup_password: "536b43778f5883433969"
#存储数据库备份的基础目录
#该目录在本机和目标MYSQL主机上是相同的
base_dir: /data/backups/full/
#目标MYSQL数据库的数据目录
datadir: "/data/mysql"
#备份保存天数,陈旧的备份将被删除
expired_days: 15
在MYSQL主机上安装软件Xtrabackup,rsync, MYSQL-python。需要连互联网。
在本机目录~/mysqlbackup/scripts下运行如下命令:
ansible-playbook installremote.yml
如果安装报错,则运行如下命令以安装:
ansible-playbook installremote.yml --extra-vars="mysql_compat=yes"
如果备份用户在目标mysql数据库上已存在,则忽略本步骤。
ansible-playbook backupuser.yml
在本机的部署目录~/mysqlbackup/scripts运行如下命令:
ansible-playbook xtrabackup.yml --extra-vars="backup_date=$(date +%Y%m%d)"
回传的备份放在/data/backups/full/目录下。
备份的过期天数在配置文件dbavars.yml里由配置项expired_days设置,单位天。
目标mysql主机过期的备份将被删除。
如果需要定时备份数据库,可以把备份命令放在crontab里由cron定时执行。
假设是每天凌晨两点运行,则运行命令'crontab -e',并增加如下内容:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/ibutils/bin:/root/bin:/root/scripts
MAILTO=root@localhost
0 2 * * * /root/mysqlbackup/scripts/xtrabackup.sh
注意:本过程只在做数据库恢复时才使用。
在本机的部署目录~/mysqlbackup/scripts
运行如下命令,其中20171123需替换成相应的全量备份日期。
ansible-playbook restore.yml --extra-vars="backup_date=20171123"