描述

在同一台服务器中安装两个 MySQL 数据库。目的是为了配置主从分离,所以需要多安装一台用于从数据库。使用 mysqld_multi 启动多个实例。
mysql 官网下载 需要安装的版本。

下载与安装

/usr/local/下创建mysqltemp(用于临时下载数据库安装包)。

1
2
3
4
5
6
7
8
[root@localhost local]# cd /usr/local
[root@localhost local]# mkdir mysqltemp
[root@localhost local]# cd mysqltemp
[root@localhost mysql3307]# wget https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.28-linux-glibc2.12-i686.tar.gz
[root@localhost mysql3307]# tar -xvf mysql-5.7.28-linux-glibc2.12-i686.tar.gz

// 重命名解压的文件为 mysql,并移动 mysql 到 /usr/local/mysql
[root@localhost mysql3307]# mv mysql-5.7.28-linux-glibc2.12-i686 /usr/local/mysql

下载、解压和重命名之后,完整路径是 /usr/local/mysql。接下来进入mysql 文件夹,创建 data 文件夹,并在 data 文件夹中创建 3306、3307、log 文件夹备用。在 3306 和 3307 文件夹中分别创建 data、log、tmp 文件夹备用。

1
2
3
4
5
6
7
[root@localhost mysql]# mkdir data
[root@localhost mysql]# cd data
[root@localhost data]# mkdir {3306,3307,log}
[root@localhost data]# cd 3306
[root@localhost 3306]# mkdir {data,log,tmp}
[root@localhost 3306]# cd ../3307
[root@localhost 3307]# mkdir {data,log,tmp}

配置

配置 /etc/my.cnf 文件

1
# vim /etc/my.cnf

使用以下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# 启动多个 mysql 实例
[client]
default-character-set = utf8mb4

[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
log = /usr/local/mysql/data/log/mysqld_multi.log

[mysqld3306]
mysqld=mysqld
mysqladmin=mysqladmin
datadir=/usr/local/mysql/data/3306/data
port=3306
user=mysql
performance_schema = off
server_id=3306
socket=/tmp/mysql_3306.sock
MyISAM_buffer_pool_size = 32M #设置 MyISAM 缓存大小
bind_address = 0.0.0.0 #设置监听 IP 地址
skip-name-resolve = 0 #关闭 DNS 反向解析
log-output=file
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /usr/local/mysql/data/3306/log/slow.log
log-error = /usr/local/mysql/data/3306/log/error.log
binlog_format = mixed
log-bin = /usr/local/mysql/data/3306/log/mysql3306_bin
explicit_defaults_for_timestamp=true
lower_case_table_names = 1

[mysqld3307]
mysqld=mysqld
mysqladmin=mysqladmin
datadir=/usr/local/mysql/data/3307/data
port=3307
user=mysql
server_id=3307
performance_schema = off
MyISAM_buffer_pool_size = 32M #设置 MyISAM 缓存大小
bind_address = 0.0.0.0 #设置监听 IP 地址
skip-name-resolve = 0 #关闭 DNS 反向解析
socket=/tmp/mysql_3307.sock
log-output=file
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /usr/local/mysql/data/3307/log/slow.log
log-error = /usr/local/mysql/data/3307/log/error.log
binlog_format = mixed
log-bin = /usr/local/mysql/data/3307/log/mysql3307_bin
explicit_defaults_for_timestamp=true
lower_case_table_names = 1

添加好配置文件之后,需要添加 mysql 用户(如果没有该用户的话)

1
2
3
# groupadd mysql
# useradd -g mysql mysql
# chown -R mysql:mysql /usr/local/mysql

初始化数据库

添加好配置之后,就可以初始化 3306 和 3307 的数据库了。执行命令之后,会出现临时密码,这个密码需要记住,用来首次登录 mysql 数据库。

1
2
3
4
5
# cd /usr/local/mysql

# ./bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/3306/data

# ./bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/3307/data

执行初始化命令,如果出现以下错误,则执行相应的安装命令即可。

1
2
3
4
5
6
./bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory

// 根据相应的提示,选择对应的安装命令
yum install -y libaio.so.1
yum install -y libnuma.so.1
yum install --setopt=protected_multilib=false libnuma.so.1

初始化数据库没有出现异常,最后会看到以下信息,说明初始化数据库成功,这也就是数据库的临时密码。

1
2
3
[Note] A temporary password is generated for root@localhost: 3/MasxQll5u

[Note] A temporary password is generated for root@localhost: 8tqGMruu8d?l

可以进入到 data 里面看看数据库有没有初始化成功。

1
2
# cd /usr/local/mysql/data/3306/data/
# cd /usr/local/mysql/data/3307/data/

启动

mysqld_multi 多实例管理的基本命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
启动全部实例 
# /usr/local/mysql/bin/mysqld_multi start

查看全部实例状态
# /usr/local/mysql/bin/mysqld_multi report

启动单个实例
# /usr/local/mysql/bin/mysqld_multi start 3306
# /usr/local/mysql/bin/mysqld_multi start 3307
停止单个实例
# /usr/local/mysql/bin/mysqld_multi stop 3306
# /usr/local/mysql/bin/mysqld_multi stop 3307
查看单个实例状态
# /usr/local/mysql/bin/mysqld_multi report 3306
# /usr/local/mysql/bin/mysqld_multi report 3307

使用命令,启动两个数据库实例

1
# /usr/local/mysql/bin/mysqld_multi start

执行命令没有报错,我们可以看一下日志有没有错误。

1
2
3
4
[root@localhost log]# cat /usr/local/mysql/data/log/mysqld_multi.log 
mysqld_multi log file version 2.16; run: 二 4 月 7 13:04:42 2020

Starting MySQL servers

为了确保两个数据库实例已经启动,可以通过命令查看相应端口是否有进程。

1
2
# ps -ef | grep 3306
# ps -ef | grep 3307

或者查看相应的实例中的日志信息

1
2
# cat /usr/local/mysql/data/3307/log/error.log
# cat /usr/local/mysql/data/3307/log/error.log

登录

以上都没有错误,我们就可以登录 mysql 进行修改密码等配置了。

直接使用 mysql -u root -p 会报以下错误。

1
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

所以要使用在配置文件中配置的 sock 地址mysql -S /tmp/mysql_3306.sock -p 密码,加上刚刚生成的临时密码。(其他配置可参考 CentOS7 环境配置(持续更新)

1
2
3
4
5
6
7
8
9
10
mysql -S /tmp/mysql_3306.sock -p3/MasxQll5u

// 设置密码
mysql> set password=password('Root@123');
// 设置允许远程登录
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Root@123' WITH GRANT OPTION;
mysql> flush privileges;

mysql> show variables like '%character%';
mysql> show variables like "%case%";

3307 数据库同样跟 3306 操作一样。

1
2
3
4
5
6
7
8
9
10
mysql -S /tmp/mysql_3307.sock -p8tqGMruu8d?l

// 设置密码
mysql> set password=password('Root@123');
// 设置允许远程登录
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Root@123' WITH GRANT OPTION;
mysql> flush privileges;

mysql> show variables like '%character%';
mysql> show variables like "%case%";

关闭数据库,发现使用 /usr/local/mysql/bin/mysqld_multi stop 不能关闭。可以先查询端口进程,然后用 kill 命令关闭。

1
2
# ps -ef | grep 3306
# kill -9 进程 ID

以上,两个数据库实例已经配置并启动成功。可以通过客户端连接操作。如果需要配置读写分离,可以参考: SpringBoot 整合 MyCat 实现读写分离

导出

1
/usr/local/mysql/bin/mysqldump -S /tmp/mysql_3306.sock -uroot -p muycodeDB --opt -R --compress --skip-lock-tables > /usr/local/mysql/backup/muycodeDB.sql

参考文章:

centos 下 mysql 多实例安装 3306、3307 实例(2014-10-15)