mysql 数据库DBA课程08_02 主从复制

主从复制高级进阶:
1、延时从库  ****** 方便我们处理,逻辑损坏,比如,误操作,drop database xy;
SQL 线程延时:数据已经写入了relaylog中了,SQL线程"慢点"运行
一般企业建议3----6小时,具体看公司运维人员对故障的反应时间
    登录slave
    stop slave;
    change master to master_delay=300; #单位:秒
    start slave;
    show slave status\G
    SQL_Delay:300
    SQL_Remainning_Delay:NULL ##最近的一个日志,还差多少秒,执行。

    1.2、延时从库处理逻辑故障
    1.2.1、延时从库的恢复思路
    (1)、监控到数据库逻辑故障
    (2)、停从库SQL线程,记录SQL线程已经 回放 的位置点(截取日志起点)。

        stop slave sql_thread;
        show slave status\G
        Relay_Log_File: dba01-relay-bin.000002
        Relay_Log_Pos: 320

    (3)、截取relaylog
        起点:
        show slave status\G
Relay_Log_File:
 Relay_Log_Pos:
        终点: drop 之前的位置点
        show realylog events in 'dba01-relay-bin.000002'
        进行截取
    (4)、模拟SQL线程回放日志
        从库 source
    (5)、恢复业务
        情况一:只有一个库        从库替代主库工作
        情况二:多个库,只删除了一个库或其中几个库。
        从库导出故障库,还原到主库中。
    1.2.2、故障演练
    主库:
    create database delay charset utf8mb4;
    use delay;
    create table t1(id int);
    insert into t1 values(1),(2),(3);
    commit;
    drop database delay;
    从库:

    (1)、停止SQL线程,获取relay的位置点
    stop slave sql_thread;
    Relay_Log_File: dba01-relay-bin.000002
    Relay_Log_Pos: 320
    (2)、找到relaylog的截取 终点
    show relaylog events in 'dba01-relay-bin.000002';

    

    (3)、截取日志
    cd /data/mysql/data
    mysqlbinlog --skip-gtids --start-position=320 --stop-position=992 dba01-relay-bin.000002 >/tmp/delay.sql
    (4)、恢复relaylog到从库
    set sql_log_bin=0;
    source /tmp/delay.sql;


(5)、恢复业务
从库备份delay
mysqldump -uroot -p -B delay -R -E --triggers --set-gtid-purged=OFF --master-data=2 --single-transaction >/tmp/master_delay.sql
scp -r /tmp/master_delay.sql root@192.168.189.128:/tmp

主库上导入数据
set sql_log_bin=0;
source /tmp/master_delay.sql;


commit;
set sql_log_bin=1;
从库:
drop database delay;
start slave sql_thread;
show slave status\G


set sql_log_bin=1;

2、过滤复制 ***** /etc/my.cnf
    主库:实现过滤,这种方法很少用。
binlog_do_db=world #白名单,只记录这个数据库的日志
binlog_ignore_db=xy #黑名单,不记录 xy 库,
多个库,要写多行。不管白名单和黑名单
一般只选一个。

    从库:实现过滤,控制SQL线程,回不回放这些库
    replicate_do_dB= #库级别,白名单 库级别用的最多

 replicate_ignore_dB= #库级别,黑名单
    replicate_do_table= #表级别,白名单
 replicate_ignore_table= #表级别,黑名单
replicate_wild_do_table= #表级别,模糊,可以支持,那个库下面的 t*开头的表,可以用通配符 白名单
     replicate_wild_ignore_table= #表级别,模糊,可以支持,那个库下面的 t*开头的表,可以用通配符 黑名单
    例子:只回放repl 库

    从库 vim /etc/my.cnf
    replicate_do_db=repl
    保存,退出。
    

3、GTID *****
    

    3.2.1、GTID核心参数
    重要参数:
    git-mode=on ##开启gitd,否则就是普通的复制
    enforce-gtid-consistency=true ## 强制GTID 一致性

    log-slave-updates=1 # slave 更新是否记录日志,强制从库刷新binlog,在MHA高可用,双主环境中,必须要加。

    准备3台干净的mysql 服务器

dba02---192.168.189.133 主库 dba03---192.168.189.134 从库 dba04---192.168.189.135 从库

/etc/my.cnf
[mysqld]
user=mysql
basedir=/application/mysql
datadir=/data/mysql/data
socket=/tmp/mysql.sock
server_id=8 #从库的server_id 比主库的大
log_bin=/data/binlog/mysql-bin
binlog_format=row
log_error=/application/mysql/mysqlerr.log
port=3306
secure_file_priv="" #允许将查询导出文件
#开启GTID
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1
##开启慢日志
slow_query_log=1
slow_query_log_file=/data/mysql/slow.log
long_query_time=2
log_queries_not_using_indexes
[mysql]
socket=/tmp/mysql.sock
prompt=dba02 [\\d]> ##登录mysql看到的提示符,其他的 dba03 dba04 [\\d]----> 显示库

搭建主从:
主库上创建复制用户
grant replication slave on *.* to repl@'192.168.%' identified by 'repl520';
从库上面:配置master
change master to master_host='192.168.189.133',master_user='repl',master_password='repl520',master_auto_position=1;
start slave;
master_auto_position=1 ## 读取relaylog最后一个事务的GTID,

GTID复制和普通复制的区别:
(1)、在主从复制环境中,主库发生 过的事务,在全局都是由唯一GTID记录的,更方便Failover
(2)、GTID额外的参数三个
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=1

(3)、change master to 的时候不再需要binlog文件和position号,直接master_auto_position=1;

(4)、在GTID复制 过程中,从库不再依赖master.info文件,而是直接读取最后一个relaylog的GTID号

(5)、在mysqldump 备份时,默认会将备份中包含的事务操作,以以下方式

SET @@GLOBAL.GTID_PURGED='8c49d7ec-7e78-11e8-9638-000c29ca725d:1-11';
告诉从库,我的备份中已经有以上事务了,你就不用运行了,直接从下一个GTID开始请求binlog就可以了。

在生产环境,已经有数据的情况下,并且开启了gtid,构建主从,
先备份主库数据,再把这些备份,恢复到从库,再开启主从
这时mysqldump 备份的时候不能加
--set-gtid-purged=off

4、半同步 *** 用得少,性能极差
    作用:为了解决主从复制数据一致性问题,也就是主从复制之间的数据安全问题。
    主库的dump线程要等到从库的IO线程将日志全部写到磁盘上的relaylog,并传回ack信号,才认为
    5.5版本以后,多了一个插件,来控制IO线程,必须要把relaylog写到磁盘,并传回ack,主库的dump线程,才认为传完了,这个事务才正常提交成功,否则,会阻塞主库的事务提交。
    半同步还有缺陷,过了超时时间间(默认为10秒),就还是会切换成异步同步,

与传统复制的区别:
ACK,从库relaylog落地,从库的IO线程会返回一个ACK_reciver ,主库事务才能提交,
如果主库一直没有收到从库IO线程返回的ACK_reciver,超过10秒钟(默认时间10秒)就会切换为异步复制。