MySQL Master-Slave replication is to set up slave server to update immediately as soon as changes done in Master server. But it will not update Master if there are any changes done on slave server. Read this article to setup Master-Slave replication.
This article will help you to set up Master-Master replication between MySQL servers. In this setup if any changes made on either server will update on an other one.
Setup Details:
Master-1: 192.168.1.15 Master-2: 192.168.1.16 Database: mydb
If you are using different – different versions of MySQL on either servers use this link to check compatibility.
Step 1. Set Up MySQL Master-1 Server
- Edit MySQL configuration file and add the following lines under [mysqld] section.
# vim /etc/my.cnf
[mysqld] log-bin=mysql-bin binlog-do-db=mydb server-id=1
# service mysqld restart
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%' IDENTIFIED BY 'secretpassword'; mysql> FLUSH PRIVILEGES;
mysql> use mydb; mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000003 | 332 | mydb | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
The above output is showing that the current binary file is using mysql-bin.000003 and offset value is 332. Note down these values to use on Master-2 server in next step.
# mysqldump -u root -p mydb > mydb.sql # scp mydb.sql 192.168.1.16:/opt/
mysql> UNLOCK TABLES;
Step 2. Setup MySQL Master-2 Server
# vim /etc/my.cnf
[mysqld] log-bin=mysql-bin binlog-do-db=mydb server-id=1
server-id always be an non zero numeric value. These value will never be similar with other master or slave servers.
# service mysqld restart
# mysql -u root -p mydb < /opt/mydb.sql
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%' IDENTIFIED BY 'secretpassword'; mysql> FLUSH PRIVILEGES;
mysql > SHOW MASTER STATUS; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000001 | 847 | mydb | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
The above output is showing that the current binary file is using mysql-bin.000001 and offset value is 847. Note down these values to use in Step 3.
mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.15', -> MASTER_USER='repl_user', -> MASTER_PASSWORD='secretpassword', -> MASTER_LOG_FILE='mysql-bin.000003', -> MASTER_LOG_POS=332;
Step 3: Complete Setup on MySQL Master-1
Login to MySQL Master-1 server and execute following command.
mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.16', MASTER_USER='repl_user', MASTER_PASSWORD='secretpassword', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=847;
Execute following command on both servers to start replication slave process.
mysql> SLAVE START;
MySQL Master-Master Replication has been configured successfully on your system and in working mode. To test if replication is working make changes on either server and check if changes are reflecting on other server.
Thanks for using this tutorial, If it’s helpful for you then please do not forgot to share it with your friends.
11 Comments
How to do multiple databases? I added them but they never sync’d to the slave server. I tried reset master and updating both my.cnf
I completely rebuilt to servers and included the databases along with mydb and at least for now I can see all of my databases. I still would like to know if you can help me with “how” to add additional databases.
2nd Issue I have is that from the master to the slave (i set it up for master-master with the above instructions” The slave can’t add any tables to the new databases. It sees the changes made on the master , the slave just can’t make any changes. Can you tell me what I need to look for to make that happen?
TIA
Hello,
You have a typo in last STEP 4:
There is needed “START SLAVE” instead of “SLAVE START”.
Hi,
I want multiple master to master (3 to 3)..
i will some update automateing take 3 servers ..
I want Multi master Replication (All
Masters) in 3 Nods With Out Circular .
How its possible Please give me an Example .
Probably you have some mistake
Step 1. Set Up MySQL Master-1 Server
server-id=1
Step 2. Setup MySQL Master-2 Server
server-id=1
It is have to be right this on the Master-2
server-id=2
Dear Rahul ,
Thanks for the good document,
I think there is some problem as below:
In situation that the tables in the replicated DB contain field with type auto-increament ; because this field is written separately by DBMSs, the DB goes to an inconsistent state.
Best
Khodadad
OK, this is not working with MySQL 5.6+. You need 4 shells open for this process…
-it don’t work if you have gtid enabled.
ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.
i had no solution to this but to disable it.
-mysql -u root -p mydb < /opt/mydb.sql
results in ERROR 1049 (42000): Unknown database mydb
so i created it manually on server 2: create database mydb;
-Steps CHANGE MASTER TO MASTER_HOST=… result in
Query OK, 0 rows affected, 2 warnings (0.42 sec)
SLAVE START; result in
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SLAVE START' at line 1
the correct query is:
start slave;
but the db is not syncing…
I know I’m a few months late with this answer, but someone might find it useful.
If you’re getting ERROR 1840 when trying to import a dump from the master DB while using GTID, you need to
mysql> reset master;
Then import the dump as normal; the dump contains the correct GTID information and will set up the master data correctly again.
Again an awesome article … I got many useful articles here. thanks again
nice article… thank you so much