====== Die Replikation der MySQL 5.6 mit GTID ====== * [[http://www.percona.com/blog/2013/02/08/how-to-createrestore-a-slave-using-gtid-replication-in-mysql-5-6/|How to create/restore a slave using GTID replication in MySQL 5.6]] * [[http://oracle2363.rssing.com/chan-26038749/all_p1.html]] * [[http://datacharmer.blogspot.de/2012/08/mysql-56-replication-gotchas-and-bugs.html]] - besondere Sicherheitsmaßnahmen bei Datenbanken mit GTID -> ''disable-gtid-unsafe-statements'' [[Replikation mit GTID wieder herstellen]] [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