MySQL主从同步配置
机器准备
- 机器准备 :一主二重的配置
准备好三台虚拟机,分别安装MySQL。笔者为了省事,先准备了一台虚拟机,安装台好MySQL(但也埋下了祸根),再以此虚拟为母体,克隆两台虚拟机,这样MySQL也不用另外安装了。
- 实验环境
VM12,centos7,mysql5.7
- 安装MySQL5.7过程
0.安装weget:yum -y install wget
1.wget https://repo.mysql.com//mysql57-community-release-el7-11.noarch.rpm
2.rpm -ivh mysql57-community-release-el7-11.noarch.rpm
3.yum install mysql-community-server
4.启动:systemctl start mysqld
4.查找root密码: grep 'temporary password' /var/log/mysqld.log
不成功:
清除:rm -rf /var/lib/mysql
重启:systemctl restart mysqld
执行:grep 'temporary password' /var/log/mysqld.log
查看密码
5.登录:mysql -u root -p
6.设置为utf-8默认编码
修改mysql的/etc/my.cnf 文件中的字符集键值
在[mysqld]字段里加入character_set_server=utf8,如下:
[mysqld]
port = 3306
socket = /var/lib/mysql/mysql.sock
character_set_server=utf8
7.重启:systemctl restart mysqld
8.查看编码:show variables like 'character%';//都设置为了UTF-8
9.设置远程访问:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'myPassWord' WITH GRANT OPTION;
FLUSH PRIVILEGES;
6.其他命令:
set password for 'root'@'localhost'=password('myPassWord');// 修改密码
systemctl restart mysqld; //重启
systemctl start mysqld; //启动
//设置开机自动启动
systemctl enable mysqld
systemctl daemon-reload
克隆机器
克隆机器也有很多注意的地方,MAC地址要重新生成
主:192.168.25.128
从0:192.168.25.133
从1:192.168.25.134
说明:因为在128号机器安装了MySQL,133,134机器是以128为母体克隆的,所以任何环境和配置都和128机器的相同,其中包括MySQL的密码
、server-id
,uuid
.
创建库表
- 创建库
在128号机主库机中创建master库
在133号机从库机0中创建slave0库
在133号机从库机1中创建slave1库 - 创建表
分别在master库、slave0库、slave1库中创建t_order表[表自己创,不一定要这张表]
create table `t_order` (
`order_id` int (11),
`user_id` int (11)
);
注意:库名不同[涉及到下面的一个重要配置],但表结构一样
主库master配置
修改/etc/my.cnf
配置
#配置server_id
server_id=1
#绝对路径,也是开启bin-log
log-bin=/var/lib/mysql/mysql-bin
sync_binlog=0
##设置日志的过期天数
expire_logs_days=7
## 要主从复制的库
binlog-do-db=master
## 忽略的库
binlog-ignore-db=information_schema
binlog-ignore-db=sys
binlog-ignore-db=mysql
binlog-ignore-db=performance_schema
给从库授权
赋予从库权限账号,允许用户在主库上读取日志 ,同时赋予 REPLICATION SLAVE的权限
- 给slave0授权
grant FILE on *.* to 'root'@'192.168.25.133' identified by 'myPassWord';
grant replication slave on *.* to 'root'@'192.168.25.133' identified by 'myPassWord';
flush privileges;
- 给slave1授权
grant FILE on *.* to 'root'@'192.168.25.134' identified by 'myPassWord';
grant replication slave on *.* to 'root'@'192.168.25.134' identified by 'myPassWord';
flush privileges;
- 重启master主库的mysql服务
systemctl restart mysqld
- 查看master状态
show master status;
主库状态.png
从库slave0配置
#配置server_id
server_id=2
## 这里写的不是全路径,也可以写全路径
log-bin=mysql-bin
binlog-ignore-db=information_schema
binlog-ignore-db=sys
binlog-ignore-db=mysql
################################################
#主库和从库的库名不一样,如果一样,以注释方法配置, #
#不一样,以未注释方法配置 #
###############################################
## replicate-do-db=slave0
# 以这种映射的方式配置
replicate-rewrite-db = master -> slave0
replicate-ignore-db=mysql
log-slave-updates
slave-skip-errors=all
slave-net-timeout=60
- 重启mysql服务
systemctl restart mysqld
- 配置slave0从库的slave
mysql> stop slave;
mysql> change master to master_host='192.168.25.128',master_user='root',master_password='myPassWord',master_log_file='mysql-bin.000002', master_log_pos=154;
mysql> start slave;
注意:master_log_file、master_log_file信息通过在主库中执行SHOW MASTER STATUS
命名查看
- 查看slave信息
如过 Slave_IO_Running: Yes和Slave_SQL_Running: Yes,则说明主从同步成功。 否则主从不成功。
从库slave1配置
配置与slave0配置大体一致,主要是server_id不一样,master_log_file、master_log_file信息要设置为最新的,重新查看
测试
在master库的表中插入一条数据,如果slave0和slave1库中的表同步更新,则说明主从同步配置成功
否则,继续往下看
问题
前面说到埋下祸根,现在就来解释一下。
前面在slave0从库中SHOW SLAVE STATUS
,发现Slave_IO_Running=NO
,没有起来,通过查到错误日志,发现有一行错误日志写道:
2020-05-09T03:25:57.881822Z 3 [ERROR] Slave I/O for channel '': 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. Error_code: 1593
UUID竟然重复了,克隆的机器啊,当然会重复,既然有问题,那就解决他
参考 https://blog.csdn.net/sunbocong/article/details/81634296博客,写的比较详细,具体方式是:删除和重新生成UUID
[root@localhost mysql]# systemctl stop mysqld.service
[root@localhost mysql]# rm -rf /var/lib/mysql/auto.cnf
[root@localhost mysql]# systemctl start mysqld.service
重新配置从库
mysql> stop slave;
mysql> reset slave all;
mysql> stop slave;
mysql> change master to master_host='192.168.25.128',master_user='root',master_password='myPassWord',master_log_file='mysql-bin.000002', master_log_file=154;
mysql> start slave;
重新测试,在master库中插入数据,slave0和slave1中的数据同步添加了,则说明真正的成功了。