How to set up MySQL Replication

By Rex Resurreccion Oct 10, 2020
How to set up MySQL Replication

In this topic I will discuss the steps on how to set up MySQL replication. I will show you the commands and configurations you will need on both Master and Slave databases.

Enable Binary logging in Master Database

The first step is to open the my.cnf or my.ini file and modify the [mysqld] block to have the following configuration. Change the bind-address to become the master server IP Address.

[mysqld]
innodb_flush_log_at_trx_commit=1
sync_binlog=1
log-bin=mysql-bin
server-id=1
bind-address=0.0.0.0

Notice the assigned server-id value is 1, that is because we need to assign a unique server-id on each of your master and slave configurations. Then restart the MySQL daemon on your host server.

systemctl restart mysqld

For security reasons, it is recommended to create a separate user that has limited access only to replication tasks. Change slave.example.com to become the slave server IP Address.

CREATE USER 'slave'@'slave.example.com' IDENTIFIED BY 'somerandompassword';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'slave.example.com';
GRANT SELECT, LOCK TABLES ON website.* TO 'slave'@'slave.example.com';
FLUSH PRIVILEGES;

To start the slave replication process at the correct point, you need to take note of the master’s current coordinates within its binary log. If you are using InnoDB, this procedure uses FLUSH TABLES WITH READ LOCK, which blocks COMMIT operations for InnoDB tables.

FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

Open another terminal while keeping the READ LOCK in effect on the current terminal (quitting the open connection will unlock the tables). And then, on the other terminal create a snapshot of the database.

mysqldump --all-databases --master-data > dbdump.db

You can also create a dump of a specific database only.

mysqldump website --master-data > dbdump.db

Unlock the tables after you have successfully created a snapshot of your databases. Unlock this in the initial terminal opened.

UNLOCK TABLES;

Slave Host Server

Subsequently, login to your slave host server and enable the slave configuration.  Edit the my.cnf or my.ini file and add the following under the [mysqld] block. Furthermore, notice that the assigned server-id value this time is 2.

[mysqld]
server-id=2

Restart the MySQL daemon on your slave host server.

systemctl restart mysqld

Load your database snapshots after the slave configuration has been set up.

mysql < dbdump.db

If you created a snapshot for a specific database, you first need to create an empty database on your slave.

CREATE DATABASE `website` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
exit;
mysql website < dbdump.db

Slave to Master Host Connection

To configure the slave connection to the master, execute the following statement on the slave, replacing the option value with the actual value relevant to your system. And also remember the output of “SHOW MASTER STATUS” we got from the master.

mysql 
CHANGE MASTER TO MASTER_HOST = '1.2.3.4', MASTER_PORT = 3306, MASTER_USER = 'slave', MASTER_PASSWORD = 'somerandompassword', MASTER_LOG_FILE='mysql-bin.001238', MASTER_LOG_POS=154;

If you are replicating only a specific database or table, you will need to apply the filter that matches the database or table names.

mysql
CHANGE REPLICATION FILTER REPLICATE_DO_DB = (website);
CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE=(‘website.%');

Start slave thread.

START SLAVE;

Check your slave thread if it is running properly.

SHOW SLAVE STATUS\G;

Pay attention to the value of Slave_IO_State Slave_IO_Running Last_IO_Error and Slave_SQL_Running_State. You should see an indication that the replication is running without an error.

Slave_IO_State: Waiting for master to send event
Slave_IO_Running: Yes
Last_IO_Error:
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates

That’s it! We just covered the process on How to set up MySQL replication. You now have a working replication to backup your data. Check out also my other tutorial about Database Charset and Collation Fix in MySQL.

© YippeeCode.com 2020