Inhaltsverzeichnis

Die Replikation der MySQL 5.6 mit GTID

Replikation mit GTID wieder herstellen

/etc/mysql/conf.d/cluster.cnf
[mysqld]
server_id                       = 330601
skip-name-resolve
report_host                     = db3306knoten01
report_port                     = 3306
gtid_mode                       = ON
enforce_gtid_consistency
log_slave_updates               = 1
master_verify_checksum          = 1
master_info_repository          = TABLE
relay_log_info_repository       = TABLE
relay_log_recovery              = 1
relay_log                       = mysql-relay-bin
log_bin                         = mysql-bin
binlog_format                   = ROW
innodb_support_xa               = 1
sync_binlog                     = 1
sync_master_info                = 1
sync_relay_log                  = 1
sync_relay_log_info             = 1
slave_sql_verify_checksum       = 1
slave_skip_errors               = 1032,1062
replicate_wild_ignore_table     = temptabelle.%

mit SQL-Dump

1. Schrittfolge auf dem Slave

der Slave muss angehalten und zurück gesetzt werden:

> echo "STOP SLAVE;"|mysql
> echo "STOP SLAVE; RESET MASTER; RESET SLAVE;" | mysql

2. Schrittfolge auf dem Master

auf dem Master muss die GTID ausgelesen werden:

> echo "SHOW GLOBAL VARIABLES LIKE 'GTID_EXECUTED';" | mysql -t
+---------------+----------------------------------------------+
| Variable_name | Value                                        |
+---------------+----------------------------------------------+
| gtid_executed | 73667e7d-a21a-11e4-a93d-008dba029cdc:1-13959 |
+---------------+----------------------------------------------+

Dump ziehen:

> mysqldump --all-databases --single-transaction --triggers --routines --events | guip -1 > dump.sql.gz

die GTID kann aber auch aus dem Dump ausgelesen werden (im Dump steht sie aber nicht als gtid_executed, sondern als GTID_PURGED drin):

> zcat dump.sql.gz | fgrep GTID_
SET @@GLOBAL.GTID_PURGED='73667e7d-a21a-11e4-a93d-008dba029cdc:1-13959';

… oder den Dump gleich an den Slave weiterreichen (ohne erst auf die Platte zu schreiben):

> mysqldump --all-databases --single-transaction --triggers --routines --events | mysql -h slave

3. Schrittfolge auf dem Slave

Den Slave zurücksetzen und die auf dem Master ausgelesene GTID setzen:

> echo "SHOW GLOBAL VARIABLES LIKE 'GTID_EXECUTED';"|mysql -t
+---------------+----------------------------------------------+
| Variable_name | Value                                        |
+---------------+----------------------------------------------+
| gtid_executed | 73667e7d-a21a-11e4-a93d-008dba029cdc:1-13959 |
+---------------+----------------------------------------------+

Wird der Slave nicht zurückgesetzt (bei dem auch die GTID gelöscht wird), dann gibt es Fehlermeldungen und eine Replikation kommt nicht zu stande!

> echo "STOP SLAVE; RESET MASTER; RESET SLAVE;" | mysql
> echo "SHOW GLOBAL VARIABLES LIKE 'GTID_EXECUTED';"|mysql -t
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| gtid_executed |       |
+---------------+-------+
> echo "SET GLOBAL GTID_PURGED='73667e7d-a21a-11e4-a93d-008dba029cdc:1-13959';" | mysql
> echo "SHOW GLOBAL VARIABLES LIKE 'GTID_EXECUTED';"|mysql -t
+---------------+----------------------------------------------+
| Variable_name | Value                                        |
+---------------+----------------------------------------------+
| gtid_executed | 73667e7d-a21a-11e4-a93d-008dba029cdc:1-13959 |
+---------------+----------------------------------------------+
> echo "CHANGE MASTER TO MASTER_HOST='master', MASTER_USER='fritz', MASTER_PASSWORD='Eema7ain', MASTER_AUTO_POSITION=1;" | mysql
> echo "START SLAVE;" | mysql

mit Binär-Dump

1. Schrittfolge auf dem Master

auf dem Master muss die GTID ausgelesen werden:

> echo "SHOW GLOBAL VARIABLES LIKE 'GTID_EXECUTED';" | mysql -t
+---------------+----------------------------------------------+
| Variable_name | Value                                        |
+---------------+----------------------------------------------+
| gtid_executed | 73667e7d-a21a-11e4-a93d-008dba029cdc:1-13959 |
+---------------+----------------------------------------------+

MySQL stoppen:

> service mysql stop

Binär-Dump packen:

> tar czf /var/lib/mysql > dump.tgz

MySQL wieder starten:

> service mysql start

2. Schrittfolge auf dem Slave

die alte weg räumen und die neue auspacken:

> service mysql stop
> rm -fr /var/lib/mysql/*
> tar xzvf dump.tgz -C /

die eindeutigen Einstellungen vom Master müssen unbedingt vor dem ersten Start entfernt werden:

> rm /var/lib/mysql/auto.cnf
> rm /var/lib/mysql/auto.cnf

starten und vorbereiten:

> service mysql start
> mysql_upgrade --force
> mysqlcheck -Ac
> mysqlcheck -Ar

Wird der Slave nicht zurückgesetzt (bei dem auch die GTID gelöscht wird), dann gibt es Fehlermeldungen und eine Replikation kommt nicht zu stande!

Den Slave zurücksetzen und die auf dem Master ausgelesene GTID setzen:

> echo "STOP SLAVE; RESET MASTER; RESET SLAVE;" | mysql
> echo "SHOW GLOBAL VARIABLES LIKE 'GTID_EXECUTED';"|mysql -t
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| gtid_executed |       |
+---------------+-------+
> echo "SET GLOBAL GTID_PURGED='73667e7d-a21a-11e4-a93d-008dba029cdc:1-13959';" | mysql
> echo "SHOW GLOBAL VARIABLES LIKE 'GTID_EXECUTED';"|mysql -t
+---------------+----------------------------------------------+
| Variable_name | Value                                        |
+---------------+----------------------------------------------+
| gtid_executed | 73667e7d-a21a-11e4-a93d-008dba029cdc:1-13959 |
+---------------+----------------------------------------------+
> echo "CHANGE MASTER TO MASTER_HOST='master', MASTER_USER='fritz', MASTER_PASSWORD='Eema7ain', MASTER_AUTO_POSITION=1;" | mysql
> echo "START SLAVE;" | mysql

sonstige

> echo "SHOW GLOBAL VARIABLES LIKE 'GTID_EXECUTED';SHOW GLOBAL VARIABLES LIKE 'GTID_PURGED';"|mysql -t
> echo "SHOW GLOBAL VARIABLES LIKE '%CHECK%';"|mysql -t
> echo "SHOW SLAVE STATUS \G; SHOW MASTER STATUS; SHOW SLAVE HOSTS;" | mysql -t