主从复制可以使MySQL数据库主服务器的主数据库,复制到一个或多个MySQL从服务器从数据库,默认情况下,复制异步; 根据配置,可以复制数据库中的所有数据库,选定的数据库或甚至选定的表。横向扩展解决方案:在多个从库之间扩展负载以提高性能。在这种环境中,所有写入和更新在主库上进行。但是,读取可能发生在一个或多个从库上。该模型可以提高写入的性能(由于主库专用于更新),同时在多个从库上读取,可以大大提高读取速度。
1.软件环境
Mysql版本:MySQL 5.7.20
Master-Server : 192.168.1.13
Slave-Server : 192.168.1.15
2. Master-Server 配置
修改 my.cnf
配置 Master 以使用基于二进制日志文件位置的复制,必须启用二进制日志记录并建立唯一的服务器ID,否则则无法进行主从复制。
要确保配置前,两台服务器的数据是一样的
停止MySQL服务
[root@XiaoFeng ~]# service mysqld stop
修改 my.cnf 开启binlog ,每台设置不同的 server-id
[root@XiaoFeng ~]# vim /etc/my.cnf
log-bin=mysql-bin server-id=13 #MySQLid 后面从服务器需设置不同,我这里用的IP后两位 #要复制的数据库 binlog-do-db=data binlog-do-db=yan #自动清理7天前的log文件 expire_logs_days=7
启动MySQL服务
[root@XiaoFeng ~]# service mysqld start
登录主MySQL
[root@XiaoFeng ~]# mysql -uroot -p123456
创建用户
每个从库使用MySQL用户名和密码连接到主库,因此主库上必须有用户帐户,从库可以连接。任何帐户都可以用于此操作,只要它已被授予 REPLICATION SLAVE权限。可以选择为每个从库创建不同的帐户,或者每个从库使用相同帐户连接到主库
虽然不必专门为复制创建帐户,但应注意,复制用到的用户名和密码会以纯文本格式存储在主信息存储库文件或表中 。因此,需要创建一个单独的帐户,该帐户只具有复制过程的权限,以尽可能减少对其他帐户的危害。
默认mysql要求设置强密码,这里为了方便,先修改成弱密码,创建的backup账号只能192.168.1.15这个IP登录
mysql> set global validate_password_policy=0; mysql> set global validate_password_length=0; grant replication slave on *.* to 'backup'@'192.168.1.15' identified by '123456';
3.Slave-Server 配置
修改 my.cnf
配置从服务器ID,如果要设置多个从库,则每个从库的server-id与主库和其他从库设置不同的唯一值。
停止MySQL服务
[root@XiaoFeng ~]# service mysqld stop
修改 my.cnf 每台设置不同的 server-id ,我这里用的IP后两位
[root@XiaoFeng ~]# vim /etc/my.cnf
server-id=15 #加上以下参数可以避免更新不及时,SLAVE 重启后导致的主从复制出错。 read_only = 1 master_info_repository=TABLE relay_log_info_repository=TABLE relay_log_recovery=1 #从机禁止写 super_read_only=1 #从机禁止写
启动MySQL服务
[root@XiaoFeng ~]# service mysqld start
4.配置主库通信
查看 Master-Server , binlog File 文件名称和 Position值位置 并且记下来
mysql> show master status \G *************************** 1. row *************************** File: mysql-bin.000001 Position: 154 Binlog_Do_DB: data,yan Binlog_Ignore_DB: Executed_Gtid_Set: 1 row in set (0.00 sec)
要设置从库与主库进行通信,进行复制,使用必要的连接信息配置从库在从库上执行以下语句
将选项值替换为与系统相关的实际值
在从服务器Slave-Server上操作
mysql>stop slave; #关闭从服务器复制线程 change master to master_host='192.168.1.13', #主服务器IP master_user='backup', #备份账号 master_password='123456', #密码 master_log_file='mysql-bin.000001', #主服务器的File: mysql-bin.000001 master_log_pos=154; #主服务器的Position: 154 start slave; #启动从服务器复制线程
查看复制状态
mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event #从站的当前状态 Master_Host: 192.168.1.13 Master_User: backup Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 #主服务器的日志文件 Read_Master_Log_Pos: 154 #日志记录 Relay_Log_File: localhost-relay-bin.000002 Relay_Log_Pos: 320 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes #读取主程序二进制日志的I/O线程是否正在运行 Slave_SQL_Running: Yes #执行读取主服务器中二进制日志事件的SQL线程是否正在运行。与I/O线程一样 Seconds_Behind_Master: 0 #是否为0,0就是已经同步了
必须都是 Yes,主从就配置完成了
如果不是原因主要有以下 4 个方面:
1、网络不通
2、密码不对
3、MASTER_LOG_POS 不对 ps
4、mysql 的 auto.cnf server-uuid 一样(可能你是复制的mysql,比如是VM复制)
5 、Slave_SQL_Running: No 两个库的数据不相同,重新做一次数据同步
修改auto.cnf
[root@XiaoFeng ~]# find / -name 'auto.cnf' /var/lib/mysql/auto.cnf [root@XiaoFeng ~]# vim /var/lib/mysql/auto.cnf [auto] server-uuid=4bebd2a1-e81e-11e7-9631-000c296b46d1 #这里面的数字随便改一个,然后重起mysql
本文为 小风原创文章,转载无需和我联系,但请注明来自 小风博客www.hotxf.com