MySQL 启动多实例

MySQL是一款流行的开源数据库。我们在开发过程中常常会用到读写分离,分库分表,区分开发环境与预生产环境。如果只有一台机器能用,在做预演时就需要用到多实例。

多实例启动数据库有三种方式:

  1. 在不同虚拟机中运行,隔离运行环境。这种方式的缺点是开销大。
  2. 在Docker中运行MySQL镜像。和虚拟机类似,运行环境隔离,但开销比虚拟机小很多。
  3. 如果使用源或编译的方式安装的数据库,就需要配置MySQL多实例。

在生产环境下,数据库建议运行在物理机中。本章主要介绍第三种方式,配置MySQL多实例。

初始化数据库

数据库安装完成后,使用mysqld命令初始化数据库。

mysqld --initialize-insecure --datadir=/home/mysql/3307/data --user=mysql;
mysqld --initialize-insecure --datadir=/home/mysql/3308/data --user=mysql;
mysqld --initialize-insecure --datadir=/home/mysql/3309/data --user=mysql;

参数说明:

--initialize-insecure
对于Mysql 5.7.6以后的5.7系列版本,Mysql使用mysqld –initialize或mysqld –initialize-insecure命令来初始化数据库。前者会生成一个随机密码,在error.log的输出日志查找“A temporary password is generated for”可以看到。后者使用空密码。但是安装Mysql时默认使用的是前一个命令,这个命令也会生成一个随机密码,该密码保存在了Mysql的日志文件中。
--datadir
指定数据库存储目录
--user
指定数据库用户,注意该用户应对datadir目录有读写权限

在Ubuntu Server中可能会初始化失败,提示:mysqld: Can’t create directory ‘/home/mysql/3307/data/’ (Errcode: 17 – File exists)

这是因为Ubuntu Server从18.04开始引入AppArmor。

AppArmor是一个Linux系统安全应用程序,类似于Selinux,AppArmor默认安全策略定义个别应用程序可以访问系统资源和各自的特权,如果不设置服务的执行程序,即使你改了属主属组并0777权限,也是对服务起不到作用。

编辑AppArmor配置文件:

vi /etc/apparmor.d/usr.sbin.mysqld

找到“Allow data dir access”,把自己要指定的MySQL数据库目录加到列表就可以了。

重启AppArmor服务:systemctl restart apparmor

再执行初始化数据库命令。

配置多实例
MySQL自带了mysqld_multi工具运行多个实例。

新建文件 /etc/mysql/mysql.conf.d/mysqld_multi.cnf ,内容如下:

[mysqld_multi]
mysqld = /usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
user = root
#password = 

# nextcloud
[mysqld3307]
user		= mysql
pid-file	= /home/mysql/3307/mysqld.pid
socket		= /home/mysql/3307/mysqld.sock
port		= 3307
datadir		= /home/mysql/3307/data
lc-messages-dir	= /usr/share/mysql
skip-external-locking
bind-address		= 0.0.0.0
key_buffer_size		= 16M
max_allowed_packet	= 16M
thread_stack		= 192K
thread_cache_size       = 8
myisam-recover-options  = BACKUP
query_cache_limit	= 1M
query_cache_size        = 16M
expire_logs_days	= 10
max_binlog_size   = 100M
innodb_buffer_pool_size = 1G
innodb_io_capacity = 4000

# wordpress
[mysqld3308]
user		= mysql
pid-file	= /home/mysql/3308/mysqld.pid
socket		= /home/mysql/3308/mysqld.sock
port		= 3308
datadir		= /home/mysql/3308/data
lc-messages-dir	= /usr/share/mysql
skip-external-locking
bind-address		= 0.0.0.0
key_buffer_size		= 16M
max_allowed_packet	= 16M
thread_stack		= 192K
thread_cache_size       = 8
myisam-recover-options  = BACKUP
query_cache_limit	= 1M
query_cache_size        = 16M
expire_logs_days	= 10
max_binlog_size   = 100M
innodb_buffer_pool_size = 1G
innodb_io_capacity = 4000
innodb_io_capacity = 4000

[mysqld3309]
user		= mysql
pid-file	= /home/mysql/3309/mysqld.pid
socket		= /home/mysql/3309/mysqld.sock
port		= 3309
datadir		= /home/mysql/3309/data
lc-messages-dir	= /usr/share/mysql
skip-external-locking
bind-address		= 0.0.0.0
key_buffer_size		= 16M
max_allowed_packet	= 16M
thread_stack		= 192K
thread_cache_size       = 8
myisam-recover-options  = BACKUP
query_cache_limit	= 1M
query_cache_size        = 16M
expire_logs_days	= 10
max_binlog_size   = 100M
innodb_buffer_pool_size = 1G
innodb_io_capacity = 4000

配置说明:

配置多实例,每个实例命名为mysqld*,这里我三个实例配置分别对应[mysql3307],[mysql3308],[mysql3309]。
  • 启动实例

执行:

mysqld_multi --defaults-file=/etc/mysql/mysql.conf.d/mysqld_multi.cnf --user=mysql start

如果需要启动指定的实例,可以在start后面跟上参数,使用实例名:

mysqld_multi --defaults-file=/etc/mysql/mysql.conf.d/mysqld_multi.cnf --user=mysql start 3307

启动指定多个实例:

mysqld_multi --defaults-file=/etc/mysql/mysql.conf.d/mysqld_multi.cnf --user=mysql start 3307,3308
  • 查看状态
mysqld_multi --defaults-file=/etc/mysql/mysql.conf.d/mysqld_multi.cnf --user=mysql report
  • 关闭实例

执行(也可以关闭指定实例,和start用法一样)

mysqld_multi --defaults-file=/etc/mysql/mysql.conf.d/mysqld_multi.cnf --user=mysql stop

我在执行stop命令时,实例未关闭。网上遇到该问题的人有改mysqld_multi.cnf脚本的,我试过,加上参数-s后直接报错。有说是因为权限问题,需要授权:grant shutdown on . to ‘username’@’localhost’ identified by ‘password’。我用的root用户启动,试过用mysqladmin去执行关闭,是可以成功的。

mysqladmin -h127.0.0.1 -P3309 -uroot shutdown

除非注明,否则均为"攻城狮·正"原创文章,请注明出处。

本文链接:https://engr-z.com/375.html

发表评论

您的电子邮箱地址不会被公开。