如果想在单机上运行版本相同的多个mysql实例的,可以通过mysql_install_db初始化到不同的数据目录,通过不同的my.cnf指定相关的参数,分别设置不同的启动和关闭脚本。不过这样管理起来感觉非常麻烦。当然,如果只单台主机上启动两个实例,这样做还可以接受。如果启动四个、五个甚至更多,显然是无法让人接受的。不过mysql的设计者们显然先我们一步想到了这个问题,其提供了更方便的管理工具 ——— mysqld_multi 。

下面就结合mysql的多实例安装和mysqld_multi做个梳理总结。

一、安装和配置多个mysqld实例

首先以yum -y install mysql mysql-server mysql-devel完成安装。完装完成后,通过server mysqld start启动。我们便得到了第一个实例服务。接下来我们配置第二个实例:

1mkdir -p /data/mysqldata
2cd /data
3chown -R mysql:mysql mysqldata
4mysql_install_db --defaults-file=/data/mysqldata/my.cnf --datadir=/data/mysqldata

假设第二个实例的数据文件保存的位置为/data/mysqldata ,可以通过mysql_install_db完成初如化数据。此时我们可以通过以下方式分别启动两个实例:

1mysqld_safe --defaults-file=/etc/my.cnf --datadir=$datadir --pid-file=$server_pid_file $other_args >/dev/null 2>&1 &

启动完成后,分别通过my.cnf修改相应参数文件的位置(下面会提到,在此不细说)。再通过mysql命令进行连接,看下是否能正常进行连接。两个都可以正常连接后,进行下一步——mysqld_multi管理。

注:按以上方式设置后,本机通过mysql命令进行连接时会受到影响,需要通过-S选项指定socket文件的位置,而其他主机连接不受影响。如:

1mysql -uroot -p -S /var/lib/mysql/mysql3306.sock //可正常连接(本机)
2mysql -h192.168.10.24 -uroot -p //远程26主机可正常连接(远程,未指定socket文件)

而本机不加-S选项指接进行连接时会有下面的提示:

1[root@localhost mysqldata]# mysql -uroot -p
2Enter password:
3ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

二、mysqld_multi管理多实例

配置mysqld_multi配置文件,以下我是以一个最小化的配置参数进行的配置,这个配置文件和单实例下的my.cnf没多大的区别。如果想设置两个实例里的内存设置,数据文件大小不同,可以在相应的mysqld下增加相应的配置就行了。

 1[mysqld_multi]
 2mysqld=/usr/bin/mysqld_safe
 3mysqladmin=/usr/bin/mysqladmin
 4user=mysql
 5log=/data/multi.log
 6[mysqld1]
 7port      = 3306
 8datadir=/var/lib/mysql
 9socket=/var/lib/mysql/mysql3306.sock
10user=mysql
11pid-file=/var/lib/mysql/mysql.pid
12log=/var/log/mysqld.log
13[mysqld3307]
14port      = 3307
15datadir=/data/mysqldata
16socket=/data/mysqldata/mysql3307.sock
17user=mysql
18pid-file=/data/mysqldata/mysql/mysql.pid
19log=/data/mysqldata/mysqld.log

mysqld_multi默认读取的配置文件是/etc/my.cnf ,当然也可以指定到其他位置,在启动时通过 “ –config-file= ” 参数进行指定。

配置完上面的配置文件,就可以通过mysqld_multi进行管理了。

1mysqld_multi --config-file=/etc/my.cnf start 1 启动实例1  //配置文件的位置为/etc/my.cnf时,可以ith mysqld_multi --config-file=/etc/my.cnf stop 1 关闭实例1
2mysqld_multi start 3307 启动实例3307
3mysqld_multi stop 3307 关闭实例3307

由上面不难看出,其后面跟的参数1、3307是个配置文件中的mysqld后面跟的内容是一致的。如果配置的内容为mysqld1、mysqld2、mysqld3这样连续性的配置。也可以通过下面的方法批量启动和关闭:

1mysqld_multi start 1-3 启动实例1、2、3
2mysqld_multi stop 1-3 关闭实例1、2、3

注,按上面的配置进行mysqld_multi可以正常启动,但关闭时确无法正常关闭。我将上面的配置文件做了修改后发现可以正常关闭。

1mysqladmin -uroot -p123456 -S /var/lib/mysql/mysql3306.sock shutdown

如上所示,其关闭原理是通过调用mysqladmin命令进行的关闭。

1[mysqld_multi]
2mysqld=/usr/bin/mysqld_safe
3mysqladmin=/usr/bin/mysqladmin
4user=root
5password=123456

如果两个实例的root密码(mysql的密码,不是系统密码)相同时,可以通过上面的方式进行设置,如果不同,需要在mysqld_multi项里注释掉password项(相当于全局配置),在各实例里(有生效作用域的配置)添加相应的pasword密码。也可以通过下面的方式在各个实例里授权一个具有关闭数据库权限的用户。具上面配置用的root用户可以换成multi_admin,密码换成multipass 。

1grant shutdown on *.* to multi_admin@'localhost' identified by 'multipass';

三、脚本化管理

通过./configure 源码包方式进行的安装。会在support-files目录里找到mysqld_multi.server脚本。其内容如下:

 1#!/bin/sh
 2#
 3# A simple startup script for mysqld_multi by Tim Smith and Jani Tolonen.
 4# This script assumes that my.cnf file exists either in /etc/my.cnf or
 5# /root/.my.cnf and has groups [mysqld_multi] and [mysqldN]. See the
 6# mysqld_multi documentation for detailed instructions.
 7#
 8# This script can be used as /etc/init.d/mysql.server
 9#
10# Comments to support chkconfig on RedHat Linux
11# chkconfig: 2345 64 36
12# description: A very fast and reliable SQL database engine.
13#
14# Version 1.0
15#
16basedir=/usr/local/mysql
17bindir=/usr/local/mysql/bin
18if test -x $bindir/mysqld_multi
19then
20  mysqld_multi="$bindir/mysqld_multi";
21else
22  echo "Can't execute $bindir/mysqld_multi from dir $basedir";
23  exit;
24fi
25case "$1" in
26    'start' )
27        "$mysqld_multi" start $2
28        ;;
29    'stop' )
30        "$mysqld_multi" stop $2
31        ;;
32    'report' )
33        "$mysqld_multi" report $2
34        ;;
35    'restart' )
36        "$mysqld_multi" stop $2
37        "$mysqld_multi" start $2
38        ;;
39    *)
40        echo "Usage: $0 {start|stop|report|restart}" >&2
41        ;;
42esac

该脚本可以根据在使用中的实际情况进行更改后使用。