mysql主从复制配置

# 以下是mysql5.6及5.7版本的,其他版本不知是否一致

目的:

1.为了冗余备份,主库挂了,切换到从库使用

2.为了实现读写分离,主从复制是实现读写分离的前提

主从复制的原理图:

配置步骤:

1.修改配置文件

vim /etc/my.cnf

# 不同mysql的server-id需要不同

主库添加配置信息: 

[mysqld]

server-id=1

log-bin=z-mysql-bin

从库添加配置信息:

[mysqld]

server-id=2

read-only=true  # 设置只读,但是对mysql的root不生效

重启mysql服务:

systemctl restart mysqld.server

# 命令不一定需要一样 

重启有可能有问题:

通过kill 或pkill 杀掉再启动也可以。

2.主库进行锁表

# 保持数据一致性,做完主从复制配置再解锁

flush table with read lock;

3.导出主库数据,并发送至从库,导入数据

主库操作:

(1) 备份当前数据库所有的数据

mysqldump -uroot -p --all-databases > /data/all_data.sql

(2) 推送备份的数据至从库data目录下

scp /data/all_data.sql root@192.168.16.106:/data/

在从库中执行:

(1) 先进入数据库中

(2) 导入主库的数据

source /data/all_data.sql

4.主库创建主从复制的用户并授权slave

# 创建用户并授权的命令

grant replication slave on *.* to 'master_copy'@'192.168.1.%' identified by 'wzz123';

flush privileges;

注:192.168.1.% 网段这个看你实际机器的

5.从库建立主从关系

# 在主库通过show master status 查看到log名和起始位置

 

在从库执行该命令(和上图对应去填):

change master to master_host='192.168.16.83',

master_user='master_copy',

master_password='wzz123',

master_log_file='z-mysql-bin.000001',

master_log_pos=472;

注: 这些字符串中左右不能有空格!

6.开启从库slave功能

start slave;

7.检查配置是否成功

show slave statusG

 # 这俩参数必须都是Yes才行

8.两项都显示Yes后,主库解锁

unlock tables;

配置中遇到的问题:

1.找不到第一个log文件

问题的原因:

我在从库写连接主库的日志时候左右有空格,所以才导致找不到

解决方式:

(1) 从库先停止:

slave stop;

(2) 主库刷新日志:

# 把sql命令刷到另一个bin-log文件去写

flush log;

查看主库的log变化:

 

(3) 修改从库log文件和起始点:

CHANGE MASTER TO MASTER_LOG_FILE='z-mysql-bin.000002',MASTER_LOG_POS=245;

注:名称必须一致,注意左右是否有空格。

(4) 启动,查看:

slave start;

show slave statusG

 

# 正常

2.UUID相同

报错:

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.

报错原因:

由于我这个slave从的机器是通过虚拟机克隆而来的,mysql都是安装好的,所以出问题。

解决方式:

(1) 把这个文件重命名,数据库找不到会重新创建一个

mv /opt/mysql5.7/data/auto.cnf /opt/mysql5.7/data/auto.cnf.bak

(2) 重启数据库

systemctl restart mysqld.server
原文地址:https://www.cnblogs.com/zezhou/p/11523710.html