#1—环境与工作场景:量化派

使用背景:MySQL 主从架构中的从库宕机,只剩主库在高负载运行。此时急需对主库数据进行备份,并尽快重新搭建从库。
#2—经验总结:合格的运维工程师或 DBA 在操作数据库数据之前,首先要做好备份。
这样当数据库出现异常或故障时,才能快速进行恢复。
但是传统的数据恢复过程通常比较耗时,往往难以满足业务对恢复时效的要求,因此需要使用更高效的数据库备份与恢复工具。
之前也了解到 mysqldump 在某些场景下可能会锁表,尤其是大数据量备份时速度较慢。
经过研究后,我们最终决定采用 percona innobackupex。它是一款常用的 MySQL 热备工具,支持全量备份和增量备份。
优点很多,整体非常适合生产环境使用。下面直接整理操作手册,便于后续自己快速执行 MySQL 备份与恢复。
#3—安装
innobackupex 的安装方式可以直接参考官网,官方提供了多种安装方案:https://www.percona.com/doc/percona-xtrabackup/2.4/index.html
我们采用的是 rpm 包安装方式,这样便于后续统一版本管理,
###3.1 下载包 wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.0/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.0-rc1.1.el7.x86_64.rpm
###3.2 本地安装 yum localinstall percona-xtrabackup-24-2.4.0-rc1.1.el7.x86_64.rpm
###3.3 卸载命令 yum remove percona-xtrabackup
###4 数据备份与恢复
备份之前,需要将原有 MySQL 的 data 目录清空。注意,必须将 data 目录中的内容全部删除。。data 目录全部清空。。data 目录全部清空。。##4.1—备份数据
innobackupex --defaults-file=/your/path/of/mysql/3306/my.cnf --user=root --password=123456 --port=3306 --host=localhost --parallel=4 --database=test /path/to/BACKUP-DIR/ 2>/tmp/data/err.log
友情提示:
①——
--parallel=4 该参数可以显著提升数据备份速度,这里可理解为将备份效率提升到约四倍;
②——
--database=test 表示仅对 test 数据库单独备份;如果不加此参数,则表示对整个 MySQL 实例进行全库备份
③——
2>/tmp/data/err.log 将输出信息写入日志文件,便于排查备份问题
④——我们没有选择在备份过程中直接压缩数据,因为压缩会额外占用数据库操作时间,所以最终采用在数据库备份完成之后,再使用 tar zcf 的方式进行压缩。实践证明,这种方式更适合我们的业务场景。##4.2—准备数据
innobackupex --apply-log --use-memory=4G /path/to/BACKUP-DIR
友情提示:--use-memory=4G 该命令默认大小是100m,可以根据服务器内存情况适当调大,以提升数据恢复速度##4.3—开始恢复
innobackupex --copy-back /path/to/BACKUP-DIR实际操作一次,你就会感受到它在 MySQL 热备和快速恢复方面的效率优势。
#5—权限设置
chown -R mysql:mysql mysql目录#6—完成以上步骤后,就可以继续操作你的数据库了。
#7—
我们第一次使用时,在备份到 18G 左右的位置遇到了一些异常,出现过短暂锁表的情况。第二次执行数据库备份时,在进行到 16G 左右时临时将 3306 端口 drop 掉,待备份完成后,再恢复该端口访问。
--16G时
iptables -A INPUT -p tcp --dport 3306 -j DROP
--数据恢复完后
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
service iptables stop
service iptables start*8—远程冷备:实用神技能,尤其是最后这一句最关键
#!/bin/bash
backup_time=`date +%Y_%m_%d_%H`
current_ip="${要备份的机器ip}"
remote_ip="${远程机器ip}"
remote_path="/home/quant_group/mysql/${current_ip}/full/${backup_time}.tar"
mysql_host="--host=${current_ip}"
mysql_user="--user=${备份的用户名}"
mysql_pass="--password=${备份的密码}"
mysql_port="--port=3306"
defaults_file="--defaults-file=/home/quant_group/mysql/3306/my.cnf"
innobackupex ${defaults_file} ${mysql_user} ${mysql_pass} ${mysql_port} ${mysql_host} --stream=tar ./ | gzip | sshpass -p '' ssh root@${remote_ip} "cat - > ${remote_path}"