一个Web系统有一主两从的小型MySQL集群,通过Amoeba调度。近日发现主从之间的同步发生异常,从库无法更新数据。试了多种方法无法恢复后,决定重新建立从库数据。方法如下。
假设主库为server1,两个从库为server2和server3
主库server1的IP地址是192.168.0.2
从库server2的IP地址是192.168.0.3
从库server3的IP地址是192.168.0.4
一、停止Amoeba的主从调度,将所有数据库读写导向主库server1
进入Amoeba的conf目录,打开dbServers.xml文件
${defaultManager}
640
1280
3306
appdb
amoeba
moocsakai
1200
500
100
600000
600000
true
true
true
192.168.0.2
192.168.0.3
192.168.0.4
1
server2,server3
定位到XML文件内容位置,将其中的server2,server3改为server1,server2后,保存xml文件,再进入Amoeba的bin目录使用如下命令重启amoeba
./shutdown
./launcher
经过这一步骤后,Amoeba将所有的读写请求定向到server1,server2和server3被旁路开了。
二、备份主库server1
进入server1,使用如下命令备份主库的日志到目录/mooc/databackup
innobackupex --user=root --password=abc /mooc/databackup/ -socket=/tmp/mysql.sock
备份成功后,会在目录/mooc/databackup下生成新的目录2016-07-15_12-29-39,其中包含了数据库中所有数据操作日志文件
三、全量恢复从库server2和server3。以server2为例,server3方法相同
1、拷贝主库的备份日志文件到从库某目录下,假设/moocmysql
scp -r /mooc/databackup/2016-07-15_12-29-39 root@server2:/moocmysql
2、登录到从库server2机器,将日志文件在从库恢复
innobackupex --defaults-file=/etc/my.cnf --apply-log /moocmysql/2016-07-15_12-29-39
3、停止从库服务器,并删除其中所有数据,假设server2的数据保存在/moocmysql/data目录下
service mysqld stop
rm -rf /moocmysql/data/*
4、全量恢复从库的数据到/moocmysql/data/
innobackupex --defaults-file=/etc/my.cnf --copy-back /mooc/databackup/2016-07-15_12-29-39
5、设置数据访问权限
chown -R mysql:mysql /moocmysql/data
6、启动mysql
service mysqld start
7、找到本次全量更新的新的同步点
cat /moocmysql/data/xtrabackup_binlog_pos_innodb
返回两个信息
master-bin.000297 248684412
8、进入mysql的控制台,设置新的同步点为这两个信息
停止slave
stop slave;
改变同步参数
change master to master_host='10.128.18.162',master_user='mooc2',master_password='moocsakai',master_log_file='master-bin.000297',master_log_pos=248684412;
启动slave
start slave
查看主从设置状态
show slave status\G;
看到信息Slave_IO_Running: Yes和Slave_SQL_Running: Yes就表示设置成功了。
四、恢复Amoeba的主从调度,修改dbServer.xml,定位到XML文件内容位置,将其中的server1,server1改回server2,server3后,保存xml文件,再进入Amoeba的bin目录使用如下命令重启amoeba
./shutdown
./launcher
至此,操作应该完成。
注意可能发生的错误
如果启动mysql从库时报错pid不存在,则应做如下查看:
1、查看通过scp命令拷贝数据的时候,是否所有日志文件都全部拷贝完成,可以通过比较文件个数和目录大小查看。
2、查看是否修改了数据的访问权限