如何用mysqld_multi构建多mysql服务

摘要:在Mysql中mysqld_multi命令,可用于在一台物理服务器运行多个Mysql服务。mysqld_multi是管理多个mysqld的服务进程,这些服务进程程序不同的unix socket或是监听于不同的端口。他可以启动、停止和监控当前的服务状态。

http://www.cnw.com.cn/cnw07/Software/DataBase/htm2007/20071113_27770_3.shtml

 

 

一、绪言

Mysql中有一mysqld_multi命令,可用于在一台物理服务器运行多个Mysql服务,现将操作过程共享给大家。

操作系统:Linux 2.6.18 (rhel 5.4),其它版的Linux应该也差不多。

数据库:Mysql  5.0.45 源程序安装(相信最新的5.1.*也差不多)

规划:运行4个mysql服务:

假设服务器名:db-app  (IP为192.168.3.300),  

 

下文直到第二部分,均为讲述db-app中的mysql,

二、准备

用mysql源程序安装,假设在安装时用的configura选择项如下:

/configure --prefix=/usr/local/mysql   --datadir=/usr/local/mysql/data1 --sysconfdir=/etc

备注:--prefix将MYSQL安装到/usr/local/mysql,

--datadir将数据库生成/usr/local/mysql/data1

sysconfdir是指定mysql使用到的my.cnf配置文件的搜索路径为/etc

其他mysql安装过程略。

根据Mysql管理手册中提到:每个Mysql的服务都可为独立的,所以它都调用一个my.cnf中各自不同的启动选项--就是下文中将提到的GNR值,使用不同的端口,生成各自的套接文件,服务的数据库都是独立的(更多可查阅mysql官方网站的英文管理手册).

mysqld_multi是管理多个mysqld的服务进程,这些服务进程程序不同的unix socket或是监听于不同的端口。他可以启动、停止和监控当前的服务状态。

----程序在my.cnf(或是在--config-file自定义的配置文件)中搜索[mysqld#]段,"#"可以是任意的正整数。这个正整数就是在下面提及的段序列,即GNR。段的序号做为mysqld_multi的参数,来区别不同的段,这样你就可以控制特定mysqld进程的启动、停止或得到他的报告信息。这些组里的参数就像启动一个mysqld所需要的组的参数一样。但是,如果使用多服务,必须为每个服务指定一个unix socket或端口(摘自http://mifor.4dian.org中的使用mysqld_multi程序管理多个MySQL服务 )。

从上述文字可看到多Mysql服务中最重要的就是my.cnf配置文件了。

 

现我贴出我的my.cnf文件。-----------------------

[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
user = mysql   (用一个帐号来启动所有的mysql服务器,因为是用一相同的帐号。那个么这帐号必须都是每个mysql服务都要用的帐号,最好是管理帐号,下面的口令与相同)

[mysqld1]
port      = 3306
socket    = /tmp/mysql.sock1
pid-file=/usr/local/mysql/data1/db-app1.pid
log=/usr/local/mysql/data1/db-app.log
datadir = /usr/local/mysql/data
user = mysql

[mysqld2]
port = 3307
socket = /tmp/mysql.sock2
pid-file = /usr/local/mysql/data2/db-app2.pid
datadir = /usr/local/mysql/data2
log=/usr/local/mysql/data2/db-app.log
user = mysql

[mysqld3]
port            = 3308
socket          = /tmp/mysql.sock3
pid-file = /usr/local/mysql/data3/db-app3.pid3
datadir = /usr/local/mysql/data3
log=/usr/local/mysql/data3/db-app.log
user = mysql

[mysqld4]
port            = 3309
socket         = /tmp/mysql.sock4
pid-file = /usr/local/mysql/data3/db-app4.pid
datadir = /usr/local/mysql/data4
log=/usr/local/mysql/data4/db-app.log
user = mysql

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash

[isamchk]
key_buffer = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M

[myisamchk]
key_buffer = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

我的配置文件中有mysqld1,mysqld2,mysqld3,mysqld4。就是说我将启动4个mysql服务在同一服务器的不同端口——3306-3309,每datadir所指定的数据库文件路径都是不相同的,都有各自不同的日志文件。其它一些设置可用my.cnf 原来的内容

ok,重要的my.cnf编好的,现在为配置中不同mysql 服务建立各自文件夹和初始数据库等。[mysqld1]是一个默认的,在我们安装mysql时已经有了,所以不用管它。

[mysqld2],只要根据配置就的路径为它建立一个目录就可以。将该目录改为mysql管理权db-app:/ #  mkdir /usr/local/mysql/data2

建数据库,我们可以把默认的mysql数据库复制过来,以利用其它的mysql帐号,其它数据库根据应用再建立。

db-app:/ # cp /usr/local/mysql/data1/mysql  /usr/local/mysql/data2 -R

db-app:/ #  chmod mysql.mysql /usr/local/mysql/data2 -R

[mysqld3],[mysqld4],相同。

我们可能看看这些目录是否都存在。

db-app:/ # ls -l /usr/local/mysql/

drwxr-xr-x   6 mysql mysql   4096 Apr  9 17:54 data4

drwxr-x---   2 mysql mysql   4096 Apr  9 17:14 data1

drwxr-xr-x   3 mysql mysql   4096 Apr  9 17:54 data2

drwxr-xr-x   3 mysql mysql   4096 Apr  9 17:54 data3

现在可以通过mysqld_multi启动了。

三、mysqld_multi命令

使用如下参数来启动mysqld_multi: (注:该命令在mysql的bin目录中,根据上面所提到./configure --prefix=/usr/local/mysql ,所以该文件应该在 /usr/local/mysq/bin,这得根据你安装时所指定的路径 )

db-app:/ #  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)。

db-app:/ # /usr/local/mysq/bin/mysqld_multi --config-file=/etc/my.cnf start 1  只启动第一个mysql服务,相关文件由my.cnf中mysql1设定。

db-app:/ # /usr/local/mysq/bin/mysqld_multi  --config-file=/etc/my.cnf stop 1  启动第一个mysql服务。

db-app:/ # /usr/local/mysq/bin/mysqld_multi   --config-file=/etc/my.cnf start 1-4,启动 第1至4mysql服务,其实就是我这里的全部。

db-app:/ # /usr/local/mysq/bin/mysqld_multi   --config-file=/etc/my.cnf report  1-4

查看启动:

db-app:/ #  ps aux 

root     10467  0.0  0.2   2712  1300 pts/0    S    18:59   0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --port=3306 --socket=/tmp/mysql.sock1
root     10475  0.0  0.2   2712  1300 pts/0    S    18:59   0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --port=3307 --socket=/tmp/mysql.sock2 
root     10482  0.0  0.2   2716  1300 pts/0    S    18:59   0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --port=3308 --socket=/tmp/mysql.sock3
root     10487  0.0  0.2   2716  1300 pts/0    S    18:59   0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --port=3309 --socket=/tmp/mysql.sock4
.............................................

四、客户端访问

任何客户端访问都需要指定访问端口。方才能进入指定数据库服务。否则将使用到Mysql默认的端口(3306)所服务的MYSQL。

 

 

五、测试

# bin/mysql -u root -S /tmp/mysql.sock -e "SELECT @@VERSION;" (连接不同的库,用-S 加指定的socket连接)
# bin/mysql -u root -S /tmp/mysql.sock1 -e "SELECT @@VERSION;"

 

——————————————分割线——————————————————————

在实际运用中,出现一个错误的认识,即./mysqld_multi start N 启动第几个数据库的时候是认为在mysqld_multi命令里面定义的。还好看了这篇文章。也就是修改自己的my.cnf文件指定就可以了。

同时重启某个数据库的时候 只要找到对应的数据库进程 然后kill掉

然后在安装的目录下面运行

./mysqld_multi start N

 

 

错误:在执行bin/mysqld_multi --config-file=./my_multi.cnf start 1,2时报如下错误:

WARNING! my_print_defaults command not found!
Please make sure you have this command available and
in your path. The command is available from the latest
MySQL distribution.
ABORT: Can't find command 'my_print_defaults'!
This command is available from the latest MySQL
distribution. Please make sure you have the command
in your PATH.

 

解决方法: 

#export PATH=$PATH:/usr/local/msyql5/bin

参考:http://bbs.chinaunix.net/viewthread.php?tid=500137

另一篇mysql单机多实例:http://sharkyan.blog.51cto.com/536264/271144 



转载:http://blog.myspace.cn/e/406357573.htm

你可能感兴趣的:(mysql,数据库,socket,command,服务器,buffer)