背景
目前公司主要服务都是直接使用 MySQL 主服务器,从服务主要给离线数据分析服务使用,由于前期弄得比较简单的粗暴,从服务上还有一两个数据库在做生产使用, 并且从服数据已经不能和主服进行进行同步了,有大量错误,忽略都没有办法进行。此外,主服仅配置了三个核心数据的 binlog,随着业务的变化,其它数据库不能走主从这条路来同步数据,于是希望不停机的情形下重新调整主服配置,记录所有的数据库的 binlog,同时添加新的从服务器来同步数据
方案 1
MySQL 的主从是通过同步 binlog 日志来实现数据同步的,于是需要想办法把从服数据先于主服同步,记录 binlog 的 pos 值,再配置从服从该 pos 处开始同步,考虑可以使用 mysqldump 导出所有 innodb 数据,使用 rsync 同步所有 myisam 数据文件,然后再开启主从同步。但是目前这种方案不适用,主服不能长时间停机
方案 2
使用 xtrabackup 来完成目标
主从服务器上都需要安装 xtrabackup(实际使用 xtrabackupex):
yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
yum install -y percona-xtrabackup-24
主服:
备份数据
# 注意数据库名称的转义,例如 - 号是 @002d
innobackupex --defaults-file=/etc/my.cnf --socket=/var/lib/mysql/mysql.sock --user=root --password=xxxx --parallel=2 --databases="db1 db2" /data/backup/xtrabackup/
保持事务一致
innobackupex --apply-log /data/backup/xtrabackup/2017-06-06_13-16-21/
同步数据
rsync -avHz 2017-06-06_13-16-21 sysops@cow:/data/backup
从服:
修改 my.cnf 相关配置,恢复备份数据
# 关闭 MySQL Servier 后恢复数据
innobackupex --defaults-file=/etc/my.cnf --copy-back /data/backup/2017-06-06_13-16-21
修改数据权限
chown -R mysql.mysql mysql
开启从服,登录 msyql 添加主从配置,并开启同步
# Master 上执行
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.23.9.146' IDENTIFIED BY 'password';
# Slave 上执行
[root@bull data]# cat backup/2018-04-26_21-27-31/xtrabackup_binlog_info
mysql-bin.000058 103394265
CHANGE MASTER TO
MASTER_HOST='10.4.25.28',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000058',
MASTER_LOG_POS=103394265;
检查主从状态
show master status;
show slave status\G;
参考
- [percona-xtrabackup] (https://www.percona.com/doc/percona-xtrabackup/LATEST/index.html)
- [wsgzao.github.io/post/xtrabackup] (https://wsgzao.github.io/post/xtrabackup/)