mysql 5.5主从单向实时同步配置

Archives

一、master服务器操作:
1)进phpmyadmin导出需要同步的数据库sql
2)在phpmyadmin中创建用户,并设置针对需要同步数据库的权限(通常已经有针对这个数据的单独用户,就不需要创建了)
注意该用户需要允许外网访问(localhost改为%),另外注意iptables规则(需要放行mysql端口)
3)进ssh,运行

mysql -u root -p

登录mysql
在mysql命令行中运行

GRANT REPLICATION SLAVE ON *.* TO 'base'@'%';

添加同步权限,上述base为第2)步中的用户名
3)进ssh运行

lnmp mysql stop

停止mysql
4)修改my.cnf文件(注意备份原文件)

server-id    = 1

行后增加

binlog-do-db    = base

上述base为需要同步的数据库名称
5)重启mysql数据库

lnmp mysql start

6)在mysql命令行界面运行

SHOW MASTER STATUS;

记录MASTER_LOG_FILE和MASTER_LOG_POS参数,留待slave服务器配置使用
备注:这两个参数比较重要,弄错或者留空,很容易导致同步出错

二、slave服务器操作
1)进phpmyadmin创建用户和数据库(和master服务器一致),并导入master服务器导出的sql
2)lnmp mysql stop
3)修改my.cnf文件(注意备份原文件)

server-id    = 1

改为

server-id    = 2

并在下方增加

replicate-do-db    = base
log-slave-updates

上述base为需要同步的数据库名称
4)lnmp mysql start
5)设置MASTER参数,在mysql命令行界面运行:

change master to master_host='xxx.xxx.com', master_user='base', master_password='xxxxxxxx',MASTER_LOG_FILE='mysql-bin.000021',MASTER_LOG_POS=201028;

上述最后两个参数在第一步的的第6)步有介绍
6)启动同步,在mysql命令行界面运行:

slave start;

7)可与在mysql命令行界面运行:

show slave status;

查看同步状态是否正常。

三、问题处理

1)重启master服务器后,mysql主从同步失败
查看错误日志,报错信息如下:

191011 18:47:32 [ERROR] Slave SQL: Error 'Duplicate entry '2329' for key 'PRIMARY'' on query. Default database: 'base'. Query: 'INSERT INTO `aws_user_action_history` (`uid`, `associate_type`, `associate_action`, `associate_id`, `associate_attached`, `add_time`, `anonymous`) VALUES ('1', '1', '401', '96', '150', '1570790852', '0')', Error_code: 1062
191011 18:47:32 [Warning] Slave: Duplicate entry '2329' for key 'PRIMARY' Error_code: 1062
191011 18:47:32 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'mysql-bin.000021' position 820045
191011 18:52:09 [Note] Slave: received end packet from server, apparent master shutdown: 

未知原因导致同步时的主键重复,解决方案为:
在slave服务器上停用mysql,修改my.cnf,添加:

slave_skip_errors    = 1062

重新启动mysql,主从同步成功。(此方案有何负面影响暂时无法预估,待观察

测试时曾在从服务器的网站上有过编辑操作,改变了从服务器上的数据库,因此导致了以上错误。
正常使用热备份时,避免主、从数据库同时使用/操作,不应该出现上述问题,因此也不应该在my.cnf中添加1062错误的skip