mysql 主主复制


 

mysql主从同步定义

主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。因为复制是异步进行的,所以从服务器不需要一直连接着主服务器,从服务器甚至可以通过拨号断断续续地连接主服务器。通过配置文件,可以指定复制所有的数据库,某个数据库,甚至是某个数据库上的某个表。

使用主从同步的好处:

  1. 通过增加从服务器来提高数据库的性能,在主服务器上执行写入和更新,在从服务器上向外提供读功能,可以动态地调整从服务器的数量,从而调整整个数据库的性能。
  2. 提高数据安全-因为数据已复制到从服务器,从服务器可以终止复制进程,所以,可以在从服务器上备份而不破坏主服务器相应数据
  3. 在主服务器上生成实时数据,而在从服务器上分析这些数据,从而提高主服务器的性能

注意,mysql是异步复制的,而MySQL Cluster是同步复制的。有很多种主从同步的方法,但核心的方法有两种,Statement Based Replication(SBR)基于SQL语句的复制,另一种是Row Based Replication(RBR)基于行的复制,也可以使用Mixed Based Replication(MBR)。在mysql5.6中,默认使用的是SBR。而mysql 5.6.5和往后的版本是基于global transaction identifiers(GTIDs)来进行事务复制。当使用GTIDs时可以大大简化复制过程,因为GTIDs完全基于事务,只要在主服务器上提交了事务,那么从服务器就一定会执行该事务。

通过设置服务器的系统变量binlog_format来指定要使用的格式:

1.SBR:当使用二进制日志时,主服务器会把SQL语句写入到日志中,然后从服务器会执行该日志,这就是SBR,在mysql5.1.4之前的版本都只能使用这种格式。使用SBR会有如下

长处:

  1. 日志文件更小
  2. 记录了所有的语句,可以用来日后审计

弊端:

  1. 使用如下函数的语句不能被正确地复制:load_file(); uuid(), uuid_short(); user(); found_rows(); sysdate(); get_lock(); is_free_lock(); is_used_lock(); master_pos_wait(); rand(); release_lock(); sleep(); version();
  2. 在日志中出现如下警告信息的不能正确地复制:[Warning] Statement is not safe to log in statement format.
  3. 或者在客户端中出现show warnings
  4. Insert … select语句会执行大量的行级锁表
  5. Update语句会执行大量的行级锁表来扫描整个表

2.RBR:主服务器把表的行变化作为事件写入到二进制日志中,主服务器把代表了行变化的事件复制到从服务中,使用RBR的

长处:

  1. 所有的数据变化都是被复制,这是最安全的复制方式
  2. 更少的行级锁表

弊端:

  1. 日志会很大
  2. 不能通过查看日志来审计执行过的sql语句,不过可以通过使用mysqlbinlog  
  3. --base64-output=decode-rows --verbose来查看数据的 变动

3.MBR:既使用SBR也使用RBR,默认使用SBR

File的值是当前使用的二进制日志的文件名,Position是该日志里面的位置信息(不需要纠结这个究竟代表什么),记住这两个值,会在下面配置从服务器时用到。

注意:如果之前的服务器并没有配置使用二进制日志,那么使用上面的sql语句会显示空,在锁表之后,再导出数据库里的数据(如果数据库里没有数据,可以忽略这一步)

[root@localhost backup]# mysqldump -uroot -p'123456' -S /data/3306/data/mysql.sock --all-databases > /server/backup/mysql_bak.$(date +%F).sql

如果数据量很大,可以在导出时就压缩为原来的大概三分之一

[root@localhost backup]# mysqldump -uroot -p'123456' -S /data/3306/data/mysql.sock --all-databases | gzip > /server/backup/mysql_bak.$(date +%F).sql.gz

这时可以对数据库解锁,恢复对主数据库的操作

mysql > unlock tables;

启动主从同步进程

mysql > start slave;

检查状态

mysql > show slave status \G

上面的两个进程都显示YES则表示配置成功

上图就是我的错误根源,可以看到用户名完全写错了,先删除错误的用户:

mysql > drop user “rep@192.168.1.%”@”%”;

再重新创建用户:

mysql > grant replication slave on *.* to ‘rep’@‘192.168.1.%’ identified by ‘123456’;

mysql > flush privileges;

3.假如用户名没有错,那么如何排除是否是输入的密码错误呢?

额,我也想知道方法。最好就是多输入几遍,或者重新创建用户名和密码来测试。问题还没有解决,转到4

4.在你的防火墙中添加3306端口

[root@localhost mysql]# firewall-cmd --zone=public --add-port=3306/tcp --permanent

[root@localhost mysql]# firewall-cmd --reload

再关闭selinux

[root@slave204 log]# vi /etc/sysconfig/selinux

把SELINUX=enforcing改为SELINUX=disabled

[root@slave204 log]# source /etc/sysconfig/selinux

登录主服务器,查看服务器状态

mysql > show master status \G

然后重新配置一次从服务器,在配置之前首先关闭主从同步进程

mysql > stop slave;

之外的方法,我也没试过 

Slave_SQL_Running: No

把上面的Slave_IO_Running调试成YES后,就轮到这个小样了。我根据这个博客的内容来解决的:http://kerry.blog.51cto.com/172631/277414

【主主复制】

基本跟上面一样

https://www.cnblogs.com/houweijian/articles/11215085.html