MySQL主从复制
MySQL主从复制主从复制实现原理操作步骤1.准备两台装有MySQL数据库的服务器2.修改主库的MySQL配置文件3.查看二进制日志是否开启4.主节点二进制日志列表5.在主库上创建复制权限的用户6.备份主库并导入从库7.从库修改文件8.在从库配置访问主库的参数信息9.从库开启IO和SQL线程10.查看同步的状态11.报错解决方法
主从复制实现原理
1.master将主库的所有改变的操作记录到二进制日志之中(binary log)
2.slave的io进程将master进程中的二进制日志拷贝到他自己的中继日志当中(relay log),
3.slave的sql线程解析中继日志文件然后再从库执行,保持与主库一致
图解:
操作步骤
1.准备两台装有MySQL数据库的服务器
2.修改主库的MySQL配置文件
#添加三段配置 cat >> /etc/my.cnf <<EOF log-bin=mysql-bin binlog_format=mixed server-id =1 EOF #重启服务 systemctl restart mysqld
3.查看二进制日志是否开启
登录到数据库查看
mysql> show global variables like '%log%';
4.主节点二进制日志列表
记录这里最后一行输出的值
mysql> show master logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 154 | +------------------+-----------+ 1 row in set (0.00 sec)
5.在主库上创建复制权限的用户
#这里用户的网段repl@'10.0.0.%'根据自己的ip来修改 mysql> grant replication slave on *.* to repl@'10.0.0.%' identified by 'Yj123.com'; Query OK, 0 rows affected, 1 warning (0.00 sec) #为了避免重启服务,刷新一下 flush privileges;
6.备份主库并导入从库
#主库备份 mysqldump -uroot -pYj123.com -A > all.sql #用rsync或者scp把备份文件传到从库 #导入从库 mysql -uroot -pYj123.com < all.sql
7.从库修改文件
cat >> /etc/my.cnf << EOF relay-log=relay-log relay-log-index=relay-log.index server-id=2 EOF #修改配置文件之后重启服务 systemctl restart mysqld
8.在从库配置访问主库的参数信息
添加 主节点主机,访问主节点的用户名及密码,主节点二进制文件信息。 注意:主节点的二进制文件一定要是二进制列表中的最后一个二进制文件。 #进入MySQL配置 CHANGE MASTER TO MASTER_HOST='10.0.0.250', MASTER_USER='repl', MASTER_PASSWORD='Yj123.com', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154; #MASTER_HOST主库的ip #MASTER_USER授权复制用户名 #MASTER_PASSWORD授权用户名的密码 #MASTER_LOG_FILE查看主节点二进制日志列表Log_name的最后一个 #MASTER_LOG_POS查看主节点二进制日志列表File_size的最后一个
9.从库开启IO和SQL线程
mysql> start slave;
10.查看同步的状态
mysql> show slave status\G; Slave_IO_Running: Yes Slave_SQL_Running: Yes #看到这两个就证明已经开启主从复制了
11.报错解决方法
--如果查看同步的状态IO进程是NO-- Slave_IO_Running: No Slave_SQL_Running: Yes #停止I/O线程和SQL线程; stop slave; #删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件; reset slave; #启动I/O 线程和SQL线程。 #I/O线程从主库读取bin log,并存储到relay log中继日志文件中。 #SQL线程读取中继日志,解析后,在从库重放。 start slave; #再进行查看线程状态 show slave status\G; Slave_IO_Running: Yes Slave_SQL_Running: Yes