MySQL是一款流行的开源数据库。我们在开发过程中常常会用到读写分离,分库分表,区分开发环境与预生产环境。如果只有一台机器能用,在做预演时就需要用到多实例。
多实例启动数据库有三种方式:
- 在不同虚拟机中运行,隔离运行环境。这种方式的缺点是开销大。
- 在Docker中运行MySQL镜像。和虚拟机类似,运行环境隔离,但开销比虚拟机小很多。
- 如果使用源或编译的方式安装的数据库,就需要配置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
除非注明,否则均为”攻城狮-正“原创文章,请注明出处。
发表回复