一般情况下,都是一台服务器主机运行一个MySQL实例;不过在单机配置非常高的情况下,也可以考虑运行多个MySQL实例。毕竟MySQL是单进程(多线程)的运行模式,单实例MySQL用不上太多资源。
当然,高配置的单机应该考虑使用Docker实现多MySQL服务,只是这里介绍一下如何运行多实例MySQL。本以为在Ubuntu上实现很容易,原来也并不简单。
运行环境
- Ubuntu 16.04
- MySQL 5.17
mysqld_multi
在安装好MySQL Server后,应该是可以使用mysqld_multi
的。
查看配置示例命令:
1 | $ mysqld_multi --example |
一般MySQL的配置文件是/etc/mysql/my.cnf
或者/etc/mysql/mysql.cnf
,在配置文件中最开始的地方添加:
1 | [mysqld_multi] |
查看当前mysqld_multi
状态:
1 | $ mysqld_multi report |
可以看到没有服务组群,现在添加一个——在MySQL的配置文件中,追加:
1 | [mysqld3307] |
再查看当前mysqld_multi
状态:
1 | $ mysqld_multi report |
可以看到服务组群mysqld3307
(注意每个服务组群名称必须以mysqld
开头)没有在运行。现在还不能直接运行mysqld3307
服务,因为没有初始化数据目录/var/lib/mysql/multi/data3307
。
初始化数据库
过去MySQL初始化数据库使用的是
mysql_install_db
命令,现在是mysqld --initialize
。
在Ubuntu系统上有一个系统安全程序,叫AppArmor,它会限制各个应用程序访问系统资源的权限。Root用户运行程序时也碰到权限不足错误的话,那么应该就是AppArmor限制了。比如我们需要修改mysqld
的权限,就得编辑对应的AppArmor配置文件,然后重启AppArmor服务:
1 | $ sudo vi /etc/apparmor.d/usr.sbin.mysqld |
上面服务组群mysqld3307
的配置中用到的目录是/tmp/mysqld
和/var/lib/mysql/multi
,mysqld
程序对/tmp
和/var/lib/mysql
都是具有读写权限的,所以不需要修改AppArmor配置文件。
现在来初始化一个新的数据库目录/var/lib/mysql/multi/data3307
(以mysql用户身份执行):
1 | $ sudo -u mysql mkdir /tmp/mysqld |
初始化成功后,新数据库会自动建立root用户,并随机生成密码,这些会记录在MySQL日志中:
1 | $ sudo tail /var/log/mysql/error.log |
我们先记住密码4kDUVrlO>zT)
。
启动新实例
执行一下命令即可以mysql用户身份启动服务组群mysqld3307
(不需要前缀mysqld
):
1 | $ sudo -u mysql mysqld_multi start 3307 |
查看当前mysqld_multi
状态:
1 | $ mysqld_multi report |
重置一下密码:
1 | $ mysqladmin -uroot -h 127.0.0.1 -P 3307 -p'4kDUVrlO>zT)' password |
连接服务组群mysqld3307
:
1 | $ mysql -uroot -h 127.0.0.1 -P 3307 -p |
关闭实例
原以为关闭服务组群mysqld3307
,只需要:
1 | $ sudo -u mysql mysqld_multi stop 3307 |
结果查看mysqld_multi
状态,mysqld3307
依然是运行中:
1 | $ mysqld_multi report |
可能是因为
mysqld3307
数据库中没有与mysqld_multi
配置对应的用户,所以mysqld_multi stop
命令没能关闭mysqld3307
。
我们可以用mysqladmin
命令来关闭服务组群mysqld3307
:
1 | $ mysqladmin -uroot -h 127.0.0.1 -P 3307 -p shutdown |
最后
这里只介绍了监听3307端口的MySQL实例的建立过程,其他更多MySQL实例,如监听3308、3309端口,只需按照上述流程(添加配置,初始化数据目录,启动服务)执行即可。