zoukankan      html  css  js  c++  java
  • 现有数据库配置主从同步

    环境说明

    现在测试的架构是主库1的work1和主库2的work2,进行多源复制到从库3中,而且忽略系统库mysql库。

    主库操作

    1. 从主库导出要同步的数据库
    #从主库导出数据库
    mysqldump -uroot -p'******' -h10.2.0.5 -P3306 --triggers -R --single-transaction --no-autocommit --master-data=2 -q -e --databases work1 > work1.sql
    mysqldump -uroot -p'******' -h10.2.0.6 -P3306 --triggers -R --single-transaction --no-autocommit --master-data=2 -q -e --databases work2 > work2.sql
    
    
    1. 主库上创建同步用户,并授权访问要同步的数据库
    #在主库授权,已做过的可以忽略
    mysql -uroot -p'******' -h10.2.0.5 -P3306
    grant replication slave on *.* to 'rep'@'%' identified by '123123';
    mysql -uroot -p'******' -h10.2.0.6 -P3306
    grant replication slave on *.* to 'rep'@'%' identified by '123123';
    

    然后,把主库导出的这俩sql文件导入到目的从库环境,只要数据不冲突,都可以导进去。

    理论上,多源复制要禁止一切同名数据库的存在,不然就不是多源复制了。

    从库操作

    1. 导入从主库导出的数据库
    # 导入数据到从库
    mysql -uroot -p'******' -h10.2.0.7 -P3306
    >create database work1
    >use work1 
    >source work1.sql
    >create database work2
    >use work2 
    >source work2.sql
    
    1. 配置多源复制环境

    旧模式是要确定pos位置,新模式则是要设置GTID的编号

    #看以下sql的备份文件
    more work1.sql
    
    -- GTID state at the beginning of the backup 
    --
    SET @@GLOBAL.GTID_PURGED='3edae34c-6299-11e6-95cd-8038bc0c67be:1-6758,
    4cdc2a74-6299-11e6-95ce-008cfaf595bc:1-38813008';
    --
    -- Position to start replication or point-in-time recovery from
    --
    -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.001284', MASTER_LOG_POS=3954096;
    

    可以看到gtid和pos值,后面我们拿来用就可以了

    1. 修改从库配置文件
    #在从库的my.cnf配置文件中添加配置项,需要重启mysql实例
    vim my.cnf
    [mysqld]
    master_info_repository=TABLE
    relay_log_info_repository=TABLE
    
    replicate_wild_do_table=work1.%
    replicate_wild_do_table=work2.%
    
    read-only # 只读
    
    #5.6以上参数,并行复制线程数
    slave_parallel_workers = 4
    
    #5.7新参数,并行复制模式选择,5.6没用
    #slave_parallel_type = LOGICAL_CLOCK
    
    #当然也可以在线实现设置,目的就是把主从配置信息改为记录到表
    mysql>SET GLOBAL master_info_repository = 'TABLE';
    mysql>SET GLOBAL relay_log_info_repository = 'TABLE';
    mysql>change replication filter REPLICATE_IGNORE_DB=(mysql) ;
    

    需要特别注意replicate_wild_do_table这个参数,这个参数的意思是只执行某个库或某个表的同步语句,其他库和表都不处理,从而达到选择性复制业务库的目的,这就不会有无用的数据了,也不会互相干扰。官方文档解析只能一个参数标记一个库,而且这个参数是全局通用,也就是说多源复制下,所有源频道都通用这个配置。

    开启只读read-only就不用多说了,多源复制一般就只有读的需求,就不要让他们有写库的可能了。

    并发复制多线程slave_parallel_workers是5.6,5.7新出的功能,能有效加快复制的效率,特别5.7是支持事务并发复制的,速度相当可观,这里设置了每个复制连接有4个并发线程。

    而slave_parallel_type是选择并发复制方式,默认是为了兼容5.6以库模式的并发复制,这里是改成5.7新出的以组提交事务的方式并发复制,并发效果更佳,但是要特别注意如果主从服务器数据库版本不一致的话,最好还是不要改,因为只有mysql5.7是默认开启组提交功能的。

    1. 正式配置多源复制
    #登录进从库数据库
    mysql -uroot -p'******' -h10.2.0.7 -P3306
    
    #先清空所有主从结构的记录
    reset slave all;
    
    #配置阿里云的数据库,这是GTID模式
    change master to
    master_host='10.2.0.5',
    master_user='rep',
    master_password='123123',
    master_port=3306,
    MASTER_AUTO_POSITION = 1
    FOR CHANNEL 'al_RDS';
    
    #配置自建的数据库,这是GTID模式
    change master to
    master_host='10.2.0.6',
    master_user='rep',
    master_password='123123',
    master_port=3306,
    MASTER_AUTO_POSITION = 1
    FOR CHANNEL 'me_mysql';
    
    #重置GTID值
    reset master;
    
    #设置GTID值
    SET @@GLOBAL.GTID_PURGED='09cb91bf-2669-11e7-8b70-00163e0835ff:1-486646,3edae34c-6299-11e6-95cd-8038bc0c67be:1-6758,
    4cdc2a74-6299-11e6-95ce-008cfaf595bc:1-38813008';
    

    需要特别注意的两点是,多源复制提供了channel的标识,区分了不同的源频道,所以配置的时候就需要加上指定频道名称FOR CHANNEL 'al_RDS';这样。

    而GTID的值和replicate_wild_do_table参数一样,默认是全局的配置,让源频道各取所需,所以,我们的gtid值,应该是所有*.sql文件的gtid值的合集,用‘,’号分隔,最终就出现我这个要设置这么多GTID的情况。

    然后都配置完成了,就可以启动了,启动和关闭都可以指定特定的源频道,相当方便,下面列举一下命令。

    #启动/关闭所有源频道
    start/stop slave;
    
    #启动/关闭单一的源频道
    start/stop slave for channel 'al_RDS';
    
    #当然重置也是可以单独频道的
    #RESET SLAVE FOR CHANNEL 'al_RDS';
    
    #查看状态也是可以单独的,不指定就是全部了
    #show slave status for channel 'al_RDS';
    

    然后,看看状态,show slave status看看。

    #在从库上执行命令
    mysql -uroot -p'******' -h10.2.0.7 -P3306
    mysql> show slave statusG
    

    其中Replicate_Wild_Do_Table,Executed_Gtid_Set是全局通用,两边都有,印证了我说的参数是全局的。

    然后各自的Retrieved_Gtid_Set是不同的,他们都自行选择了,相当智能。

    再看到Channel_Name就是他们不同的频道名字了。

    然后可以看到,

    Slave_IO_Running和Slave_SQL_Running的双yes,

    Master_Log_File=Relay_Master_Log_File,

    Read_Master_Log_Pos=Exec_Master_Log_Pos,

    Seconds_Behind_Master为0,

    所以现在是同步的。

  • 相关阅读:
    [csp-s模拟测试72] 简单的期望
    [csp-s模拟测试72] 简单的序列
    csp-s模拟测试70
    经验积累
    [csp-s模拟测试69] 回滚莫队
    [模板]主席树查前趋后继
    复习及学习计划
    错排公式
    csp-s模拟测试 56~65
    LIS LCS LCIS
  • 原文地址:https://www.cnblogs.com/sanduzxcvbnm/p/11639985.html
Copyright © 2011-2022 走看看