最全 MySQL主从同步与主主同步

目录

同步原理

主从复制实际配置与取消主从

Slave_IO_Running:Connecting ;处理

/var/lib/mysql/目录下的数据库文件

主从复制下主服务器

主从复制下从服务器


同步原理

MySQL复制: 

图解:

     MySQL内建的复制功能是构建大型,高性能应用程序的基础。将MySQL的数据分布到多个系统上去,这种分布的机制,是通过将mysql的某一台主机的数据复制到其它主机(slave)上,并重新执行一遍来实现。复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循坏,这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知的更新。

需注意的是:

    在进行mysql复制时,所有对复制中的表的更新必须在主服务器上进行。否则必须要小心,以避免用户对主服器上的表进行更新与对从服务器上的表所进行更新之间的冲突。

(1)mysql支持哪些复制

     a.基于语句的复制:在主服务器上执行的sql语句,在从服务器上执行同样的语句。mysql默认采用基于语句的复制,效率比较高。一旦发现没法精确复制时,会自动选择基于行的复制。

     b.基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍。从mysql 5.0开始支持

     c.混合类型的复制:默认采用基于语句的复制,一旦发现基于语句的无法精确复制时,就会采用基于行的复制。

 (2)mysql复制解决的问题

     a.数据分布(data distribution)

     b.负载平衡(load balancing)

     c.数据备份(backup),保证数据安全

     d.高可用性与容错行(high availability and failover)

     e.实现读写分离,缓解数据库压力

   (3)mysql主从复制原理

        master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中;slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/O Thread请求master二进制事件,同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重写,使得其数据和主节点的保持一致,最后I/O Thread和SQL Thread将进入睡眠状态,等待下一次被唤醒。

    注意几点:
     1--master将操作语句记录到binlog日志中,然后授予slave远程连接的权限(master一定要开启binlog二进制日志功能;通常为了数据安全考虑,slave也开启binlog功能)。
     2--slave开启两个线程:IO线程和SQL线程。其中:IO线程负责读取master的binlog内容到中继日志relay log里;SQL线程负责从relay log日志里读出binlog内容,并更新到slave的数据库里,这样就能保证slave数据和 master数据保持一致了。
     3--Mysql复制至少需要两个Mysql的服务,当然Mysql服务可以分布在不同的服务器上,也可以在一台服务器上启动多个服务。
     4--Mysql复制最好确保master和slave服务器上的Mysql版本相同(如果不能满足版本一致,那么要保证master主节点的版本低于slave从节点的版本
     5--master和slave两节点间时间需同步

Mysql复制的流程图如下:

 如上图所示:
     Mysql复制过程的第一部分就是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线程将这些事件写入中继日志。
    SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS(操作系统:Operating System,缩写:OS)的缓存中,所以中继日志的开销很小。
   此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。

(4)mysql复制的模式

     1--主从复制:主库授权从库远程连接,读取binlog日志并更新到本地数据库的过程;主库写数据后,从库会自动同步过来(从库跟着主库变);
     2--主主复制:主从相互授权连接,读取对方binlog日志并更新到本地数据库的过程;只要对方数据改变,自己就跟着改变;

(5)mysql主从复制优点

     1--在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;(主库写,从库读,降压)
     2--在从服务器进行备份,避免备份期间影响主服务器服务;(确保数据安全)
     3--当主服务器出现问题时,可以切换到从服务器。(提升性能)

(6)mysql主从复制工作流程细节

     a. MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。MySQL复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志。每个从服务器从主服务器接收主服务器上已经记录到其二进制日志的保存的更新。当一个从服务器连接主服务器时,它通知主服务器定位到从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,并在本机上执行相同的更新。然后封锁并等待主服务器通知新的更新。从服务器执行备份不会干扰主服务器,在备份过程中主服务器可以继续处理更新。

     b. MySQL使用3个线程来执行复制功能,其中两个线程(Sql线程和IO线程)在从服务器,另外一个线程(IO线程)在主服务器。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句。主服务器创建一个线程将二进制日志中的内容发送到从服务器。该线程可以即为主服务器上SHOW PROCESSLIST的输出中的Binlog Dump线程。从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是SQL线程,由从服务器创建,用于读取中继日志并执行日志中包含的更新。在从服务器上,读取和执行更新语句被分成两个独立的任务。当从服务器启动时,其I/O线程可以很快地从主服务器索取所有二进制日志内容,即使SQL线程执行更新的远远滞后。

mysql> show processlist;
+----+--------+-----------------------+-------+-------------+------+---------------------------------------------------------------+------------------+
| Id | User   | Host                  | db    | Command     | Time | State                                                         | Info             |
+----+--------+-----------------------+-------+-------------+------+---------------------------------------------------------------+------------------+
|  2 | root   | localhost             | mysql | Query       |    0 | starting                                                      | show processlist |
|  5 | lianxi | 192.168.220.130:56684 | NULL  | Binlog Dump | 9182 | Master has sent all binlog to slave; waiting for more updates | NULL             |
+----+--------+-----------------------+-------+-------------+------+---------------------------------------------------------------+------------------+
2 rows in set (0.00 sec)

 (7)总结:

主从数据完成同步的过程:

1)在Slave 服务器上执行start slave命令开启主从复制开关,开始进行主从复制

2)此时,Slave服务器的IO线程会通过在master上已经授权的复制用户权限请求连接master服务器,并请求从执行binlog日志文件的指定位置(日志文件名和位置就是在配置主从复制服务时执行change master命令指定的)之后开始发送binlog日志内容

3)Master服务器接收到来自Slave服务器的IO线程的请求后,其上负责复制的IO线程会根据Slave服务器的IO线程请求的信息分批读取指定binlog日志文件指定位置之后的binlog日志信息,然后返回给Slave端的IO线程。返回的信息中除了binlog日志内容外,还有在Master服务器端记录的IO线程。返回的信息中包含了binlog中的下一个指定更新位置。

4)当Slave服务器的IO线程获取到Master服务器上IO线程发送的日志内容、日志文件及位置点后,会将binlog日志内容依次写到Slave端自身的Relay Log(即中继日志)文件(Mysql-relay-bin.xxx)的最末端,并将新的binlog文件名和位置记录到master-info文件中,以便下一次读取master端新binlog日志时能告诉Master服务器从新binlog日志的指定文件及位置开始读取新的binlog日志内容

5)Slave服务器端的SQL线程会实时检测本地Relay Log 中IO线程新增的日志内容,然后及时把Relay LOG 文件中的内容解析成sql语句,并在自身Slave服务器上按解析SQL语句的位置顺序执行应用这样sql语句,并在relay-log.info中记录当前应用中继日志的文件名和位置点

主从复制条件

1)开启Binlog功能

2)主库要建立账号

3)从库要配置master.info(CHANGE MASTER to...相当于配置密码文件和Master的相关信息)

4)start slave 开启复制功能

需要了解的:

1)3个线程,主库IO,从库IO和SQL及作用

2)master.info(从库)作用

3)relay-log 作用

4)异步复制

5)binlog作用(如果需要级联需要开启Binlog)

需要注意:

1)主从复制是异步的逻辑的SQL语句级的复制

2)复制时,主库有一个I/O线程,从库有两个线程,I/O和SQL线程

3)实现主从复制的必要条件是主库要开启记录binlog功能

4)作为复制的所有Mysql节点的server-id都不能相同

 5)binlog文件只记录对数据库有更改的SQL语句(来自主库内容的变更),不记录任何查询(select,show)语句 

......................................................................................
彻底解除主从复制关系

1)stop slave;

2)reset slave; 或直接删除master.info和relay-log.info这两个文件;##reset slave命令会删除/var/lib/mysql/下的master.info和relay-log.info文件,这2个文件是通过change master to master_host='xxx.xxx.xxx.xxx',master_user='username',master_password='password',master_log_file='mysql-bin.00000X',master_log_pos=xxxx;生成的

3)修改my.cnf删除主从相关配置参数。

让slave不随MySQL自动启动

修改my.cnf 在[mysqld]中增加 skip-slave-start 选项。
......................................................................................

做了MySQL主从复制以后,使用mysqldump对数据备份时,一定要注意按照如下方式:

mysqldump --master-data --single-transaction --user=username --password=password dbname> dumpfilename

这样就可以保留 file 和 position 的信息,在新搭建一个slave的时候,还原完数据库,file 和 position 的信息也随之更新,接着再start slave 就可以很迅速的完成增量同步!

需要限定同步哪些数据库,有3个思路:

1)在执行grant授权的时候就限定数据库;

2)在主服务器上限定binlog_do_db = 数据库名;

3)主服务器上不限定数据库,在从服务器上限定replicate-do-db = 数据库名;

如果想实现 主-从(主)-从 这样的链条式结构,需要设置:

log-slave-updates      只有加上它,从前一台机器上同步过来的数据才能同步到下一台机器。

当然,二进制日志也是必须开启的:

log-bin=/opt/mysql/binlogs/bin-log

log-bin-index=/opt/mysql/binlogs/bin-log.index

还可以设置一个log保存周期:

expire_logs_days=14

--------------------------下面记录下mysql主从/主主同步环境的实施过程-------------------------

1.环境描述

mysql 的安装可以参考本人名下的博客或  http://www.cnblogs.com/kevingrace/p/6109679.html

centos 7.4

master:192.168.220.128

slave: 192.168.220.130

注意下面几点:

1)要保证同步服务期间之间的网络联通。即能相互ping通,能使用对方授权信息连接到对方数据库(防火墙开放3306端口)。

2)关闭selinux。

###############################关闭selinux#####################################
安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统。
SELinux 主要作用就是最大限度地减小系统中服务进程可访问的资源(最小权限原则)。

# 临时关闭安全工具
[root@oldboy ~]# setenforce 0
[root@oldboy ~]# getenforce
Permissive
# 永久关闭安全工具
[root@oldboy ~]# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
       -- 表示selinux安全策略功能是启用状态
#     permissive - SELinux prints warnings instead of enforcing.
      -- 表示selinux安全策略只是显示警告信息,不会进行安全处理
#     disabled - No SELinux policy is loaded.
      -- 表示selinux安全策略功能彻底禁用
SELINUX=enforcing
[root@oldboy ~]# sed -i '7s#enforcing#disabled#g' /etc/selinux/config
[root@oldboy ~]# reboot
#############################################################################

3)同步前,双方数据库中需要同步的数据要保持一致。这样,同步环境实现后,再次更新的数据就会如期同步了。

2.主从复制实现过程

(1)设置master数据库的my.cnf文件(my.cnf 查找顺序 /etc/my.cnf ---> $basedir/my.cnf,在[mysqld]配置区域添加下面内容) 

[root@master ~]# vim /etc/my.cnf

 ..........

[mysqld] 

server-id=1        #数据库唯一ID,主从的标识号绝对不能重复。

log-bin=mysql-bin    #开启bin-log,并指定文件目录和文件名前缀

binlog-do-db=student   #需要同步liting数据库。如果是多个同步库,就以此格式另写几行即可。如果不指明对某个具体库同步,就去掉此行,表示同步所有库(除了ignore忽略的库)。

binlog-ignore-db=mysql  #不同步mysql系统数据库。如果是多个不同步库,就以此格式另写几行;也可以在一行,中间逗号隔开。如果此处忽略binlog-ignore-db=mysql,那么在主从同步时默认增量同步mysql库(mysql 5.7.42)。

sync_binlog = 1      #确保binlog日志写入后与硬盘同步

binlog_checksum = none  #跳过现有的采用checksum的事件,mysql5.6.5以后的版本中binlog_checksum=crc32,而低版本都是binlog_checksum=none

binlog_format = mixed   #bin-log日志文件格式,设置为MIXED可以防止主键重复。

温馨提示:在主服务器上最重要的二进制日志设置是sync_binlog,这使得mysql在每次提交事务的时候把二进制日志的内容同步到磁盘上,即使服务器崩溃也会把事件写入日志中。

sync_binlog这个参数是对于MySQL系统来说是至关重要的,他不仅影响到Binlog对MySQL所带来的性能损耗,而且还影响到MySQL中数据的完整性。对于"sync_binlog"参数的各种设置的说明如下:

sync_binlog=0,当事务提交之后,MySQL不做fsync之类的磁盘同步指令刷新binlog_cache中的信息到磁盘,而让Filesystem自行决定什么时候来做同步,或者cache满了之后才同步到磁盘。

sync_binlog=n,当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。

在MySQL中系统默认的设置是sync_binlog=0,也就是不做任何强制性的磁盘刷新指令,这时候的性能是最好的,但是风险也是最大的。因为一旦系统Crash,在binlog_cache中的所有binlog信息都会被丢失。而当设置为“1”的时候,是最安全但是性能损耗最大的设置。因为当设置为1的时候,即使系统Crash,也最多丢失binlog_cache中未完成的一个事务,对实际数据没有任何实质性影响。

从以往经验和相关测试来看,对于高并发事务的系统来说,“sync_binlog”设置为0和设置为1的系统写入性能差距可能高达5倍甚至更多。

(2)在master上设置数据同步权限

mysql> grant replication slave,replication client on *.* to repl@'192.168.220.130' identified by "repl123";  #只允许192.168.220.130使用repl,且密码为"repl123"连接主库做数据同步  --此语句若报错,见下面解决办法  ##授权slave通过rep1访问master,因此为slave的ip地址或者若要所有网段则设置repl@'%' ;部分网段:repl@'192.168.220.%'

#############################################################################
mysql> grant replication slave,replication client on *.* to lianxi@'%' identified by '123456';
ERROR 1819 (HY000): Unknown error 1819

报错的原因分析:
在为MySQL数据库服务器的root设置密码时,系统会提示您启用“验证密码”组件。如果启用,验证密码组件将自动检查给定密码的强度,并强制用户只设置足够安全的密码。如果您提供了一个简单的弱密码,您将会遇到类似于“ERROR 1819 (HY000): Your password does not satisfy the current policy requirements.”这样的错误。从技术上讲,这实际上不是一个错误。这是一个内置的安全机制,根据当前密码策略的要求通知用户只提供复杂的强密码。

让我给你看一个例子。我使用以下命令以root用户身份登录到MySQL服务器:

$ mysql -u root -p

使用弱密码创建数据库用户:

mysql> create user 'ostechnix'@'localhost' identified by 'mypassword';

我遇到以下错误:

ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

 看到了吗?验证密码组件不允许我创建一个弱密码的用户。您将一直收到此错误提示,直到密码满足当前密码策略的要求,或者禁用Validate password组件。

修复– MySQL错误1819(HY000):您的密码不符合当前的策略要求

启用“验证密码”时,将强制实施三个级别的密码验证策略:

低强度> = 8个字符。

中等强度> = 8,数字,大小写混合和特殊字符。

高强度> = 8,数字,大小写混合,特殊字符和词典文件。

根据这些策略级别,您需要设置适当的密码。例如,如果密码验证策略设置为“中”,则必须设置密码,密码至少包含8个字符,包括数字,小写字母,大写字母和特殊字符。

首先,我们需要找到当前的密码策略级别。为此,请运行以下命令以显示“密码验证插件”系统变量:

mysql> SHOW VARIABLES LIKE 'validate_password%';

 大家可以看到,目前强制执行的密码等级是Medium,中等强度。所以我们的密码应该是8个字符长,有数字、混合大小写和特殊字符。

我将使用命令设置这个密码--Password123#@!

mysql> create user 'ostechnix'@'localhost' identified by 'Password123#@!';

现在可以使用了!因此,为了解决“ ERROR 1819(HY000)…”错误,您需要根据当前密码验证策略输入密码。

更改密码验证政策

您还可以通过设置较低级别的密码策略来解决“ ERROR 1819(HY000)…”。

为此,请在mysql提示符下运行以下命令:

mysql> SET GLOBAL validate_password_policy = 0;

或者mysql> SET GLOBAL validate_password_policy=LOW;

然后检查密码验证策略是否已更改为低:

mysql> SHOW VARIABLES LIKE 'validate_password%';

现在你可以创建一个用户与弱密码如下:

mysql> create user 'senthil'@'localhost' identified by 'password';    ##即使是低强度也需要>=8个字符

 要恢复到中级策略,只需在mysql提示符下运行以下命令:

mysql> SET GLOBAL validate_password.policy=MEDIUM;

如果密码策略未更改,请从mysql提示符退出,然后从“终端”窗口重新启动mysql服务:

$ sudo systemctl restart mysql

现在应该可以了。

禁用密码验证策略

如果您想使用弱密码创建用户,只需完全禁用“验证密码”组件,然后在创建用户后重新启用它即可。

登录到MySQL服务器:

$ mysql -u root -p

要临时禁用验证密码组件,请在mysql提示符下运行以下命令:

mysql> UNINSTALL COMPONENT "file://component_validate_password";

使用您选择的任何密码创建用户:

mysql> create user 'kumar'@'localhost' identified by '123456';

最后,启用验证密码组件:

mysql> INSTALL COMPONENT "file://component_validate_password";

 我个人不建议将策略更改为较低级别或禁用密码策略。无论是数据库用户还是普通用户,都应该使用包含8个以上字符的强密码,包括数字、混合大小写和空格字符。

原文链接:https://blog.csdn.net/weixin_35891142/article/details/113419248

实际解决:

mysql> grant replication slave,replication client on *.* to lianxi@'%' identified by '123456';
ERROR 1819 (HY000): Unknown error 1819
mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password_check_user_name    | OFF    |
| validate_password_dictionary_file    |        |
| validate_password_length             | 8      |
| validate_password_mixed_case_count   | 1      |
| validate_password_number_count       | 1      |
| validate_password_policy             | MEDIUM |
| validate_password_special_char_count | 1      |
+--------------------------------------+--------+
7 rows in set (0.00 sec)

mysql> SET GLOBAL validate_password_policy = 0;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| validate_password_check_user_name    | OFF   |
| validate_password_dictionary_file    |       |
| validate_password_length             | 8     |
| validate_password_mixed_case_count   | 1     |
| validate_password_number_count       | 1     |
| validate_password_policy             | LOW   |
| validate_password_special_char_count | 1     |
+--------------------------------------+-------+
7 rows in set (0.00 sec)

mysql> grant replication slave,replication client on *.* to lianxi@'%' identified by '12345678';     ##此处密码需要大于等于8个字符
Query OK, 0 rows affected, 1 warning (0.33 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

######################################################################################

权限查看方式:

mysql> show grants;

mysql> show grants for repl@'192.168.220.130';

mysql> show grants for lianxi@%;
ERROR 1064 (42000): 
mysql> show grants for lianxi;
+--------------------------------------------------------------------+
| Grants for lianxi@%                                                |
+--------------------------------------------------------------------+
| GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'lianxi'@'%' |
+--------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> show grants for lianxi@'%';
+--------------------------------------------------------------------+
| Grants for lianxi@%                                                |
+--------------------------------------------------------------------+
| GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'lianxi'@'%' |
+--------------------------------------------------------------------+
1 row in set (0.00 sec)

(3)查看主服务器master状态(注意File与Position项,从服务器需要这两项参数)

mysql> show master status \G
*************************** 1. row ***************************
             File: log-bin.000004
         Position: 154
     Binlog_Do_DB: student
 Binlog_Ignore_DB: mysql
Executed_Gtid_Set: 
1 row in set (0.00 sec

[root@localhost ~]# cat /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql                     ###data目录位置
socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

log-error=/var/log/mysqld.log       ##错误日志存放位置
pid-file=/var/run/mysqld/mysqld.pid

server-id=1        
log-bin=mysql-bin    #binlog名称与存放位置,此处没有指定绝对路径,那么存放在相对路径/var/lib/mysql下
binlog-do-db=student
binlog-ignore-db=mysql 
sync_binlog = 1      
#binlog_checksum = none
binlog_format = mixed 
[root@localhost ~]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.39-log MySQL Community Server (GPL)

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 |      154 | student      | mysql            |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> quit;
Bye
[root@localhost ~]# ls /var/lib/mysql/      
auto.cnf    client-cert.pem  ibdata1      ibtmp1            mysql-bin.000002  mysql-bin.index  performance_schema  server-cert.pem  sys
ca-key.pem  client-key.pem   ib_logfile0  mysql             mysql-bin.000003  mysql.sock       private_key.pem     server-key.pem
ca.pem      ib_buffer_pool   ib_logfile1  mysql-bin.000001  mysql-bin.000004  mysql.sock.lock  public_key.pem      student

(4)导出master数据库多余slave数据库中的数据,然后导入到slave数据库中。保证双方在同步环境实现前的数据一致。[新建环境可忽略次步骤]

导出数据库之前先锁定数据库

mysql> flush tables with read  lock;    #数据库只读锁定命令,防止导出数据库的时候有数据写入。unlock tables命令解除锁定

导出master数据库中需要同步的库(master数据库的root用户登陆密码:123456)

[root@~]# mysqldump -uroot  -p123456 student >/opt/student.sql

[root@~]# scp /opt/student.sql root@192.168.220.130:/opt/  
#将导出的sql文件上传到slave机器上

下面是slave数据库上的操作:

(1)设置slave数据库的my.cnf配置文件

[root@master ~]# vim /etc/my.cnf

.......

[mysqld]

server-id=2   #设置从服务器id,必须于主服务器不同

log-bin=mysql-bin   #启动MySQ二进制日志系统

replicate-do-db=student  #需要同步的数据库名。如果不指明同步哪些库,就去掉这行,表示所有库的同步(除了ignore忽略的库)     #此项主从库只需要配置一个

replicate-ignore-db=mysql  #不同步mysql数据库  #此项主从库只需要配置一个

slave-skip-errors = all   #跳过所有的错误,继续执行复制操作

--------------------------------------------------------------------------------------
温馨提示:

当只针对某些库的某张表进行同步时,如下,只同步liting库的haha表和test库的heihei表:

replicate-do-db = liting

replicate-wild-do-table = liting.haha       //当只同步几个或少数表时,可以这样设置。注意这要跟上面的库指定配合使用;

replicate-do-db = test

replicate-wild-do-table = test.heihei      //如果同步的库的表比较多时,就不能这样一一指定了,就把这个选项配置去掉,直接根据指定的库进行同步。
--------------------------------------------------------------------------------------

(2)在slave数据库中导入从master传过来的数据。

mysql> CREATE DATABASE student CHARACTER SET utf8 COLLATE utf8_general_ci;   
#先创建一个student空库,否则下面导入数据时会报错说此库不存在。

mysql> use student;

mysql> source /opt/student.sql;   #导入master中多余的数据。

.......

(3)配置主从同步指令

mysql> stop slave;   #执行同步前,要先关闭slave

mysql> change master to master_host='192.168.220.128',master_user='repl',master_password='repl123',master_log_file='mysql-bin.000004',master_log_pos=154;

mysql> start slave;

mysql> show slave status \G;

*************************** 1. row ***************************

        Slave_IO_State: Waiting for master to send event

         Master_Host: 192.168.220.128

         Master_User: repl

         Master_Port: 3306

        Connect_Retry: 60

       Master_Log_File: mysql-bin.000004

     Read_Master_Log_Pos: 154

       Relay_Log_File: mysql-relay-bin.000002

       Relay_Log_Pos: 279

   Relay_Master_Log_File: mysql-bin.000007

     Slave_IO_Running: Yes

     Slave_SQL_Running: Yes

      Replicate_Do_DB: student

    Replicate_Ignore_DB: mysql

     .............

   Seconds_Behind_Master: 0

如上,当IO和SQL线程的状态均为Yes,则表示主从已实现同步了!

下面测试下Mysql主从同步的效果

在master主数据库上写入新数据

mysql> use student;    

mysql>create table if not exists haha (id int PRIMARY KEY AUTO_INCREMENT,name varchar(50) NOT NULL);

Query OK, 0 rows affected (0.02 sec)

mysql> insert into student.haha values(100,"anhui");

Query OK, 1 row affected (0.00 sec)

然后在slave数据库上查看,发现master上新写入的数据已经同步过来了

mysql> select * from student.haha;

+-----+-----------+

id   | name    |

+-----+-----------+

| 100 | anhui   |

+-----+-----------+

1 rows in set (0.00 sec)

至此,主从同步环境已经实现!

参考:MySQL 主从同步(1) - 概念和原理介绍 以及 主从/主主模式 部署记录

注意:
Mysql主从环境部署一段时间后,发现主从不同步时,如何进行数据同步至一致?
有以下两种做法:
1)参考:mysql主从同步(2)-问题梳理 中的第(4)步的第二种方法
2)参考:mysql主从同步(3)-percona-toolkit工具(数据一致性监测、延迟监控)使用梳理

 ********主主复制实现过程*********

根据上面的主从环境部署,master和slave已经实现同步,即在master上写入新数据,自动同步到slave。而从库只能读不能写,一旦从库有写入数据,就会造成主从数据不一致!

下面就说下Mysql主主复制环境,在slave上更新数据时,master也能自动同步过来。

 -------------------------------------------------------------------------------------
温馨提示:

在做主主同步前,提醒下需要特别注意的一个问题:

主主复制和主从复制有一些区别,因为多主中都可以对服务器有写权限,所以涉及到自增长重复问题,例如:

出现的问题(多主自增长ID重复)

1)首先在A和B两个库上创建test表结构;

2)停掉A,在B上对数据表test(存在自增长属性的ID字段)执行插入操作,返回插入ID为1;

3)然后停掉B,在A上对数据表test(存在自增长属性的ID字段)执行插入操作,返回的插入ID也是1;

4)然后 同时启动A,B,就会出现主键ID重复

解决方法:

只要保证两台服务器上的数据库里插入的自增长数据不同就可以了

如:A插入奇数ID,B插入偶数ID,当然如果服务器多的话,还可以自定义算法,只要不同就可以了

在下面例子中,在两台主主服务器上加入参数,以实现奇偶插入!

记住:在做主主同步时需要设置自增长的两个相关配置,如下:

auto_increment_offset     表示自增长字段从那个数开始,取值范围是1 .. 65535。这个就是序号。如果有n台mysql机器,则从第一台开始分为设1,2...n

auto_increment_increment    表示自增长字段每次递增的量,其默认值是1,取值范围是1 .. 65535。如果有n台mysql机器,这个值就设置为n。

在主主同步配置时,需要将两台服务器的:

auto_increment_increment     增长量都配置为2

auto_increment_offset      分别配置为1和2。这是序号,第一台从1开始,第二台就是2,以此类推.....

这样才可以避免两台服务器同时做更新时自增长字段的值之间发生冲突。(针对的是有自增长属性的字段)
--------------------------------------------------------------------------------------

主主同步实现操作过程:

1)在master上的my.cnf配置:

[root@master ~]# vim /etc/my.cnf

server-id = 1        

log-bin = mysql-bin  

binlog-ignore-db = mysql,information_schema

sync_binlog = 1

binlog_checksum = none

binlog_format = mixed

auto-increment-increment = 2    

auto-increment-offset = 1   

slave-skip-errors = all     

   

[root@master ~]# /etc/init.d/mysql restart

Shutting down MySQL. SUCCESS!

Starting MySQL.. SUCCESS!

数据同步授权(iptables防火墙开启3306端口,要确保对方机器能使用下面权限连接到本机mysql

mysql> grant replication slave,replication client on *.* to repl@'192.168.0.104' identified by "repl123";

mysql> flush privileges;

最好将库锁住,仅仅允许读,以保证数据一致性;待主主同步环境部署后再解锁;锁住后,就不能往表里写数据,但是重启mysql服务后就会自动解锁!

mysql> FLUSH TABLES WITH READ LOCK;    //注意该参数设置后,如果自己同步对方数据,同步前一定要记得先解锁!

Query OK, 0 rows affected (0.00 sec)

mysql> show master status \G
*************************** 1. row ***************************
             File: mysql-bin.000001
         Position: 158
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

2)slave数据库上

[root@slave ~]# vim /etc/my.cnf

server-id = 2       

log-bin = mysql-bin  

binlog-ignore-db = mysql,information_schema

sync_binlog = 1

binlog_checksum = none

binlog_format = mixed

auto-increment-increment = 2    

auto-increment-offset = 2   

slave-skip-errors = all

[root@slave ~]# /etc/init.d/mysql restart

Shutting down MySQL. SUCCESS!

Starting MySQL.. SUCCESS!

数据同步授权(iptables防火墙开启3306端口,要确保对方机器能使用下面权限连接到本机mysql)

同理,slave也要授权给master机器远程同步数据的权限

mysql> grant replication slave ,replication client on *.* to repl@'192.168.0.103' identified by "repl123";  

mysql> flush privileges;

mysql> FLUSH TABLES WITH READ LOCK;

mysql> show master status \G
*************************** 1. row ***************************
             File: mysql-bin.000001
         Position: 256
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

3)执行主从同步操作

先在slave数据库上做同步master的设置。(确保slave上要同步的数据,提前在master上存在。最好双方数据保持一致)

mysql> unlock tables;     //先解锁,将对方数据同步到自己的数据库中

mysql> stop slave;

mysql> change master to master_host='192.168.0.103',master_user='repl',master_password='repl123',master_log_file='master-bin.000001',master_log_pos=158;

mysql> start slave;

mysql> show slave status \G;

*************************** 1. row ***************************

             Slave_IO_State: Waiting for master to send event

              Master_Host: 192.168.0.103

              Master_User: repl

              Master_Port: 3306

             Connect_Retry: 60

            Master_Log_File: mysql-bin.000001

          Read_Master_Log_Pos: 158

           nelay_Log_File: mysql-relay-bin.000003

             Relay_Log_Pos: 750

        Relay_Master_Log_File: mysql-bin.000001

            Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

            ..................

这样就实现了slave->master的同步环境。

再在master数据库上做同步slave的设置。(确保slave上要同步的数据,提前在master上存在。最好双方数据保持一致)

mysql> unlock tables;

mysql> stop slave;

mysql> change master to master_host='192.168.0.104',master_user='repl',master_password='repl123',master_log_file='master-bin.000001',master_log_pos=256;

mysql> start slave;

mysql> show slave status \G;

*************************** 1. row ***************************

           Slave_IO_State: Waiting for master to send event

             Master_Host: 192.168.0.103

             Master_User: repl

             Master_Port: 3306

            Connect_Retry: 60

           Master_Log_File: mysql-bin.000001

          Read_Master_Log_Pos: 256

           Relay_Log_File: mysql-relay-bin.000003

           Relay_Log_Pos: 750

        Relay_Master_Log_File: mysql-bin.000001

            Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

            ..................

这样就实现了master->slave的同步环境。至此,主主双向同步环境已经实现!

(4)最后测试下Mysql主主同步的效果

在master上写入新数据

mysql> select * from liting.haha;

+-----+-----------+

id   | name    |

+-----+-----------+

| 100 | anhui   |

+-----+-----------+

1 rows in set (0.00 sec)

mysql> insert into huanqiu.haha values(10,"beijing");

在slave数据库中查看,发现master新写入的数据已经同步过来了

mysql> select * from liting.haha;

+-----+------------+

id  | name    |

+-----+------------+

|  10| beijing  |

| 100 | anhui   |

+-----+------------+

2 rows in set (0.00 sec)

在slave上删除数据

mysql> delete from liting.haha where id=100;

在master数据库中查看

mysql> select * from liting.haha;

+-----+------------+

id  | name    |

+-----+------------+

|  10 | beijing  |

+-----+------------+

3 rows in set (0.00 sec)

以上,主主同步实现 

主从复制实际配置与取消主从

查找mysql配置文件
[root@dongm ~]# /usr/bin/mysql --verbose --help | grep -A 1 'Default options'
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf     ##依次读取

第一步:master操作 192.168.220.128
[root@localhost mysql]# cat /etc/my.cnf
...........
[mysqld]
...........
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

#master
server-id=1        
log-bin=mysql-bin    
binlog-do-db=test
binlog-ignore-db=mysql 
sync_binlog = 1      
#binlog_checksum = none
binlog_format = mixed 

[root@localhost mysql]# systemctl restart mysqld        ##读取更改的配置文件
##################修改密码策略,此处可省略########################
mysql>  set global validate_password_policy=0;
Query OK, 0 rows affected (0.00 sec)

mysql> set global validate_password_length=1;
Query OK, 0 rows affected (0.00 sec)
################################################################
mysql> grant replication slave,replication client on *.* to lianxi@'%' identified by '12345678';     ##此处密码需要大于等于8个字符
Query OK, 0 rows affected, 1 warning (0.33 sec)
##############################查看,撤销权限与删除用户################################
mysql客户机远程登录服务器:mysql -h服务器ip -u用户 -p密码        #无法远程登录需要排查服务端防火墙
show grants for 'user'@'ip';       #查看权限
mysql> revoke all privileges on *.* from lianxi@'%';    #撤销权限
Query OK, 0 rows affected (0.03 sec)

mysql> drop user lianxi@'%';                  #删除用户
Query OK, 0 rows affected (0.01 sec)
###############################################################################
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> flush tables with read lock;      ###数据库只读锁定命令,防止导出数据库的时候有数据写入。unlock tables命令解除锁定
Query OK, 0 rows affected (0.00 sec)


[root@localhost ~]# mysqldump -uroot -p test >/root/1.sql   ##只读状态下备份数据库
Enter password: 
[root@localhost ~]# scp /root/1.sql root@192.168.220.130:/opt/        #本地文件上传到远程服务器opt目录下
1.sql         100%   11KB   6.2MB/s   00:00                                                                                                                                     

mysql> show master status;  #此处test与mysql对应/etc/my.cnf内的binlog-do-db=test与binlog-ignore-db=mysql 
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000006 |      154 | test         | mysql            |                   |   
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

第二步:slave操作 192.168.220.130
[root@localhost ~]# cat /etc/my.cnf
..........
#
[mysqld]
..........
character-set-client-handshake = FALSE
character-set-server = utf8
collation-server =  utf8_general_ci
init_connect='SET NAMES utf8'

#slave
server-id=2
log-bin=mysql-bin
#slave-skip-errors = all 

mysql> CREATE DATABASE test CHARACTER SET utf8 COLLATE utf8_general_ci;   #先创建一个test空库,否则下面导入数据时会报错说此库不存在
mysql> use test;
mysql> source /opt/1.sql;   # 1.sql为master中备份的数据库文件
mysql> stop slave;  #开始配置主从同步指令,执行同步前,要先关闭slave
mysql> change master to master_host='192.168.220.128',master_user='lianxi',master_password='12345678',master_log_file='mysql-bin.000006',master_log_pos=154;  #此处为master的信息,包括ip,授权同步的用户信息,以及同步的binlog名称与位置信息
mysql> start slave;
mysql> show slave status \G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.220.128
                  Master_User: lianxi
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000006       #master二进制文件名
          Read_Master_Log_Pos: 154                    #当前的二进制文件位置
               Relay_Log_File: localhost-relay-bin.000006    #当前使用的中继日志文件名
                Relay_Log_Pos: 369                           #当前中继日志文件位置
        Relay_Master_Log_File: mysql-bin.000006
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:          #对应slave下/etc/my.cnf文件binlog-do-db=
          Replicate_Ignore_DB:          #对应slave下/etc/my.cnf文件binlog-ignore-db=
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 154
              Relay_Log_Space: 748
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1       #主库id
                  Master_UUID: 779a159e-3592-11ed-a998-000c29d1462e
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates  #状态
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 0
            Network_Namespace: 
1 row in set (0.00 sec)    #如上,当IO和SQL线程的状态均为Yes,则表示主从已实现同步了
##########################################################################
mysql -uroot -pxxxxxx <<eof
CREATE DATABASE test CHARACTER SET utf8 COLLATE utf8_general_ci;
use test;
source /opt/1.sql;
stop slave;
change master to master_host='192.168.220.128',master_user='lianxi',master_password='12345678',master_log_file='mysql-bin.000006',master_log_pos=154;
start slave;
show slave status \G
eof
###########################################################################


第三步:master操作 192.168.220.128
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)

取消主从配置
部署环境有时需要更换取消主从机制或者更换备机,需要将之前的主备关系解除,现梳理其一般性流程:

1、slave流程
首先停止slave
mysql>stop slave;
清除slave信息
mysql>reset slave all;

# 可以通过以下命令查看当前状态
mysql> show slave status\G
Emptyset (0,00 sec)

slave之后可以直接关闭下线。

2、master流程
清除master上主从信息
mysql> reset master;
修改配置重启mysql
如果想彻底清除主从的机制,可以修改配置文件,删除主从相关的配置项,然后重启mysql即可。

Slave_IO_Running:Connecting ;处理

参考文章:Slave_IO_Running:Connecting ;_Java小白白又白的博客-CSDN博客

处理实例:
客户端
[root@zabbix-server ~]# mysql -udongm -p123456 -h192.168.220.108
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.220.108' (113)

服务器
[root@zabbix-proxy mysql_script]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 3533  266K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
    1    84 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
   16  1072 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
    2   104 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
 2308  182K REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 2354 packets, 260K bytes)
 pkts bytes target     prot opt in     out     source               destination         

服务器:
[root@zabbix-proxy selinux]# iptables -F
[root@zabbix-proxy selinux]# iptables -nvL
Chain INPUT (policy ACCEPT 50 packets, 3300 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 26 packets, 2536 bytes)
 pkts bytes target     prot opt in     out     source               destination         

客户端
[root@zabbix-server ~]# mysql -udongm -p123456 -h192.168.220.108
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.42-log MySQL Community Server (GPL)

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

/var/lib/mysql/目录下的数据库文件

主从复制下主服务器

[root@zabbix-proxy mysql]# pwd
/var/lib/mysql
[root@zabbix-proxy mysql]# ls
auto.cnf    ca.pem           client-key.pem  ibdata1      ib_logfile1  mysql             mysql-bin.000002  mysql-bin.index  mysql.sock.lock     private_key.pem  server-cert.pem  sys
ca-key.pem  client-cert.pem  ib_buffer_pool  ib_logfile0  ibtmp1       mysql-bin.000001  mysql-bin.000003  mysql.sock       performance_schema  public_key.pem   server-key.pem   test
[root@zabbix-proxy mysql]# cd test             #test为一个数据库名
[root@zabbix-proxy test]# pwd
/var/lib/mysql/test
[root@zabbix-proxy test]# ls
aaa.frm  customers.frm  db.opt          orderitems.ibd  orders.ibd        productnotes.MYD  products.frm  vendors.frm
aaa.ibd  customers.ibd  orderitems.frm  orders.frm      productnotes.frm  productnotes.MYI  products.ibd  vendors.ibd

mysql数据data目录结构
mysql数据data目录下有如下几个重要文件:ibdata1,ib_logfile0,ib_logfile1
数据库xx 以及该目录下的一系列 .frm 文件,其中ib_logfile0 和 ib_logfile1 是关于数据库的一些日志文件
数据库xx 是默认数据库和我们添加的数据库目录              #数据库test
ibdata1 存储了数据库的真实表数据
.frm 是存储了数据库表的结构描述说明

mysql-bin.000001,mysql-bin.000002为二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)语句事件         #需要开启二进制日志,修改配置文件/etc/my.cnf,mysqlbinlog命令可以解析二进制日志
mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |      1844 |
| mysql-bin.000002 |       653 |
| mysql-bin.000003 |       154 |
+------------------+-----------+
3 rows in set (0.00 sec)

mysql-bin.index   二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件
[root@zabbix-proxy mysql]# cat mysql-bin.index 
./mysql-bin.000001
./mysql-bin.000002
./mysql-bin.000003

mysql> show processlist;      #dump线程
+----+--------+-----------------------+------+-------------+------+---------------------------------------------------------------+------------------+
| Id | User   | Host                  | db   | Command     | Time | State                                                         | Info             |
+----+--------+-----------------------+------+-------------+------+---------------------------------------------------------------+------------------+
|  3 | root   | localhost             | NULL | Query       |    0 | starting                                                      | show processlist |
|  4 | lianxi | 192.168.220.128:39834 | NULL | Binlog Dump | 2076 | Master has sent all binlog to slave; waiting for more updates | NULL             |
+----+--------+-----------------------+------+-------------+------+---------------------------------------------------------------+------------------+
2 rows in set (0.00 sec)

mysql> show master status \G
*************************** 1. row ***************************
             File: mysql-bin.000003
         Position: 154
     Binlog_Do_DB: test
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

主从复制下从服务器

[root@zabbix-server mysql]# pwd
/var/lib/mysql
[root@zabbix-server mysql]# ls
auto.cnf    client-cert.pem  ibdata1      ibtmp1       mysql-bin.000001  mysql-bin.index  performance_schema  relay-log.info   sys                             zabbix-server-relay-bin.000009
ca-key.pem  client-key.pem   ib_logfile0  master.info  mysql-bin.000002  mysql.sock       private_key.pem     server-cert.pem  test                            zabbix-server-relay-bin.index
ca.pem      ib_buffer_pool   ib_logfile1  mysql        mysql-bin.000003  mysql.sock.lock  public_key.pem      server-key.pem   zabbix-server-relay-bin.000008

zabbix-server-relay-bin.000008,zabbix-server-relay-bin.000009   中继日志文件   ##从库会将主库binlog日志内容依次写到Slave端自身的Relay Log(即中继日志)文件(Mysql-relay-bin.xxx)的最末端

zabbix-server-relay-bin.index   中继日志索引文件(文件名后缀为.index)用于记录所有的中继日志文件
[root@zabbix-server mysql]# cat zabbix-server-relay-bin.index
./zabbix-server-relay-bin.000008
./zabbix-server-relay-bin.000009

master-info   从库将新的binlog文件名和位置记录到此文件中,以便下一次读取master端新binlog日志时能告诉Master服务器从新binlog日志的指定文件及位置开始读取新的binlog日志内容
[root@zabbix-server mysql]# cat master.info 
25
mysql-bin.000003                  #master的二进制文件名       
154                               #master的二进制文件位置
192.168.220.108                   #master的ip地址
lianxi                            #master授权的用户名
123456                            #master授权用户lianxi的登录密码
3306                              #端口号
60
0

0
30.000

0
d05f2ccf-ed91-11ed-a261-000c29d1462e
86400


0


relay-log.info    记录当前应用中继日志的文件名和位置点      #Slave服务器端的SQL线程会实时检测本地Relay Log 中IO线程新增的日志内容,然后及时把Relay LOG 文件中的内容解析成sql语句,并在自身Slave服务器上按解析SQL语句的位置顺序执行应用这样sql语句,并在relay-log.info中记录当前应用中继日志的文件名和位置点
[root@zabbix-server mysql]# cat relay-log.info
7
./zabbix-server-relay-bin.000009      #当前中继日志的文件名   sql线程当前记录的文件名和位置
367                                   #当前中继日志文件位置
mysql-bin.000003                      #master的二进制文件名  从站i/o线程当前记录的文件名和位置
154                                   #master的二进制文件位置
0
0
1
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL主从同步是一种数据复制机制,用于将一个MySQL数据库实例中的数据自动复制到其他MySQL数据库实例,从而实现数据的备份、负载均衡和故障恢复等功能。 在主从同步中,一个MySQL实例被配置为主服务器(Master),而其他实例被配置为从服务器(Slave)。主服务器负责接收和处理客户端的写操作,然后将这些操作记录到二进制日志(Binary Log)。从服务器连接到主服务器,并通过读取主服务器的二进制日志来复制这些操作。从服务器将这些操作应用到自己的数据上,以保持与主服务器数据的一致性。 配置MySQL主从同步需要进行以下步骤: 1. 确保主服务器和从服务器之间可以互相通信。 2. 在主服务器上开启二进制日志功能,并配置二进制日志文件的位置和名称。 3. 在主服务器上创建一个用于复制的用户,并为该用户授予复制权限。 4. 在从服务器上配置复制参数,包括指定主服务器的IP地址、连接用户名和密码等。 5. 启动从服务器,并连接到主服务器进行复制。 6. 监控主从同步过程,确保数据的一致性和同步性。 需要注意的是,在配置主从同步时,需要考虑网络延迟、带宽和硬件性能等因素,以确保同步过程的效率和稳定性。另外,主从同步只能复制数据更改操作(如插入、更新、删除),而不能复制结构变更操作(如创建表、修改表结构)。如果需要同步结构变更,可以使用其他工具或方法来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值