主从同步使得数据可以从一个数据库服,务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。因为复制是异步进行的,所以从服务器不需要一直连接着主服务器,从服务器甚至可以通过拨号断断续续地连接主服务器。通过配置文件,可以指定复制所有的数据库,某个数据库,甚至是某个数据库上的某个表。
使用主从同步的好处:
1.通过增加从服务器来提高数据库的性能,在主服务器上执行写入和更新,在从服务器上向外提供读功能,可以动态地调整从服务器的数量,从而调整整个数据库的性能。
2.提高数据安全-因为数据已复制到从服务器,从服务器可以终止复制进程,所以,可以在从服务器上备份而不破坏主服务器相应数据
3.在主服务器上生成实时数据,而在从服务器上分析这些数据,从而提高主服务器的性能
master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中;slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,
如果发生改变,则开始一个I/O Thread请求master二进制事件,同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从
中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/O Thread和SQL Thread将进入睡眠状态,等待下一次被唤醒。
注意以下几点:
一、master将操作语句记录到binlog日志中,然后授予slave远程连接的权限(master一定要开启binlog二进制日志功能;通常为了数据安全考虑,slave也开启binlog功能)。
二、slave开启两个线程:IO线程和SQL线程。其中:IO线程负责读取master的binlog内容到中继日志relay log里;SQL线程负责从relay log日志里读出binlog内容,并更新到slave的数据库里,这样就能保证slave数据和 master数据保持一致了。
三、Mysql复制至少需要两个Mysql的服务,当然Mysql服务可以分布在不同的服务器上,也可以在一台服务器上启动多个服务。
四、Mysql复制最好确保master和slave服务器上的Mysql版本相同(如果不能满足版本一致,那么要保证master主节点的版本低于slave从节点的版本)
五、master和slave两节点间时间需同步
masterIP:192.168.197.142
slaveIP:192.168.197.131
一、在主服务器上,必须开启二进制日志机制和配置一个独立的ID(不能重复)
二、在从服务器上,通用需要配置一个唯一的ID(不能重复),创建一个用来专门复制主服务器数据的mysql账号及秘密。
三、如果在同步之前,数据库中已经有数据,就需要使用mysqldump导出master数据库数据,然后在导入到slaave数据库中,使主备服务器数据同步,以防主从同步失败!
四、配置从服务器要连接的主服务器的IP地址和登陆授权,二进制日志文件名.
一、查看主服务器上的my.cnf文件中是否已经在[mysqld]模块下配置了log-bin和server-id,如没有这执行下面这个命令。
[root@master ~]# echo -e "[mysqld]\nserver-id=100\nlog-bin=mysql-bin" >> etc/mysql/my.cnf
查看配置文件my.cnf是否添加成功
[root@master ~]# cat /etc/mysql/my.cnf
[mysqld]
server-id=100 #同一局域网内注意要唯一
log-bin=mysql-bin #开启二进制日志功能
二、因为上面更修改了my.com文件所已要刷新mysql
[root@master ~]# systemctl restart mysql.service
三、在master节点上创建用户并授予用户slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。
[root@master ~]# mysql -uroot -p123456 #登录数据库
mysql> CREATE USER 'slave'@'%' IDENTIFIED BY 'slave'; #创建一个用户为slave密码为root
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%'; #设置slave用的的权限
mysql> flush privileges; #刷新数据库
四、查看master节点的binlog日志文件
mysql> show master status;
File和Position字段的值后面将会用到,在后面的操作完成之前,需要保证Master库不能做任何操作,否则将会引起状态变化,File和Position字段的值也会变化。
五、导出master主数据库里的数据(如果数据库里没有数据,可以忽略这一步)
[root@master ~]# mysqldump -u用户 -p秘密 数据库名 > 导出的文件名.sql
一、查看修改/etc/mysql/my.cnf文件
查看slave备服务器上的my.cnf文件中是否已经在[mysqld]模块下配置了server-id、log-bin、relay_log,如没有这执行下面这个命令。
[root@slave ~]# echo -e "[mysqld]\nserver-id=101\nlog-bin=mysql-slave-bin\nrelay_log=edu-mysql-relay-bin" >> /etc/mysql/my.cnf
[root@slave ~]# cat /etc/mysql/my.cnf #查看my.cnf内容
[mysqld]
server-id=101 #唯一值
log-bin=mysql-slave-bin #开启二进制日志功能,以备Slave作为其它Slave的Master时使用
relay_log=edu-mysql-relay-bin #开启中继日志
二、重启slave备服务器数据库
[root@slave ~]# systemctl restart mysql.service
三、如果主服务器有数据,则在备服务器上面导入数据(如果数据库里没有数据,可以忽略这一步)
[root@salve ~]# mysql -u用户 -p秘密 数据库名 < 要恢复的.sql
三、配置slave备服务器数据库连接master主服务器数据库
mysql> change master to master_host='192.168.197.142', master_user='slave', master_password='slave', master_port=3306, master_log_file='mysql-bin.000002', master_log_pos= 0;
master_host # master主服务器地址
master_port #容器的端口号,指的是容器内部运行mysql的端口号
master_user #是在master中创建主从的用户名
master_password #是在master中创建主从的秘密
master_log_file #是上一步中从master中查出File字段的值
master_log_pos #是复制起始点,如果为0,为从头复制
四、启动slave备服务器的slave
mysql> start slave;
五、查看slave的主从状态
mysql> show slave status\G;
在master主服务器上执行
mysql > reste master
作用包括:
删除binlog索引文件中列出的所有binlog文件
清空binlog索引文件
创建一个新的binlog文件
清空系统变量gtid_purged和gtid_executed
在MySQL 5.7.5 及后续版本中, RESET MASTER还会会清空 mysql.gtid_executed 数据表。
在slave备服务器上执行
mysql > reset slave
作用包括:
清除slave 复制时的master binlog的位置
清空master info, relay log info
删除所有的relay log文件,并创建一个新的relay log文件。
重置复制延迟(CHANGE MASTER TO 的 MASTER_DELAY参数指定的)为0。