您的位置:首页 > 数据库 > MySQL

MySQL multiple instances on Ubuntu

2015-07-02 00:00 686 查看
Production systems must take care of security and tweaking not covered by this post
The post looks long, but you can get another instance of MySQL running in less than 5 mins
Assumptions

OS: Ubuntu 12.04 LTS server edition – up to date

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

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

You have OS root privileges

Default MySQL is running on port 3306

What will we do

Set up 2 more MySQL instances on ports 3307 and 3308

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

Stopping default MySQL instance
sudo service mysql stopsudo 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

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

Creating log 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

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

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

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

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

sudo service mysql startsudo -b mysqld_safe --defaults-file=/etc/mysql/my3307.cnf --user=mysql
sudo -b mysqld_safe --defaults-file=/etc/mysql/my3308.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

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

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

Post installation set up ( for each instance )

update root password

drop all anonymous users – check for users with empty username

drop database test

flush privileges

update mysql.user set password=PASSWORD('myRootPassword') where User='root';
drop database test;
drop user ''@'localhost';
drop user ''@'%';
drop user ''@'ubuntu';
flush privileges;

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

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

Troubleshooting

Most of the time, the problem is due to incorrect permissions, or incorrect config files or apparmor

Check error logs in /var/log/mysql for each instance

Make sure that each mysql config has different values for variables

Make sure that directory permissions are correct, mysql must own data and log dirs

remember to specify host and port explicitly when connecting

if connecting from a remote host, check the bind-address config variable in the config file for the instance

if connecting from remote host, make sure that ports 3307 and 3308 are open and no other applications are using them

Make sure that all dirs have the apparmor permissions and you have reloaded apparmor.

You can see enties like the below in /var/log/syslog if apparmor is blocking mysql

Nov 7 11:51:16 ubuntu kernel: [ 1080.756609] type=1400 audit(1383843076.476:32): apparmor="DENIED" operation="mknod"
parent=2749 profile="/usr/sbin/mysqld" name="/var/lib/mysql1/ibdata1" pid=3559 comm="mysqld" requested_mask="c"
denied_mask="c" fsuid=102 ouid=102

Finally – bash aliases if you need

To make commands simpler to type, you can set up bash aliases

Put the below aliases or whatever you want, in a file called .bash_aliases in your home dir

If the file is not found, create it in ~/.bash_aliases

remember to open a new shell for these commands to take effect

########### mysql @ 3307 ##############################
alias mysql3307-start='sudo -b mysqld_safe --defaults-file=/etc/mysql/my3307.cnf --user=mysql'
alias mysql3307-stop='mysqladmin -h 127.0.0.1 --port=3307 -u root shutdown -p'
alias mysql3307-root='mysql -h 127.0.0.1 --port=3307 -u root -p'
########### mysql @ 3308 ##############################
alias mysql3308-start='sudo -b mysqld_safe --defaults-file=/etc/mysql/my3308.cnf --user=mysql'
alias mysql3308-stop='mysqladmin -h 127.0.0.1 --port=3308 -u root shutdown -p'
alias mysql3308-root='mysql -h 127.0.0.1 --port=3308 -u root -p'
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Mysql多端口