MySQL主從複製之GTID複製

lhrbest發表於2019-07-23

MySQL主從複製之GTID複製


原文: https://www.cnblogs.com/hmwh/p/9198705.html


GTID複製又叫全域性事物ID(global transaction ID),是一個已提交事物的編號,並且是一個全域性唯一的編號,MYSQL5.6版本之後在主從複製型別上新增了GTID複製。

GTID是由server_uuid和事物id組成的,即GTID=servier_uuid:transacton_id。Server_uuid是在資料庫啟動過程中自動生成的,每臺機器的server-uuid不一樣。UUID存放在資料目錄的auto.cnf檔案下。而trasaciton_id就是事物提交時由系統順序分配的一個不會重複的序列號。

 

3.1GTID存在的價值

1、GTID使用master_auto_position=1 代替了基於binlog和position號的主從複製搭建的方式,更便於主從複製的搭建。

2、GTID可以知道事務在最開始是在哪個例項上提交的。

3、GTID方便實現主從之間的failover,再也不用不斷的去找position和binlog。

3.2GTID搭建模式

GTID不需要傳統的binlog和position號了,而是在從庫”change master to”時使用”master_auto_position=1”的方式搭建,這就讓操作變得更加方便和可靠了。

 

3.3配置前期準備

在安裝好主從資料庫之後:

主庫需要以下配置:

gtid_mode=on

enforce_gtid_consistency=on

log_bin=on

 

從庫需要以下配置:

 

servier-id 主從庫不能一樣。

gtid_mode=on

enforce_gtid_consistency=on

log_slave_updates=1

 

主庫操作:

建立主從複製賬號

create user 'rep'@'192.16.20.%' identified by 'mysql';

 

grant replication slave on *.* to 'rep'@'172.16.20.%';

 

show grants for 'rep'@'172.16.20.%';

 

 

如果不同網段建議主從各建各的。

 

初始化:

/usr/local/mysql5.7/bin/mysqldump -S /tmp/mysql3307.sock --single-transaction -uroot -pmysql --master-data=2 -A > slave.sql(我全庫匯入的有問題,換成絕對路徑就行,只用的test庫)

 

注意:必須加引數 –master-data=2,讓備份出來的檔案中記錄備份這一刻binlog檔案與position號,為搭建主從環境做準備。檢視備份檔案中記錄的當前binlog檔案和position號。

 

 

scp salve.sql 172.16.20.21:/binlogbak

 

 

 

test庫操作:

mysqldump -S /tmp/mysql3307.sock --single-transaction -uroot -pmysql --master-data=2 --database test > slave_test.sql

 

注意,如果主從GTI不一樣,資料一致可以:

set global gtid_purged='*******';

 

 

如果資料不一樣,GTID也不一樣,建議按照下面先reset從庫:reset master;

mysql -S /tmp/mysql3307.sock -uroot -pmysql < slave_test.sql

 

 

注意:多次恢復會報錯,因為裡面已經有gtid的資訊了。

如果你還想繼續強制恢復,可以在從庫上 reset master ;reset後,gtid_executed,gtid_purged為空。

show global variables like '%gtid%';

 

3.4主從配置

 

1、如果是在已經跑的伺服器,你需要重啟一下mysql server。

2、啟動之前,一定要先關閉master的寫入,保證所有slave端都已經和master端資料保持同步。

3、所有slave需要加上skip_slave_start=1的配置引數,避免啟動後還是使用老的複製協議。

 

 

在資料庫命令列執行配置主從命令。

 

change master to master_host='172.16.20.32',master_port=3307,master_user='rep',master_password='mysql',master_auto_position=1;

 

提示:master_log_file='mysql-binlog.000010',MASTER_LOG_POS=797 這兩個引數替換成了 master_auto_position=1

 

 

show slave status\G;

 

 

start slave;

 

stop slave;

reset slave all; 清空從庫的所有配置資訊。

start slave;

 

 

一般複製建議半同步+GTID 複製:

 

 

 

附帶主從引數:

主:

[root@mysql5 ~]# cat /etc/my3307.cnf

[client]

port = 3307

socket = /tmp/mysql5.7.sock

[mysql]

prompt="\u@db \R:\m:\s [\d]> "

no-auto-rehash

[mysqld]

user = mysql

port = 3307

basedir = /usr/local/mysql5.7

datadir = /mydata/mysql/mysql3307/data

socket = /tmp/mysql3307.sock

rpl_semi_sync_master_enabled=1

rpl_semi_sync_master_timeout=1000

event_scheduler=1

sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

lower_case_table_names=1

secure_file_priv=/tmp

character-set-server = utf8mb4

skip_name_resolve = 1

open_files_limit = 65535

back_log = 1024

max_connections = 500

max_connect_errors = 1000000

table_open_cache = 1024

table_definition_cache = 1024

table_open_cache_instances = 64

thread_stack = 512K

external-locking = FALSE

max_allowed_packet = 32M

sort_buffer_size = 4M

join_buffer_size = 4M

thread_cache_size = 768

query_cache_size = 0

query_cache_type = 0

interactive_timeout = 600

wait_timeout = 600

tmp_table_size = 32M

max_heap_table_size = 32M

slow_query_log = 1

slow_query_log_file = /mydata/mysql/mysql3307/logs/slow.log

log-error = /mydata/mysql/mysql3307/logs/error.log

long_query_time = 0.5

server-id = 3307101

log-bin = /mydata/mysql/mysql3307/logs/mysql-binlog

sync_binlog = 1

binlog_cache_size = 4M

max_binlog_cache_size = 1G

max_binlog_size = 500M

expire_logs_days = 7

master_info_repository = TABLE

relay_log_info_repository = TABLE

gtid_mode = on

enforce_gtid_consistency = 1

log_slave_updates

binlog_format = row

relay_log_recovery = 1

relay-log-purge = 1

key_buffer_size = 32M

read_buffer_size = 8M

read_rnd_buffer_size = 4M

bulk_insert_buffer_size = 64M

lock_wait_timeout = 3600

explicit_defaults_for_timestamp = 1

innodb_thread_concurrency = 0

innodb_sync_spin_loops = 100

innodb_spin_wait_delay = 30

transaction_isolation = REPEATABLE-READ

innodb_buffer_pool_size = 1024M

innodb_buffer_pool_instances = 8

innodb_buffer_pool_load_at_startup = 1

innodb_buffer_pool_dump_at_shutdown = 1

innodb_data_file_path = ibdata1:1G:autoextend

innodb_flush_log_at_trx_commit = 1

innodb_log_buffer_size = 32M

innodb_log_file_size = 2G

innodb_log_files_in_group = 2

innodb_max_undo_log_size = 4G

innodb_io_capacity = 2000

innodb_io_capacity_max = 4000

innodb_flush_neighbors = 0

innodb_write_io_threads = 8

innodb_read_io_threads = 8

innodb_purge_threads = 4

innodb_page_cleaners = 4

innodb_open_files = 65535

innodb_max_dirty_pages_pct = 50

innodb_flush_method = O_DIRECT

innodb_lru_scan_depth = 4000

innodb_checksum_algorithm = crc32

innodb_lock_wait_timeout = 10

innodb_rollback_on_timeout = 1

innodb_print_all_deadlocks = 1

innodb_file_per_table = 1

innodb_online_alter_log_max_size = 500M

internal_tmp_disk_storage_engine = InnoDB

innodb_stats_on_metadata = 0

innodb_status_file = 1

innodb_status_output = 0

innodb_status_output_locks = 0

#performance_schema

performance_schema = 1

performance_schema_instrument = '%=on'

#innodb monitor

innodb_monitor_enable="module_innodb"

innodb_monitor_enable="module_server"

innodb_monitor_enable="module_dml"

innodb_monitor_enable="module_ddl"

innodb_monitor_enable="module_trx"

innodb_monitor_enable="module_os"

innodb_monitor_enable="module_purge"

innodb_monitor_enable="module_log"

innodb_monitor_enable="module_lock"

innodb_monitor_enable="module_buffer"

innodb_monitor_enable="module_index"

innodb_monitor_enable="module_ibuf_system"

innodb_monitor_enable="module_buffer_page"

innodb_monitor_enable="module_adaptive_hash"

[mysqldump]

quick

max_allowed_packet = 32M

 

 

從:

[root@rac1 ~]# cat /etc/my3307.cnf

[client]

port = 3307

socket = /tmp/mysql5.7.sock

[mysql]

prompt="\u@db \R:\m:\s [\d]> "

no-auto-rehash

[mysqld]

user = mysql

port = 3307

basedir = /usr/local/mysql5.7

datadir = /mydata/mysql/mysql3307/data

socket = /tmp/mysql3307.sock

character-set-server = utf8mb4

lower_case_table_names=1

sql_mode=STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

rpl_semi_sync_slave_enabled=1

skip_name_resolve = 1

open_files_limit = 65535

back_log = 1024

max_connections = 500

max_connect_errors = 1000000

table_open_cache = 1024

table_definition_cache = 1024

table_open_cache_instances = 64

thread_stack = 512K

external-locking = FALSE

max_allowed_packet = 32M

sort_buffer_size = 4M

join_buffer_size = 4M

thread_cache_size = 768

query_cache_size = 0

query_cache_type = 0

interactive_timeout = 600

wait_timeout = 600

tmp_table_size = 32M

max_heap_table_size = 32M

slow_query_log = 1

slow_query_log_file = /mydata/mysql/mysql3307/logs/slow.log

log-error = /mydata/mysql/mysql3307/logs/error.log

long_query_time = 0.1

server-id = 3307102

log-bin = /mydata/mysql/mysql3307/logs/mysql-binlog

sync_binlog = 1

binlog_cache_size = 4M

max_binlog_cache_size = 500m

max_binlog_size = 200m

expire_logs_days = 7

master_info_repository = TABLE

relay_log_info_repository = TABLE

gtid_mode = on

enforce_gtid_consistency = 1

log_slave_updates

binlog_format = row

relay_log_recovery = 1

relay-log-purge = 1

key_buffer_size = 32M

read_buffer_size = 8M

read_rnd_buffer_size = 4M

bulk_insert_buffer_size = 64M

lock_wait_timeout = 3600

explicit_defaults_for_timestamp = 1

innodb_thread_concurrency = 0

innodb_sync_spin_loops = 100

innodb_spin_wait_delay = 30

transaction_isolation = REPEATABLE-READ

innodb_buffer_pool_size = 1024M

innodb_buffer_pool_instances = 8

innodb_buffer_pool_load_at_startup = 1

innodb_buffer_pool_dump_at_shutdown = 1

innodb_data_file_path = ibdata1:1G:autoextend

innodb_flush_log_at_trx_commit = 1

innodb_log_buffer_size = 32M

innodb_log_file_size = 1g

innodb_log_files_in_group = 2

innodb_max_undo_log_size = 1G

innodb_io_capacity = 2000

innodb_io_capacity_max = 4000

innodb_flush_neighbors = 0

innodb_write_io_threads = 8

innodb_read_io_threads = 8

innodb_purge_threads = 4

innodb_page_cleaners = 4

innodb_open_files = 65535

innodb_max_dirty_pages_pct = 50

innodb_flush_method = O_DIRECT

innodb_lru_scan_depth = 4000

innodb_checksum_algorithm = crc32

innodb_lock_wait_timeout = 10

innodb_rollback_on_timeout = 1

innodb_print_all_deadlocks = 1

innodb_file_per_table = 1

innodb_online_alter_log_max_size = 4G

internal_tmp_disk_storage_engine = InnoDB

innodb_stats_on_metadata = 0

innodb_status_file = 1

innodb_status_output = 0

innodb_status_output_locks = 0

performance_schema = 1

performance_schema_instrument = '%=on'

#innodb monitor

innodb_monitor_enable="module_innodb"

innodb_monitor_enable="module_server"

innodb_monitor_enable="module_dml"

innodb_monitor_enable="module_ddl"

innodb_monitor_enable="module_trx"

innodb_monitor_enable="module_os"

innodb_monitor_enable="module_purge"

innodb_monitor_enable="module_log"

innodb_monitor_enable="module_lock"

innodb_monitor_enable="module_buffer"

innodb_monitor_enable="module_index"

innodb_monitor_enable="module_ibuf_system"

innodb_monitor_enable="module_buffer_page"

innodb_monitor_enable="module_adaptive_hash"

[mysqldump]

quick

max_allowed_packet = 32M

 

 

4、GTID複製與傳統複製的切換

 

主:172.16.20.32

從:172.16.10.21

 

a)    GTID切換成傳統複製

從庫資訊:

show slave status\G;

 

 

主庫:

 

 

從庫切換操作:

stop slave;

 

change master to master_auto_position=0,master_host='172.16.20.32', master_port=3307,master_user='rep',master_password='mysql',Master_Log_File='mysql-binlog.000007',Master_Log_Pos=194;

 

start slave;

 

主從資料庫伺服器上 同時,依次執行以下操作:

set global gtid_mode='on_permissive';

 

set global gtid_mode='off_permissive';

 

主從關閉GTID功能:

set global enforce_gtid_consistency=off;

 

set global gtid_mode=off;

 

把gtid_mode=off和enforce_gtid_consistency=off寫入配置檔案my3307.cnf中。重啟後可以繼續生效,並進行測試。

 

b)    傳統複製切換成GTID過程

主從資料庫伺服器同時修改以下引數:

 

set global enforce_gtid_consistency=warn; error log 不會出現警告資訊,如果有,需要先修復,才能繼續後面操作。

 

set global enforce_gtid_consistency=on;

 

set global gtid_mode=off_permissive;

 

set global gtid_mode=on_permissive;

 

 

確認從庫沒等待的事務:

show global status like '%ongoing%';

 

 

0代表沒有等待的事務。

 

主從庫上同時設定gtid_mode=on;

 

set global gtid_mode=on;

 

 

show variables like '%gtid%';

 

 

把傳統複製模式改為(GTID)複製。

 

stop slave;

 

change master to master_auto_position=1;

 

 

檢視並進行測試:

 

 

主:

 

 

從:

 

 

例如主庫:

 

 

從庫:

 

5、GTID使用限制條件

GTID複製是針對事物,一個gtid對於一個事務。

1、 不能使用create table table_name select * from table_name。

2、 在一個事務中即包含事務表的操作,又包含非事物表。

3、 不支援create temporary table or drop temporary table語句操作。

4、 使用GTID複製從庫調過錯誤,不支援執行slave_skip_errors。







MySQL5.6 GTID新特性實踐

搭建

本次搭建使用了mysql_sandbox指令碼為基礎,先建立了一個一主三從的基於位置複製的環境。然後透過配置修改,將整個架構專為基於GTID的複製。如果你還不熟悉mysql_sandbox,可以閱讀部落格之前的文章

。需要一次對主從節點做配置修改,並重啟服務。這樣的操作,顯然在production環境進行升級時是不可接受的。Facebook,Booking.com,Percona都對此透過patch做了最佳化,做到了更優雅的升級。具體的操作方式會在以後的博文當中介紹到。這裡我們就按照官方文件,進行一次實驗性的升級。 主要的升級步驟會有以下幾步:
  • 確保主從同步
  • 在master上配置read_only,保證沒有新資料寫入
  • 修改master上的my.cnf,並重啟服務
  • 修改slave上的my.cnf,並重啟服務
  • 在slave上執行change master to並帶上master_auto_position=1啟用基於GTID的複製

由於是實驗環境,read_only和服務重啟並無大礙。只要按照官方的

做就能順利完成升級,這裡就不贅述詳細過程了。下面列舉了一些在升級過程中容易遇到的錯誤。

[ERROR] --gtid-mode[ERROR] --gtid-modechange master to 後的warnings

在按照文件的操作change master to後,會發現有兩個warnings。其實是兩個安全性警告,不影響正常的同步(有興趣的讀者可以看下關於該warning的

。warning的具體內容如下:

slave1 [localhost] {msandbox} ((none)) > stop slave;
Query OK, 0 rows affected (0.03 sec)
slave1 [localhost] {msandbox} ((none)) > change master to master_host='127.0.0.1',master_port =21288,master_user='rsandbox',master_password='rsandbox',master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.04 sec)
slave1 [localhost] {msandbox} ((none)) > show warnings;
+-------+------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message                                                                                                                                                                                                                                                                              |
+-------+------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Note  | 1759 | Sending passwords in plain text without SSL/TLS is extremely insecure.                                                                                                                                                                                                               |
| Note  | 1760 | Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. |
+-------+------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

官方文件

實驗二:忽略purged的部分,強行同步

那麼實際生產應用當中,偶爾會遇到這樣的情況:某個slave從備份恢復後(或者load data infile)後,DBA可以人為保證該slave資料和master一致;或者即使不一致,這些差異也不會導致今後的主從異常(例如:所有master上只有insert沒有update)。這樣的前提下,我們又想使slave透過replication從master進行資料複製。此時我們就需要跳過master已經被purge的部分,那麼實際該如何操作呢? 我們還是以實驗一的情況為例:

先確認master上已經purge的部分。從下面的命令結果可以知道master上已經缺失24024e52-bd95-11e4-9c6d-926853670d0b:1這一條事務的相關日誌

master [localhost] {msandbox} (test) > show global variables like '%gtid%';
+---------------------------------+------------------------------------------+
| Variable_name                   | Value                                    |
+---------------------------------+------------------------------------------+
| binlog_gtid_simple_recovery     | OFF                                      |
| enforce_gtid_consistency        | ON                                       |
| gtid_executed                   | 24024e52-bd95-11e4-9c6d-926853670d0b:1-3 |
| gtid_mode                       | ON                                       |
| gtid_owned                      |                                          |
| gtid_purged                     | 24024e52-bd95-11e4-9c6d-926853670d0b:1   |
| simplified_binlog_gtid_recovery | OFF                                      |
+---------------------------------+------------------------------------------+
7 rows in set (0.00 sec)

在slave上透過set global gtid_purged='xxxx'的方式,跳過已經purge的部分

slave2 [localhost] {msandbox} ((none)) > stop slave;
Query OK, 0 rows affected (0.04 sec)
slave2 [localhost] {msandbox} ((none)) > set global gtid_purged = '24024e52-bd95-11e4-9c6d-926853670d0b:1';
Query OK, 0 rows affected (0.05 sec)
slave2 [localhost] {msandbox} ((none)) > start slave;
Query OK, 0 rows affected (0.01 sec)
slave2 [localhost] {msandbox} ((none)) > show slave status\G                
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                          ......
              Master_Log_File: mysql-bin.000005
          Read_Master_Log_Pos: 359
               Relay_Log_File: mysql_sandbox21290-relay-bin.000004
                Relay_Log_Pos: 569
        Relay_Master_Log_File: mysql-bin.000005
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
                          ......
          Exec_Master_Log_Pos: 359
              Relay_Log_Space: 873
                          ......
             Master_Server_Id: 1
                  Master_UUID: 24024e52-bd95-11e4-9c6d-926853670d0b
             Master_Info_File: /data/mysql/rsandbox_mysql-5_6_23/node2/data/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
                          ......
           Retrieved_Gtid_Set: 24024e52-bd95-11e4-9c6d-926853670d0b:2-3
            Executed_Gtid_Set: 24024e52-bd95-11e4-9c6d-926853670d0b:1-3
                Auto_Position: 1
1 row in set (0.00 sec)

可以看到此時slave已經可以正常同步,並補齊了24024e52-bd95-11e4-9c6d-926853670d0b:2-3範圍的binlog日誌。






MySQL5.7殺手級新特性:GTID原理與實戰

一、理論篇

1.1 GTID是什麼(what)

1.1.1 GTID組成和架構

  • GTID 架構

a) GTID = server_uuid:transaction_id
b) server_uuid 來源於 auto.cnf
c) GTID: 在一組複製中,全域性唯一

gtid_set:
    uuid_set [, uuid_set] ...
    | uuid_set: uuid:
    hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh 0-interval:
    n[-n]
    (n >= GTID在binlog中的結構 
 GTID event 結構 
 * 假設有binlog: bin.001 : Previous-GTIDs=emptybin.002 : Previous-GTIDs=;  binlog_event有:41-80 * 1-80bin.004 : Previous-GTIDs=;  binlog_event有:121-160 binlog開始掃描(即:bin.004) bin.004的Previous-GTIDs=1-120,如果$A=140 > Previous-GTIDs,那麼肯定在3. binlog檔案 gtid_purged 
 丟棄掉的GTID 
 gtid_next 
 session級別的變數,下一個gtid 
 enforce_gtid_consistency 
 保證GTID安全的引數 
 重要引數如何持久化 
 1) 如何持久化gtid_executed [ log-bin=on,log_slave_update=on ] 
 1. gtid_executed = mysqlnormal】
or .gtid_executed +  last_binlog中最後沒寫到mysql.gtid_executed中的gtid_event  【recover】 2) 如何持久化重置的gtid_purged值? 
 $A$A2. 由於有可能手動設定過gtid_purged=:a-b, binlog.index中,first_binlog的Previous-GTIDs肯定不會出現:a-b @@global.gtid_executed(mysql.@@global.gtid_executed代替) - last_binlog的Previous-GTIDs  - last_binlog所有的gtid_event $reset_gtid_purged 來表示重置的gtid

3)如何持久化gtid_purged [ log-bin=on,log_slave_update=on ]

gtid_purged=binlog.index:first_binlog的Previous-GTIDs  + gtid_mode=ON(必選) -slaveON(必選)
enforce-consistency(必選)
  • MySQL 5.7gtid_mode=
  • -gtidON
  • (可選)--高可用切換,最好設定
  • log-updates
  • =
  • ON
  • 1.1.5 新的複製協議 COM_BINLOG_DUMP_GTID

    • Slave sends to master range of identifiers of executed transactions to master
    • 同樣的GTID不能被執行兩次,如果有同樣的GTID,會自動被skip掉。

    com_binlog_dump_gtid



  • GTID_SUBTRACT(set,subset) returns only those GTIDs from set that are not in subset
    WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS(gtid_set[, timeout][,channel]) Wait until the given GTIDs have executed on slave
    • 新語法
-71CA-9E33-C80AA9429562:11-71CA-9E33-C80AA9429562:10 的時候停止,下一個事務是11
2. START SLAVE SQL_THREAD UNTIL SQL_AFTER_GTIDS = 3E11FA47-11E1-56 表示,當SQL_thread 執行到3E11FA47-11E1 
 1.2.2 GTID replication [so easy] 
  > 設定enforce-gtid-consistency=ON 
 CREATE SELECT statements CREATE TABLE DROP TABLE statements inside transactions  > Non-GTID 推薦配置: relay_log_recovery=1,relay_log_info_repository=TABLE,master_info_repository=TABLE > GTID 推薦配置:MASTER_AUTO_POSITION=on,relay_log_recovery=0 
  > Non-GTID 推薦配置: relay_log_recovery=1, sync_relay_log=1,relay_log_info_repository=TABLE,master_info_repository=TABLE > GTID 推薦配置: MASTER_AUTO_POSITION=on, relay_log_recovery=0 
 SET @@read_only = ON;
  • step 2: 關閉所有MySQL
shell> mysqladmin -uusername -p mysqld ---logbin ---&

當然,在my.cnf中配置好最佳

  • step 4: change master
MASTER_HOST = host,
     > MASTER_USER = user,
     > MASTER_AUTO_POSITION = mysql> SLAVE;
  • step 5: 讓master 可讀可寫
mysql> global.mysqldump xx 獲取並且記錄gtid_purged值 --獲取並且記錄gtid_executed值,這個就相當於mysqldump中得到的gtid_purged
  • step 2: 在新伺服器上reset master,匯入備份
reset --清空gtid資訊 匯入備份; set mysql> CHANGE MASTER TO
     > MASTER_PORT = port,
     > MASTER_PASSWORD = password,
     > 1;
START
  • step 9: change master
STOP   MASTER_AUTO_POSITION =    maseter_auto_position同步好 在新 開啟新;
  • binlog 已經傳遞到slave
change to maseter_auto_position同步好 master的surper_read_only=1. 選取最新的slave,master 2. 開啟新off;

以上操作,在傳統模式複製下,只能透過MHA來實現,MHA比較複雜。
現在,在GTID模式下,實現起來非常簡單,且非常方便。

2.4 GTID 運維和錯誤處理

  • 使用GTID後,對原來傳統的運維有不同之處了,需要調整過來。
  • 使用Row模式且複製配置正確的情況下,基本上很少發現有複製出錯的情況。
  • slave 設定 super_read_only=on

2.4.1 錯誤場景: Errant transaction

  • SET GLOBAL
  • SQL> 'b9b4712a-df64-11e3-b391-60672090eb04:7';   --設定需要跳過的gtid event SQL> BEGIN;COMMIT; SQL> 'AUTOMATIC'; SQL> START SLAVE;

    對於第二種不小心多執行了事務

這裡說下inject empty transction的隱患

  1. 目前只能夠reset
    • 設定gtid_purged
  2. -2
d66-864f-ecf4bbf1f42c:1如果被刪掉,重啟後,不會

3.4 GTID和複製過濾規則之間如何協同工作?MySQL,test還能愉快的過濾掉嗎?

<1pre style="font-family:courier new;color:#000000;font-size:16px;" box-sizing:border-box;margin-top:0px;margin-bottom:10px;padding:0px;overflow:auto;font-size:13px;border-radius:2px;line-height:1.42857;word-break:break-all;border:none;"="">可以,改過濾的會自己過濾,不用擔心





MySQL 5.7基於GTID的主從複製實踐

什麼是GTID Replication

從 MySQL 5.6.5 開始新增了一種基於 GTID 的複製方式。透過 GTID 保證了每個在主庫上提交的事務在叢集中有一個唯一的ID。這種方式強化了資料庫的主備一致性,故障恢復以及容錯能力。

在原來基於二進位制日誌的複製中,從庫需要告知主庫要從哪個偏移量進行增量同步,如果指定錯誤會造成資料的遺漏,從而造成資料的不一致。藉助GTID,在發生主備切換的情況下,MySQL的其它從庫可以自動在新主庫上找到正確的複製位置,這大大簡化了複雜複製拓撲下叢集的維護,也減少了人為設定複製位置發生誤操作的風險。另外,基於GTID的複製可以忽略已經執行過的事務,減少了資料發生不一致的風險。

什麼是GTID

GTID (Global Transaction ID) 是對於一個已提交事務的編號,並且是一個全域性唯一的編號。 GTID 實際上 是由 UUID+TID 組成的。其中 UUID 是一個 MySQL 例項的唯一標識。TID 代表了該例項上已經提交的事務數量,並且隨著事務提交單調遞增。下面是一個GTID的具體形式:

3E11FA47-71CA-11E1-9E33-C80AA9429562:23

一組連續的事務可以用  - 連線的事務序號範圍表示。例如:

e6954592-8dba-11e6-af0e-fa163e1cf111:1-5

GTID 集合可以包含來自多個 MySQL 例項的事務,它們之間用逗號分隔。如果來自同一 MySQL 例項的事務序號有多個範圍區間,各組範圍之間用冒號分隔。例如:

e6954592-8dba-11e6-af0e-fa163e1cf111:1-5:11-18,
e6954592-8dba-11e6-af0e-fa163e1cf3f2:1-27

可以使用  SHOW MASTER STATUS 實時看當前的事務執行數。

GTID的作用

GTID 的使用不單單是用單獨的識別符號替換舊的二進位制日誌檔案和位置,它也採用了新的複製協議。舊的協議往往簡單直接,即:首先從伺服器上在一個特定的偏移量位置連線到主伺服器上一個給定的二進位制日誌檔案,然後主伺服器再從給定的連線點開始傳送所有的事件。

新協議稍有不同:支援以全域性統一事務 ID (GTID) 為基礎的複製。當在主庫上提交事務或者被從庫應用時,可以定位和追蹤每一個事務。GTID 複製是全部以事務為基礎,使得檢查主從一致性變得非常簡單。如果所有主庫上提交的事務也同樣提交到從庫上,一致性就得到了保證。

GTID 相關操作:預設情況下將一個事務記錄進二進位制檔案時,首先記錄它的 GTID,而且 GTID 和事務相關資訊一併要傳送給從伺服器,由從伺服器在本地應用認證,但是絕對不會改變原來的事務 ID 號。因此在 GTID 的架構上就算有了N層架構,複製是N級架構,事務 ID 依然不會改變,有效的保證了資料的完整和安全性。

你可以使用基於語句的或基於行的複製與 GTID ,但是,為了獲得最佳效果,我們建議你使用基於行(ROW)的格式。

GTID功能的具體歸納主要有以下兩點:

  • 根據 GTID 可以知道事務最初是在哪個例項上提交的

  • GTID 的存在方便了 Replication 的 Failover

我們可以看下在 MySQL 5.6 的 GTID 出現以前 Replication Failover 的操作過程。假設我們有一個如下圖的環境:

MySQL主從複製之GTID複製

此時,Server A 的伺服器當機,需要將業務切換到 Server B 上。同時,我們又需要將 Server C 的複製源改成 Server B。複製源修改的命令語法很簡單即:

CHANGE MASTER TO MASTER_HOST='xxx', MASTER_LOG_FILE='xxx', MASTER_LOG_POS=nnnn

而這種方式的難點在於,由於同一個事務在每臺機器上所在的 binlog 名字和位置都不一樣,那麼怎麼找到 Server C 當前同步停止點對應 Server B 上  master_log_file 和  master_log_pos 的位置就成為了難題。

這也就是為什麼  M-S 複製叢集需要使用  MMMMHA 這樣的額外管理工具的一個重要原因。 這個問題在 5.6 的 GTID 出現後,就顯得非常的簡單。

由於同一事務的 GTID 在所有節點上的值一致,那麼根據 Server C 當前停止點的 GTID 就能唯一定位到 Server B 上的GTID。甚至由於  MASTER_AUTO_POSITION 功能的出現,我們都不需要知道 GTID 的具體值。直接使用以下命令就可以直接完成 Failover 的工作。

CHANGE MASTER TO MASTER_HOST='xxx', MASTER_AUTO_POSITION=='xxx'

如何產生GTID

GTID 的生成受  gtid_next 控制。 在主伺服器上 gtid_next 是預設的  AUTOMATIC,即在每次事務提交時自動生成新的 GTID 。它從當前已執行的 GTID 集合(即  gtid_executed )中,找一個大於 0 的未使用的最小值作為下個事務 GTID 。同時在 Binlog 的實際的更新事務事件前面插入一條  set gtid_next 事件。

這裡以一條 insert 語句來看看 GTID 的生成過程:

MySQL主從複製之GTID複製

在從庫上回放主庫的 Binlog 時,先執行  SET @@SESSION.GTID_NEXT語句,然後再執行 insert 語句,確保在主和備上這條 insert 對應於相同的 GTID。

一般情況下,GTID集合是連續的,但使用多執行緒複製(MTS)以及透過  gtid_next 進行人工干預時會導致 GTID 空洞。

MySQL主從複製之GTID複製

繼續執行事務,MySQL 會分配一個最小的未使用 GTID,也就是從出現空洞的地方分配 GTID,最終會把空洞填上。

MySQL主從複製之GTID複製

這意味著嚴格來說我們即不能假設 GTID 集合是連續的,也不能假定 GTID 序號大的事務在GTID序號小的事務之後執行,事務的順序應由事務記錄在 Binlog 中的先後順序決定。

什麼是server-uuid

MySQL 5.6 以後用 128 位的  server-uuid 代替了原本的 32 位  server-id 的大部分功能。原因很簡單, server-id 依賴於 my.cnf 的手工配置,有可能產生衝突。而自動產生 128 位 UUID 的演算法可以保證所有的 MySQL UUID 都不會衝突。

MySQL 在資料目錄下有一個 auto.cnf 檔案就是用來儲存  server-uuid 的,如下:

$ cat /var/lib/mysql/auto.cnf
[auto]
server-uuid=f75ae43f-3f5e-11e7-9b98-001c4297532a

在 MySQL 再次啟動時會讀取 auto.cnf 檔案,繼續使用上次生成的  server_uuid。使用  SHOW 命令可以檢視 MySQL 例項當前使用的  server-uuid,它是一個 MySQL Global Variables。

SHOW GLOBAL VARIABLES LIKE ‘server_uuid';

配置GTID主從複製

環境準備

這裡一共使用了二臺機器,MySQL 版本都為 5.7.18。

機器名 IP地址 MySQL角色
dev-master-01 192.168.2.210 MySQL 主庫
dev-node-02 192.168.2.212 MySQL 從庫

安裝MySQL

MySQL 安裝比較簡單,在 「 MySQL 5.7多源複製實踐」一文中我們也講了,這裡就不在重複講了。如果你還不會安裝,可以先參考此文安裝好 MySQL 。

配置MySQL基於GTID的複製

GTID主從複製的配置思路

MySQL主從複製之GTID複製

  • 修改MySQL主配置檔案

配置 MySQL 基於GTID的複製,主要是需要在 MySQL 伺服器的主配置檔案  [mysqld] 段中新增以下內容:

gtid-mode = ON
enforce-gtid-consistency = ON
log-slave-updates = ON

在 MySQL 5.6 版本時,基於 GTID 的複製中  log-slave-updates 選項是必須的。但是其增大了從伺服器的IO負載, 而在 MySQL 5.7 中該選項已經不是必須項。

MySQL主伺服器配置片斷

$ vim /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
server-id = 1
binlog_format = row
expire_logs_days = 30
max_binlog_size  = 100M
gtid_mode = ON
enforce_gtid_consistency = ON
binlog-checksum = CRC32
master-verify-checksum = 1
log-bin = /var/log/mysql/mysql-bin
log_bin_index = /var/log/mysql/mysql-bin.index
log-slave-updates = ON

MySQL從伺服器配置片斷

$ vim /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
server-id = 3
gtid_mode = ON
enforce_gtid_consistency = ON
log-slave-updates = ON
skip-slave-start = true
expire_logs_days = 30
max_binlog_size  = 100M
read_only = ON
slave-sql-verify-checksum = 1
log-bin = /var/log/mysql/mysql-bin
log_bin_index = /var/log/mysql/mysql-bin.index
relay-log = /var/log/mysql/relay-log
relay-log-index = /var/log/mysql/relay-log-index
relay-log-info-file = /var/log/mysql/relay-log.info
master-info-repository = table
relay-log-info-repository = table
relay-log-recovery = ON
report-port = 3306
report-host = 192.168.2.212
replicate-do-db = master1
replicate_wild_do_table=master1.%

注: server-id 每臺必須配置為不一樣,比如 dev-master-01 為1,dev-node-02 為3。這裡沒有給出全部配置,其它請根據實際情況自行配置。

  • 重啟MySQL伺服器

$ service mysql restart
  • 建立具有複製許可權的使用者

基於 GTID 的複製會自動地將沒有在從庫執行過的事務重放,所以不要在其它從庫上建立相同的賬號。 如果建立了相同的賬戶,有可能造成複製鏈路的錯誤。

# 在MySQL主伺服器上建立
mysql> grant replication slave on *.* to 'repl'@'192.168.2.%' identified by '000000';
mysql> flush privileges;
  • 檢視主庫與從庫的GTID是否開啟

mysql> show variables like "%gtid%";
+----------------------------------+-----------+
| Variable_name                    | Value     |
+----------------------------------+-----------+
| binlog_gtid_simple_recovery      | ON        |
| enforce_gtid_consistency         | ON        |
| gtid_executed_compression_period | 1000      |
| gtid_mode                        | ON        |
| gtid_next                        | AUTOMATIC |
| gtid_owned                       |           |
| gtid_purged                      |           |
| session_track_gtids              | OFF       |
+----------------------------------+-----------+
8 rows in set (0.00 sec)
mysql> show variables like '%gtid_next%';
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| gtid_next     | AUTOMATIC |
+---------------+-----------+
1 row in set (0.00 sec)

簡單說下幾個常用引數的作用:

a) gtid_executed

在當前例項上執行過的 GTID 集合,實際上包含了所有記錄到 binlog 中的事務。設定  set sql_log_bin=0 後執行的事務不會生成 binlog 事件,也不會被記錄到  gtid_executed 中。執行  RESET MASTER 可以將該變數置空。

b) gtid_purged

binlog 不可能永遠駐留在服務上,需要定期進行清理(透過  expire_logs_days 可以控制定期清理間隔),否則遲早它會把磁碟用盡。

gtid_purged 用於記錄本機上已經執行過,但是已經被清除了的 binlog 事務集合。它是  gtid_executed 的子集。只有  gtid_executed 為空時才能手動設定該變數,此時會同時更新  gtid_executed 為和  gtid_purged 相同的值。

gtid_executed 為空意味著要麼之前沒有啟動過基於 GTID 的複製,要麼執行過  RESET MASTER。執行  RESET MASTER 時同樣也會把  gtid_purged 置空,即始終保持  gtid_purged 是  gtid_executed 的子集。

c) gtid_next

會話級變數,指示如何產生下一個GTID。可能的取值如下:

第一個:AUTOMATIC

自動生成下一個 GTID,實現上是分配一個當前例項上尚未執行過的序號最小的 GTID。

第二個:ANONYMOUS

設定後執行事務不會產生GTID。

第三個:顯式指定的GTID

可以指定任意形式合法的 GTID 值,但不能是當前  gtid_executed 中的已經包含的 GTID,否則下次執行事務時會報錯。

  • 檢視伺服器server_uuid

mysql> show global variables like '%uuid%';
+---------------+--------------------------------------+
| Variable_name | Value                                |
+---------------+--------------------------------------+
| server_uuid   | f75ae43f-3f5e-11e7-9b98-001c4297532a |
+---------------+--------------------------------------+
1 row in set (0.00 sec)
  • 檢視主伺服器狀態

MySQL主從複製之GTID複製

  • 從庫連線至主庫

mysql> CHANGE MASTER TO MASTER_HOST='192.168.2.210',MASTER_USER='repl',MASTER_PASSWORD='000000',MASTER_AUTO_POSITION=1;
  • 在從伺服器上啟動複製

mysql> START SLAVE;

啟動成功後檢視SLAVE的狀態

mysql> SHOW SLAVE STATUS\G
...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...

確認  Slave_IO_Running 和  Slave_SQL_Running 兩個引數都為 Yes 狀態。

在主伺服器檢視從庫連線的主機資訊

MySQL主從複製之GTID複製

測試GTID主從複製

  • 在主庫(dev-master-01)例項建立一些資料。

mysql> create database master1;
mysql> use master1;
mysql> CREATE TABLE `test1` (`id` int(11) DEFAULT NULL,`count` int(11) DEFAULT NULL);
mysql> insert into test1 values(1,1);
  • 在從庫(dev-node-02)例項檢查資料是否成功複製。

mysql> select * from master1.test1;
+------+-------+
| id   | count |
+------+-------+
|    1 |     1 |
+------+-------+
1 row in set (0.00 sec)

檢查從伺服器狀態

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.2.210
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 977
               Relay_Log_File: relay-log.000002
                Relay_Log_Pos: 1190
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: master1
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table: master1.%
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 977
              Relay_Log_Space: 1391
              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: 1
                  Master_UUID: f75ae43f-3f5e-11e7-9b98-001c4297532a
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set: f75ae43f-3f5e-11e7-9b98-001c4297532a:1-4
            Executed_Gtid_Set: 2c55f623-4fea-11e7-82c7-001c4283459b:1,
f75ae43f-3f5e-11e7-9b98-001c4297532a:1-4
                Auto_Position: 1
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
1 row in set (0.00 sec)

可以看到 IO 和 SQL 執行緒都為 YES ,另外  retrieved_Gtid_Set 接收了4個事務, Executed_Gtid_Set 執行了4個事務。

  • 如何修復GTID複製錯誤

在基於 GTID 的複製拓撲中,要想修復從庫的 SQL 執行緒錯誤,過去的  SQL_SLAVE_SKIP_COUNTER 方式不再適用。需要透過設定  gtid_next 或  gtid_purged來完成,當然前提是已經確保主從資料一致,僅僅需要跳過複製錯誤讓複製繼續下去。

在從庫上執行以下SQL:

mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)
mysql> set gtid_next='f75ae43f-3f5e-11e7-9b98-001c4297532a:20';
Query OK, 0 rows affected (0.00 sec)
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
mysql> set gtid_next='AUTOMATIC';
Query OK, 0 rows affected (0.00 sec)
mysql> start slave;
Query OK, 0 rows affected (0.02 sec)

其中  gtid_next 就是跳過某個執行事務,設定  gtid_next 的方法一次只能跳過一個事務,要批次的跳過事務可以透過設定  gtid_purged 完成。假設下面的場景:

MySQL主從複製之GTID複製

此時從庫的  Executed_Gtid_Set 已經包含了主庫上 1-13 和 20 的事務,再開啟複製會從後面的事務開始執行,就不會出錯了。在從庫上驗證剛才插入的資料:

MySQL主從複製之GTID複製

注意,使用  gtid_next 和  gtid_purged 修復複製錯誤的前提是跳過那些事務後仍可以確保主備資料一致。如果做不到,就要考慮 pt-table-sync 或者重新匯入備份的方式了。

GTID與備份恢復

在做備份恢復的時候,有時需要恢復出來的 MySQL 例項可以作為從庫連上原來的主庫繼續複製,這就要求從備份恢復出來的 MySQL 例項擁有和主資料庫資料一致的  gtid_executed 值。這也是透過設定  gtid_purged實現的,下面看下 mysqldump 做備份的例子。

  • 透過mysqldump在主庫上做一個全量備份

這裡使用  --all-databases選項是因為基於 GTID 的複製會記錄全部的事務, 所以要構建一個完整的dump。

$ mysqldump --all-databases --single-transaction  --triggers --routines --events --host=127.0.0.1 --port=3306 --user=root -p000000 > dump.sql

生成的 dump.sql 檔案裡包含了設定  gtid_purged 的語句

SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;
SET @@SESSION.SQL_LOG_BIN= 0;
...
SET @@GLOBAL.GTID_PURGED='f75ae43f-3f5e-11e7-9b98-001c4297532a:1-14:20';
...
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;

在從庫恢復資料前需要先透過  reset master 清空  gtid_executed 變數

$ mysql -h127.0.0.1 --user=root -p000000 -e  'reset master'
$ mysql -h127.0.0.1 --user=root -p000000<dump.sql

否則執行設定  GTID_PURGED 的 SQL 時會報下面的錯誤:

ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.

此時恢復出的 MySQL 例項的  GTID_EXECUTED 和在主庫備份時的一致:

MySQL主從複製之GTID複製

由於恢復出 MySQL 例項已經被設定了正確的  GTID_EXECUTED ,下面以  master_auto_postion = 1 的方式  CHANGE MASTER 到原來的主節點即可開始複製。

mysql> CHANGE MASTER TO MASTER_HOST='192.168.2.210', MASTER_USER='repl', MASTER_PASSWORD='000000', MASTER_AUTO_POSITION = 1;

如果不希望備份檔案中生成設定  GTID_PURGED 的 SQL,可以給  mysqldump傳入  --set-gtid-purged=OFF 關閉。

其它一些需要注意的點

enforce_gtid_consistency 強制 GTID 一致性, 啟用後以下命令無法再使用。

  • create table … select …

mysql> create table test2 select * from test1;
ERROR 1786 (HY000): Statement violates GTID consistency: CREATE TABLE ... SELECT.

因為實際上是兩個獨立事件,所以只能將其拆分。先建立表,然後再把資料插入到表中。

  • 事務內部不能建立臨時表

mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> create temporary table test2(id int);
ERROR 1787 (HY000): Statement violates GTID consistency: CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE can only be executed outside transactional context.  These statements are also not allowed in a function or trigger because functions and triggers are also considered to be multi-statement transactions.
  • 同一事務中不能同時更新事務表與非事務表(MyISAM),建議都選擇 Innodb 作為預設的資料庫引擎。

mysql> CREATE TABLE `test_innodb` (id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT);
Query OK, 0 rows affected (0.04 sec)
mysql> CREATE TABLE `test_myisam` (id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT)   ENGINE = `MyISAM`;
Query OK, 0 rows affected (0.03 sec)
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into test_innodb(id) value(1);
Query OK, 1 row affected (0.00 sec)
mysql> insert into test_myisam(id) value(1);
ERROR 1785 (HY000): Statement violates GTID consistency: Updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tables.

參考文件





http://www.cnblogs.com/abobo/p/4242417.html







About Me

.............................................................................................................................................

● 本文整理自網路

● 本文在itpub( http://blog.itpub.net/26736162/abstract/1/)、部落格園( http://www.cnblogs.com/lhrbest)和個人微信公眾號( xiaomaimiaolhr)上有同步更新

● 本文itpub地址: http://blog.itpub.net/26736162/abstract/1/

● 本文部落格園地址: http://www.cnblogs.com/lhrbest

● 本文pdf版、個人簡介及小麥苗雲盤地址: http://blog.itpub.net/26736162/viewspace-1624453/

● 資料庫筆試面試題庫及解答: http://blog.itpub.net/26736162/viewspace-2134706/

● DBA寶典今日頭條號地址:

.............................................................................................................................................

● QQ群: 230161599     微信群:私聊

● 聯絡我請加QQ好友(646634621),註明新增緣由

● 於 2017-07-01 09:00 ~ 2017-07-31 22:00 在魔都完成

● 文章內容來源於小麥苗的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解

● 版權所有,歡迎分享本文,轉載請保留出處

.............................................................................................................................................

●  小麥苗的微店

●  小麥苗出版的資料庫類叢書http://blog.itpub.net/26736162/viewspace-2142121/

.............................................................................................................................................

使用 微信客戶端掃描下面的二維碼來關注小麥苗的微信公眾號( xiaomaimiaolhr)及QQ群(DBA寶典),學習最實用的資料庫技術。

   小麥苗的微信公眾號          小麥苗的QQ群             小麥苗的微店

.............................................................................................................................................

MySQL主從複製之GTID複製
DBA筆試面試講解
歡迎與我聯絡










About Me

........................................................................................................................

● 本文作者:小麥苗,部分內容整理自網路,若有侵權請聯絡小麥苗刪除

● 本文在itpub、部落格園、CSDN和個人微 信公眾號( xiaomaimiaolhr)上有同步更新

● 本文itpub地址: http://blog.itpub.net/26736162

● 本文部落格園地址: http://www.cnblogs.com/lhrbest

● 本文CSDN地址: https://blog.csdn.net/lihuarongaini

● 本文pdf版、個人簡介及小麥苗雲盤地址: http://blog.itpub.net/26736162/viewspace-1624453/

● 資料庫筆試面試題庫及解答: http://blog.itpub.net/26736162/viewspace-2134706/

● DBA寶典今日頭條號地址:

........................................................................................................................

● QQ群號: 230161599(滿) 、618766405

● 微 信群:可加我微 信,我拉大家進群,非誠勿擾

● 聯絡我請加QQ好友 646634621 ,註明新增緣由

● 於 2019-07-01 06:00 ~ 2019-07-31 24:00 在西安完成

● 最新修改時間:2019-07-01 06:00 ~ 2019-07-31 24:00

● 文章內容來源於小麥苗的學習筆記,部分整理自網路,若有侵權或不當之處還請諒解

● 版權所有,歡迎分享本文,轉載請保留出處

........................................................................................................................

小麥苗的微店

小麥苗出版的資料庫類叢書http://blog.itpub.net/26736162/viewspace-2142121/

小麥苗OCP、OCM、高可用網路班http://blog.itpub.net/26736162/viewspace-2148098/

小麥苗騰訊課堂主頁https://lhr.ke.qq.com/

........................................................................................................................

使用 微 信客戶端掃描下面的二維碼來關注小麥苗的微 信公眾號( xiaomaimiaolhr)及QQ群(DBA寶典)、新增小麥苗微 信, 學習最實用的資料庫技術。

........................................................................................................................

歡迎與我聯絡

 

 



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26736162/viewspace-2651411/,如需轉載,請註明出處,否則將追究法律責任。

相關文章