一、Mysqld_multi在一台物理服务器上运行多个mysql实例
Mysql具有一次安装可以运行多个实例的功能,这个功能是通过mysqld_multi实现的。当一台机器上需要运行多个MySQL服务器时,mysqld_multi是管理多个mysqld的服务进程,这些服务进程程序用不同的unix socket或是监听于不同的端口,通过简单的命令,它可以启动,关闭和报告所管理的服务器的状态 。( 可以用此在一台机器上做主从复制 )。
1.准备
用mysql源程序安装,假设在安装时用的configura选择项如下:
/configure --prefix=/usr/bin/mysql --datadir=/search/mysql1/data1 --sysconfdir=/etc
备注 :--prefix将MYSQL安装到/usr/bin/mysql ,
--datadir将数据库生成/search/mysql1/data1,
--sysconfdir是指定mysql使用到的my.cnf配置文件的搜索路径为/etc
其他mysql安装过程略。
2.配置
安装完成后,就是设置配置文件,是mysql能够运行多个实例。
一下是我们机器上的配置文件my.cnf的配置
[mysqld_multi]
mysqld = /usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
user = root
[mysqld1]
datadir=/search/mysql1/data1
socket=/var/lib/mysql/mysql.sock1
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
port=3306
skip-name-resolve
server_id=21
log-bin=mysql-bin
max_connections=1000
key_buffer_size=2147836348
query_cache_size=134217728
read_rnd_buffer_size=134217728
table_cache=10000
tmp_table_size=536870912
log-slow-queries=slow.log
long_query_time=1
concurrent_insert=2
thread_cache_size=300
#log=/search/mysql1/data1/mysql1.log
pid-file=/search/mysql1/data1/mysql.pid1
log-error=/search/mysql1/data1/log.1
log-slave-updates
slave-skip-errors=ALL
[mysqld2]
datadir=/search/mysql2/data2
socket=/var/lib/mysql/mysql.sock2
user=mysql
old_passwords=1
skip-name-resolve
server_id=2
log-bin=mysql-bin
max_connections=1000
key_buffer_size=2147836348
#query_cache_size=134217728
query_cache_type=0
read_rnd_buffer_size=134217728
table_cache=10000
tmp_table_size=536870912
log-slow-queries=slow.log
long_query_time=1
concurrent_insert=2
thread_cache_size=300
port=3307
#log=/search/mysql2/data2/mysql2.log
pid-file=/search/mysql2/data2/mysql.pid2
log-error=/search/mysql2/data2/log.2
[mysqld3]
datadir=/search/mysql3/data3
socket=/var/lib/mysql/mysql.sock3
user=mysql
old_passwords=1
port=3308
skip-name-resolve
server_id=3
log-bin=mysql-bin
max_connections=1000
key_buffer_size=2147836348
#query_cache_size=134217728
query_cache_type=0
read_rnd_buffer_size=134217728
table_cache=10000
tmp_table_size=536870912
log-slow-queries=slow.log
long_query_time=1
concurrent_insert=2
thread_cache_size=300
#log=/search/mysql3/data3/mysql3.log
pid-file=/search/mysql3/data3/mysql.pid3
log-error=/search/mysql3/data3/log.3
[mysqld4]
datadir=/search/mysql3/data4
socket=/var/lib/mysql/mysql.sock4
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
port=3309
skip-name-resolve
server_id=13
log-bin=mysql-bin
max_connections=1000
key_buffer_size=2147836348
#query_cache_size=134217728
query_cache_type=0
delay_key_write=ALL
read_rnd_buffer_size=134217728
table_cache=10000
tmp_table_size=536870912
log-slow-queries=slow.log
long_query_time=1
concurrent_insert=2
thread_cache_size=300
#log=/search/mysql3/data4/mysql4.log
pid-file=/search/mysql3/data4/mysql.pid4
log-error=/search/mysql3/data4/log.4
根据以上的配置信息,可知我们配置了mysqld1,mysqld2,mysqld3,mysqld4四个mysql实例,每个实例都指定了不同的连接端口(是3306——3309)和数据存储路径(datadir所指定的就是它们各自数据的存储路径)等等一些其他的信息。
最重要的配置文件my.cnf弄好了之后,现在为配置中不同mysql 服务建立各自文件夹和初始数据库等。
[mysqld1]是一个默认的,在我们安装mysql时已经有了,所以不用管它。接下来只要配置[mysqld2]、[mysqld3]、[mysqld3]既可以。
下面就已配置[mysqld2]为例:
只要根据配置就的路径为它建立一个目录就可以。将该目录改为mysql管理权,命令如下
mkdir /search/mysql2/data2 #建立[mysqld2]实例的数据存储目录
建数据库,我们可以把默认的mysql数据库复制过来,以利用其它的mysql帐号,其它数据库根据应用再建立。
cp -R /search/mysql1/data1/mysql /usr/local/mysql/data2 #默认的mysql数据库复制过来
chown -R mysql:mysql /usr/local/mysql/data2 #该目录改为mysql管理权
[mysqld3],[mysqld4]的操作相同,在此省略。
至此我们的配置就结束了,接下来就是要启动我们的mysql服务了。
3.启动mysql服务
使用如下参数来启动mysqld_multi: (注:该命令在mysql的bin目录中,根据上面所提到./configure --prefix=/usr/bin/mysql ,所以该文件应该在 /usr/bin/mysql/bin,这得根据你安装时所指定的路径 ) 。
mysqld_multi [options] [GNR[,GNR]...]
start,stop和report是指你想到执行的操作。你可以在单独的服务或是多服务上指定一个操作,区别于选项后面的GNR列表。如果没有指定GNR列表,那么mysqld_multi将在所有的服务中根据选项文件进行操作。
每一个GNR的值是组的序列号或是一个组的序列号范围。此项的值必须是组名字最后的数字,比如说如果组名为mysqld17,那么此项的值则为 17。如果指定一个范围,使用"-"(破折号)来连接二个数字。如GNR的值为10-13,则指组mysqld10到组mysqld13。多个组或是组范围可以在命令行中指定,使用","(逗号)隔开。不能有空白的字符(如空格或tab),在空白字符后面的参数将会被忽略。 (注:GNR值就是我们定义my.cnf中mysqld#中的值,我这里只有1-4)。
mysqld_multi --config-file=/etc/my.cnf start 1 #只启动第一个mysql服务,相关文件由my.cnf中mysql1设定
mysqld_multi --config-file=/etc/my.cnf stop 1 #停止第一个mysql服务,相关文件由my.cnf中mysql1设定
mysqld_multi --config-file=/etc/my.cnf start 1-4 #启动 第1至4mysql服务,其实就是我这里的全部。
注意: 直接用 service mysqld start 命令去启动会报错。【个人觉得这个命令是用来启动只安装了单个实例的服务器的】
4、客户端访问
任何(远程)客户端访问都需要指定访问端口。方才能进入指定数据库服务。否则将使用到Mysql默认的端口(3306)所服务的MYSQL。
4.1 如果是在本地机器上连接mysql服务器
mysql -S/var/lib/mysql/mysql.sock1 #连接的是[mysql1]实例上
如果使用 mysql -p3306 命令去连接[mysql1]实例,则会报错“ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) ”【个人觉得出现这个错误是,默认会去找mysql.sock这个文件,而因为此物理机器上运行的是多个实例,所以这个文件不存在】
4.2如果是在远程机器上去连接此mysql服务器(当然此远程机器需要有连接的权限)
mysql -umysql -p -h10.10.2.23 #这里假设用户名是mysql,服务器iP是10.10.2.23,则连接的是[mysql1]实例,因为没有指定端口。