zoukankan      html  css  js  c++  java
  • MySQL 5.6.10 跨平台GTID复制实践

    根据业务需要,建立MySQL复制来实现数据冗余。

    1:binlog_format   默认值是:statement

                有效值: ROW,基于行的复制

                           STATEMENT 基于语句级别的复制

                           MASTER_LOG_POS,MIXED  基于以上2种混合

         都有个各自的优缺点,可根据实际情况选择

        
    2:gtid_mode   默认是:off

                 有效值: on   开启gtid

                            off  关闭gtid

         从 5.6 开始mysql 增加了gtid (Global Transaction Identifiers) ,开启了这个参数,就在change master to 的时候就无需再指定 MASTER_LOG_FILE 和 MASTER_LOG_POS,而只需要增加 auto_master_postition =1 就行了,如开启这个参数需要相应增加--log-slave-updates  --enforce-gtid-consistency 这2个参数

    3:slave_skip_errors  默认值:off

                有效值:相关错误号

                            all

                            ddl_exist_errors

                如果在复制的过程中,slave 遇到复制错误,就会停止复制,如果想跳过错误,继续复制,那就可以采用这个参数

                 Examples:

                               --slave-skip-errors=1062,1053

                               --slave-skip-errors=all

                               --slave-skip-errors=ddl_exist_errors

       

          在复制过程中,由于各种的原因,从服务器可能会遇到执行BINLOG中的SQL出错的情况,在默认情况下,服务器会停止复制进程,不再进行同步,等到用户自行来处理。

      Slave-skip-errors的作用就是用来定义复制过程中从服务器可以自动跳过的错误号,当复制过程中遇到定义的错误号,就可以自动跳过,直接执行后面的SQL语句。

      --slave-skip-errors=[err1,err2,…….|ALL]

      但必须注意的是,启动这个参数,如果处理不当,很可能造成主从数据库的数据不同步,在应用中需要根据实际情况,如果对数据完整性要求不是很严格,那么这个选项确实可以减轻维护的成本

    4:slave_parallel_workers :默认值 0,表示不开启并行复制

           有效值:0-1024

           5.6 版本开始支持并行复制,可以减少mysql slave 的复制时间

           设置:

           stop slave

           set global skip_parallel_works=4 ;

           start slave;

           或者在my.cnf 配置文件中加入

           skip_parallel_works 参数

    5: 延时复制

         如果你想slave 延时复制的话,可以把slave 停掉之后,用命令  change master to master_delay=n n  为你想要延时的时间

    6: replicate-do-db ,replicate-do-table,replicate-ignore-db,replicate-ignore-tables 前2个参数都是告诉slave 要复制那个数据库或者那个表

    ,而后2个参数告诉slave ,那些是要忽略复制的

    7: log-slave-updates

      log-slave-updates这个参数用来配置从服务器的更新是否写入二进制日志,这个选项默认是不打开的,但是,如果这个从服务器B是服务器A的从服务器,同时还作为服务器C的主服务器,那么就需要开发这个选项,这样它的从服务器C才能获得它的二进制日志进行同步操作

    8 :master-connect-retry

      master-connect-retry这个参数是用来设置在和主服务器连接丢失的时候,重试的时间间隔,默认是60秒

    9:read-only

      read-only是用来限制普通用户对从数据库的更新操作,以确保从数据库的安全性,不过如果是超级用户依然可以对从数据库进行更新操作

    10:enforce-gtid-consistency

          gtid-mode=on 

          enforce-gtid-consistency=true

          开启gtid模式必须开启此参数

    11:master-info-repository  = TABLE,relay-log-info-repository = TABLE

           在MySQL 5.6.2之前,slave记录的master信息以及slave应用binlog的信息存放在文件中,即master.info与relay-log.info。在5.6.2版本之后,允许记录到table中

    12:sync-master-info 启用之后可确保无信息丢失

    13:binlog-checksum、master-verify-checksum和slave-sql-verify-checksum:启用复制有关的所有校验功能

    14:binlog-rows-query-log-events:启用之可用于在二进制日志记录事件相关的信息,可降低故障排除的复杂度

    15:Binlog_gtid_simple_recovery = 1 这个参数控制了当mysql启动或重启时,mysql在搜寻GTIDs时是如何迭代使用binlog文件的,这个选项设置为真,会提升mysql执行恢复的性能。因为这样mysql-server启动和binlog日志清理更快。该参数为真时,mysql-server只需打开最老的和最新的这2个binlog文件,gtid_purged参数的值和gtid_executed参数的值可以根据这些文件中的Previous_gtids_log_event 或者 Gtid_log_event计算得出。这确保了当mysql-server重启或清理binlog时,只需打开2个binlog文件,在MySQL-5.6中,调整这个选项设置也同样会提升性能,但是在一些特殊场景下,计算gtids值可能会出错。而保持这个选项值为false,能确保计算总是正确,在MySQL-5.7.7中,几乎不需要在速度和安全性之间做权限。设置该选项为TRUE总能得到正确的结果,除了以下2个极端场景

    a.最新的binlog是MySQL-5.7.5(或更老版本)产生的,并且gtid_mode对一些binlog设置为ON,但是对最新的binlog设置为OFF

    b.GTID_PURGED的状态是MySQL-5.7.7之前的版本发布的,并且在当时激活清理的binlog在当前仍然没有清理完成

    因此,开启这个选项几乎总是更好一些,所以这个选项默认开启,如果这个参数设置为off,在mysql恢复期间为了初始化gtid_executed,所有以最新文件开始的binlog都要被检查。并且为了初始化gtid_purged,所有的binlog都要被检查。这可能需要非常长的时间

    MySQL 5.6.10版本提供了更方便的基于GTID的复制功能,MySQL可以通过GTID自动识别上次同步的点,极大地方便了运维人员,减少出错的几率。

    在官方文档中提到,最保险可靠的复制方式,是基于row的复制,所以宁可牺牲一些性能也要保证数据的安全。

    现实环境中,master主数据库MySQL 5.6.10(msi安装方式)安装在Windows 2008 Server x64上,slave从服务器是一台老旧的DELL服务器,运行CentOS 6.4 x64系统,源码编译安装MySQL 5.6.10的Linux版本,安装过程可以参考我以前的博文:http://www.cnblogs.com/jlzhou/archive/2013/03/09/2951544.html

    不同平台下,MySQL是有一些差异的,要小心处理。

    第一个问题是,Windows平台下,文件名大小写不敏感,造成对应的MySQL的数据表名称默认都采用小写字母方式,同时大小不写敏感,参考我以前的博文:http://www.cnblogs.com/jlzhou/archive/2013/03/18/2966106.html 为了能将数据同步复制到Linux平台的MySQL,我们需要设置Linux平台下MySQL的数据表名称设置:(修改my.cnf文件)

    [mysqld]
    lower_case_table_names=1

    第二个问题是,自增字段0值的问题。因为现有数据库是MSSQL,业务逻辑需要某些表的自增字段从0开始。参考我以前的博文:http://www.cnblogs.com/jlzhou/archive/2013/03/18/2965384.html 为了在Windows平台和Linux平台的MySQL之间复制数据,增加全局变量设置,在my.ini和my.cnf中分别添加NO_AUTO_VALUE_ON_ZERO设置到sql-mode行:

    //my.ini 该文件默认在Windows7或Windows2008操作系统中位于 C:ProgramDataMySQLMySQL Server 5.6 目录下(采用MSI安装方式),如果你自定义了数据目录,则该配置文件在数据目录下。
    # Set the SQL mode to strict
    sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_AUTO_VALUE_ON_ZERO"

    现在开始配置GTID复制,先配置master端的my.ini文件,加入下述配置,然后重启master的MySQL服务:

    复制代码
    binlog-format=ROW
    log-bin=master-bin.log
    log-bin-index=master-bin.index
    log-slave-updates=true
    gtid-mode=on
    enforce-gtid-consistency=true
    master-info-repository=TABLE
    relay-log-info-repository=TABLE
    sync-master-info=1
    slave-parallel-workers=2
    binlog-checksum=CRC32
    master-verify-checksum=1
    slave-sql-verify-checksum=1
    binlog-rows-query-log-events=1
    server-id=1
    sync_binlog=1
    复制代码

     再修改slave端的my.cnf文件,加入下述配置,然后重启slave的MySQL服务:

    复制代码
    binlog-format=ROW
    log-bin=slave-bin.log
    log-bin-index=slave-bin.index
    log-slave-updates=true
    gtid-mode=on
    enforce-gtid-consistency=true
    master-info-repository=TABLE
    relay-log-info-repository=TABLE
    sync-master-info=1
    slave-parallel-workers=2
    binlog-checksum=CRC32
    master-verify-checksum=1
    slave-sql-verify-checksum=1
    binlog-rows-query-log-events=1
    server-id=2
    sync_binlog=1
    复制代码

    其实,并不需要在slave端启用binlog,但是为了在master故障时,方便的转换slave到master,并且方便建立slave的slave,所以采用和主服务器类似的配置。

    复制设置会将用于复制的用户和密码以明文形式保存在master.info文件中,最好为复制建立专用的用户,授予 REPLICATION SLAVE 权限。

    在master端执行:

    GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.1.101' IDENTIFIED BY '12345678';

    最后,在slave执行指向master的命令,并开启slave复制。

    CHANGE MASTER TO MASTER_HOST='192.168.1.100', MASTER_PORT=3306, MASTER_USER='repluser',MASTER_PASSWORD='12345678', master_auto_position=1;
    START slave;

    这时就可以测试在master上建立数据库,建表,然后监控slave的复制状态了。

    本文中没有涉及到已有数据库在master上的情况,请参考这篇博文:http://www.zhaokunyao.com/archives/4131

    后记:

    附上备份和恢复脚本:命令行执行

    复制代码
    Backup from remote server scripts:
    
    // for test database:
    "C:MySQLMySQL Server 5.6inmysqldump.exe" --user=root --max_allowed_packet=1G --host=10.192.8.105 --port=3306 --default-character-set=utf8 --set-gtid-purged=OFF --password --databases test > "C:\Backup\test.dump.sql" 
    
    Restore to local dev machine scripts:
    
    // for test database:
    "C:MySQLMySQL Server 5.6inmysql.exe" --host=localhost --user=root --port=3306 --password --default-character-set=utf8 --comments < "C:\Backup\test.dump.sql"
    复制代码

    注意,上述脚本中,备份的部分要加入--set-gtid-purged=OFF参数,防止在备份出的sql脚本中生成 SET @@global.gtid_purged 语句:

    Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF.

    官方文档关于set-gtid-purged是这样写的:

    This option enables control over global transaction ID (GTID) information written to the dump file, by indicating whether to add a SET @@global.gtid_purged statement to the output. 

  • 相关阅读:
    .NET学习笔记(1)— C#学习路线图
    Huffman树压缩程序(c实现)
    selenium webdriver使用一二三
    同时装了python2和python3,pip没法使用
    NotePad++配置python开发环境(windows)
    用Sublime搭建Python开发环境(windows)
    mapbox将图层缩放到视口合适区域
    关于 FormData 和 URLSearchParams
    vue-router在新窗口打开页面
    微信小程序wx.request 请求方法
  • 原文地址:https://www.cnblogs.com/Yongzhouunknown/p/4852440.html
Copyright © 2011-2022 走看看