zoukankan      html  css  js  c++  java
  • MySQL 主从复制(下)

    延时复制

    因为延时复制主从数据同一时间不一致,
    所以延时从库一般只能做备份,不提供任何对外服务

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

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

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

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

    关闭延时从库

    mysql> stop slave;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> change master to master_delay=0;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> start slave;
    Query OK, 0 rows affected (0.02 sec)
    

    注意事项

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

    延时复制实例

    #  思考问题:
    总数据量级500G,正常备份去恢复需要1.5-2小时
    1)配置延时3600秒
    mysql>CHANGE MASTER TO MASTER_DELAY = 3600;
    
    2)主库
    drop database db;
    
    3)怎么利用延时从库,恢复数据?
    提示:
    1、从库relaylog存放在datadir目录下
    2、mysqlbinlog 可以截取relaylog内容
    3、show relay log events in 'db01-relay-bin.000001';
    
    # #处理的思路:
    1)停止SQL线程
    mysql> stop slave sql_thread;
    
    2)截取relaylog到误删除之前点
    relay-log.info 获取到上次运行到的位置点,作为恢复起点
    分析relay-log的文件内容,获取到误删除之前position
    模拟故障处:
    
    1)关闭延时
    mysql -S /data/3308/mysql.sock
    mysql> stop slave;
    mysql> CHANGE MASTER TO MASTER_DELAY = 0;
    mysql> start slave;
    
    2)模拟数据
    mysql -S /data/3307/mysql.sock
    source  /root/world.sql
    use world;
    create table c1 select * from city;
    create table c2 select * from city;
    
    3)开启从库延时5分钟
    mysql -S /data/3308/mysql.sock
    show slave status G
    mysql>stop slave;
    mysql>CHANGE MASTER TO MASTER_DELAY = 300;
    mysql>start slave;
    mysql -S /data/3307/mysql.sock
    use world;
    create table c3 select * from city;
    create table c4 select * from city;
    
    4)破坏,模拟删库故障。(以下步骤在5分钟内操作完成。)
    mysql -S /data/3307/mysql.sock
    drop database world;
    
    5)从库,关闭SQL线程
    mysql -S /data/3308/mysql.sock
    stop slave sql_thread;
    
    6)截取relay-log
    起点:
    cd /data/3308/data/
    cat relay-log.info
    ./db01-relay-bin.000002
    283
    终点:
    mysql -S /data/3308/mysql.sock
    show relaylog events in 'db01-relay-bin.000002'
    db01-relay-bin.000002 | 268047 
    mysqlbinlog --start-position=283  --stop-position=268047 /data/3308/data/db01-relay-bin.000002 >/tmp/relay.sql 
    恢复relay.sql
    
    1)取消从库身份
    mysql> stop slave;
    mysql> reset slave all;
    
    2)恢复数据
    mysql> set sql_log_bin=0;
    mysql> source /tmp/relay.sql
    mysql> use world
    mysql> show tables;
    

    半同步复制

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

    半同步复制概念

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

    主库配置

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

    从库配置

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

    额外参数

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

    过滤复制

    过滤复制的方式

    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000002 |      305 |   白名单      |    黑名单        |                   |
    +------------------+----------+--------------+------------------+-------------------+
    

    白名单

    # 从库
    replicate-do-db=test
    replicate-do-table=test.t1
    replicate-wild-do-table=test.t*
    # 主库
    binlog-do-db=test
    binlog-do-table=test.t1
    binlog-wild-do-table=test.t*
    

    黑名单

    # 从库
    replicate-ignore-db=test
    replicate-ignore-table=test.t1
    replicate-wild-ignore-table=test.t*
    # 主库
    binlog-ignore-db=test
    binlog-ignore-table=test.t1
    binlog-wild-ignore-table=test.t*
    

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

    主库创建两个库

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

    第一台从库配置

    [root@db02 data]#  vim /etc/my.cnf
    [mysqld]
    server_id=2
    replicate-do-db=wzry
    
    [root@db02 data]#  systemctl restart mysqld
    
    # 查看主从状态
    mysql> show slave statusG
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
                  Replicate_Do_DB: wzry
    

    配置第二台从库

    [root@db03 ~]#  vim /etc/my.cnf
    [mysqld]
    server_id=2
    replicate-do-db=lol
    
    [root@db03 ~]#  systemctl restart mysqld
    
    # 查看主从状态
    mysql> show slave statusG
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
                  Replicate_Do_DB: lol
    

    验证过滤复制

    # 1.主库操作
    mysql> use wzry
    Database changed
    
    mysql> create table cikexintiao(id int);
    Query OK, 0 rows affected (0.26 sec)
    
    mysql> use lol
    Database changed
    
    mysql> create table fuleierzhuode(id int);
    Query OK, 0 rows affected (0.01 sec)
    
    # 第一台从库查看
    mysql> use wzry
    Database changed
    
    mysql> show tables;
    +----------------+
    | Tables_in_wzry |
    +----------------+
    | cikexintiao    |
    +----------------+
    1 row in set (0.00 sec)
    
    mysql> use lol
    Database changed
    
    mysql> show tables;
    Empty set (0.00 sec)
    
    # 第二台从库查看
    mysql> use wzry
    Database changed
    
    mysql> show tables;
    Empty set (0.00 sec)
    
    mysql> use lol
    Database changed
    
    mysql> show tables;
    +---------------+
    | Tables_in_lol |
    +---------------+
    | fuleierzhuode |
    +---------------+
    1 row in set (0.00 sec)
    

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

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

    过滤复制配置在主库

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

    过滤复制总结

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

    GTID 主从复制

    什么是 GTID

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

    GTID 主从复制的优点

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

    GTID 主从复制的缺点

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

    搭建 GTID 主从复制

    配置三台数据库

    # 配置第一台主库
    [root@db01 ~]#  vim /etc/my.cnf
    [mysqld]
    server_id=1
    log_bin=/usr/local/mysql/data/mysql-bin
    
    # 配置第一台从库
    [root@db02 ~]#  vim /etc/my.cnf
    [mysqld]
    server_id=2
    
    # 配置第二台从库
    [root@db03 ~]#  vim /etc/my.cnf
    [mysqld]
    server_id=3
    

    查看是否开启 GTID

    mysql> show variables like '%gtid%';
    +---------------------------------+-----------+
    | Variable_name                   | Value     |
    +---------------------------------+-----------+
    | binlog_gtid_simple_recovery     | OFF       |
    | enforce_gtid_consistency        | OFF       |
    | gtid_executed                   |           |
    | gtid_mode                       | OFF       |
    | gtid_next                       | AUTOMATIC |
    | gtid_owned                      |           |
    | gtid_purged                     |           |
    | simplified_binlog_gtid_recovery | OFF       |
    +---------------------------------+-----------+
    8 rows in set (0.00 sec)
    

    开启 GTID

    # 主库配置
    [root@db01 ~]#  vim /etc/my.cnf
    [mysqld]
    server_id=1
    log_bin=/usr/local/mysql/data/mysql-bin
    gtid_mode=on
    enforce_gtid_consistency
    log-slave-updates
    
    # 从库1的配置
    [root@db02 ~]#  vim /etc/my.cnf
    [mysqld]
    server_id=2
    log_bin=/usr/local/mysql/data/mysql-bin
    gtid_mode=on
    enforce_gtid_consistency
    log-slave-updates
    
    # 从库2的配置
    [root@db02 ~]#  vim /etc/my.cnf
    [mysqld]
    server_id=3
    log_bin=/usr/local/mysql/data/mysql-bin
    gtid_mode=on
    enforce_gtid_consistency
    log-slave-updates
    

    需要用 log-slave-updates 的场景

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

    主库创建用户

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

    主库数据同步到从库

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

    从库配置主从信息

    mysql> change master to
        -> master_host='172.16.1.51',
        -> master_user='rep',
        -> master_password='123',
        -> master_auto_position=1;
    Query OK, 0 rows affected, 2 warnings (0.03 sec)
    
  • 相关阅读:
    JAVA 打开文件乱码
    单引号和双引号的区别
    global和$GLOBALS[]的区别
    php统计数组元素个数
    PHP5.3x不再支持ereg和eregi
    discuz论坛diy标签
    网页特效过渡功能
    discuz缓存机制
    php数组中删除元素
    speedphp是个不错的框架
  • 原文地址:https://www.cnblogs.com/zzzwqh/p/13374217.html
Copyright © 2011-2022 走看看