一、原理
该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。
下一步就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。
SQLslave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。复制 过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。
(简短描述:主从数据库同步工作原理(流程):
但主库的数据发生修改时,数据更改的记录将写入到主库的二进制文件中,从库此时将会调用一个IO线程读取主库的二进制文件,并与中继日志作对比,并将存在差异的事件写入到中继日志中(当两日志内容事件一致时,IO线程将处于睡眠状态),然后从库再调用SQL线程去读取中继日志,并将刚写入的事件数据放入到从库中以保持主从数据库数据同步。)
二、要求mysql主从的环境要求
1、互相同步的两台mysql的版本必须保证大版本号一致。比如5.5+和5.6+之间同步数据,5.6的数据同步到5.5就会出现问题。保证大版本号一致很重要。
2、每台服务器必须开启binlog,不开启binlog则根本无法开始数据同步。
3、每台服务器必须配置不同的server-id,范围在1到(2^32-1)之间。
4、要保证防火墙对3306端口的开启,为了学习数据库的主从配置。
5、保证网络畅通
主从系统要保持一致:包括数据库版本,操作系统版本,磁盘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
服务器类型
虚拟机
三、主服务配置
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
六.这时候就完成了主从复制