mysql主从复制

本文作者:wuXing

QQ:1226032602

E-mail:1226032602@qq.com

https://dev.mysql.com/doc/refman/5.7/en/replication-implementation-details.html

  1. mysql复制

在这里插入图片描述

  1. 工作原理

复制(replication)是mysql提供的一种高可用性的解决方案。

1、主库(master)把数据更改记录到二进制日志(binlog)中

2、从库(slave)I/O线程请求主库建立连接,获取master的binlog并记录成本地的中继日志(relay log)

3、从库(slave)sql线程读取并应用relaylog

  1. 用途

1、利用从库做负载均衡,提高读数据的能力

2、利用从库做master的故障切换服务器,高可用性

3、利用从库做备份服务器

4、利用从库做延时数据的备份

5、利用复制做mysql升级

6、利用从库做查询服务器

  1. 复制模式

mysql5.6开始支持:

传统复制

1、基于语句的复制 binlog_format = statement (SBR)

2、基于行复制 binlog_format = row (RBR)

3、混合复制 binlog_format = mixed

GTID复制

半同步复制是复制安全的一种技术实现

  1. 基于行的复制
binlog_format = row

优点:
1、安全的复制模式

2、某些情况下复制速度快(sql复杂,表有主键,直接复制更新的目标记录)

3、系统函数也可以复制

4、更少的锁

缺点:

1、binary log文件大

2、单独语句如更新,删除的记录过多,会产生大量的binary log

3、无法从日志中看到具体的语句内容,(binlog-row-query-log events=1 可以增加这部分信息)

注意:DDL语句,还是会记录为statement

  1. 查看表里面字段的顺序
mysql> select TABLE_NAME,COLUMN_NAME from columns where TABLE_SCHEMA='oldboy' limit 10;
+------------+-------------+
| TABLE_NAME | COLUMN_NAME |
+------------+-------------+
| backupstep | id          |
| backupstep | step        |
| student    | id          |
| student    | name        |
| student    | age         |
| student    | dept        |
| test       | id          |
| test       | name        |
+------------+-------------+
8 rows in set (0.01 sec)
  1. 基于mixed的复制
binlog_format = mixed

混合使用两种模式
Innodb表,事物级别为read-uncommitted read-committed日志类型只能为row

转换为row模式条件:

1、表的存储引擎为NDB引擎表,这时对于表的DML操作都会以row格式记录

2、使用了UUID()、USER()、CURRENT_USER()、FOUND_ROWS()、ROW_COUNT()等不确定函数

3、两个及以上含有Auto_increment字段的表被更新时

4、使用了INSERT DELAY语句

5、使用了用户定义函数

6、使用了临时表

  1. 转换为row模式条件

当是有grant,revoke,set password,rename user,create(all forms except create table…select),alter(all forms),and drop (all forms)都将使用statement级别来记录binlog而忽视系统设置

create table…select 是一个集数据定义和数据处理为一体的语句。他的create table部分使用statement方式,而select部分使用系统定义的方式

  1. 复制常用命令
show slave status\G;
show master status;
start slave;
start slave IO_THREAD;
start slave SQL_THREAD;
start slave [SQL_THREAD] until
master_log_file = 'log_name'
master_log_pos = log_pos
stop slave IO_THREAD;
stop slave SQL_THREAD;
reset master/slave;
  1. 跳过错误
stop slave;
set global sql_slave_skip_counter=1;
start slave;
  1. 从库配置主从同步执行命令
change master to
master_host = '10.0.0.51',
master_port=3306,
master_user = 'replication',
master_password ='slave',
master_log_file = 'mysqld-bin.006572',
master_log_pos=514294150;
  1. 复制创建的基本原则

1、一个mysql从库只能有一个主库(mysql5.7后可以多源复制)

2、每个主库,从库必须有唯一的server id

3、 一个主库可以有多个从库

4、如果级联复制需要打开log_slave_updates,从库把relaylog记录到binlog中用于它的从库的复制

  1. 一主多从

适用于少量写大量读,可以实现:

1、为不同从库设置不同角色

2、把一台从库当做待用的主库,除了复制没有其他数据查询

3、将一台从库放到远程数据中心,用作灾难恢复

4、延迟一个备库,以备灾难恢复

  1. 双主

主动-主动模式复制包含2台服务器,每一方都设置成对方的主库和从库。适用于两边都需要写入的情况

问题:自增列的冲突问题

auto_increment_increment=2#自增ID的间隔,如 1 3 5间隔为2

Master A: auto_increment_offset=1 #分布1 3 5 7 9 …

Master B: auto_increment_offset=2 #分布 2 4 6 8 10 …

主动-被动模式区别其中一台是只读的被动服务器。这种方式使反复切换主动和被动服务器非常方便。

故障转移和故障恢复很方便。可以在不关闭服务器的情况下进行维护,优化,升级操作系统

测试单个主库

create database oldboy CHARACTER SET utf8  COLLATE utf8_general_ci;
use oldboy;
CREATE TABLE `student` (
  `id` bigint(12) NOT NULL auto_increment COMMENT '主键',
  `name` varchar(12) NOT NULL COMMENT '姓名',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
  1. 拥有从库的双主

在这里插入图片描述

  1. 级联复制

在这里插入图片描述

级联复制中,添加log-slave-updates参数,从库从主库复制的数据才会写入log-bin日志文件里

  1. mysql主从复制配置
  2. 配置复制

复制的准备

1、master创建一个replication专用复制账号

replication slave replication client

2、master和slave设置不同的server-id

3、在master上执行一次完整逻辑备份

4、拷贝到slave,执行一次全量恢复

5、slave上面执行change master设置主服务器信息

slave上面执行start slave 启用复制,从库连接到主库读取数据

  1. 主库和从库都建立复制账户
grant replication slave,replication client on *.* to repuser@'172.16.1.%'  identified by '123456';
grant replication slave on *.* to rep@'10.0.0.%' identified by '123';

mysql8.0主从复制用户

default-authentication-plugin=mysql_native_password
create user 'aaa'@'10.0.0.%' identified with mysql_native_password by '123';
  1. 配置主库

在主库需要指定唯一的server id和启用二进制日志

[mysqld]
server-id=1
log-bin=mysql-bin
log-bin_index
binlog_format=row
binlog_cache_size=2M
max_binlog_size=1G
expire_logs_days=7
binlog-ignore-db = mysql
replicate-ignore-db = mysql
skip-name-resolve
gtid_mode=off
[mysqld]
server-id=1
log-bin=/application/mysql/mysqlbinlog/mysql-bin
basedir=/application/mysql
datadir=/application/mysql/data
binlog-ignore-db=mysql
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
user=mysql
socket=/usr/local/mysql/mysql.sock
log_error=/var/log/mysql.log
secure-file-priv=/tmp
server-id=1
log_bin=/data/binlog/mysql-bin
binlog_format=row
sync_binlog=1
slow_query_log=1
slow_query_log_file=/data/binlog/slow.log
long_query_time=0.01
log_queries_not_using_indexes

重启使二进制日志生效。注意如果你没有明确的设置server-id或者设置为它的默认值0

master会拒绝从库的任何连接

建议启用

innodb_flush_log_at_trx_commit=1
sync_binlog=1
innodb_support_xa=1
  1. 主库创建主从复制账号
grant replication slave on *.* to 'rep'@'172.16.1.%' identified by '123456';
  1. 主库锁表
flush table with read lock;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |      405 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
  1. 导出全部数据
mysqldump -uroot -p123456  -A -B --triggers --routines --events --master-data=2 --single-transaction |gzip >all_$(date +%F).sql.gz
  1. 解锁
unlock table;
  1. 配置从库

在从库需要指定唯一的server id

[mysqld]
server-id=2
log-bin=mysql-bin
relay-log=/directory/mysql-relay-bin
relay-log-info-file=/directory/relay-log.info
log-slave-updates=1
read-only=1
sync_master_info=1
sync_relay_log=1
sync_relay_log_info=1
master_info_repository=table
relay-log-info-repository=table
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
user=mysql
socket=/usr/local/mysql/mysql.sock
log_error=/var/log/mysql.log
secure-file-priv=/tmp
server-id=2
log_bin=/data/binlog/mysql-bin
binlog_format=row
sync_binlog=1
slow_query_log=1
slow_query_log_file=/data/binlog/slow.log
long_query_time=0.01
log_queries_not_using_indexes
relay-log=/data/relaylog/mysql-relay-bin
relay-log-info-file=/data/relaylog/relay-log.info

relay_log

relay_log_index

relay_log_info_file

master_info_repository

[mysqld]
server-id=2
log-bin=/application/mysql/mysqlbinlog/mysql-bin
log-slave-updates=1
basedir=/application/mysql
datadir=/application/mysql/data
relay-log=/application/mysql/mysqlrelaylog/mysql-relay-bin
[mysql]
user=root
password=oldboy123
[mysqladmin]
user=root
password=oldboy123
[mysqldump]
user=root
password=oldboy123
[mysqld]
server-id=3
basedir=/application/mysql
datadir=/application/mysql/data
socket=/application/mysql/tmp/mysql.sock
character-set-server=utf8
innodb_data_file_path=ibdata1:12M;ibdata2:50M:autoextend
log-bin=/application/mysql/mysql-bin
binlog_format = 'ROW'
binlog-ignore-db = mysql
replicate-ignore-db = mysql
skip-name-resolve
slow-query-log=1
long_query_time = 2
log_queries_not_using_indexes
slow_query_log_file= /application/mysql/slow.log
min_examined_row_limit = 1000
  1. 在从库执行配置主从同步
change master to
master_host='172.17.0.3',
master_port=3306,
master_user='rep',
master_password='123456',
master_log_file='mysql-bin.000006',
master_log_pos=120;
master_connect_retry=10;

启动主从复制所有线程

start slave;

启动io线程

start slave io_thread;

启动SQL线程

start slave sql_thread;
  1. 锁表
mysql> flush table with read lock;
Query OK, 0 rows affected (0.00 sec)
  1. 解锁
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
  1. 复制的础数据来源

前面的方法适用于刚刚搭建服务器没有应用的情况。

如何在一个运行中的主库搭建从库呢?

1、从主库复制数据

2、从另外一个从库克隆数据

3、最近的一次完全备份,启动从库。

我们需要确定三个因素:

1、某一个时间点的主库的数据快照

2、主库的二进制日志文件,以及获得快照时在该二进制文件中的偏移量

3、从获得快照到现在的二进制文件

  1. 从主服务器搭建复制

获得数据的方法:

1、使用冷备份,或者flush tables with read lock; 把数据复制到从库,缺点就是需要停服务

2、使用热备份。mysqldump

3、使用percona xtrabackup (innobackupex)

如果是从主库获得的备份,可以从xtrabackup_binlog_pos_innodb获得开始的位置

如果是从从库获得的备份,可以从xtrabackup_slave_info获得开始位置

注意冷备份和热备份需要参考从库的:

show slave status; 获得从库的现在执行主库的二进制文件的执行位置

缺点:如果从库已经跟主库数据不同步,得到的数据为脏数据

Tip: 如果需要在已经配置过复制的从服务器重新配置。需要reset slave命令初始化

  1. 复制状态信息文件

复制过程中,slave服务器会创建多个信息文件,记录复制的状态信息。

1、 master info log master.info

master-info-repository = table

记录到 mysql.slave_master_info

sync-master-info = 1

2、 relay log info log relay-log.info

relay-log-info-repository = table

记录到mysql.slave_relay_log_info

sync_relay_log_info=1

大小由max_relay_log_size决定,如果该值为0,大小由max_binlog_size决定

3、 relay log mysqld-relay-bin.000001

relay-log=

sync_relay_log=1

relay log格式和二进制日志相同可以用mysqlbinlog 读取

4、 relay log index

relay-log-index=

mysqld-relay-bin.index 追踪当前使用的relay log

  1. 启动但是不启动slave
./mysql start --skip-slave-start
  1. 复制的应用
  2. 使用复制作为备份服务器

对于小数据量可以使用mysqldump

对于大数据量可以使用冷备份或者Xtrabackup

  1. 复制不同数据库到不同slave

  2. 复制的常见故障和解决方法

错误信息来源show slave status\G;

现象:

Slave_IO_Running:No
Slave_SQL_Running:No
Last_IO_Errno:
Last_IO_Error:
Last_SQL_Errno:
Last_SQL_Error:
  1. server-id相同

主从相同时:

出现从库不能io线程不能同步,show slave status

从和从相同:

从服务器的io线程总是在这个之间切换,两个从库的io线程轮流争抢主库连接

master不知道该将binlog发送到哪个slave,slave看起来是不发送binlog给它

  1. 主键冲突 Error_code:1062

查看master对应的记录跟slave记录是否一致,如果一致跳过错误,如果不一致删除slave对应记录

注意: 如果当前高可用架构为master-master,则以下均在从库的操作都必须

set sql_log_bin=0避免从库执行的语句同步到主库

一致:

Mysql> stop slave;
Mysql> set global sql_slave_skip_counter=1;
Mysql> start slave;

不一致:

Mysql> stop slave;
Mysql> set sql_log_bin=0;
Mysql> delete from trends_uint where itemid=xx and clock=xxx;
Mysql> start slave;
Mysql> set sql_log_bin=1;
  1. 记录不存在Error_code:1032

delete:可以直接跳过错误

update:根据binlog位置信息到master找到对应记录insert到slave

Mysql> set sql_log_bin=0;
Mysql>insert into items values(...);
Mysql> start slave;
Mysql> set sql_log_bin=1;

扩展:如果业务需要,对于确认错误可以跳过。不建议使用

[mysqld]
slave-skip-errors=1062,1053,1146
slave-skip-errors=all

建议slave上面设置read_only=1 除非有super权限,否则不能修改数据

  1. 表不存在Error_code:1146

属于严重错误,建议重建slave

  1. 复制延迟

Seconds_Behind_Master:xxx

0 表示主从复制良好,可以认为没有延迟

正值 表示主从已经出现延迟,数字越大表示从库落后主库越多

造成原因:mysql是通过比较sql_thread执行的event的timestamp和 io_thread复制到relay log中的

event的timestamp进行比较得出的差值单位秒

注意:

如果主库I/O负载很大或是网络阻塞io_thread不能及时复制binlog(没有中断,也在复制),

而 sql_thread一直都能跟上io_thread的脚本,这时Seconds_Behind_Master的值是0,也就是我们认为的无延时,但是这种情况不能正确反映出复制的情况

可以通过在主上 show master status\G 的 Position, 和从执行 show slave status\G 的

Read_Master_Log_Pos 和 Exec_Master_Log_Pos进行比较得出复制是否能跟上主的状态

如果主库压力正常,网络正常。造成延迟的原因:

1、从库负载高,系统压力大

2、SQL进程为单线程,执行速度慢。MsSQL5.6开始改进

  1. Master Slave 字段定义不同
mysql> stop slave;
mysql> set global slave_type_conversions=ALL_NON_LOSSY;
mysql> start slave;

默认为,即不支持主从字段类型不一致,
其它3种类型为:

all_lossy 支持有损转换,如 int -> tiny int

all_non_lossy 支持无损转换, 如 char(20) -> varchar(25)

all_lossy,all_non_lossy支持所有转换

  1. 字段不一致错误

1.修改student表结构 从char20到 char40

mysql> set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)
mysql> alter table student modify column name char(40);
Query OK, 6 rows affected (0.04 sec)
Records: 6  Duplicates: 0  Warnings: 0
mysql> set sql_log_bin=1;
Query OK, 0 rows affected (0.00 sec)

2.master 插入记录

mysql> insert into student(name,age) values('xxxxxxxxxxxxxxxxxxxx',36);
Query OK, 1 row affected (0.00 sec)

3.Slave错误信息

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.16.1.51
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 1603
               Relay_Log_File: relay-bin.000002
                Relay_Log_Pos: 809
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
              Replicate_Do_DB: 
          Replicate_Ignore_DB: mysql
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 1677
                   Last_Error: Column 1 of table 'oldboy.student' cannot be converted from type 'char(20)' to type 'char(40)'
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 1390
              Relay_Log_Space: 1172
              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: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 1677
               Last_SQL_Error: Column 1 of table 'oldboy.student' cannot be converted from type 'char(20)' to type 'char(40)'
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
1 row in set (0.00 sec)

解决方法

mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)
mysql> set global slave_type_conversions=ALL_NON_LOSSY;
Query OK, 0 rows affected (0.00 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.16.1.51
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 1603
               Relay_Log_File: relay-bin.000003
                Relay_Log_Pos: 253
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: mysql
           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: 1603
              Relay_Log_Space: 1318
              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
1 row in set (0.00 sec)
mysql> select * from student;
+----+----------------------+-----+------+
| id | name                 | age | dept |
+----+----------------------+-----+------+
|  2 | oldboy               |   0 | NULL |
|  4 | oldboy2              |   0 | NULL |
|  6 | andy                 |  36 | NULL |
|  8 | andy                 |  36 | NULL |
| 10 | andy2                |  36 | NULL |
| 12 | andy2                |  36 | NULL |
| 13 | xxxxxxxxxxxxxxxxxxxx |  36 | NULL |
+----+----------------------+-----+------+
7 rows in set (0.00 sec)
  1. slave 启动错误
mysql> reset slave;
mysql> change master to ...
mysql> start slave;
  1. sql线程NO

stop slave; #<==临时停止同步开关。

set globalsql_slave_skip_counter = 1; #<==将同步指针向下移动一个,如果多次不同步,可以重复操作。

start slave;

配置文件

slave-skip-errors = 1032,1062,1007
set global sql_slave_skip_counter=N;

这条语句跳过N 主设备的下一个事件。这对从语句引起的复制停止恢复很有用

MySQL常见错误代码(error code)及代码说明

http://oldboy.blog.51cto.com/2561410/1728380

  1. 主从复制延迟
  • 问题1:一个主库的从库太多,导致复制延迟

建议从库数量3~5个为宜,要复制的从节点数量过多,会导致复制延迟

  • 问题2:从库硬件比主库差,导致复制延迟

查看master和slave的系统配置,可能会因为机器配置的问题,包括磁盘io、CPU、内存等各方面因素造成复制的延迟,一般发生在高并发大数据量写入场景

  • 问题3:慢SQL语句过多

假如一条SQL语句,执行时间是20秒,那么从库执行完毕,到从库上能查到数据也至少是20秒,这样就延迟20秒

问题4:主从复制的设计问题

例如,主从复制单线程,如果主库写并发太大,来不及传送到从库就会导致延迟

更高版本的MySQL可以支持多线程复制,

  1. 从库只读(read-only)

  2. 复制的监控

主要监控:

Slave_IO_Running:Yes

Slave_SQL_Running:Yes

Seconds_Behind_Master:0

  1. binlog_row_image

当一个表中含有blob text 类型字段, update的时候,即使不更新这些字段,也要被log,导致binlog暴增,5.6增加了这个参数,我们可以配置来减少binlog的量

可选的值有:

full: 记录所有的行信息,和以前没有区别

nolob: 记录除了BLOB和TEXT之外的所有字段

minimal: binlog只记录了要修改的列的记录

注意:

当binlog_format = statement的时候,不起作用;

= row 完美支持;

= mixed 根据实际情况决定;

  1. mysql主从架构深入

面向普通人的php加密

http://justcoding.iteye.com/blog/2120329?utm_source=tuicool

  1. 半同步复制

mysql5.5 之前,复制其实是异步操作,而不是同步,也就意味着允许主从之间的数据存在一定的延迟,异步复制使得master处于一种性能最优的状态:写完binlog后即可提交而不需要等待slave的操作完成

缺点:当你使用slave作为备份时,如果master挂掉,那么会存在部分已提交的事务未能成功传输到slave的可能,这就意味着数据丢失!

master会等到binlog成功传送并写入至少一个slave的relay log 之后才会提交,否则一直等待,直到timeout(默认10s)。当出现timeout的时候,master会自动切换半同步为异步,直到至少有一个slave确认已经接受到了该复制事件,master会再切换回半同步模式,结合这个新功能,我们可以做到,在允许损失一定的事务吞吐量的前提下来保证同步数据的绝对安全,因为当你设置timeout为一个足够大的值的情况下,任何提交的数据都会安全抵达slave

mysql5.5 版本支持半同步复制功能,但还不是原生的支持,是通过plugin来支持的,并且默认是没有安装这个插件的

不论是二进制发布的,还是自己源代码编译的,都会默认生成这个插件,一个是针对master的,一个是针对slave的,在使用之前需要先安装这两个plugins

mysql> show plugins;    #查看所有支持的plugin
  1. 加载插件

master

install plugin rpl_semi_sync_master soname 'semisync_master.so';

slave

install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
  1. 查看插件
show plugins;
  1. 启动

SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_master_timeout = N;  #单位:milliseconds. 默认值10000 (10 seconds).

配置文件

[mysqld] 
rpl_semi_sync_master_enabled=1 
rpl_semi_sync_master_timeout=1000 # 1 second

SET GLOBAL rpl_semi_sync_slave_enabled = 1;
  1. 重启从库上的IO线程
stop slave io_thread;
start slave io_thread;
  1. 查看是否在运行

主:

show status like 'Rpl_semi_sync_master_status';

从:

show status like 'Rpl_semi_sync_slave_status';
  1. 测试

查看延迟时间

show variables like '%rpl_semi_sync%';
  1. mysql 5.7半同步复制
master: 
mysql> show global variables like '%rpl_semi%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | ON         |
| rpl_semi_sync_master_timeout              | 1000       |
| rpl_semi_sync_master_trace_level          | 32         |
| rpl_semi_sync_master_wait_for_slave_count | 1          |
| rpl_semi_sync_master_wait_no_slave        | ON         |
| rpl_semi_sync_master_wait_point           | AFTER_SYNC |
+-------------------------------------------+------------+
6 rows in set (0.00 sec)
slave:
show global variables like '%rpl_semi%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | ON         |
| rpl_semi_sync_master_timeout              | 1000       |
| rpl_semi_sync_master_trace_level          | 32         |
| rpl_semi_sync_master_wait_for_slave_count | 1          |
| rpl_semi_sync_master_wait_no_slave        | ON         |
| rpl_semi_sync_master_wait_point           | AFTER_SYNC |
| rpl_semi_sync_slave_enabled               | ON         |
| rpl_semi_sync_slave_trace_level           | 32         |
+-------------------------------------------+------------+

GTID

  1. GTID的优点:

在主从切换后,在传统的方式里,你需要找到binlog和POS点,然后change master to 指向。

在mysql5.6里,你无需再知道binlog和POS点,你只需要知道master的ip、端口,账号密码即可,

因为同步复制是自动的,mysql通过内部机制GTID自动找到同步

  1. GTID介绍

Global Transaction Identifiers

一个事务对应一个ID

一个GTID事务在一个服务器上面只执行一次

GTID 5.6.2支持,5.6.10完善

binlog_format=row 必须为 row 模式

  1. GTID的限制条件

不支持create table … select 语句 master直接报错

不支持非事务引擎

一个复制组中,要求统一开启或者关闭GTID

开启GTID需要重启

不支持create temporary table drop temporary table

不支持 sql_slave_skip_counter

  1. 如何跳过语句
mysql> show slave status\G;
mysql>stop slave;
mysql>set gtid_next 'xxxx:N';   (此处的xxxx为show slave status 的executed_Gtid_Set,而N参考executed_Gtid_Set里本身uuid的N值,填写它的下一个值)
mysql>begin;commit;
mysql>set gtid_next='AUTOMATIC';
mysql>start slave;

Retrieved_Gtid_Set: f2e00f82-3ed1-11e8-b729-000c29c2da47:1-2
Executed_Gtid_Set: f2e00f82-3ed1-11e8-b729-000c29c2da47:1,
f6f43626-3ed1-11e8-b729-000c29ed3675:1
stop slave;
set gtid_next='f2e00f82-3ed1-11e8-b729-000c29c2da47:2';
begin;commit;
set  gtid_next='AUTOMATIC';
start slave;
这里的xxxxx:N 也就是你的slave sql thread报错的GTID,或者说是你想要跳过的GTID
change master to并带上master_auto_position=1启用基于GTID的复制
开启GTID的数据库,在导出数据库时,要加上--set-gtid-purged=OFF , 否则在导入时不记录binlog
  1. 延迟复制
CHANGE MASTER TO MASTER_DELAY = 60;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wuxingge

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值