http://naveensnayak.wordpress.com/2013/11/10/mysql-multiple-instances-on-ubuntu/

MySQL multiple instances on Ubuntu

Assumptions

  1. OS: Ubuntu 12.04 LTS server edition – up to date

  2. Already has MySQL installed that comes default with 12.04 – you can easily install LAMP with the command tasksel

  3. MySQL Server version: 5.5.34-0ubuntu0.12.04.1 (Ubuntu)

  4. You have OS root privileges

  5. Default MySQL is running on port 3306

What will we do

  1. Set up 2 more MySQL instances on ports 3307 and 3308

  2. Each instance will have their own config files, data directories and log directories

Stopping default MySQL instance

Icon                

sudo service mysql stop 
sudo ps -A | grep mysql

                   

Creating data directories

 

  • MySQL cannot share data directories, so we need to set up new ones

  • default basedir = /usr, this can be shared across instances

  • default instance port = 3306 and data dir = /var/lib/mysql

  • new instance       port = 3307 and data dir = /var/lib/mysql3307

  • new instance       port = 3308 and data dir = /var/lib/mysql3308

  • MySQL must own data dirs

  • we need to set rules in apparmor to let MySQL access the new dirs

 

Icon                

sudo mkdir /var/lib/mysql3307 
sudo mkdir
/var/lib/mysql3308
sudo chown
-R mysql /var/lib/mysql3307
sudo chown
-R mysql /var/lib/mysql3308

                   

 

 

 

Creating data directories

  • create separate log dirs for new MySQL instances

  • default log dir = /var/log/mysql

  • new log dir for 3307 = /var/log/mysql/mysql3307

  • new log dir for 3308 = /var/log/mysql/mysql3308

  • log dirs must be owned by MySQL

  • note that /var/log/mysql already has apparmor permissions for MySQL, so any dir under it also has access


Icon                

sudo mkdir /var/log/mysql/mysql3307sudo mkdir /var/log/mysql/mysql3308
sudo chown -R mysql /var/log/mysql/mysql3307
sudo chown -R mysql /var/log/mysql/mysql3308

                   

Creating config files

  • create the config files for new instances by copying default file

  • default config file = /etc/mysql/my.cnf

  • config file for 3307 = /etc/mysql/my3307.cnf

  • config file for 3308 = /etc/mysql/my3308.cnf

  • see config files on github

  • /etc/mysql/my3307.cnf

  • /etc/mysql/my3308.cnf

  • special care has to be taken so that these values are different

  • datadir

  • server-id

  • all port entries

  • all socket entries

  • all pid-file entries

  • all log file entries, general, error, binary etc

Icon                

sudo cp /etc/mysql/my.cnf /etc/mysql/my3307.cnfsudo cp /etc/mysql/my.cnf /etc/mysql/my3308.cnf

                   

Apparmor settings ( skip if you dont have this )

  • apparmor is like an application firewall – comes installed default with Ubuntu server

  • command aa-status will show you if it is loaded

  • default apparmor profile for MySQL = /etc/apparmor.d/usr.sbin.mysqld

  • put additional rules in /etc/apparmor.d/local/usr.sbin.mysqld

  • specify the correct data dirs, pid and socket files for each instance - see file on github

  • /etc/apparmor.d/local/usr.sbin.mysqld

  • after modifying, restart apparmor

/etc/apparmor.d/usr.sbin.mysqld

Icon                

# Site-specific additions and overrides for usr.sbin.mysqld.

# For more details, please see /etc/apparmor.d/local/README.

######### mysqld1 on port 3307 ###############

/var/lib/mysql3307/ r,

/var/lib/mysql3307/** rwk,

/var/run/mysqld/mysqld.pid3307 rw,

/var/run/mysqld/mysqld.sock3307 w,

/run/mysqld/mysqld.pid3307 rw,

/run/mysqld/mysqld.sock3307 w,

######### mysqld2 on port 3308 ###############

/var/lib/mysql3308/ r,

/var/lib/mysql3308/** rwk,

/var/run/mysqld/mysqld.pid3308 rw,

/var/run/mysqld/mysqld.sock3308 w,

/run/mysqld/mysqld.pid3308 rw,

/run/mysqld/mysqld.sock3308 w,


$sudo service apparmor reload

                   

Installing new MySQL instances

  • install MySQL files into the new data dirs for port 3307 and port 3308

  • after this, under each new data dir, you will see the mysql, performance_schema and test dirs

  • this will install MySQL with default settings,  no root password

  • in the below commands, you can use the - -verbose flag to see more details

 

Icon                

sudo mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql3307 --defaults-file=/etc/mysql/my3307.cnf
sudo mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql3308 --defaults-file=/etc/mysql/my3308.cnf

                   

Starting the mysql instances

  • start the default instance on 3306

  • start instances on 3307 and 3308 in the background

 

Icon                

sudo service mysql start sudo -b mysqld_safe --defaults-file=/etc/mysql/my3307.cnf --user=mysql
sudo -b mysqld_safe --defaults-file=/etc/mysql/my3308.cnf --user=mysql

                   

如果是centos系统,这样启动:/usr/bin/mysqld_safe --defaults-file= /etc/mysql/my3307.cnf --user=mysql &

Accessing the new instances

  • Note that the new instances on 3307 and 3308 will not have a root password

  • it is important to specify host and host=127.0.0.1

  • if host is omitted, or localhost is given, then default instance is assumed ( on 3306 )

  • remember to explicitly specify host and port for all commands

Icon                

mysql -h 127.0.0.1 --port=3307 -u root
mysql -h 127.0.0.1 --port=3308 -u root

                   

Shutting down the MySQL instances

 

  • We will use mysqladmin to cleanly shutdown

  • it is important to specify host and and port

  • no password for now

 

Icon                

mysqladmin -h 127.0.0.1 --port=3307 -u root shutdown 
mysqladmin -h 127.0.0.1 --port=3308 -u root shutdown

                   

 

Starting new instances on boot and reboot

  • Put commands in the file /etc/rc.local to start new instances on boot

  • the rc.local file will look like this

Icon                

sudo -b mysqld_safe --defaults-file=/etc/mysql/my3307.cnf --user=mysql
sudo -b mysqld_safe --defaults-file=/etc/mysql/my3308.cnf --user=mysql
exit 0

                   

补充:

  1. 防火墙添加3307端口,重启防火墙,
    # vi /etc/sysconfig/iptables #编辑防火墙配置文件
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 3307 -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 3308 -j ACCEPT
    重启防火墙
    # /etc/init.d/iptables restart #最后重启防火墙使配置生效

  2.  登录多实例的mysql要指定.sock文件  

    mysql -uroot -p -S /var/lib/mysql3307/mysql3307.sock

    mysql -uroot -prx5dbt2c -S /var/lib/mysql3307/mysql3307.sock

  3. 创建密码:

    mysqladmin -u root -S /var/lib/mysql3307/mysql3307.sock password 'rx5dbt2c'

  4. 授权远程登录

    mysql>grant all privileges on *.* to 'root'@'%' identified by 'rx5dbt2c' with grant option;

    mysql> flush privileges;