Mysql主从同步搭建
in 默认分类 with 0 comment

Mysql主从同步搭建

in 默认分类 with 0 comment

第一次搭建Mysql的主从同步,记录一下。

环境

注:一开始以为搭建完主从同步后,从库会自动复制主库的旧数据,但实际上发现并不会,只有在主从搭建完成后才会保持同步更新,所以建议主从库的数据和结构保持一致再开始配置。

主库配置

修改主库服务器的Mysql配置文件

vim /etc/my.cnf
# 指定一个server的id,随便起只要不重复即可,因为这台是主,所以直接给1
server-id=1
# 开启binlog日志并且指定日志的位置,从库就是根据这个日志做数据同步的
log_bin=/var/log/mysql-bin.log
# 日志的缓存时间,设置5天
expire_logs_days=5
#日志的最大大小,设置5G
max_binlog_size=5G
#同步的数据库名称
binlog_do_db=test
#忽略同步的数据库
#binlog_ignore_db = mysql
systemctl restart mysqld

注: 重启的时候发现启动失败,查看日志后发现是缺少/var/log/目录的权限,赋予权限:

chmod 777 /var/log/

赋予完权限后再次启动Mysql应该就正常了。

创建同步账号

mysql -u root -p 123456
CREATE USER 'syncuser'@'%' IDENTIFIED BY '123456789';
GRANT REPLICATION SLAVE ON *.* TO 'syncuser'@'%' IDENTIFIED BY '123456789';
flush privileges;
show master status;

这句执行完,能看到以下内容

+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |     3746 | test         |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

这里的File字段和Position字段在后面的从库上需要使用到。Binlog_Do_DB就是我们需要同步的库。

至此主库的配置完成,接下来配置从库。

从库配置

修改从库服务器的Mysql配置文件

vim /etc/my.cnf
#设置一个serviceid,不允许与其他服务器的重复
server-id=2
##日志的缓存时间,5天
expire_logs_days=5
##日志的最大大小,5G
max_binlog_size=5G
##同步的数据库名称
replicate_do_db=test
##忽略同步的数据库
##replicate_ignore_db = mysql
systemctl restart mysqld

配置同步信息

mysql -u root -p 123456
change master to master_host='192.168.0.102', master_user='syncuser', master_password='123456789', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=3746;

注:这里的master_log_filemaster_log_pos都是在主库中获取的(也就是上面提到的File字段和Position字段),需要和主库查询出来的保持一致。

start slave;

附上停止同步的命令:

stop slave;
show slave status\G;

这里会跳出一堆内容,其中Slave_IO_RunningSlave_SQL_Running两个字段为Yes就代表目前正常同步,可以尝试在主库的test表中添加一条数据,看看从库对应的test表是否同步。

过程可能出现的问题

问题1

在从库上查看同步状态,发现报错了下面的错:

Last_Error: Error executing row event: 'Table 'test.test' doesn't exist'

是因为从库没有对应的表结构。

问题2

在从库上查看同步状态,发现报错了下面的错:

Last_SQL_Error: Could not execute Update_rows event on table test.test; Can't find record in 'test', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000001, end_log_pos 3205

这是因为我在配置从库前修改了表数据,导致从库的master_log_pos字段和主库的Position字段不一致。查询下主库的Position字段,从库重新执行下change master to...语句即可。

问题3

Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; 
these UUIDs must be different for replication to work.

创建虚拟机的时候为了方便,在装完mysql之后直接复制了一份虚拟机,导致两个MySQL的auto.cnf文件中UUID是一样的,所以需要修改其中一个的UUID。
该文件在/var/lib/mysql/auto.cnf,可以直接删掉,重启MySQL服务会自动生成:

mv auto.cnf auto.cnf.bk
systemctl restart mysqld
Responses