# 以下是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