MySQL Cluster database & MySQL Replication
RSS icon Email icon Home icon
  • Get MySQL Replication up and running in 5 minutes

    Posted on October 6th, 2010 andrew 8 comments

    MySQL Replication is incredibly simple to get up and running and this (short) post steps you through it.

    Simple Master -> Slave Replication

    MySQL allows you to build up complex replication hierarchies, such as multi-master, chains of read slaves, backup databases at a remote site or any combination of these. This post focuses on a simple single master to single slave topology – the more complex solutions are built from this basic building block.

    This post also makes the assumption that the 2 MySQL Servers have been installed but that there is no existing data in the master that needs to be copied to the slave – it’s not complex to add that extra requirement and it will be covered in a future post.

    Server “black” (192.168.0.31) is to be our master and “blue” (192.168.0.34) the slave.

    Step 1: Edit the configuration files & start the MySQL Servers

    The first step in setting up replication involves editing the “my.cnf” file on the servers that will serve as the master and slave. A default is provided with the MySQL installation but in case there is already a production MySQL database running on these servers, we provide local configuration files “master.cnf” and “slave.cnf” that will be used when starting up the MySQL servers.

    At a minimum we’ll want to add two options to the [mysqld] section of the master.cnf file:

    • log-bin: in this example we choose black-bin.log
    • server-id: in this example we choose 1. The server cannot act as a replication master unless binary logging is enabled. The server_id variable must be a positive integer value between 1 to 2^32

    master.cnf:

    [mysqld]
    server-id=1
    log-bin=black-bin.log
    datadir=/home/billy/mysql/master/data
    innodb_flush_log_at_trx_commit=1
    sync_binlog=1

    Note: For the greatest possible durability and consistency in a replication setup using InnoDB with transactions, you should also specify the innodb_flush_log_at_trx_commit=1, sync_binlog=1 options.

    Next, you’ll need to add the server-id option to the [mysqld] section of the slave’s slave.cnf file. The server-id value, like the master_id value, must be a positive integer between 1 to 2^32, It is also necessary that the ID of the slave be different from the ID of the master. If you are setting up multiple slaves, each one must have a unique server-id value that differs from that of the master and from each of the other slaves.

    slave.cnf:

    [mysqld]
    server-id=2
    relay-log-index=slave-relay-bin.index
    relay-log=slave-relay-bin
    datadir=/home/billy/mysql/slave/data

    Now, start the MySQL servers using the service manager or directly from the command line if not being run as a service:

    [billy@black ~]$ mysqld --defaults-file=/home/billy/mysql/master/master.cnf &
    [billy@blue ~]$ mysqld --defaults-file=/home/billy/mysql/slave/slave.cnf&

    Step 2: Create Replication User

    Create an account on the master server that the slave server can use to connect. This account must be given the REPLICATION SLAVE privilege:

    [billy@black ~]$ mysql -u root --prompt='master> '
    master> CREATE USER repl_user@192.168.0.34;
    master> GRANT REPLICATION SLAVE ON *.* TO repl_user@192.168.0.34 IDENTIFIED BY 'billy';

    Step 3: Initialize Replication

    We are now ready to initialize replication on the slave; issue a CHANGE MASTER command:

    slave> CHANGE MASTER TO MASTER_HOST='192.168.0.31',
     -> MASTER_USER='repl_user',
     -> MASTER_PASSWORD='billy',
     -> MASTER_LOG_FILE='',
     -> MASTER_LOG_POS=4;

    Where:

    • MASTER_HOST: the IP or hostname of the master server, in this example blue or 192.168.0.31
    • MASTER_USER: this is the user we granted the REPLICATION SLAVE privilege to in Step 2, in this example, “repl_user”
    • MASTER_PASSWORD: this is the password we assigned to ”rep_user” in Step 2
    • MASTER_LOG_FILE: is an empty string (wouldn’t be empty if there were existing writes to be picked up from the master)
    • MASTER_LOG_POS: is 4 (would likely be different if there were existing writes to be picked up from the master)

    Finally, start replication on the slave:

    slave> start slave;

    Step 4: Basic Checks

    Now we are ready to perform a basic check to ensure that replication is indeed working. In this example we insert a row of data into the “simples” table on the master server and then verify that these new rows materialize on the slave server:

    master> create database clusterdb;
    master> create table clusterdb.simples (id int not null primary key) engine=ndb;
    master> insert into clusterdb.simples values (999),(1),(2),(3);
    slave> select * from clusterdb.simples;
     +-----+
     | id  |
     +-----+
     |   1 |
     |   2 |
     |   3 |
     | 999 |
     +-----+
     

    8 responses to “Get MySQL Replication up and running in 5 minutes” RSS icon

    • Hi,
      Good write. Typo on last example though, should remove “slave> create database clusterdb;”

      Regards

    • Thanks Shlomi,

      I’ve found that I’ve needed to create the database on the slave as well as the master (after that, table creations get replicated).

      Regards, Andrew.

    • That’s very strange. Were you applying any replicate-do-db and co. parameters?

    • Hi Schlomi,

      you were quite right – there’s no need to manually create the database on the slave as replication does it for you (I was getting confused with restoring a backup when introducing replication to an established database).

      Thanks again!

    • First, I got “Error connecting to master: Access denied for user ‘repl_user’@'blue’ (using password: YES)”.

      Solution : GRANT REPLICATION SLAVE ON *.* TO repl_user@’%’ IDENTIFIED BY ‘billy’;

      (Or @’blue’ maybe more secure)

      Then I tried LOAD DATA FROM MASTER;
      But I had to add SUPER priviledge.

    • magix – the “GRANT REPLICATION…” statement is included in Step 2 of the procedure.

      Regards, Andrew.

    • Between step 2 and step 3, I would add this:

      master> show master status;
      ++++–+
      | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
      ++++–+
      | master-bin.000004 | 4 | | |
      ++++–+
      1 row in set (0.00 sec)

      This gives you the position to use for step 3′s
      MASTER_LOG_POS. This is especially important if your setup requires you to first import data from the master to the slave.

    • Awesome. Yes just correct innodb for DB. I even did this on same box with two instances using localhost address

      Works great, thank you very much.


    Leave a reply