====== Changing Masters ====== ===== The problem ===== I have a mysql master database with an slave. I want to change the master server. Downtime it is not a problem, however, I will try to reduce downtime. My servers, for the sake of this example will be named: master, future-master, slave. ===== First: make future-master to become an slave of master ===== For that, I've found this: http://plusbryan.com/mysql-replication-without-downtime mysqldump --skip-lock-tables --single-transaction --flush-logs --hex-blob --master-data=2 -A -h MASTER-SERVERNAME -u root -p > ~/dump.sql As it is said in the document, take note of the value of MASTER_LOG_FILE and MASTER_LOG_POS: head dump.sql -n80 | grep "MASTER_LOG_POS" In the slave, edit the config file: server-id = 101 binlog-format = mixed log_bin = mysql-bin relay-log = mysql-relay-bin log-slave-updates = 1 read-only = 1 Restart future-master. Import data: mysql -h localhost -u root -p < .\20150623-total-dump-1114.sql Now, in the future-master server we must execute: CHANGE MASTER TO MASTER_HOST='MASTER',MASTER_USER='replicant',MASTER_PASSWORD='<>', MASTER_LOG_FILE='<>', MASTER_LOG_POS=<>; START SLAVE; The server future-master will begin to replicate the pending changes from the master server. To check out the pending tasks it has: show slave status\G It's important that that \G must be written as-is: an uppercase G and no space between the \ and the last character of the command, because otherwise it won't be understood. The synchronization will be finished when --for instance-- this value shows this: Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it I've compared the value ''Read_Master_Log_Pos'' with other slave just to make sure all the changes were updated. ===== Second: make the slave to change the master ===== We have this: {{ :mysql:20150623_mysql_step_1.png?200 |}} And now we want this: {{:mysql:20150623_mysql_step_3.png?200|}} For that, we have to: - Stop the master - Check that both slaves are up-to-date - issue a [[https://dev.mysql.com/doc/refman/5.0/en/replication-solutions-switch.html|change master to]] command to the old slave ==== Stop the master ==== Nothing new under the sun: /etc/rc.d/mysql stop or: net stop mysql ==== Check that both slaves are up-to-date ==== Among the information that ''show slave status\G'' displays, I've chosen Read_Master_Log_Pos to make sure both database servers are in the same position. ==== Create (if it does not exist) a replication user in future-master ==== grant replication slave, replication client on *.* to YOUR-REPLICATION-USERNAME identified by 'YOUR-REPLICATION-PASSWORD'; ==== Check master status an take note of the master log file and master log position ==== We have to issue a ''show master status'' command to get the file and log position of our new master: mysql> show master status\G *************************** 1. row *************************** File: YOUR-MASTER-LOG-FILE Position: YOUR-MASTER-LOG-POS Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 1 row in set (0.00 sec) With this two values, YOUR-MASTER-LOG-FILE and YOUR-MASTER-LOG-POS, we can move to the slave and issue a change master to command. ==== Issue a change master command ==== In the slave server I've issued a ''change master to'' command: stop slave; change master to master_host='future-master', master_port=3306, master_user='YOUR-REPLICATION-USERNAME', master_password='YOUR-REPLICATION-PASSWORD', master_log_file = 'YOUR-MASTER-LOG-FILE', master_log_pos = YOUR-MASTER-LOG-POSITION; start slave; And I've stopped and started the slave. ===== Final check ===== You can double check that your slave is working with the new configuration just by the method of looking one change made in the new master.