MySQL(十):MySQL主从复制搭建
主从复制有一主一从、一主多从、多主一从等多种模式,这里搭建一主一从模式,其他模式搭建过程的类似。
1、准备工作
准备两台虚拟机,这里准备了两台虚拟机,并在两个节点安装MySQL。
192.168.33.55 (主节点)
192.168.33.11 (从节点)
mysql version : 8.0.31
2、主从复制搭建
2.1、在主从节点同时创建mall数据库
2.2、创建表
CREATE TABLE `order` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键', `price` decimal(10,2) NOT NULL COMMENT '价格', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4COLLATE=utf8mb4_0900_ai_ci;
2.3、添加配置
3.3.1、主节点配置
vi /etc/my.cnf
添加如下配置:
#在mysqld模块中添加如下配置信息
log-bin=mysql-bin #二进制文件名称
binlog-format=ROW #二进制日志格式
server-id=53306 #服务id,各节点不能相同,一般使用ip最后一位 + 数据库端口号
binlog-do-db=mall #同步的数据库名称
binlog-ignore-db=mysql #忽略的数据库名称
3.3.2、从节点配置
vi /etc/my.cnf
添加如下配置:
#在mysqld模块中添加如下配置信息
log-bin=mysql-bin #二进制文件的名称
binlog-format=ROW #二进制文件的格式
server-id=13306 #服务器的id
3.3.3、注意事项
主从配置一定要添加在[mysqld]下,我第一次配置将配置内容添加在了[mysqld_safe]下,my.cnf配置的文件内容未生效,导致主从的服务id相同,丛节点出现如下错误:
修改完配置后,重启数据库。
2.4、登录主库,创建绑定账号
登录主数据库 mysql -u root -p
4.4.1、创建绑定用户
登录主数据库mysql -u root -p,创建绑定用户:
--授权操作 create user 'snails'@'%' IDENTIFIED BY 'snails'; GRANT REPLICATION SLAVE ON *.* TO 'snails'@'%'; alter user 'snails'@'%' IDENTIFIED WITH mysql_native_password BY 'snails';
4.4.2、查看主库状态
show master status
记录File和Position,在从数据库连接主数据库时需要用到。
4.4.3、登录从数据库连接主服务器
change master to master_host='192.168.33.55',master_user='snails',master_password='snails',master_port=3306,master_log_file='mysql-bin.000001',master_log_pos=1254;
4.4.4、启动slave
start slave;
4.4.5、查看slave状态
show slave status\G
当IO、SQL运行为Yes时,表示主从复制配置成功。
4.4.6、验证主从复制
在主数据库中添加记录:
稍等片刻,登录从数据库,查看数据同步情况。
3、搭建过程中出现的问题
3.1、主从配置my.cnf未生效导致服务id重复
执行show slave status\G,查看从库状态时出现:
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).
在my.cnf配置文件中,主节点数据库的server-id配置为 53306,从节点数据库的server-id配置的为13304。但登录主从数据库mysql -u root -p,执行查看服务id命令:
show variables like 'server_id';
发现无论是主节点还是从节点,server_id都为 1,my.cnf配置文件没有生效。
问题原因:
my.cnf的配置内容写在了[mysqld_safe]标签后面,导致未生效。
解决方案:
将配置内容设置到[mysqld]标签后,[mysqld_safe]标签前。
3.2、主库默认插件导致同步权限问题
执行show slave status\G,查看从库状态时出现:
Last_IO_Error: error connecting to master 'slave@192.168.33.55:3306' - retry-time: 60 retries: 1 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
问题原因:
主库plugin是caching_sha2_password 导致连接不上,修改为mysql_native_password即可解决。
解决方案:
登录主数据库mysql -u root -p,执行如下命令:
alter user 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'slave';
3.3、binlog日志文件不匹配同步失败
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'
问题原因:
日志文件读取错误,在从数据与主数据库建立关系时,master_log_file文件名称与主数据库中的文件名称不一致,导致无法读取日志文件
从数据库与主数据库建立关系的日志名称:
主数据库,show master status\G 的 File名称。
3.4、相同的server UUIDS问题
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.
问题原因:
主数据库与从数据的server UUID相同。登录主从数据库mysql -u root -p,查看uuid值:
show variables like '%server_uuid%';
解决方案:
find -name auto.cnf
修改auto.cnf中的uuid值使得主从数据库的uuid不同即可。