背景

目前公司主要服务都是直接使用 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;

参考