企业中如何对Mysql数据库进行热备份
A.基础概念问答:
-
为什么要使用热迁移?
答:传统的数据库迁移方式(1、mysqldump;2、停机直接复制文件)都需要面临应用服务暂时停止访问的问题。如果数据库文件过大(GB级别),服务暂停时间甚至需要按小时计算。对于生产环境而言这是不可接受的。
-
如何实现热迁移?
使用xtrabackup,以下为xtrabackup的热备原理图。
知识引申: http://mysql.taobao.org/monthly/2016/03/07/
注意点:实际中xtrabackup也会存在锁表,对于备份myism引擎的数据会全程锁表,对于备份innodb引擎的数据会存在短暂锁表(秒到分钟级别,个人在生产环境验证过热备200G左右的数据库文件,整个备份过程大概是5分钟,锁表时间是秒级别)。所以xtrabackup特别适合大数据库文件备份。
-
xtrabackup存在那些优缺点?
优点:
- 备份速度极快,可以实现innodb的热备份。
- 基于物理备份,成功率高。
- 对内存,CPU资源的消耗可控且小
- 恢复速度极快。
缺点:
- xtrabackup生成的文件相对要比mysqldump等文件要大,因为他是基于物理备份的(mysqldump为逻辑备份)
- 不是mysql自带的工具,需要额外安装。
- 备份与恢复的操作相比mysqldump要繁琐些
- 支持文档没有mysqldump那么全面,网络上的资源文档参差不齐需要自己辨别。
B.具体的操作说明(以centos7,mysql5.7为例)
1、xtrabackup安装
依赖安装:
yum install -y perl-DBD-MySQL yum install -y perl-Digest-MD5 yum install -y perl-DBI yum install -y perl-DBD-MySQL yum install -y perl-Time-HiRes yum install -yperl-IO-Socket-SSL
xtrabackup下载:
下载地址: https://www.percona.com/downloads/Percona-XtraBackup-2.4/LATEST/
注意事项:
1、xtrabackup需要和本机的libgcrypt对应。例如通过yum list installed|grep libgcrypt查看本机的libgcrypt。
Xtrabackup安装:
解压下载的文件: tar –zvxf percona-xtrabackup-2.4.18-Linux-x86_64.libgcrypt153.tar.gz 移动文件:mv percona-xtrabackup-2.4.18-Linux-x86_64 /usr/local/xtrabackup 建立命令软连接:ln -sf /usr/local/xtrabackup/bin/* /usr/bin/
Xtrabackup数据库备份:
innobackupex --defaults-file=/etc/my.cnf --user=备份用账号 --password=备份用账户密码 --socket=/tmp/mysql.sock /tmp/backup/
注意:提示completed ok!表示备份成功。成功后/tmp/backup会生成一个日志命名格式的文件夹。
传输备份文件到需要迁移的主机 scp –P 2222 /tmp/backup/2019-12-31_09-44-20 root@192.168.8.117/tmp/
在需要恢复的主机上对备份文件进行日志重放
注意:这个是实现不停机迁移恢复备份的关键步骤,另外恢复备份数据的主机也需要安装Xtrabackup才能执行相关命令。
innobackupex --apply-log /tmp/2019-12-31_09-44-20
在待恢复的主机上关闭MySQL服务并让datadir为空。 service mysqld stop mv /usr/local/mysql/data /usr/local/mysql/data_bak && mkdir /usr/local/mysql/data
利用全备数据进行数据恢复:
innobackupex --defaults-file=/etc/my.cnf --copy-back --rsync /tmp/2019-12-31_09-44-20
修改恢复后文件的所属信息
chown –R mysql:mysql /usr/local/mysql
启动mysql
service mysqld start
至此mysql的全量备份迁移已经完成。但是在热迁移过程中,数据库是时实更新的。我们在拿到备份数据恢复的这段时间中数据库依然有新数据产生。所以还需要继续对binlog进行追赶,直到数据完全一致。
查看Xtrabackup备份时记录的binlog文件名和pos日志偏移量
cat /tmp/2019-12-31_09-44-20/xtrabackup_binlog_info 注意:恢复后的/usr/local/mysql/data/路径中也有这个文件。
登入mysql设置主从同步,追binlog
mysql –uroot –p登入密码 注意:数据同步尽量不要使用root账户,应该重新建立一个单独账户。 stop slave; change master to master_host='192.168.8.86', master_port=3306, master_user='root', master_password='账户密码', master_log_file='mysqlbin.000002', master_log_pos=14970574; start slave; show slave status; 注意:这两项为yes表示成功。
待binlog追平后我们可以在应用的负载均衡中,转发业务请求到新迁移的数据库中。并执行stop slave;停止追赶数据库,并停止被迁移的mysql服务。
知识拓展:
对于高并发的系统,如果后端的mysql是集群模式,则不建议使用binlog加pos(日志偏移量)的方式来做主从同步,而是使用mysq5.7的新特性gtid来实现集群同步。
拓展知识关键词:mysql,gtid
本文系作者 @Mr.Lee 原创发布在 维简网。未经许可,禁止转载。