星期一, 一月 15, 2007

mysqld_multi 运行多实例数据库

之所以使用多实例,一方面是因为资源有限,没有更多的主机资源,而同时为了保证以后迁移和扩展的需要,最好将所有的数据从文件系统层面上分开,并使用不同的端口(port)来进行连接。

使用以前提到的包管理器,其安装 profile 如下:
pkgname = "mysql";
version = "4.1.22";
user = "mysql";
groups = "";
group = "mysql";
archive = "mysql-4.1.22.tar.gz";
command = "tar xfz mysql-4.1.22.tar.gz";
command = "cd mysql-4.1.22";
command = "./configure --without-debug --with-extra-charsets=gb2312 --enable-assembler --without-isam --without-innodb --with-pthread --enable-thread-safe-client --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static --localstatedir=/data/mysql";
command = "make";
command = "make install";
command = "scripts/mysql_install_db --user=mysql";
command = "cd ..";
command = "rm -rf mysql-4.1.22";
command = "cd /usr/local/libexec";
command = "cp mysqld mysqld.backup";
command = "strip mysqld";
time = "20061231 16:34:51 Sun";
注意需要指定 --localstatedir=/data/mysql,因为这里 /data 是专门用来存放数据的数据盘,在我们的应用中需要分开已方便管理。

然后需要修改配置文件 /etc/my.cnf:
......
# [mysqld]
[mysqld01]
datadir=/data/mysql01
socket=/data/mysql01/mysql.sock
port=3306

skip-locking
key_buffer = 16M
max_allowed_packet = 1M
table_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M

log-bin

[mysqld02]
datadir=/data/mysql02
socket=/data/mysql02/mysql.sock
port=3307

skip-locking
key_buffer = 16M
max_allowed_packet = 1M
table_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M

log-bin
......
要注释 [mysqld],否则不行;[mysqldX] X 必须为数字。有一些配置重复,但目前来看没有其它办法,不知道怎样让 [mysqld01] 和 [mysqld02] 共享一部分配置?

然后进入 /data,将 mysql 拷贝为 mysql01 和 mysql02
# cd /data
# cp -Rp mysql mysql01
# cp -Rp mysql mysql02

再启动两个实例的数据库:
# mysqld_multi --mysqld=mysqld_safe start 01,02

因为是多实例运行,所以原来的 sysv init 启动脚本 /etc/rc.d/init.d/mysqld(从 mysql.server 拷贝)不能使用,因为它只启动 mysqld_safe 而不会运行 mysqld_multi。可以考虑更改这个脚本,也可以将 mysqld_multi 命令加入 /etc/rc.d/rc.local,以后要关闭数据库时使用 kill 命令或:
# mysqld_multi stop 01
关闭编号为 01 的数据库,并使用
# mysqld_multi start 01
再启动它。

没有评论: