主库master:192.168.31.16
从库slave:192.168.31.17
一、主库配置
1. 修改 /etc/my.cnf文件,添加以下配置
vim /etc/my.cnf
[mysqld]
# 同一局域网内注意要唯一
server-id=100
# 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin
# 复制过滤:不需要备份的数据库,不输出(mysql库一般不同步)
binlog-ignore-db=mysql
# 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
# 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
# 重启Mysql服务
systemctl restart mysqld
2. 在master服务器授权slave服务器可以同步权限
mysql > mysql -uroot -proot
# 授予slave服务器可以同步master服务
mysql > grant replication slave, replication client on *.* to 'root'@'slave服务的ip' identified by 'slave服务器的密码';
mysql > flush privileges;
# 查看MySQL现在有哪些用户及对应的IP权限(可以不执行,只是一个查看)
mysql > select user,host from mysql.user;
3. 查询master服务的binlog文件名和位置,以便从服务器配置使用
日志文件名:mysql-bin.000004
复制的位置:1066
二、从库配置
1. 修改 /etc/my.cnf文件,添加以下配置
vim /etc/my.cnf
[mysqld]
# 设置server_id,注意要唯一
server-id=102
# 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
# relay_log配置中继日志
relay_log=edu-mysql-relay-bin
#复制过滤:不需要备份的数据库,不输出(mysql库一般不同步)
binlog-ignore-db=mysql
# 如果需要同步函数或者存储过程
log_bin_trust_function_creators=true
# 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
# 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
# 重启Mysql服务
systemctl restart mysqld
2. 从库进行关联主库
mysql > mysql -uroot -proot
# 主库查询的binlog文件名和位置
mysql> change master to master_host='master服务器ip', master_user='root', master_password='master密码', master_port=3306, master_log_file='mysql-bin.000004',master_log_pos=1066;
3. 启动主从复制
mysql> start slave;
4. 查看主从同步状态
mysql> show slave status\G;
5. 停止主从复制
mysql> stop slave;
三、遇到的问题
1. 解决主库user表中’root’@’%’没有grant的权限
# 分配权限
mysql> update mysql.user set Grant_priv='Y',Super_priv='Y' where user = 'root' and host = '%';
# 刷新权限
mysql> flush privileges;
# 重启Mysql服务
systemctl restart mysqld
2. 解决在给slave分配用户的时候,设置的密码太简单
#设置密码验证强度为低
mysql> set global validate_password_policy=LOW;
# 设置密码长度(设置的长度最小为4)
mysql> set global validate_password_length=4;