延时复制

因为延时复制主从数据同一时间不一致,

所以延时从库一般只能做备份,不提供任何对外服务

配置延时复制(已经有主从)

  1. 1.停止主从
  2. mysql> stop slave;
  3. Query OK, 0 rows affected (0.03 sec)
  4. 2.配置延时时间
  5. mysql> change master to master_delay=180;
  6. Query OK, 0 rows affected (0.01 sec)
  7. 3.开启主从
  8. mysql> start slave;
  9. Query OK, 0 rows affected (0.00 sec)

配置延时复制(没有主从)

  1. 1.搭建出一台mysql
  2. 2.配置主从
  3. mysql> change master to
  4. -> master_host='172.16.1.51',
  5. -> master_user='rep',
  6. -> master_password='123',
  7. -> master_log_file='mysql-bin.000001',
  8. -> master_log_pos=424,
  9. -> master_delay=180;
  10. Query OK, 0 rows affected, 2 warnings (0.02 sec)
  11. 3.开启线程
  12. mysql> start slave;
  13. Query OK, 0 rows affected (0.01 sec)

关闭延时从库

  1. mysql> stop slave;
  2. Query OK, 0 rows affected (0.01 sec)
  3. mysql> change master to master_delay=0;
  4. Query OK, 0 rows affected (0.01 sec)
  5. mysql> start slave;
  6. Query OK, 0 rows affected (0.02 sec)

注意事项

  1. 延时从库恢复数据时不要关闭主库的binlog,实际上从库还是会执行主库执行错的语句,只不过又执行了重建语句

延时复制实例

  1. # 思考问题:
  2. 总数据量级500G,正常备份去恢复需要1.5-2小时
  3. 1)配置延时3600
  4. mysql>CHANGE MASTER TO MASTER_DELAY = 3600;
  5. 2)主库
  6. drop database db;
  7. 3)怎么利用延时从库,恢复数据?
  8. 提示:
  9. 1、从库relaylog存放在datadir目录下
  10. 2mysqlbinlog 可以截取relaylog内容
  11. 3show relay log events in 'db01-relay-bin.000001';
  12. # #处理的思路:
  13. 1)停止SQL线程
  14. mysql> stop slave sql_thread;
  15. 2)截取relaylog到误删除之前点
  16. relay-log.info 获取到上次运行到的位置点,作为恢复起点
  17. 分析relay-log的文件内容,获取到误删除之前position
  18. 模拟故障处:
  19. 1)关闭延时
  20. mysql -S /data/3308/mysql.sock
  21. mysql> stop slave;
  22. mysql> CHANGE MASTER TO MASTER_DELAY = 0;
  23. mysql> start slave;
  24. 2)模拟数据
  25. mysql -S /data/3307/mysql.sock
  26. source /root/world.sql
  27. use world;
  28. create table c1 select * from city;
  29. create table c2 select * from city;
  30. 3)开启从库延时5分钟
  31. mysql -S /data/3308/mysql.sock
  32. show slave status \G
  33. mysql>stop slave;
  34. mysql>CHANGE MASTER TO MASTER_DELAY = 300;
  35. mysql>start slave;
  36. mysql -S /data/3307/mysql.sock
  37. use world;
  38. create table c3 select * from city;
  39. create table c4 select * from city;
  40. 4)破坏,模拟删库故障。(以下步骤在5分钟内操作完成。)
  41. mysql -S /data/3307/mysql.sock
  42. drop database world;
  43. 5)从库,关闭SQL线程
  44. mysql -S /data/3308/mysql.sock
  45. stop slave sql_thread;
  46. 6)截取relay-log
  47. 起点:
  48. cd /data/3308/data/
  49. cat relay-log.info
  50. ./db01-relay-bin.000002
  51. 283
  52. 终点:
  53. mysql -S /data/3308/mysql.sock
  54. show relaylog events in 'db01-relay-bin.000002'
  55. db01-relay-bin.000002 | 268047
  56. mysqlbinlog --start-position=283 --stop-position=268047 /data/3308/data/db01-relay-bin.000002 >/tmp/relay.sql
  57. 恢复relay.sql
  58. 1)取消从库身份
  59. mysql> stop slave;
  60. mysql> reset slave all;
  61. 2)恢复数据
  62. mysql> set sql_log_bin=0;
  63. mysql> source /tmp/relay.sql
  64. mysql> use world
  65. mysql> show tables;

半同步复制

从MYSQL5.5开始,支持半自动复制。之前版本的MySQL Replication都是异步(asynchronous)的,主库在执行完一些事务后,是不会管备库的进度的。如果备库不幸落后,而更不幸的是主库此时又出现Crash(例如宕机),这时备库中的数据就是不完整的。简而言之,在主库发生故障的时候,我们无法使用备库来继续提供数据一致的服务了。

半同步复制概念

  1. 半同步复制(Semi synchronous Replication)则一定程度上保证提交的事务已经传给了至少一个备库。
  2. 出发点是保证主从数据一致性问题,安全的考虑。
  3. 5.5 出现概念,但是不建议使用,性能太差
  4. 5.6 出现group commit 组提交功能,来提升开启半同步复制的性能
  5. 5.7 更加完善了,在group commit基础上出现了MGR
  6. 5.7 的增强半同步复制的新特性:after commit after sync
  7. # 缺点:
  8. 1.性能差,影响主库效率
  9. 2.半同步复制,有一个超时时间,超过这个时间恢复主从复制

主库配置

  1. # 登录数据库
  2. [root@db01 ~]# mysql -uroot -p123
  3. # 查看是否有动态支持
  4. mysql> show global variables like 'have_dynamic_loading';
  5. # 安装自带插件
  6. mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME'semisync_master.so';
  7. # 启动插件
  8. mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
  9. # 设置超时
  10. mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000;
  11. # 修改配置文件
  12. [root@db01 ~]# vim /etc/my.cnf
  13. # 在[mysqld]标签下添加如下内容(不用重启库)
  14. [mysqld]
  15. rpl_semi_sync_master_enabled=1
  16. rpl_semi_sync_master_timeout=1000
  17. 检查安装:
  18. mysql> show variables like'rpl%';
  19. mysql> show global status like 'rpl_semi%';

从库配置

  1. # 登录数据库
  2. [root@mysql-db02 ~]# mysql -uroot -poldboy123
  3. # 安装slave半同步插件
  4. mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME'semisync_slave.so';
  5. # 启动插件
  6. mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
  7. # 重启io线程使其生效
  8. mysql> stop slave io_thread;
  9. mysql> start slave io_thread;
  10. # 编辑配置文件(不需要重启数据库)
  11. [root@mysql-db02 ~]# vim /etc/my.cnf
  12. # 在[mysqld]标签下添加如下内容
  13. [mysqld]
  14. rpl_semi_sync_slave_enabled =1

额外参数

  1. rpl_semi_sync_master_timeout=milliseconds
  2. 设置此参数值(ms),为了防止半同步复制在没有收到确认的情况下发生堵塞,如果Master在超时之前没有收到任何确认,将恢复到正常的异步复制,并继续执行没有半同步的复制操作。
  3. rpl_semi_sync_master_wait_no_slave={ON|OFF}
  4. 如果一个事务被提交,但Master没有任何Slave的连接,这时不可能将事务发送到其它地方保护起来。默认情况下,Master会在时间限制范围内继续等待Slave的连接,并确认该事务已经被正确的写到磁盘上。
  5. 可以使用此参数选项关闭这种行为,在这种情况下,如果没有Slave连接,Master就会恢复到异步复制。

过滤复制

过滤复制的方式

  1. mysql> show master status;
  2. +------------------+----------+--------------+------------------+-------------------+
  3. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  4. +------------------+----------+--------------+------------------+-------------------+
  5. | mysql-bin.000002 | 305 | 白名单 | 黑名单 | |
  6. +------------------+----------+--------------+------------------+-------------------+

白名单

  1. # 从库
  2. replicate-do-db=test
  3. replicate-do-table=test.t1
  4. replicate-wild-do-table=test.t*
  5. # 主库
  6. binlog-do-db=test
  7. binlog-do-table=test.t1
  8. binlog-wild-do-table=test.t*

黑名单

  1. # 从库
  2. replicate-ignore-db=test
  3. replicate-ignore-table=test.t1
  4. replicate-wild-ignore-table=test.t*
  5. # 主库
  6. binlog-ignore-db=test
  7. binlog-ignore-table=test.t1
  8. binlog-wild-ignore-table=test.t*

配置过滤复制(一个从库)

主库创建两个库

  1. mysql> create database wzry;
  2. Query OK, 1 row affected (1.00 sec)
  3. mysql> create database lol;
  4. Query OK, 1 row affected (0.00 sec)

第一台从库配置

  1. [root@db02 data]# vim /etc/my.cnf
  2. [mysqld]
  3. server_id=2
  4. replicate-do-db=wzry
  5. [root@db02 data]# systemctl restart mysqld
  6. # 查看主从状态
  7. mysql> show slave status\G
  8. Slave_IO_Running: Yes
  9. Slave_SQL_Running: Yes
  10. Replicate_Do_DB: wzry

配置第二台从库

  1. [root@db03 ~]# vim /etc/my.cnf
  2. [mysqld]
  3. server_id=2
  4. replicate-do-db=lol
  5. [root@db03 ~]# systemctl restart mysqld
  6. # 查看主从状态
  7. mysql> show slave status\G
  8. Slave_IO_Running: Yes
  9. Slave_SQL_Running: Yes
  10. Replicate_Do_DB: lol

验证过滤复制

  1. # 1.主库操作
  2. mysql> use wzry
  3. Database changed
  4. mysql> create table cikexintiao(id int);
  5. Query OK, 0 rows affected (0.26 sec)
  6. mysql> use lol
  7. Database changed
  8. mysql> create table fuleierzhuode(id int);
  9. Query OK, 0 rows affected (0.01 sec)
  10. # 第一台从库查看
  11. mysql> use wzry
  12. Database changed
  13. mysql> show tables;
  14. +----------------+
  15. | Tables_in_wzry |
  16. +----------------+
  17. | cikexintiao |
  18. +----------------+
  19. 1 row in set (0.00 sec)
  20. mysql> use lol
  21. Database changed
  22. mysql> show tables;
  23. Empty set (0.00 sec)
  24. # 第二台从库查看
  25. mysql> use wzry
  26. Database changed
  27. mysql> show tables;
  28. Empty set (0.00 sec)
  29. mysql> use lol
  30. Database changed
  31. mysql> show tables;
  32. +---------------+
  33. | Tables_in_lol |
  34. +---------------+
  35. | fuleierzhuode |
  36. +---------------+
  37. 1 row in set (0.00 sec)

配置过滤复制(多个从库)

  1. [root@db02 data]# vim /etc/my.cnf
  2. [mysqld]
  3. server_id=2
  4. replicate-do-db=wzry,lol

过滤复制配置在主库

  1. 1.配置
  2. [root@db01 ~]# vim /etc/my.cnf
  3. [mysqld]
  4. server_id=1
  5. log_bin=/usr/local/mysql/data/mysql-bin
  6. binlog-do-db=wzry
  7. 2.查看主库状态
  8. mysql> show master status;
  9. +------------------+----------+--------------+------------------+-------------------+
  10. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  11. +------------------+----------+--------------+------------------+-------------------+
  12. | mysql-bin.000003 | 120 | wzry | | |
  13. +------------------+----------+--------------+------------------+-------------------+
  14. 1 row in set (0.00 sec)
  15. 3.在主库的wzry库和lol库添加数据
  16. 4.从库查看数据,只能看到wzry库的数据

过滤复制总结

  1. # 配置在从库时
  2. 1.配置白名单:IO线程将主库的数据拿到了relay-log,但是sql线程只执行白名单配置的数据库相关语句
  3. 1.配置黑名单:IO线程将主库的数据拿到了relay-log,但是sql线程只不执行黑名单配置的数据库相关语句
  4. # 配置在主库时
  5. 1.配置白名单:binlog只记录白名单相关的sql语句
  6. 2.配置黑名单:binlog只不记录黑名单相关的sql语句

GTID 主从复制

什么是 GTID

  1. 1.全局事务标识符
  2. 2.组成:UUID + TID
  3. f03a53e0-cd46-11ea-a2c4-000c292c767e:1

GTID 主从复制的优点

  1. 1.GTID同步时开启多个SQL线程,每一个库同步时开启一个线程
  2. 2.binlogrows模式下,binlog内容比寻常的主从更加简洁
  3. 3.GTID主从复制会记录主从信息,不需要手动配置binlog和位置点

GTID 主从复制的缺点

  1. 1.备份时更加麻烦,需要额外加一个参数 --set-gtid=on
  2. 2.主从复制出现错误,没有办法跳过错误

搭建 GTID 主从复制

配置三台数据库

  1. # 配置第一台主库
  2. [root@db01 ~]# vim /etc/my.cnf
  3. [mysqld]
  4. server_id=1
  5. log_bin=/usr/local/mysql/data/mysql-bin
  6. # 配置第一台从库
  7. [root@db02 ~]# vim /etc/my.cnf
  8. [mysqld]
  9. server_id=2
  10. # 配置第二台从库
  11. [root@db03 ~]# vim /etc/my.cnf
  12. [mysqld]
  13. server_id=3

查看是否开启 GTID

  1. mysql> show variables like '%gtid%';
  2. +---------------------------------+-----------+
  3. | Variable_name | Value |
  4. +---------------------------------+-----------+
  5. | binlog_gtid_simple_recovery | OFF |
  6. | enforce_gtid_consistency | OFF |
  7. | gtid_executed | |
  8. | gtid_mode | OFF |
  9. | gtid_next | AUTOMATIC |
  10. | gtid_owned | |
  11. | gtid_purged | |
  12. | simplified_binlog_gtid_recovery | OFF |
  13. +---------------------------------+-----------+
  14. 8 rows in set (0.00 sec)

开启 GTID

  1. # 主库配置
  2. [root@db01 ~]# vim /etc/my.cnf
  3. [mysqld]
  4. server_id=1
  5. log_bin=/usr/local/mysql/data/mysql-bin
  6. gtid_mode=on
  7. enforce_gtid_consistency
  8. log-slave-updates
  9. # 从库1的配置
  10. [root@db02 ~]# vim /etc/my.cnf
  11. [mysqld]
  12. server_id=2
  13. log_bin=/usr/local/mysql/data/mysql-bin
  14. gtid_mode=on
  15. enforce_gtid_consistency
  16. log-slave-updates
  17. # 从库2的配置
  18. [root@db02 ~]# vim /etc/my.cnf
  19. [mysqld]
  20. server_id=3
  21. log_bin=/usr/local/mysql/data/mysql-bin
  22. gtid_mode=on
  23. enforce_gtid_consistency
  24. log-slave-updates

需要用 log-slave-updates 的场景

  1. # 配置log-slave-updates参数的场景
  2. 1.基于GTID的主从复制
  3. 2.双主架构+keepalived
  4. 3.级联复制
  5. 4.MHA

主库创建用户

  1. mysql> grant replication slave on *.* to rep@'172.16.1.5%' identified by '123';

主库数据同步到从库

  1. mysqldump -uroot -p -R --triggers --master-data=2 --single-transaction -A > /tmp/full.sql
  2. scp
  3. mysql < full.sql

从库配置主从信息

  1. mysql> change master to
  2. -> master_host='172.16.1.51',
  3. -> master_user='rep',
  4. -> master_password='123',
  5. -> master_auto_position=1;
  6. Query OK, 0 rows affected, 2 warnings (0.03 sec)

MySQL 主从复制(下)的更多相关文章

  1. mysql学习(3)-linux下mysql主从复制

    前言:为什么MySQL要做主从复制(读写分离)?通俗来讲,如果对数据库的读和写都在同一个数据库服务器中操作,业务系统性能会降低.为了提升业务系统性能,优化用户体验,可以通过做主从复制(读写分离)来减轻 ...

  2. Linux下Mysql主从复制(Master-Slave)与读写分离(Amoeba)实践

    一.为什么要做Mysql的主从复制(读写分离)?通俗来讲,如果对数据库的读和写都在同一个数据库服务器中操作,业务系统性能会降低.为了提升业务系统性能,优化用户体验,可以通过做主从复制(读写分离)来减轻 ...

  3. centos5.4下mysql主从复制

    centos5.4下mysql主从复制配置分享. 本文转自:http://www.jbxue.com/article/771.html 安装环境:centos 5.4 mysql版本:mysql 5. ...

  4. centos7下部署mysql主从复制

    首先大致看一下这个图 环境说明: 系统:centos7 IP:master:192.168.7.235 slave:192.168.7.226 mysql版本MySQL-5.7 1.Master 下载 ...

  5. Mysql系列三:Centos6下安装Mysql和Mysql主从复制的搭建

    一.Centos6下安装Mysql 检测下系统有没有自带的mysql:yum list installed | grep mysql, 如果已经有的话执行命令yum -y remove mysql-l ...

  6. CentOS下MySQL主从复制,读写分离

    1.环境:所有系统都是CentOS5.5 mysql-5.6.31-2.el5,MySQL中都没有数据 主服务器IP为192.168.128.230 从服务器IP为192.168.128.235 代理 ...

  7. 1.Mysql集群------Docker下的Mysql主从复制

    前言: 实话说,我想做的是Mysql集群架构. 我的计划是: 1.实现Docker下的Mysql主从复制 2.实现MyCat基于Mysql的读写分离 3.实现MyCat的分库分表 4.实现pxc集群 ...

  8. mysql主从复制(linux下)

    转至:http://369369.blog.51cto.com/319630/790921 怎么安装mysql数据库,这里不说了,只说它的主从复制,步骤如下: 1.主从服务器分别作以下操作:   1. ...

  9. 九、linux-msyql下的mysql主从复制深度实战

    1.上节基本诉说了mysql主从同步,这里想说明的是,其一从库在请求主库进行同步的时候,是主库的主线程进行用户名.密码的验证,在验证通过后,将请求转交给I/O线程负责同步:其二从库sql线程在读取中继 ...

  10. Linux下MySQL主从复制(Binlog)的部署过程

    什么是 MySQL 的主从复制 Mysql内建的复制功能是构建大型高性能应用程序的基础, 将Mysql数据分布到多个系统上,这种分布机制是通过将Mysql某一台主机数据复制到其它主机(slaves)上 ...

随机推荐

  1. JAVA编程中button按钮,actionlistener和mouseClicked区别

    在java的编程中,对于按钮button 有两个事件: 1.actionPerformed 2.mouseClicked 区别: actionPerformed:一般事件,仅侦听鼠标左键的单击事件,右 ...

  2. hive窗口函数/分析函数详细剖析

    hive窗口函数/分析函数 在sql中有一类函数叫做聚合函数,例如sum().avg().max()等等,这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的.但是有时 ...

  3. 24V转3.3V稳压芯片,高效率同步降压DC-DC变换器3A输出电流

    PW2312是一个高频,同步,整流,降压,开关模式转换器与内部功率MOSFET.它提供了一个非常紧凑的解决方案,以实现1.5A的峰值输出电流在广泛的输入电源范围内,具有良好的负载和线路调节. PW23 ...

  4. 使用git同步代码

    方法1.先把远程仓库clone到本地,本地修改后再push到gitee的远程仓库 1. 配置本地的git配置信息 git config -l #查看git本地配置信息 # 如果没有配置,需要配置自己的 ...

  5. 前端面试之ES6中的继承!

    前端面试之ES6中的继承! ES6之前并没有给我们提供 extends继承.我们可以通过构造函数+原型对象模拟实现继承,被称为组合继承. 1 call() 两个作用: 1 调用这个函数! 2 修改函数 ...

  6. Go Proverbs

    https://github.com/go-proverbs/go-proverbs.github.io Go Proverbs Simple, Poetic, Pithy Don't communi ...

  7. 前置时间(Lead Time),也称前置期、备货周期

    https://wiki.mbalib.com/wiki/前导时间 什么是前导时间 所谓的前导时间(leading time),就是产品从设计,到生产.物流.销售的过程. BELLWETHER:&qu ...

  8. (万字好文)Dubbo服务熔断与降级的深入讲解&代码实战

    原文链接:(万字好文)Dubbo服务熔断与降级的深入讲解&代码实战 一.Dubbo服务降级实战 1 mock 机制 谈到服务降级,Dubbo 本身就提供了服务降级的机制:而 Dubbo 的服务 ...

  9. 踹树(Trie 字典树)

    Trie 字典树 ~~ 比 KMP 简单多了,无脑子选手学不会KMP,不会结论题~~ 自己懒得造图了OI WIKI 真棒 字典树大概长这么个亚子 呕吼真棒 就是将读进去的字符串根据当前的字符是什么和所 ...

  10. CF486B

    扯在前面 本人找规律找了很长时间,然后发现找到规律之后其实是lj题,于是五分钟敲完代码,然后WA了两发 正文 题意: A, B 都是 n*m 的 01 矩阵,已知 B 矩阵是由A矩阵以一种规则生成 B ...