1、原理mysql
该过程的第一部分就是master记录二进制日志。在每一个事务更新数据完成以前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即便事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。 git
下一步就是slave将master的binary log拷贝到它本身的中继日志。首先,slave开始一个工做线程——I/O线程。I/O线程在master上打开一个普通的链接,而后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,若是已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。 sql
SQLslave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志一般会位于OS的缓存中,因此中继日志的开销很小。 数据库
此外,在master中也有一个工做线程:和其它MySQL的链接同样,slave在master中打开一个链接也会使得master开始一个线程。复制 过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操做不能在slave上并行操做。centos
(简短描述:主从数据库同步工做原理(流程):缓存
但主库的数据发生修改时,数据更改的记录将写入到主库的二进制文件中,从库此时将会调用一个IO线程读取主库的二进制文件,并与中继日志做对比,并将存在差别的事件写入到中继日志中(当两日志内容事件一致时,IO线程将处于睡眠状态),而后从库再调用SQL线程去读取中继日志,并将刚写入的事件数据放入到从库中以保持主从数据库数据同步。)服务器
2、要求mysql主从的环境要求网络
一、互相同步的两台mysql的版本必须保证大版本号一致。好比5.5+和5.6+之间同步数据,5.6的数据同步到5.5就会出现问题。保证大版本号一致很重要。tcp
二、每台服务器必须开启binlog,不开启binlog则根本没法开始数据同步。ide
三、每台服务器必须配置不一样的server-id,范围在1到(2^32-1)之间。
四、要保证防火墙对3306端口的开启,为了学习数据库的主从配置。
五、保证网络畅通
主从系统要保持一致:包括数据库版本,操做系统版本,磁盘IO磁盘容量,网络带宽等。
[root@data02 ~]# cat /etc/redhat-release
CentOS release 6.2 (Final)
[root@data02 ~]#
|
主库master |
从库slave |
OS系统版本 |
CentOS release 6.2 (Final) |
CentOS release 6.2 (Final) |
数据库版本 |
5.6.12-log |
5.6.12-log |
磁盘容量 |
50G |
30G |
主机ip地址 |
192.168.52.129 |
192.168.52.130 |
端口 |
3306 |
3306 |
内存 |
1G |
1G |
服务器类型 |
虚拟机 |
3、主服务配置
1. MySQL的配置文件的位置是在 /etc/my.cnf
添加
server_id=
#指定binlog的生成目录,不少人不是这么写的
log-bin=/var/lib/mysql-log/mastera
gtid_mode=on
enforce_gtid_consistency=1
2.建立binlog目录并受权mysql用户
mkdir /var/lib/mysql-log/mastera
chown mysql . /var/lib/mysql-log/mastera
3.重启mysql服务
service mysqld restart
4.查看binlog是否生成
ls /var/lib/mysql-log/mastera
5.导出主数据库(注:若是两个数据库状态一致即表及数据记录都同样,就不用作5,6这两步了)
mysqldump -uroot -p'密码' -A --single-transaction > /tmp/mysql.all.sql
这个过程会发生报警,由于用了明码。不用担忧
6.将mysql.all.sql 拷贝到slave上,能够用scp命令
7.在slave服务器上将导出的mysql.all.sql脚本,导入mysql服务器
mysql -uroot -p'密码' < sql备份文件
8.查看slave上是否导入
四.从服务器操做
修改my.cnf
1.#设置和master不一样的server-id
server-id=
gtid_mod=on
enforce_git_consistency=1
2.重启mysql服务
service mysqld restart
防火墙开启master 服务器的3306端口
centos6.* 开启方式
centos7.*的开启方式
[root@localhost ~]# firewall-cmd –add-port=3306/tcp
[root@localhost ~]# firewall-cmd –permanent –add-port=3306/tcp
[root@localhost ~]# firewall-cmd –reload success
五.最后两步
1.登陆master受权slave
grant replication slave on *.* to ‘用户名’@'slaveip' identified by '密码';
flush privileges;
2.登陆slave修改master
change master to master_host='192.168.0.103',master_user='slave1',master_password='123456',master_auto_position=1;
3.slave 上打开复制线程
start slave(中止slave 命令:stop slave)
4.查看slave状态
show slave status;
查看返回状态找到一下两个字段,
1) Slave_IO_Running: Yes
IO线程状态,必须YES
2) Slave_SQL_Running: Yes
SQL线程状态,必须YES
六.这时候就完成了主从复制