How to install multiple MySQL instances on a single host using MyEnv?

We have been asked several times by MySQL users about how to install multiple MySQL instances on a single host.
Typically, this is required when testing different MySQL versions or MySQL servers (MySQL server, Percona server and MariaDB server) while no available resources are available.
Sometimes, it is even required to install multiple MySQL instances on a single production server.

In this article, I’ll go through the steps needed to install multiple MySQL instances on a single host (using the tar balls binaries) and how our popular tool MyEnv can make such process so easy.

Prepare MySQL environment

[root@centos-temp ~]# groupadd mysql
[root@centos-temp ~]# useradd -g mysql mysql
[root@centos-temp ~]# su - mysql
[mysql@centos-temp:~]$ mkdir ~/product
[mysql@centos-temp:~]$ mkdir ~/data
[mysql@centos-temp ~]$ cd /downloads
[mysql@centos-temp ~]$ wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.21-linux-glibc2.5-x86_64.tar.gz
[mysql@centos-temp ~]$ cd ~/product
[mysql@centos-temp ~]$ tar xf /downloads/mysql-5.6.21-linux-glibc2.5-x86_64.tar.gz
[mysql@centos-temp ~]$ ln -s mysql-5.6.21-linux-glibc2.5-x86_64 mysql-5.6.21

Install MyEnv

MyEnv can be downloaded from here and the installation steps are listed here.

Install the first instance (named master)

  • Launch the myenv installer:

    [mysql@centos-temp ~]$ ~/product/myenv/bin/installMyEnv.sh
    PHP is installed on /usr/bin/php
    Starting MyEnv installer: /home/mysql/product/myenv-1.1.2/bin/installMyEnv.php
    
    
    Configuration file /etc/myenv/myenv.conf does NOT exist.
    Copy from template or abort (T, a): 
    
  • Since this is the first instance, the myenv config file does not exist yet, we take the template (t):

    Copy from template or abort (T, a): t
    Copy /home/mysql/product/myenv-1.1.2/etc/myenv.conf.template to /etc/myenv/myenv.conf
    
  • Then MyEnv will detect that no instances are there, we choose the first option (a) to add a new instance:

    No instance exists yet.
    An instance is the same as a mysqld process.
    
    What do you want to do next?
    o Add a new instance,
    o change an existing instance,
    o delete an existing instance,
    o save configuration and exit or
    o quit without saving
     (A/c/d/s/q)? a
    
  • MyEnv will ask for the new instance name (master):

    You have to enter a new instance name. An instance name can consist of 0-9, a-z, A-Z, - and _.
    Examples: test, prod, dev, [mysqld1] mysqld-3306
    
    Enter a new instance name: master
    
  • MyEnv will ask for the MySQL basedir and datadir (it will create tha datadir if it does not exist):

    Changing instance master:
    
    Set basedir. The basedir is the directory where your MySQL binaries are located.
    Example:
    /home/mysql/product/myenv
    /home/mysql/product/myenv-1.1.2
    /home/mysql/product/mysql-5.6.21
    /home/mysql/product/mysql-5.6.21-linux-glibc2.5-x86_64
    /usr/local/mysql
    /opt/mysql
    [/usr]
    
    basedir = /home/mysql/product/mysql-5.6.21
    
    
    /home/mysql/product/mysql-5.6.21 seems to exist and has already some files in it                                                                         .
    Omitting installation of binary tar ball.
    
    Set datadir. The datadir is the directory where your MySQL data are located.
    Example: /usr/local/mysql/data, /opt/mysql/data or /var/lib/mysql or /home/mysql/product/mysql-5.6.21/data or [/home/mysql/data/master] or /home/mysql/data/master
    datadir = /home/mysql/data/master
    
  • MyEnv will detect that no mysql database is created yet in the datadir and ask if it should install it for us or not (using the normal mysql_install_db script)

    Shall I install a mysql database under /home/mysql/data/master (Y/n)? y
    Installing MySQL instance. Please be patient, this can take a while...
      /home/mysql/product/mysql-5.6.21/scripts/mysql_install_db --datadir=/home/mysql/data/master --basedir=/home/mysql/product/mysql-5.6.21
    
  • For the new instance, we should specify the port, the socket, and the location of my.cnf (MyEnv will generate a my.cnf file including our choices in the specified location). All these must be specific per instance:

    Set port.
    Example: 3307 or [3306]
    port    = 3306
    
    Set socket.
    Example: /tmp/mysql-3306.sock /tmp/mysql-master.sock [/tmp/mysql.sock] /var/run/mysqld/mysql.sock
    socket  = /home/mysql/data/master/master.sock
    
    Choose location of my.cnf:
    Example: /etc/my.cnf /etc/mysql/my.cnf /home/mysql/data/master/my-3306.cnf [/home/mysql/data/master/my.cnf]
    my.cnf  = /home/mysql/data/master/my.cnf
    
  • MyEnv will list the just added instance and ask what should be the next step, we should save and exit (s):

    The following instances are available:
    
    master
    An instance is the same as a mysqld process.
    
    What do you want to do next?
    o Add a new instance,
    o change an existing instance,
    o delete an existing instance,
    o save configuration and exit or
    o quit without saving
     (a/c/d/S/q)? s
    
    
    Writing the configuration file...
    Rename /etc/myenv/myenv.conf to /etc/myenv/myenv.conf.2014-10-15-05-50-12
    Write /etc/myenv/myenv.conf
    
  • MyEnv will propose to add the following lines to the .bash_profile file, we should confirm (y):

    Do you want to add the following code to your ~/.bash_profile file?
    
    . /etc/myenv/MYENV_BASE
    MYENV_PWD=`pwd`
    cd $MYENV_BASE/bin
    . myenv.profile
    cd $MYENV_BASE;
    $MYENV_BASE/bin/showMyEnvStatus.php;
    cd - > /dev/null
    cd $MYENV_PWD
    
    (Y/n)? y
    
    Writing /etc/myenv/MYENV_BASE
    
  • We should add the myenv startup script as shown here into the appropriate path (the provided commands should be executed manually from the root/privileged-user after that):

    Please copy yourself manually the MyEnv start/stop script to the following location:
    shell> sudo cp /home/mysql/product/myenv-1.1.2/bin/myenv.server /etc/init.d/myenv
    done (Y)? y
    and link it to your O/S runlevels:
    RedHat/CentOS: shell> sudo chkconfig --add myenv; chkconfig myenv on
    Ubuntu/Debian: shell> sudo update-rc.d myenv defaults
    SLES/OpenSuSE: shell> sudo chkconfig --add myenv
    done (Y)? y
    
    Now source your profile as follows:
    . ~/.bash_profile
    
  • Now, we should logout and login so that the .bash_profile code will be executed (we can copy the startup script in the meantime):

    [mysql@centos-temp ~]$> exit
    [root@centos-temp ~]# cp /home/mysql/product/myenv-1.1.2/bin/myenv.server /etc/init.d/myenv
    [root@centos-temp ~]# chkconfig --add myenv
    [root@centos-temp ~]# su - mysql
    
    Up       :
    
    Down     : master (5.6.21)
    
    master ( 3306) : test
    
    mysql@centos-temp:~ [master, 3306]>
    
  • Now, we can start the just installed instance and check if it is started correctly or not:

    mysql@centos-temp:~ [master, 3306]> start
    . SUCCESS!
    mysql@centos-temp:~ [master, 3306]> up
    
    Up       : master (5.6.21)
    
    Down     :
    
    master ( 3306) : test
    
    mysql@centos-temp:~/data/master [master, 3306]>
    

Cool! We have got the first instance installed. let’s install the second one …

Install the second instance (named slave1)

  • Launch the MyEnv installer and add the new instance:

    mysql@centos-temp:~ [master, 3306]> product/myenv/bin/installMyEnv.sh
    PHP is installed on /usr/bin/php
    Starting MyEnv installer: /home/mysql/product/myenv-1.1.2/bin/installMyEnv.php
    
    Configuration file /etc/myenv/myenv.conf already exists.
    
    Use this, overwrite with template or abort (U,t,a): u
    
    The following instances are available:
    
    master
    An instance is the same as a mysqld process.
    
    What do you want to do next?
    o Add a new instance,
    o change an existing instance,
    o delete an existing instance,
    o save configuration and exit or
    o quit without saving
     (A/c/d/s/q)? a
    
    
    You have to enter a new instance name. An instance name can consist of 0-9, a-z, A-Z, - and _.
    Examples: test, prod, dev, [mysqld1] mysqld-3306
    
    Enter a new instance name: slave1
    
    Changing instance slave1:
    
    Set basedir. The basedir is the directory where your MySQL binaries are located.
    Example:
    /home/mysql/product/myenv
    /home/mysql/product/myenv-1.1.2
    /home/mysql/product/mysql-5.6.21
    /home/mysql/product/mysql-5.6.21-linux-glibc2.5-x86_64
    /usr/local/mysql
    /opt/mysql
    [/usr]
    
    basedir = /home/mysql/product/mysql-5.6.21
    
    
    /home/mysql/product/mysql-5.6.21 seems to exist and has already some files in it.
    Omitting installation of binary tar ball.
    
    Set datadir. The datadir is the directory where your MySQL data are located.
    Example: /usr/local/mysql/data, /opt/mysql/data or /var/lib/mysql or /home/mysql/product/mysql-5.6.21/data or [/home/mysql/data/slave1] or /home/mysql/data/slave1
    datadir = /home/mysql/data/slave1
    
    Shall I install a mysql database under /home/mysql/data/slave1 (Y/n)? y
    Installing MySQL instance. Please be patient, this can take a while...
      /home/mysql/product/mysql-5.6.21/scripts/mysql_install_db --datadir=/home/mysql/data/slave1 --basedir=/home/mysql/product/mysql-5.6.21
    
    Set port.
    Example: 3307 or [3306]
    port    = 3307
    
    
    Set socket.
    Example: /tmp/mysql-3307.sock /tmp/mysql-slave1.sock [/tmp/mysql.sock] /var/run/mysqld/mysql.sock
    socket  = /home/mysql/data/slave1/slave1.sock
    
    
    Choose location of my.cnf:
    Example: /etc/my.cnf /etc/mysql/my.cnf /home/mysql/data/slave1/my-3307.cnf [/home/mysql/data/slave1/my.cnf]
    my.cnf  = /home/mysql/data/slave1/my.cnf
    
    
    The following instances are available:
    
    master slave1
    An instance is the same as a mysqld process.
    
    What do you want to do next?
    o Add a new instance,
    o change an existing instance,
    o delete an existing instance,
    o save configuration and exit or
    o quit without saving
     (a/c/d/S/q)? s
    
    
    Writing the configuration file...
    Rename /etc/myenv/myenv.conf to /etc/myenv/myenv.conf.2014-10-15-06-44-04
    Write /etc/myenv/myenv.conf
    
    Now source your profile as follows:
    . ~/.bash_profile
    
  • Then we logout and login again to load the new configs:

    mysql@centos-temp:~ [master, 3306]> exit
    logout
    [root@centos-temp product]# su - mysql
    
    Up       : master (5.6.21)
    
    Down     : slave1 (5.6.21)
    
    master ( 3306) : test
    slave1 ( 3307) : test
    
    mysql@centos-temp:~ [master, 3306]>
    

MyEnv says that we have two instances (master and slave1), master is up and running while slave1 is stopped. Let’s start it then ..

  • First, all commands we execute are sent to the master instance, we should change to the slave1 instance:

    mysql@centos-temp:~ [master, 3306]> slave1
    mysql@centos-temp:~ [slave1, 3307]> start
    . SUCCESS!
    mysql@centos-temp:~ [slave1, 3307]> 
    
  • Both instances are now up and running …

    mysql@centos-temp:~ [slave1, 3307]> up
    
    Up       : master (5.6.21) slave1 (5.6.21)
    
    Down     :
    
    master ( 3306) : test
    slave1 ( 3307) : test
    
    mysql@centos-temp:~ [slave1, 3307]>
    

Instances navigation and MySQL connection

After we installed the two instances we need to know how can we navigate between them to open MySQL connections.

  • Open a MySQL connection to the master instance:

    mysql@centos-temp:~ [master, 3306]> mysql -u root
    Welcome to the MySQL monitor.  Commands end with ; or <br>g.
    Your MySQL connection id is 7
    Server version: 5.6.21 MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '<br>h' for help. Type '<br>c' to clear the current input statement.
    
    root@localhost master [(none)] SQL>
    
  • While the instance name is already printed in the terminal we need to double check that by a MySQL command (the used port) and exit after that:

    root@localhost master [(none)] SQL> SHOW GLOBAL VARIABLES LIKE 'port';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | port          | 3306  |
    +---------------+-------+
    1 row in set (0.00 sec)
    
    root@localhost master [(none)] SQL> exit
    Bye
    mysql@centos-temp:~ [master, 3306]>
    
  • Open a MySQL connection to the slave1 instance and check the used port:

    mysql@centos-temp:~ [master, 3306]> slave1
    mysql@centos-temp:~ [slave1, 3307]> mysql -u root
    Welcome to the MySQL monitor.  Commands end with ; or <br>g.
    Your MySQL connection id is 5
    Server version: 5.6.21 MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '<br>h' for help. Type '<br>c' to clear the current input statement.
    
    root@localhost slave1 [(none)] SQL> SHOW GLOBAL VARIABLES LIKE 'port';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | port          | 3307  |
    +---------------+-------+
    1 row in set (0.00 sec)
    
    root@localhost slave1 [(none)] SQL>
    
  • Navigate back to the master instance:

    mysql@centos-temp:~ [slave1, 3307]> master
    mysql@centos-temp:~ [master, 3306]>
    

More information about MyEnv commands can be checked here.

Note:

Using the same procedures above we can add several instances using either the same binaries or some others.