首页 > 数据库 >mysql主从同步

mysql主从同步

时间:2024-05-10 10:00:30浏览次数:19  
标签:同步 slave log Master mysql master 日志 主从

6.MySQL主从同步 、 主从同步模式

6.MySQL主从同步 、 主从同步模式

主从同步原理

(1)Master,记录数据更改操作

①启用binlog日志

②启用binlog日志格式

③设置server_id

(2)Slave运行2个线程

①Slave_IO: 复制master主机binlog日志文件里的SQL到本机的relay-log文件里

②Slave-SQL: 执行本机relay-log文件里的SQL语句,重现Master的数据操作

③relay-log中继日志文件:只要指定为从服务器,自动开启此文件

在主从同步的过程中,主库会将所有的操作事件记录在 binlog 中,从库通过开启一个 I/O 线程保持与主库的通信,并在一定时间间隔内探测 binlog 日志文件是否发生改变。如果 binlog 日志发生了变化,主库生成一个 binlog dump 线程向从库 I/O 线程传送 binlog。从库上的 I/O 线程将 binlog 复制到自己的 relay log 中。最终由从库中的 SQL 线程读取 relay log 中的事件重放到从库上

构建主从同步

(1)确保数据相同:从库必须要有主库上的数据

(2)配置主服务器:启用binlog日志、授权用户,查看当前正在使用的日志

(3)配置从服务器:设置server_id,指定主库信息

(4)测试配置:客户端连接主库写入数据,在从库上也能查询到

文件名 说明
Master.info 主库信息
Relay-log.info 中继日志信息
主机名-relay-bin.xxxxxx 中继日志
主机名-relay-bin.index 中继日志索引文件

配置主服务器

修改/etc/my.cnf配置,重新启动MySQL服务程序

vim /etc/my.cnf
[mysqld]
log_bin=日志名                          //启用binlog日志,并指定文件名前缀
server_id=id值                          //指定服务器ID号
binlog_format=”mixed”                   //指定binlog日志类型
......

重启mysql服务:

systemctl  restart mysqld.service

新建备份用户,授予复制权限

需要的权限为REPLICATION SLAVE,允许其从Slave服务器访问:

grant replication slave ON *.* TO 授权用户名@'从库地址' IDENTIFIED BY '密码';

检查Master服务器的同步状态

show master status\G

*************************** 1. row ***************************
             File: dbsvr1-bin.000001               //记住当前的日志文件名
         Position: 154                             //记住当前的位置
     Binlog_Do_DB:
 Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)

验证是否为从库

show slave status   空则不是

配置从服务器

修改/etc/my.cnf配置,指定服务器ID号、允许日志同步:

vim /etc/my.cnf
[mysqld]
log_bin=dbsvr2-bin                      //启动SQL日志,并指定文件名前缀
server_id = 20                          //指定服务器ID号,不要与Master的相同
.. ..

配置完成后,重启mysql服务:

systemctl  restart mysqld.service

指定主库信息

change master to
master_host='主库ip地址',
master_user='主库授权的用户名',
master_password='授权密码',
master_log_file='主库日志文件名',      //对应Master的日志文件
master_log_pos=主库偏移量;                 //对应Master的日志偏移位置(偏移量)

启动 SLAVE进程

start slave;                  //启动进程,stop slave,停止进程    

注意:一旦启用SLAVE复制,当需要修改MASTER信息时,应先执行STOP SLAVE停止复制,然后重新修改、启动复制。

检查Slave服务器的同步状态

确认其中的IO线程、SQL线程正常运行,才能成功同步:

show slave status\G                 #显示当前服务器从库的状态

Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.4.1
                  Master_User: replicater
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: dbsvr1-bin.000001
          Read_Master_Log_Pos: 154
               Relay_Log_File: db2-relay-bin.000003   #中继日志文件
                Relay_Log_Pos: 321
        Relay_Master_Log_File: dbsvr1-bin.000001
             Slave_IO_Running: Yes             //IO线程应该已运行
            Slave_SQL_Running: Yes             //SQL线程应该已运行
              Replicate_Do_DB:
          Replicate_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: 2490
              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       #IO错误显示的地方
                Last_IO_Error:
               Last_SQL_Errno: 0      #SQL错误显示的地方
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 10
                  Master_UUID: 2d4d8a11-27b7-11e7-ae78-52540055c180
             Master_Info_File: /var/lib/mysql/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:
1 row in set (0.00 sec)

错误分析

若START SLAVE直接报错失败,请检查CHANGE MASTER相关设置是否有误,纠正后再重试;若IO线程或SQL线程有一个为“No”,则应检查服务器的错误日志,分析并排除故障后重启主从复制。

Slave_IO_Running错   #从服务器指定主服务器的IP以及最初改主配置文件等打错了,细心寻找差错,找到某个之后直接

stop slave;

change master to 选项=‘值’,选项=‘值’...; #哪个错了改哪个,一个错了就改一个

start slave;

Slave_SQL_Running错   #最初主从数据库的数据不一致

从服务器相关文件

cat /var/lib/mysql/master.info   //主库信息

主机名-relay-bin.00001          //中继日志文件 默认保留两个最新的

主机名-relay-bin.index           //中继日志文件的索引文件

relay-log.info                   //中继日志信息

同步部分数据库

主库配置选项:对所有从服务器有效

选项 用途
Bin_do_db=想同步的库名,多个库用逗号空格间隔 设置master对哪些库记日志
Binlog_ignore_db=不想同步的库名 设置master对哪些库不记日志

从库配置选项

选项 用途
log_slave_updates 记录从库更新,允许链式复制(A-B-C),作主从从用
relay_log=日志文件的名字 指定文件日志文件名
replicate_do_db=库名1,库名2 仅复制指定库,其他库将被忽略,此选项可设置多条(省略时复制所有库)
replicate_ignore_db=test ignore-db与do-db只需选用其中一种
不复制哪些库,其他库将被忽略

主-从-从

主 192.168.4.51  从 192.168.4.52  从 192.168.4.53

配置主服务器192.168.4.51

vim /etc/my.cnf
[mysqld]
log_bin=db51                      //启用binlog日志,并指定文件名前缀
server_id=51                        //指定服务器ID号
binlog-format="mixed"              // 指定binlog日志格式

systemctl  restart   mysqld

确保/var/lib/mysql下面有两个文件:
/var/lib/mysql/db51.000001  /var/lib/mysql/db51.index

查看主服务正在使用的日志信息
show  master  status;

对从库52上的用户进行授权
grant replication  slave on  *.*  to  用户52@"192.168.4.52"  identified  by "密码";

配置从服务器192.168.4.52

对用户53用户进行授权
grant replication slave  on  *.*  to 用户53@"192.168.4.53" identified  by "密码";

vim /etc/my.cnf
[mysqld]
server_id=52                  
log-bin=db52
binlog-format="mixed"
log_slave_updates                          //允许级联复制

systemctl restart mysqld

确保/var/lib/mysql下面有两个文件:
/var/lib/mysql/db52.000001  /var/lib/mysql/db52.index

查看正在使用的日志信息
show  master  status;

change master to
master_host="192.168.4.51",
master_user="yaya",
master_password="123456",
master_log_file="db51.000002",
master_log_pos=437;
Query OK, 0 rows affected, 2 warnings (0.43 sec)

start slave;
show slave status \G;   确认其中的IO线程、SQL线程正常运行

配置从从服务器192.168.4.53

mysql  -h192.168.4.52  -uuser53  -p654321

vim /etc/my.cnf
validate_password_policy=0
validate_password_length=6
server_id=53

systemctl restart mysqld

mysql -uroot -p123456
change  master  to
master_host="192.168.4.52",
master_user="user53",
master_password="654321",
master_log_file=" db52.000001",
master_log_pos=154;

start  slave;

show slave status\G

配置半同步复制模式

异步复制:主库执行完成后,立即将结果返回给客户端,并不关心从库是否已经接收并处理,客户端体度高

全同步模式:当主库执行完一次事务,且所有从库都执行了该事物才返回给客户端,用户体验度差

半同步复制: 介于异步和全同步之间,主库在执行完一次事物后,等待至少一个从库接收到并写到relay log中才返回给客户端

1) 查看是否允许动态加载模块默认允许
mysql> show  variables  like  'have_dynamic_loading';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| have_dynamic_loading | YES   |
+----------------------+-------+
如果为no,修改主配置文件/etc/my.cnf,加一句have_dynamic_loading=yes即可

2)加载插件,用户需有SUPER权限(加载模块)
主库上面操作:
mysql> install plugin rpl_semi_sync_master soname  'semisync_master.so';
从库上面操作:
mysql> install plugin rpl_semi_sync_slave soname  'semisync_slave.so';
查看模块是否安装成功:
mysql> select plugin_name,plugin_status from information_schema.plugins where  plugin_name like '%semi%';
+-------------------  ---+-------------------+
| PLUGIN_NAME       | PLUGIN_STATUS |
+--------------------  --+-------------------+
| rpl_semi_sync_master | ACTIVE          |
| rpl_semi_sync_slave   | ACTIVE          |
+---------------------  -+-------------- ----+
3)启用半同步复制
// 在安装完插件后,半同步复制默认是关闭的
主库上面执行:
mysql> set global rpl_semi_sync_master_enabled = 1;
从库上面执行:
mysql> set global rpl_semi_sync_slave_enabled = 1;
查看半同步复制模式是否启用,主库和从库都要操作:
mysql>  show  variables  like  "rpl_semi_sync_%_enabled";
+------------------------------+-------+
| Variable_name                | Value |
+------------------------------+-------+
| rpl_semi_sync_master_enabled | ON    |
| rpl_semi_sync_slave_enabled  | ON    |
+------------------------------+-------+
4)永久启用半同步复制 (推荐)
主库配置
vim /etc/my.cnf
[mysqld]
plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1
从库配置
vim /etc/my.cnf
[mysqld]
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1
在高可用架构下,master和slave需同时启动,以便在切换后能继续使用半同步复制
[root@master51 ~]# vim /etc/my.cnf
[mysqld]
plugin-load ="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl-semi-sync-master-enabled = 1
rpl-semi-sync-slave-enabled = 1

标签:同步,slave,log,Master,mysql,master,日志,主从
From: https://www.cnblogs.com/lixunblogs/p/18167575

相关文章

  • 配置mysql多实例
    配置mysql多实例需要专用的、支持多实例的mysql软件。这里用到的是mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz解压mysql软件包tar-xfmysql-5.7.34-linux-glibc2.12-x86_64.tar.gz-C/usr/local/mysql配置多实例vim/etc/my.cnf[mysqld_multi]            ......
  • mysql导入导出整个数据库
    要将整个MySQL数据库导入到另一个MySQL实例中,您可以使用mysqldump工具导出数据库,并使用mysql客户端导入它。以下是一般的步骤:1. 导出数据库使用mysqldump工具导出数据库到一个SQL文件。例如,如果您要导出名为mydatabase的数据库,可以这样做:mysqldump-u[username]-pmydatabas......
  • mysql事务
    1.事务  事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。2.控制事务控制事务一查看/设置事务提交方式SELECT@@autocommit;SET@@autocommit=0;提交事......
  • Linux问题--docker启动mysql时提示3306端口被占用(kill不掉3306端口)
    使用kill-9杀掉mysqld服务时一直失败。mysql启动时会启动mysqld和mysqld_safe两个进程,当使用kill-9杀掉mysqld进程时,mysqld_safe会自动重新启动mysqld。当使用正常方式退出mysqld时,mysqld_safe也会退出。如果需要kill掉mysqld服务可以先通过lsof-i:3306查询到占用3306......
  • [转帖]Mysql数据库的事务特性、隔离级别及MVCC多版本并发控制简介
    https://my.oschina.net/tongchengyu/blog/4714950事务的特性数据库如果支持事务,就要满足下面四个特性(ACID)。原子性(A:Atomicity)在一个事务中,多个sql操作,要么一起成功(所有数据操作都成功),要么一起回滚(其中一个没有成功,其他数据操作一起恢复到开始状态)。一致性(C:Consisten......
  • mysql面试
    001Mysql如何实现索引机制MySQL中索引分三类:B+树索引,Hash索引,全文索引InnoDB索引和MySAM索引实现的区别是什么?MySAMMySAM索引文件和数据是分离的,使用B+树实现,主键索引和辅助索引实现一致,索引文件仅保存记录所以在页的指针(物理地址),通过这些地址来读取页,进而读取被索引的行 ......
  • MySQL 创建数据库使用 UTF-8 问题
    问题描述将emoji符号(如......
  • mysql - mysql 命令行的使用
    1.Mysql管理连接数据库--连接本地数据库mysql-uroot-p--连接远程数据库mysql-h192.168.0.105-uroot-p--连接远程指定数据库并设置字符集mysql-h192.168.0.105-uroot-p--default-character-set=utf8test修改root密码,直接修改配置文件[mysql]......
  • 【转】[MySQL] 忘记密码的处理之 Windows 篇
    来自:阿里的通义灵码在Windows环境下,如果你忘记了MySQL的root密码,可以通过以下步骤重置:停止MySQL服务:打开“服务”管理工具(可以通过运行 services.msc 或搜索“服务”找到)。找到名为 MySQL 或 MySQL80(根据你的版本)的服务,然后右键选择“停止”。找到MySQ......
  • 【转】[MySQL] 忘记密码的处理之 Linux 篇
    来自:阿里的通义灵码如果你忘记了MySQL的root用户密码,可以按照以下步骤重置:方法1:使用 mysqld_safe 跳过授权表停止MySQL服务:bash sudoservicemysqlstop启动MySQL并跳过授权表:bash sudomysqld_safe--skip-grant-tables&登录到MyS......