Current user: root@localhost
Server version: 5.7.22 MySQL Community Server - GPL
Protocol version: 10
Connection: Localhost via UNIX socket

多实例部署的方式主要有三种:
1. 使用多个配置文件启动不同的实例进程来实现多实例,这种方式的优点是逻辑简单,配置简单,缺点是管理起来不太方便;
2. 通过官方自带的mysqld_multi工具,使用单独的配置文件来实现多实例,这种方式的优点是管理起来很方便,集中管理;缺点是定制每个实例的配置不太方便;
3. 如果仅仅是用来做POC测试,也可以考虑使用dbdeployer工具来进行部署,这种方式的优点就是部署很简单,管理方便,缺点就是配置调整有点难度;
1. 所有服务共享主机资源;
2. 当服务器资源有剩余时,可以充分利用剩余的资源提供更多的服务。
3. 当某个服务实例服务并发很高时或者开启慢查询时,会发生资源互相抢占问题,高负载实例会消耗更多的内存、CPU、磁盘IO资源,降低服务器上的其他实例的服务质量;
1. 配置文件的安装路径不能相同;
2. 数据库生成文件目录不能相同;
3. 数据库启动脚本不能同名;
4. 数据库启动端口号不能相同;
5. socket文件的生成路径不能相同;
配置环境变量:---所有操作均在mysql用户下
在.bash_profile文件中增加如下路径,其中,/mysql/base5722/bin是MySQL软件路径,配置完成后,即可直接使用MySQL相关命令,执行命令无须写全部路径。
PATH=/mysql/base5722/bin:$PATH
创建相关目录
1. 软件目录,官网下载二进制源码包解压后放在如下目录:
mkdir mysql/base5722
2. 配置文件及日志目录
mkdir -p /mysql/my3310/log /mysql/my3311/log /mysql/my3312/log
3. 创建数据文件和binlog目录
mkdir -p mysqldata/my3310/{data,log,tmp}mkdir -p mysqldata/my3311/{data,log,tmp}mkdir -p /mysqldata/my3312/{data,log,tmp}
4. 创建MySQL数据库配置文件,同理创建3311/3312的配置文件
vi mysql/my3310/my.cnf[mysqld]datadir = mysqldata/my3310/datasocket = mysql/my3310/mysql.sockpid_file = /mysql/my3310/mysql.pidlog_error = /mysql/my3310/log/error.logport = 3310
5. 初始化 MySQL数据库
/mysql/base5722/bin/mysqld --defaults-file=/mysql/my3310/my.cnf --initialize
/mysql/base5722/bin/mysqld --defaults-file=/mysql/my3311/my.cnf --initialize
/mysql/base5722/bin/mysqld --defaults-file=/mysql/my3312/my.cnf --initialize
6. 记录临时密码(后面登录使用)
cat mysql/my3310/log/error.log |grep pass----3310:A temporary password is generated for root@localhost: Y!.B+#su2st>----3311:A temporary password is generated for root@localhost: w#p/h(&lo5B*----3312:A temporary password is generated for root@localhost: Gf0Kj5f3kX-s
7. 启动 MySQL实例
nohup mysql/base5722/bin/mysqld_safe --defaults-file=/mysql/my3310/my.cnf &
nohup mysql/base5722/bin/mysqld_safe --defaults-file=/mysql/my3311/my.cnf &
nohup mysql/base5722/bin/mysqld_safe --defaults-file=/mysql/my3312/my.cnf &
8 . 查看MySQL进程
mysql@Tdongkf[12:43:57]:/mysql/my3311$ps -ef|grep mysqldmysql 98476 96640 0 12:40 pts/0 00:00:00 bin/sh mysql/base5722/bin/mysqld_safe --defaults-file=/mysql/my3310/my.cnfmysql 98609 98476 0 12:40 pts/0 00:00:00 mysql/base5722/bin/mysqld --defaults-file=/mysql/my3310/my.cnf --basedir=/mysql/base5722 --datadir=/mysqldata/my3310/data --plugin-dir=/mysql/base5722/lib/plugin --log-error=/mysql/my3310/log/error.log --pid-file=/mysql/my3310/mysql.pid --socket=/mysql/my3310/mysql.sock --port=3310mysql 98637 96640 0 12:41 pts/0 00:00:00 bin/sh mysql/base5722/bin/mysqld_safe --defaults-file=/mysql/my3311/my.cnfmysql 98766 98637 0 12:41 pts/0 00:00:00 mysql/base5722/bin/mysqld --defaults-file=/mysql/my3311/my.cnf --basedir=/mysql/base5722 --datadir=/mysqldata/my3311/data --plugin-dir=/mysql/base5722/lib/plugin --log-error=/mysql/my3311/log/error.log --pid-file=/mysql/my3311/mysql.pid --socket=/mysql/my3311/mysql.sock --port=3311mysql 98813 96640 0 12:41 pts/0 00:00:00 bin/sh mysql/base5722/bin/mysqld_safe --defaults-file=/mysql/my3312/my.cnfmysql 98942 98813 0 12:41 pts/0 00:00:00 /mysql/base5722/bin/mysqld --defaults-file=/mysql/my3312/my.cnf --basedir=/mysql/base5722 --datadir=/mysqldata/my3312/data --plugin-dir=/mysql/base5722/lib/plugin --log-error=/mysql/my3312/log/error.log --pid-file=/mysql/my3312/mysql.pid --socket=/mysql/my3312/mysql.sock --port=3312
可以看到三个MySQL实例都已经正常启动了。
由于默认的root用户密码是已经过期了,需要进行更改,我们连接三个数据库实例进行调整;
mysql@Tdongkf[12:43:10]:/mysql/my3311$mysql -uroot -p --socket=/mysql/my3311/mysql.sockEnter password: (前面记录的临时密码)root@MYSQL:[DB((none))]>alter user root@'localhost' identified by 'root1234';
至此,多配置文件的方式我们就介绍完毕了。
我们将三个实例进行关闭:
shutdown;
mysqld_multi:是用于管理多实例的一个脚本集。
mysqld_multi会读取配置文件中的[mysqld_multi]、[mysqld]、[mysqldN],N是一个整数,建议用端口号表示,该部分配置会覆盖[mysqld]部分中的配置。
[mysqld] 通用的参数配置
[mysqldN] 针对特定实例的参数配置
1. 复制mysqld_multi文件到init.d目录,用操作系统root用户执行:
cp mysql/base5722/support-files/mysqld_multi.server etc/init.d/mysqld_multidchkconfig mysqld_multid on
2. 创建/etc/my.cnf,在这里,我们将三个实例的配置信息都写在了my.cnf文件里,根据不同的端口号做了区分:
[mysqld]character_set_server = utf8mb4collation_server = utf8mb4_binbasedir = mysql/base5722[mysqld_multi]log = /mysql/multi/log/mysql_multi.log[mysqld3310]mysqld = /mysql/base5722/bin/mysqld_safemysqladmin = /mysql/base5722/bin/mysqladmindatadir = /mysqldata/my3310/datasocket = /mysql/my3310/mysql.sockpid_file = /mysql/my3310/mysql.pidlog_error = /mysql/my3310/log/error.logport = 3310[mysqld3311]mysqld = /mysql/base5722/bin/mysqld_safemysqladmin = /mysql/base5722/bin/mysqladmindatadir = /mysqldata/my3311/datasocket = /mysql/my3311/mysql.sockpid_file = /mysql/my3311/mysql.pidlog_error = /mysql/my3311/log/error.logport = 3311[mysqld3312]mysqld = /mysql/base5722/bin/mysqld_safemysqladmin = /mysql/base5722/bin/mysqladmindatadir = /mysqldata/my3312/datasocket = /mysql/my3312/mysql.sockpid_file = /mysql/my3312/mysql.pidlog_error = /mysql/my3312/log/error.logport = 3312
由于还是刚才的三个数据库,我们在此就不再重新初始化了。
3. 我们直接执行mysqld_multi report命令来查看下:
mysql@Tdongkf[13:01:49]:/mysql$mysqld_multi reportReporting MySQL serversMySQL server from group: mysqld3310 is not runningMySQL server from group: mysqld3311 is not runningMySQL server from group: mysqld3312 is not running
mysqld_multi已经识别出来三个MySQL数据库了,下面我们通过mysqld_multi提供的命令来管理数据库实例:
4. 启动3310实例:
mysql@Tdongkf[13:03:15]:/mysql$mysqld_multi start 3310
5. 再来看下report的状态:
mysql@Tdongkf[13:03:21]:/mysql$mysqld_multi reportReporting MySQL serversMySQL server from group: mysqld3310 is runningMySQL server from group: mysqld3311 is not runningMySQL server from group: mysqld3312 is not running
6. 3310已经启动了,其它两个还没有启动,我们都启动下:
mysql@Tdongkf[13:03:32]:/mysql$mysqld_multi start
7. report命令已经显示三个实例都启动了,操作系统上MySQL进程也都有了。
mysql@Tdongkf[13:04:14]:/mysql$mysqld_multi reportReporting MySQL serversMySQL server from group: mysqld3310 is runningMySQL server from group: mysqld3311 is runningMySQL server from group: mysqld3312 is runningmysql@Tdongkf[13:04:17]:/mysql$mysql@Tdongkf[13:04:17]:/mysql$ps -ef|grep mysqld |grep 331mysql 99911 1 0 13:03 pts/0 00:00:00 /bin/sh /mysql/base5722/bin/mysqld_safe --datadir=/mysqldata/my3310/data --socket=/mysql/my3310/mysql.sock --pid_file=/mysql/my3310/mysql.pid --log_error=/mysql/my3310/log/error.log --port=3310mysql 100076 99911 0 13:03 pts/0 00:00:00 /mysql/base5722/bin/mysqld --basedir=/mysql/base5722 --datadir=/mysqldata/my3310/data --plugin-dir=/mysql/base5722/lib/plugin --log-error=/mysql/my3310/log/error.log --pid-file=/mysql/my3310/mysql.pid --socket=/mysql/my3310/mysql.sock --port=3310mysql 100156 1 0 13:04 pts/0 00:00:00 /bin/sh /mysql/base5722/bin/mysqld_safe --datadir=/mysqldata/my3311/data --socket=/mysql/my3311/mysql.sock --pid_file=/mysql/my3311/mysql.pid --log_error=/mysql/my3311/log/error.log --port=3311mysql 100175 1 0 13:04 pts/0 00:00:00 /bin/sh /mysql/base5722/bin/mysqld_safe --datadir=/mysqldata/my3312/data --socket=/mysql/my3312/mysql.sock --pid_file=/mysql/my3312/mysql.pid --log_error=/mysql/my3312/log/error.log --port=3312mysql 100630 100156 3 13:04 pts/0 00:00:00 /mysql/base5722/bin/mysqld --basedir=/mysql/base5722 --datadir=/mysqldata/my3311/data --plugin-dir=/mysql/base5722/lib/plugin --log-error=/mysql/my3311/log/error.log --pid-file=/mysql/my3311/mysql.pid --socket=/mysql/my3311/mysql.sock --port=3311mysql 100631 100175 3 13:04 pts/0 00:00:00 /mysql/base5722/bin/mysqld --basedir=/mysql/base5722 --datadir=/mysqldata/my3312/data --plugin-dir=/mysql/base5722/lib/plugin --log-error=/mysql/my3312/log/error.log --pid-file=/mysql/my3312/mysql.pid --socket=/mysql/my3312/mysql.sock --port=3312
8. 但是,此时如果我们关闭数据库是不成功的:
mysql@Tdongkf[13:15:45]:~$mysqld_multi stopmysql@Tdongkf[13:15:50]:~$mysql@Tdongkf[13:15:51]:~$mysql@Tdongkf[13:15:51]:~$mysqld_multi reportReporting MySQL serversMySQL server from group: mysqld3310 is runningMySQL server from group: mysqld3311 is runningMySQL server from group: mysqld3312 is running
执行完关闭命令,可实例状态还是显示正在运行中,我们看下mysqld_multi的日志:
mysqladmin: connect to server at 'localhost' failederror: 'Access denied for user 'root'@'localhost' (using password: NO)'mysqladmin: connect to server at 'localhost' failederror: 'Access denied for user 'root'@'localhost' (using password: NO)'mysqladmin: connect to server at 'localhost' failederror: 'Access denied for user 'root'@'localhost' (using password: NO)'mysqld_multi log file version 2.16; run: Thu Feb 18 13:15:54 2021
用户连接报错,那看来就是跟用户密码有关系了,我们在配置中增加用户信息:
mysqld_multi]user = rootpass = root1234log = /mysql/multi/log/mysql_multi.log
再来关闭下:
mysql@Tdongkf[13:47:11]:~$mysqld_multi stop
查看数据库实例状态:
mysql@Tdongkf[13:47:15]:~$mysqld_multi reportReporting MySQL serversMySQL server from group: mysqld3310 is not runningMySQL server from group: mysqld3311 is not runningMySQL server from group: mysqld3312 is not running
这次数据库正常停止了,操作系统上进程也不存在了。
如果每个实例的自定义参数列表特别多的话,可以考虑在配置文件中使用defaults-file参数,将参数都独立出来。
defaults-file = /mysql/my3306/my.cnf
启动全部实例:
mysqld_multi start
停止全部实例:
mysqld_multi stop
查看全部实例状态:
mysqld_multi report
启动单个实例:
mysqld_multi start 3310
停止单个实例:
mysqld_multi stop 3311
查看单个实例状态:
mysqld_multi report 3312
至此,通过mysqld_multi方式进行多实例管理就介绍完了。
dbdeployer 是一款十分强大的数据库测试环境部署工具,可实现一键部署不同架构、不同版本的数据库环境。是和 MySQL SandBox 类似的工具
如:MySQL 主从复制、GTID 模式、MySQL 组复制(单主模式、多主模式等)、多源复制等完整的数据库类型支持及版本,并且部署MySQL环境都是秒级别(10-30秒,和实例数量有关),使用起来很方便,还有各种管理命令,该工具不建议在生产环境使用。
该工具的详细使用我们以后的文章再介绍。
我们介绍了三种常见的MySQL数据库多实例部署的方式,如果需要在使用中部署多实例的方式,我们建议使用官方的mysqld_multi方式进行多实例的管理,运维工作更加方便;

完
=end=




