ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
> ***主从复制也叫主从同步,就是在一台服务器上指定一台主数据库,另一台指定一台从数据库,两者同时开启远程连接,通过主数据库中的二进制日志事件被从数据库中的IO线程调用到中继日志事件中,从数据库再根据SQL线程来进行写入操作。*** * [ ] 主从复制是异步进行的,所以会有一定的延迟 * [ ] 主从复制可以实现读写分离 * [ ] 主从复制可以缓解数据库的压力 > #### ***主从复制原理*** MySQL主从复制涉及到三个线程,一个运行在主节点(log dump thread),其余两个(I/O thread, SQL thread)运行在从节点,如下图所示: ![](https://box.kancloud.cn/95082fd3bb20636c824c5d5355192eac_511x311.png) > #### ***主从复制配置*** windows配置:my.ini linux配置:my.cnf * [ ] 先关闭防火墙 windows在网络里面设置防火墙,linux关闭:service iptables stop * [ ] centos7关闭防火墙 ~~~ #查看防火墙 firewall-cmd --state #停止防火墙 systemctl stop firewalld.service #禁止防火墙开机启动 systemctl disable firewalld.service ~~~ * [ ] debian关闭防火墙 ~~~ /etc/init.d/ufw stop /etc/init.d/ufw start #或者 sudo ufw status 状态 sudo ufw enable 开启 sudo ufw disable 禁用 ~~~ * [ ] 授权(远程访问) ``` #允许任何ip地址(%表示允许任何ip地址)的电脑用admin帐户和密码(123456)来访问这个mysql server。 注意admin账户不一定要存在。 grant all on *.* to admin@'%' identified by '123456' with grant option; flush privileges; #支持root用户允许远程连接mysql数据库 grant all privileges on *.* to 'root'@'192.168.1.%' identified by '123456789' with grant option; flush privileges; ``` * [ ] 在配置文件中的[mysqld]中进行以下配置(主机配置) ``` #id server-id =1 #二进制文件 log-bin ="/www/server/data/mysql-bin" log-error ="/www/server/data/mysql-error" #主从同步时 忽略的数据库 binlog-ignore-db=mysql #只同步shop数据库 binlog-do-db=shop ``` * [ ] 授权哪台主机为从数据库 ``` grant replication slave,reload,super ON *.* TO 'root'@'192.168.1.%' identified by '123456' ``` * [ ] 查看主数据库状态(每次在做同步前/重启mysql时,需要观察一些最新状态) ``` show master status; ``` * [ ] 从机配置(my.cnf) ``` #id server-id =2 #二进制文件 log-bin =mysql-bin #同步test数据库 replicate-do-db=shop ``` * [ ] 授权哪台数据库是自己的主数据库 ``` STOP SLAVE; CHANGE MASTER TO master_host = '192.168.1.105', master_user = 'root', master_password = '123456789', master_log_file = 'mysql-bin.000054', master_log_pos = 1254; START SLAVE; SHOW SLAVE STATUS; ``` 如果此时出错... 解决:stop slave 然后再次执行授权的哪一步 * [ ] 开启主从同步 ``` 在从机里面执行(linux),start slave; 检验:show slave status \G; ``` * [ ] 主要观察两个 ``` Slave_IO_Running Slave_SQL_Running ``` 如果都是YES,则说明配置成功! 如果此时出现错误,看下面的日志说明。主要可能是id相同了,这里可能是个bug。 首页先检查serverid `show variables like 'server_id'` #注意这里是下划线,配置时是- 解决:set global server_id = 2;