> ***主从复制也叫主从同步,就是在一台服务器上指定一台主数据库,另一台指定一台从数据库,两者同时开启远程连接,通过主数据库中的二进制日志事件被从数据库中的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;