您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

MySQL 5.6利用GTIDs构建主从数据库

2024/3/8 21:43:45发布35次查看
(global transactions identifier)是mysql5.6.5新加入的一项新特性。当使用gtids时,无论是在master上提交事物还是在slave上应
【概念】什么是gtids
(global transactions identifier)是mysql5.6.5新加入的一项新特性。
【关于gtid】gtid由source_id和transaction_id两部门组成。
source_id来自于server_uuid,可以在auto.cnf文件中查看;tranction_id是一个序列数字,从小到达自动生成;
[root@t-db01 mysql]# cat auto.cnf
[auto]
server-uuid=268e23d1-2216-11e5-abcc-000c296ecd05
mysql> show global variables like 'gtid_executed';
+---------------+-----------------------------------------------------+
| variable_name | value                                                                  |
+---------------+-----------------------------------------------------+
| gtid_executed  | 268e23d1-2216-11e5-abcc-000c296ecd05:1-28    |
+---------------+-----------------------------------------------------+
【构建主从数据库】
环境说明:
 主库信息从库信息
数据库版本5.6.235.6.23
ip地址192.168.47.169192.168.47.186
同步数据库john_db 
同步用户repl 
1、主库参数的设置
server_id = 1
binlog-format=row  #建议使用row格式
log-bin=mysql-bin      #打开binlog
report-port=3306
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=true
replicate_do_db=john_db
2、从库参数的设置
server_id = 2
log-bin=mysql-bin
report-port=3306
gtid-mode=on
enforce-gtid-consistency=true
log-slave-updates=true
replicate_do_db=john_db
skip-slave-start    #启动的时候自动打开复制
检查gtid是否启用:show global variables like ‘%gtid%’;
3、在主库上面用户的创建
grant replication slave on john_db.* to 'repl'@'192.168.47.186' identified by 'repl';
4、进行从库数据的初始化
操作的步骤跟5.5的步骤一样,这边就偷懒不再重复了;
5、配置从库连接主库
从库连接主库:
change master to master_host='192.168.47.169', master_user='repl',master_password='repl',master_auto_position=1;
启动从库:
start slave;
检查状态:
show slave status\g;
mysql> show slave status\g;
*************************** 1. row ***************************
              slave_io_state: waiting for master to send event
                  master_host: 192.168.47.169
                  master_user: repl
                  master_port: 3306
                connect_retry: 60
              master_log_file: mysql-bin.000009
          read_master_log_pos: 485
              relay_log_file: t-db02-relay-bin.000012
                relay_log_pos: 695
        relay_master_log_file: mysql-bin.000009
            slave_io_running: yes
            slave_sql_running: yes
              replicate_do_db: john_db
          replicate_ignore_db:
          replicate_do_table:
      replicate_ignore_table:
      replicate_wild_do_table:
  replicate_wild_ignore_table:
                  last_errno: 0
                  last_error:
                skip_counter: 0
          exec_master_log_pos: 485
              relay_log_space: 1150
              until_condition: none
              until_log_file:
                until_log_pos: 0
          master_ssl_allowed: no
          master_ssl_ca_file:
          master_ssl_ca_path:
              master_ssl_cert:
            master_ssl_cipher:
              master_ssl_key:
        seconds_behind_master: 0
master_ssl_verify_server_cert: no
                last_io_errno: 0
                last_io_error:
              last_sql_errno: 0
              last_sql_error:
  replicate_ignore_server_ids:
            master_server_id: 31
                  master_uuid: 268e23d1-2216-11e5-abcc-000c296ecd05
            master_info_file: /data/mysql/master.info
                    sql_delay: 0
          sql_remaining_delay: null
      slave_sql_running_state: slave has read all relay log; waiting for the slave i/o thread to update it
          master_retry_count: 86400
                  master_bind:
      last_io_error_timestamp:
    last_sql_error_timestamp:
              master_ssl_crl:
          master_ssl_crlpath:
          retrieved_gtid_set: 268e23d1-2216-11e5-abcc-000c296ecd05:1-29
            executed_gtid_set: 268e23d1-2216-11e5-abcc-000c296ecd05:1-29
                auto_position: 1
1 row in set (0.02 sec)
error:
no query specified
自动找到binlog位置,并进行同步;
经过以上操作便完成了mysql主从架构的搭建;
【常见问题的处理方法】
1、场景的模拟
步骤一:主库上面创建表john,并插入3行数据。(这个时候从库和主库的数据是一致的)
mysql> select * from john;
+------+
| id  |
+------+
| 1    |
| 2    |
| 3    |
+------+
3 rows in set (0.19 sec)
步骤二:从库关闭slave状态
mysql> stop slave;
步骤三:主库关闭写binlog
mysql>  set sql_log_bin=off;  关闭
query ok, 0 rows affected (0.03 sec)
步骤四:主库插入值4
mysql> insert into john values(4);
query ok, 1 row affected (0.04 sec)
步骤五:主库启动binlog
mysql> set sql_log_bin=on;
query ok, 0 rows affected (0.00 sec)
步骤六:主库插入值 5
mysql> insert into john values(5);
query ok, 1 row affected (0.00 sec)
经过以上步骤,主库和从库中john的值已经不一致了;
主库如下:
从库如下:
步骤六:修改主库id为4的行,这个时候从库就会报错了
retrieved_gtid_set: a989adc2-2a8e-11e5-a308-000c296ecd05:1-30  主库的gtid序号
executed_gtid_set: a989adc2-2a8e-11e5-a308-000c296ecd05:1-29  从库执行gtid序号
2、问题原因:由于id=4是没有写日志的,所以id=4并没有同步到从库,当主库删除id=4这条记录的时候,,从库找不到这条记录所以报错了;
3、解决方法:gtids模式下的主从问题,操作如下:
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product