MySQL 单机多实例部署 多配置文件 mysqld_multi 两种方案

一、MySQL多实例简介

A、MySQL多实例是什么

MySQL多实例是在一台机器上通过开启多个不同的服务端口(如:3306 3307 3308…),运行多个MySQL服务进程,通过不同的socket监听不同的服务端口来提供各自的服务。

B、MySQL多实例特点

  • 有效利用服务器资源:当单个服务器资源有剩余时,可以充分利用剩余的资源提供更多的服务
  • 资源互相抢占问题:当某个服务实例服务并发很高时或者开启慢查询时,会消耗更多的内存、CPU、磁盘IO资源,导致服务器上的其他实例提供服务的质量下降。

C、单机多实例部署注意事项

  • 配置文件中安装路径不能相同。
  • 数据库生成文件目录不能相同。
  • 数据库启动脚本不能同名。
  • 数据库启动端口号不能相同。
  • socket文件的生成路径不能相同。

D、MySQL多实例两种部署方式

  • 第一种:使用多个配置文件启动不同的进程来实现多实例。
    • 优点:逻辑简单,配置简单。
    • 缺点:管理起来不太方便。
  • 第二种:通过官方自带的mysqld_multi使用单独的配置文件来实现多实例。
    • 优点:管理起来很方便,集中管理。
    • 缺点:定制每个实例的配置不太方面。

二、多配置文件方案

CentOS 7 下载 安装 MySQL 8.0.19

MySQL mysqld mysqld_safe mysql.server mysqld_multi 四种启动方式区别


三、mysqld_multi方案

A、下载MySQL免编译包

CentOS 7 下载 安装 MySQL 8.0.19

B、查看CentOS版本

cat /etc/redhat-release

在这里插入图片描述

C、创建MySQL用户和用户组

# 自动创建用户 用户组
useradd mysql

# 设置用户密码
passwd mysql

在这里插入图片描述

D、解压MySQL免编译包

# 解压到 /data/opt/ 目录下
tar -xvf /data/targz/mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz -C /data/opt/

在这里插入图片描述

E、重命名文件夹

mv /data/opt/mysql-8.0.19-linux-glibc2.12-x86_64/ /data/opt/mysql-8.0.19

在这里插入图片描述
备注:

# 目录 A 重命名 B
mv A B
# 目录 A 移动到目录 B 下并重命名为 C
mv /A /B/C

F、设置软连接

ln -s /data/opt/mysql-8.0.19/ /usr/local/mysql-8.0.19

在这里插入图片描述

G、MySQL配置文件my.cnf

my.cnf配置文件生效优先级(由高到低):

  • MySQL启动时指定的具体参数。
  • MySQL启动时指定位置的配置文件。
  • MySQL数据目录下的my.cnf文件。
  • MySQL读取/etc/my.cnf文件。
  • MySQL默认的参数。

multi.cnf

# 客户端设置:客户端的连接参数
[client]
# 连接 MySQL 使用的端口
port = 3308
# 连接 MySQL 使用的套接字文件
socket = /data/data/mysql/multi/mysql.sock
# 设置字符集
default-character-set = utf8mb4

# 服务端设置
[mysqld]
# 数据库默认编码(5.1以下 default-character-set)
character_set_server = utf8mb4
# 数据库默认比对规则、排序规则
collation_server = utf8mb4_bin
# 该目录为根目录(安装目录)
basedir = /data/opt/mysql-8.0.19

[mysqld_multi]
# mysqld命令位置,用于启动MySQL实例,也可以为mysqld_safe命令位置
mysqld = /data/opt/mysql-8.0.19/bin/mysqld_safe
# 用于停止MySQL实例
mysqladmin = /data/opt/mysql-8.0.19/bin/mysqladmin
# 调用mysqladmin时的账号
user = mysql
# 调用mysqladmin时的密码
password = password
# 日志
log = /data/data/mysql/multi/log/mysql_multi.log
 
# 3308数据库
[mysqld3308]
# 监听端口
port = 3308
# 服务id:可高可用时区分
server_id = 3308
# 数据库默认编码(5.1以下 default-character-set)
character_set_server = utf8mb4
# 数据库默认比对规则、排序规则
collation_server = utf8mb4_bin
# 该目录为根目录(安装目录)
basedir = /data/opt/mysql-8.0.19
# 数据库初始化数据存放目录(创建文件夹且文件夹中无文件)
datadir = /data/data/mysql/multi/8.0.19_3308/data
# 指定客户端程序与数据库间通讯的套接字文件
socket = /data/data/mysql/multi/8.0.19_3308/mysql3308.sock
# 数据库存放临时文件的目录(创建文件夹且文件夹中无文件)
tmpdir = /data/data/mysql/multi/8.0.19_3308/tmp
pid-file = /data/data/mysql/multi/8.0.19_3308/mysql3308.pid 
explicit_defaults_for_timestamp = true
log-output = file
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /data/data/mysql/multi/8.0.19_3308/log/slow.log
log-error = /data/data/mysql/multi/8.0.19_3308/log/error.log
binlog_format = mixed
log-bin = /data/data/mysql/multi/8.0.19_3308/log/mysql3308_bin

# 3309数据库
[mysqld3309]
# 监听端口
port = 3309
# 服务id:可高可用时区分
server_id = 3309
# 数据库默认编码(5.1以下 default-character-set)
character_set_server = utf8mb4
# 数据库默认比对规则、排序规则
collation_server = utf8mb4_bin
# 该目录为根目录(安装目录)
basedir = /data/opt/mysql-8.0.19
# 数据库初始化数据存放目录(创建文件夹且文件夹中无文件)
datadir = /data/data/mysql/multi/8.0.19_3309/data
# 指定客户端程序与数据库间通讯的套接字文件
socket = /data/data/mysql/multi/8.0.19_3309/mysql3309.sock
# 数据库存放临时文件的目录(创建文件夹且文件夹中无文件)
tmpdir = /data/data/mysql/multi/8.0.19_3309/tmp
pid-file = /data/data/mysql/multi/8.0.19_3309/mysql3309.pid 
explicit_defaults_for_timestamp = true
log-output = file
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /data/data/mysql/multi/8.0.19_3309/log/slow.log
log-error = /data/data/mysql/multi/8.0.19_3309/log/error.log
binlog_format = mixed
log-bin = /data/data/mysql/multi/8.0.19_3309/log/mysql3309_bin

# 3310数据库
[mysqld3310]
# 监听端口
port = 3310
# 服务id:可高可用时区分
server_id = 3310
# 数据库默认编码(5.1以下 default-character-set)
character_set_server = utf8mb4
# 数据库默认比对规则、排序规则
collation_server = utf8mb4_bin
# 该目录为根目录(安装目录)
basedir = /data/opt/mysql-8.0.19
# 数据库初始化数据存放目录(创建文件夹且文件夹中无文件)
datadir = /data/data/mysql/multi/8.0.19_3310/data
# 指定客户端程序与数据库间通讯的套接字文件
socket = /data/data/mysql/multi/8.0.19_3310/mysql3310.sock
# 数据库存放临时文件的目录(创建文件夹且文件夹中无文件)
tmpdir = /data/data/mysql/multi/8.0.19_3310/tmp
pid-file = /data/data/mysql/multi/8.0.19_3310/mysql3310.pid 
explicit_defaults_for_timestamp = true
log-output = file
slow_query_log = 1
long_query_time = 1
slow_query_log_file = /data/data/mysql/multi/8.0.19_3310/log/slow.log
log-error = /data/data/mysql/multi/8.0.19_3310/log/error.log
binlog_format = mixed
log-bin = /data/data/mysql/multi/8.0.19_3310/log/mysql3310_bin

H、MySQL安装文件权限

# 设置安装文件所属 用户和用户组
chown -R mysql:mysql /data/opt/mysql-8.0.19/

# 设置安装文件调用权限
chmod -R 755 /data/opt/mysql-8.0.19/

# 查看设置结果
ll /data/opt/mysql-8.0.19/

在这里插入图片描述
备注:

# 通配符匹配
chown -R mysql:mysql /usr/local/mysql*
chmod -R 755 /usr/local/mysql*

I、MySQL运行数据文件夹

mkdir -p /data/data/mysql/multi/log/
mkdir -p /data/data/mysql/multi/8.0.19_3308/data
mkdir -p /data/data/mysql/multi/8.0.19_3308/log
mkdir -p /data/data/mysql/multi/8.0.19_3308/tmp
mkdir -p /data/data/mysql/multi/8.0.19_3309/data
mkdir -p /data/data/mysql/multi/8.0.19_3309/log
mkdir -p /data/data/mysql/multi/8.0.19_3309/tmp
mkdir -p /data/data/mysql/multi/8.0.19_3310/data
mkdir -p /data/data/mysql/multi/8.0.19_3310/log
mkdir -p /data/data/mysql/multi/8.0.19_3310/tmp

在这里插入图片描述

J、MySQL运行数据文件夹权限

chown -R mysql:mysql /data/data/mysql/multi
chmod -R 755 /data/data/mysql/multi

在这里插入图片描述

K、初始化MySQL

MySQL 5.7.2及以上版本与以前版本不同,很多资料上使用命令../scripts/mysql_install_db。而在MySQL 5.7.2mysql_install_db的指令在bin目录下,官网说使用mysqld --initialize进行初始化。

  • 切换至mysql用户:
    su mysql
    
  • 初始化3308 3309 3310数据库:
/data/opt/mysql-8.0.19/bin/mysqld --defaults-file=/data/opt/mysql-8.0.19/multi.cnf --datadir=/data/data/mysql/multi/8.0.19_3308/data --initialize
/data/opt/mysql-8.0.19/bin/mysqld --defaults-file=/data/opt/mysql-8.0.19/multi.cnf --datadir=/data/data/mysql/multi/8.0.19_3309/data --initialize
/data/opt/mysql-8.0.19/bin/mysqld --defaults-file=/data/opt/mysql-8.0.19/multi.cnf --datadir=/data/data/mysql/multi/8.0.19_3310/data --initialize

在这里插入图片描述

  • 记录临时密码(后面登陆使用):
A temporary password is generated for root@localhost: c!&BvFql4<hB
A temporary password is generated for root@localhost: WS#3kj7NxYlz
A temporary password is generated for root@localhost: RiVG/TyhN3HQ
  • 查看初始化成功产生文件:
    在这里插入图片描述

L、添加系统环境变量

# 需要切换 root 执行
echo 'export PATH=$PATH:/data/opt/mysql-8.0.19/bin' >> /etc/profile 
source /etc/profile

在这里插入图片描述

M、启动MySQL

  • 查看MySQL状态
/data/opt/mysql-8.0.19/bin/mysqld_multi --defaults-file=/data/opt/mysql-8.0.19/multi.cnf report

在这里插入图片描述

  • 启动mysqld3308 mysqld3309 mysqld3310
/data/opt/mysql-8.0.19/bin/mysqld_multi --defaults-file=/data/opt/mysql-8.0.19/multi.cnf start 3308
/data/opt/mysql-8.0.19/bin/mysqld_multi --defaults-file=/data/opt/mysql-8.0.19/multi.cnf start 3309
/data/opt/mysql-8.0.19/bin/mysqld_multi --defaults-file=/data/opt/mysql-8.0.19/multi.cnf start 3310

在这里插入图片描述

  • 再次查看MySQL状态
# 稍等十几秒查看 保证 MySQL 已完全启动
/data/opt/mysql-8.0.19/bin/mysqld_multi --defaults-file=/data/opt/mysql-8.0.19/multi.cnf report

在这里插入图片描述
在这里插入图片描述

N、启动MySQL错误

  • /usr/bin/perl: 坏的解释器: 没有那个文件或目录
    yum install perl gcc kernel-devel
    
  • mysqld33xx数据库启动失败:可查看启动日志或错误日志(multi.cnf中配置)
    [mysqld_multi]
    # 日志
    log=/data/mysql/multi/log/mysql_multi.log
    
    # 3308数据库
    [mysqld3308]
    log-error=/data/mysql/multi/3308_8.0.x/log/error.log
    

O、登陆MySQL

  • 端口登陆
    # 格式 mysql -u用户名 -p -hIP地址 -P端口`
    mysql -uroot -p -h127.0.0.1 -P3308`
    
  • sock登陆(multi.cnf中配置)
    [mysqld3308]
    socket = /data/data/mysql/multi/8.0.19_3308/mysql3308.sock
    
    [mysqld3309]
    socket = /data/data/mysql/multi/8.0.19_3309/mysql3309.sock
    
    [mysqld3310]
    socket = /data/data/mysql/multi/8.0.19_3310/mysql3310.sock
    

O.1、端口登陆MySQL

  • mysql -uroot -p -h127.0.0.1 -P3308

    A temporary password is generated for root@localhost: c!&BvFql4<hB
    在这里插入图片描述

  • mysql -uroot -p -h127.0.0.1 -P3309

    A temporary password is generated for root@localhost: WS#3kj7NxYlz
    在这里插入图片描述

  • mysql -uroot -p -h127.0.0.1 -P3310

    A temporary password is generated for root@localhost: RiVG/TyhN3HQ
    在这里插入图片描述

O.2、sock登陆MySQL

  • mysql -S /data/data/mysql/multi/8.0.19_3308/mysql3308.sock -p

    A temporary password is generated for root@localhost: c!&BvFql4<hB
    在这里插入图片描述

  • mysql -S /data/data/mysql/multi/8.0.19_3309/mysql3309.sock -p

    A temporary password is generated for root@localhost: WS#3kj7NxYlz
    在这里插入图片描述

  • mysql -S /data/data/mysql/multi/8.0.19_3310/mysql3310.sock -p

    A temporary password is generated for root@localhost: RiVG/TyhN3HQ
    在这里插入图片描述

P、修改MySQL密码

# 格式:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';  
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

在这里插入图片描述


三、连接MySQL

客户端无法连接到MySQL服务器(网络不通)
在这里插入图片描述

A、查看MySQL是否启动成功

  • 查看MySQL进程:
    ps -ef|grep mysql-8.0.19
    
    在这里插入图片描述
  • 命令登录MySQL
    mysql -uroot -p -h127.0.0.1 -P3308
    
    在这里插入图片描述

B、查看MySQL是否占用系统3308端口

# yum install net-tools -y
netstat -lnp|grep 3308

在这里插入图片描述

C、查看客户端是否可以ping通服务器

在这里插入图片描述

D、关闭CentOS 7防火墙

CentOS 7默认使用 firewall作为防火墙

# 防火墙状态
firewall-cmd --state

# 停止 firewall
systemctl stop firewalld.service

# 禁止 firewall 开机启动
systemctl disable firewalld.service 

在这里插入图片描述
备注:

# 查看已开放端口
firewall-cmd --list-ports

# 开启端口:--zone #作用域  --add-port=80/tcp #添加端口(端口/通讯协议) --permanent #永久生效(无此参数重启后失效)
firewall-cmd --zone=public --add-port=80/tcp --permanent

# 关闭 selinux:将 etc/selinux/config 文件中 SELINUX=enforcing 改为 SELINUX=disabled
vi /etc/selinux/config

E、再次连接MySQL

客户端请求MySQL服务器被拒绝(网络通,被拒绝)
在这里插入图片描述

F、授权用户远程访问

MySQL 5.7/8.0 命令行 创建数据库 添加用户 用户授权

# 登录 3308 MySQL
mysql -uroot -p -h127.0.0.1 -P3308

# mysql db 中存储了用户信息(user 表)
use mysql

# 表格中 root 用户的 host 应该显示 localhost(只支持服务器访问,不支持远程)
select host, user, authentication_string, plugin from user;

在这里插入图片描述

# 创建远程登陆用户 密码
CREATE USER 'root'@'%' IDENTIFIED BY 'password';

# 用户登录的加密规则修改为 mysql_native_password*
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

# 授予用户(root)远程访问权限  GRANT ALL(所有权限) %(通配所有 host,可访问远程)
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

# MySQL 权限放在 cache(grant表)中,所以必须重新重新加载
flush privileges;

# 表格中 root 用户的 host 已经变成 %(修改成功,可远程访问)
select host, user, authentication_string, plugin from user;

在这里插入图片描述

G、再次连接MySQL

在这里插入图片描述


四、常见问题

A、--initialize specified but the data directory has files in it. Aborting

# 数据库初始化数据存放目录(创建文件夹且文件夹中无文件)
datadir = /data/data/mysql/8.0.19_3306/data

删除/data/data/mysql/8.0.19_3306/data文件夹下所有文件

B、用户授权报错1064 (42000)

MySQL 8.0.x 用户授权报错 1064 (42000)

C、Navicat连接MySQL2059 错误

MySQL 8.0版本与MySQL5.0版本加密规则不一致,而现有的可视化工具只支持旧的加密方式。两种解决方法:

  • 升级Navicat驱动。
  • MySQL用户登录的加密规则修改为mysql_native_password**

第二种解决方法:

# 修改加密规则(password 当前密码)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;

# 修改 root 用户密码(password 设置新密码)
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

# 刷新权限
flush privileges;
发布了212 篇原创文章 · 获赞 151 · 访问量 50万+

猜你喜欢

转载自blog.csdn.net/yhj19920417/article/details/44181823