MySQL单机多实例

jopen 10年前

在数据库服务器上,可以架构多个Mysql服务器,进行单机多实例的读写分离;

可以通过mysqld_multi来进行多实例的管理,mysqld_multi是用perl写的脚本,原理是通过mysql_admin来进行多个数据库的操作;多实例的配置文件也有点不同,可以看作是多个mysql配置的集合;mysqld_multi命令使用如下:

mysqld_multi report/start/stop

可以使用 mysqld_multi --example来查看配置文件的例子;也可以直接复制下来当作自己的配置;注意备份以前的配置;

mv /etc/my.cnf /etc/my.cnf.bak  mysqld_multi --example > /etc/my.cnf

按自己的需要修改配置文件,改成多个数据库;

[mysqld_multi]  mysqld     = /usr/bin/mysqld_safe  mysqladmin = /usr/bin/mysqladmin  user       = multi_admin  password   = my_password    [mysqld1]  socket     = /tmp/mysql1.sock  port       = 3306  pid-file   = /data2/mysql1/mysql.pid  datadir    = /data2/mysql1    [mysqld2]  socket     = /tmp/mysql2.sock  port       = 3307  pid-file   = /data2/mysql2/mysql.pid  datadir    = /data2//mysql2

这里多出了一个[mysqld_multi]的配置项,需要在每个数据库里配置一个multi_admin来管理mysql

下面新建数据库:

mysql_install_db --user=mysql --datadir=/data2/mysql1  mysql_install_db --user=mysql --datadir=/data2/mysql2

启动mysql服务器

mysqld_multi start 1,2

这个时候使用 mysqld_report来查看是否已启动是会失败的,因为还没有新建 multi_admin来查询状态;我们可以通过 netstat来查看端口

# netstat -tulnp | grep mysql  tcp        0      0 :::3306                     :::*                        LISTEN      716784/mysqld  tcp        0      0 :::3307                     :::*                        LISTEN      3669/mysqld  tcp        0      0 :::3317                     :::*                        LISTEN      714503/mysqld

可以看到3306和3307端口已经监听;同时目录下生成了相应的.socket文件; 

下面我们可以连接mysql来配置multi_admin用户;由于有多个实例,连接需要使用socket连接

mysql -u root -S /tmp/mysql1.sock  grant shutdown on *.* to multi_admin@'localhost' identified by'my_password';  flush privileges;  quit

同样道理配置另一台3307;

也可以拷贝一份mysql来创建新的实例,这样里面的用户也会被拷贝。注意目录权限必须是mysql , chown -R mysql.mysql /data2/mysql2 

下面可以使用

mysqld_multi --defaults-file=/etc/my.cnf start 启动全部实例

如果启动出错的话,可以到对应目录下查看日志文件,看哪里出错了。

使用mysqld_multi需要手动启动数据库,也可以加入开机启动项: 

echo "mysqld_multi" >>  /etc/rc.local

来自:http://my.oschina.net/ifeixiang/blog/369833