- 操作系统:Ubuntu 24.04 LTS(64 位)
- MySQL 版本:mysql-8.0.37-linux-glibc2.28-x86_64(二进制免编译版本)
- 安装路径:全部组件统一部署至
/opt/mysql(含程序、数据、日志)
- 核心适配:
- Ubuntu 24.04 老旧依赖(libaio/ncurses/tinfo)适配
- MySQL 大小写敏感配置(区分表名大小写)
- 全路径标准化部署,便于运维管理
- 创建专用业务用户(仅授予增删改查权限,遵循最小权限原则)
- 前提条件:拥有服务器 root 权限,已配置网络(或已下载好 MySQL 安装包)
# 检查系统架构(确认是x86_64)
uname -m
# 检查glibc版本(Ubuntu 24.04默认≥2.12,满足要求)
ldd --version | head -1
Ubuntu 24.04 移除了 libncurses5/libaio1 等老旧包名,安装兼容依赖:
# 更新源并安装核心依赖
sudo apt update
sudo apt install -y libaio-dev libncurses-dev wget tar libnuma1 libnuma-dev software-properties-common -y
- 忽略
libncursesw5/libncurses5等包找不到的报错,后续通过软链接适配
- 核心依赖说明:
libaio-dev:提供 MySQL 异步 I/O 所需的 libaio 库
libncurses-dev:ncurses 基础库,满足终端交互依赖
libnuma1/libnuma-dev:NUMA 内存管理依赖
wget/tar:下载 / 解压安装包工具
方式 1:外网直接下载
# 创建下载目录
mkdir -p /opt/mysql/src && cd /opt/mysql/src
# 下载MySQL 8.0.18二进制包
wget https://cdn.mysql.com/archives/mysql-8.0/mysql-8.0.37-linux-glibc2.28-x86_64.tar.xz
方式 2:本地上传(无外网)将下载好的mysql-8.0.37-linux-glibc2.28-x86_64.tar.xz上传至/opt/mysql/src目录。
# 校验MD5(官网可查对应MD5值)
md5sum /opt/mysql/src/mysql-8.0.37-linux-glibc2.28-x86_64.tar.xz
# 创建mysql组(系统级,运行MySQL服务)
sudo groupadd mysql
# 创建mysql用户(无登录权限,仅运行服务)
sudo useradd -r -s /sbin/nologin -g mysql mysql
cd /opt/mysql/src
# 解压安装包
sudo tar -xvf mysql-8.0.37-linux-glibc2.28-x86_64.tar.xz
# 移动解压后的程序目录至/opt/mysql(统一路径)
sudo mv mysql-8.0.37-linux-glibc2.28-x86_64 /opt/mysql/server
# 创建数据、日志、临时、配置目录(全路径归拢至/opt/mysql)
sudo mkdir -p /opt/mysql/{data,log,tmp,conf}
# 授权所有/opt/mysql目录给mysql系统用户
sudo chown -R mysql:mysql /opt/mysql
# 设置目录权限(数据目录严格限制为700)
sudo chmod 755 /opt/mysql/server
sudo chmod 700 /opt/mysql/data
sudo chmod 755 /opt/mysql/log
sudo chmod 755 /opt/mysql/tmp
Ubuntu 24.04 的 libaio 库名为libaio.so.1t64,需创建 MySQL 识别的软链接:
# 查找系统libaio库路径
sudo find /usr/lib -name "libaio.so*"
# 创建libaio.so.1软链接(MySQL 8.0.37硬编码依赖)
sudo ln -s /usr/lib/x86_64-linux-gnu/libaio.so.1t64 /usr/lib/x86_64-linux-gnu/libaio.so.1
sudo ln -s /usr/lib/x86_64-linux-gnu/libaio.so.1t64 /usr/lib/libaio.so.1
# 刷新系统库缓存
sudo ldconfig
# 查找系统ncurses/tinfo库路径
sudo find /usr/lib -name "libncurses.so.6"
sudo find /usr/lib -name "libtinfo.so.6"
# 1. 适配libncurses.so.5
sudo ln -s /usr/lib/x86_64-linux-gnu/libncurses.so.6 /usr/lib/x86_64-linux-gnu/libncurses.so.5
sudo ln -s /usr/lib/x86_64-linux-gnu/libncursesw.so.6 /usr/lib/x86_64-linux-gnu/libncursesw.so.5
# 2. 适配libtinfo.so.5(mysql客户端依赖)
sudo ln -s /usr/lib/x86_64-linux-gnu/libtinfo.so.6 /usr/lib/x86_64-linux-gnu/libtinfo.so.5
sudo ln -s /usr/lib/x86_64-linux-gnu/libtinfo.so.5 /usr/lib/libtinfo.so.5
# 刷新系统库缓存
sudo ldconfig
# 创建配置文件(统一放在/opt/mysql/conf下)
sudo vim /opt/mysql/conf/my.cnf
写入以下配置(根据服务器内存调整性能参数):
[mysqld]
# 基础配置(全路径+大小写敏感核心)
user = mysql
basedir = /opt/mysql/server
datadir = /opt/mysql/data
socket = /opt/mysql/tmp/mysql.sock
pid-file = /opt/mysql/tmp/mysql.pid
port = 3306
server-id = 1
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 大小写敏感配置(关键:区分表名大小写,Linux默认开启,显式配置)
lower_case_table_names = 0 # 0=区分大小写;1=不区分;2=仅存储不区分(慎用)
# 注意:lower_case_table_names需初始化时配置,后续修改需重新初始化
# 日志配置(全路径归拢至/opt/mysql/log)
log-error = /opt/mysql/log/mysqld.err
slow_query_log = 1
slow_query_log_file = /opt/mysql/log/slow.log
long_query_time = 2
log_bin = /opt/mysql/log/mysql-bin
binlog_format = row
# 性能配置(根据服务器内存调整,示例为4G内存配置)
max_connections = 1000
innodb_buffer_pool_size = 2G
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
[client]
socket = /opt/mysql/tmp/mysql.sock
port = 3306
default-character-set = utf8mb4
[mysqld_safe]
log-error = /opt/mysql/log/mysqld.err
pid-file = /opt/mysql/tmp/mysql.pid
# 关键:--defaults-file必须作为第一个参数
# 简化版:my.cnf已配置datadir/basedir,无需重复指定
sudo /opt/mysql/server/bin/mysqld --defaults-file=/opt/mysql/conf/my.cnf --initialize --user=mysql
关键提示:
- 初始化无报错即成功,临时密码会写入
/opt/mysql/log/mysqld.err
- 若提示权限错误,重新执行:
sudo chown -R mysql:mysql /opt/mysql
lower_case_table_names仅初始化时生效,若需修改需清空/opt/mysql/data重新初始化
# 创建服务文件
sudo vim /usr/lib/systemd/system/mysqld.service
写入以下内容(适配 /opt/mysql 全路径):
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
Type=notify
TimeoutSec=0
PermissionsStartOnly=true
# 绝对路径执行mysqld,指定自定义配置文件
ExecStart=/opt/mysql/server/bin/mysqld --defaults-file=/opt/mysql/conf/my.cnf $MYSQLD_OPTS
LimitNOFILE = 5000
Restart=on-failure
RestartPreventExitStatus=1
Environment=MYSQLD_PARENT_PID=1
PrivateTmp=false
# 重新加载systemd配置
sudo systemctl daemon-reload
# 启动MySQL
sudo systemctl start mysqld
# 设置开机自启
sudo systemctl enable mysqld
# 检查服务状态(显示active (running)即成功)
sudo systemctl status mysqld
# 添加到系统环境变量
sudo echo 'export PATH=$PATH:/opt/mysql/server/bin' >> /etc/profile
sudo echo 'export MYSQL_HOME=/opt/mysql/server' >> /etc/profile
# 生效配置
source /etc/profile
# 验证环境变量
echo $PATH | grep mysql
echo $MYSQL_HOME
# 从错误日志中筛选临时密码(关键!)
sudo grep "temporary password" /opt/mysql/log/mysqld.err
输出示例:A temporary password is generated for root@localhost: Abc123!xyz
# 使用临时密码登录(指定socket避免路径问题)
mysql -uroot -p -S /opt/mysql/tmp/mysql.sock
登录后执行以下 SQL(替换RootPasswd@123为自定义 root 强密码):
-- 修改root本地密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'RootPasswd@123';
-- (可选)允许root远程访问(生产环境建议指定IP,如192.168.1.0/24)
CREATE USER 'root'@'%' IDENTIFIED BY 'RootPasswd@123';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
-- 刷新权限
FLUSH PRIVILEGES;
-- 1. 创建业务用户(示例:用户名mysql_user,密码UserPasswd@123,仅允许本地访问)
CREATE USER 'mysql_user'@'localhost' IDENTIFIED BY 'UserPasswd@123';
-- 2. 授予指定数据库的增删改查权限(示例:数据库名test_db,若需所有库替换为*.*)
-- 核心权限:SELECT(查)、INSERT(增)、UPDATE(改)、DELETE(删)
GRANT SELECT, INSERT, UPDATE, DELETE ON test_db.* TO 'mysql_user'@'localhost';
-- 3. (可选)允许远程访问(生产环境建议指定具体IP,如192.168.1.100)
CREATE USER 'mysql_user'@'%' IDENTIFIED BY 'UserPasswd@123';
GRANT SELECT, INSERT, UPDATE, DELETE ON test_db.* TO 'mysql_user'@'%';
-- 4. 刷新权限使配置生效
FLUSH PRIVILEGES;
GRANT ALL PRIVILEGES ON test_db.* TO 'mysql_user'@'%';
FLUSH PRIVILEGES;
MySQL 8.0 默认使用caching_sha2_password,若客户端不兼容,修改业务用户认证插件:
ALTER USER 'mysql_user'@'%' IDENTIFIED WITH mysql_native_password BY 'UserPasswd@123';
FLUSH PRIVILEGES;
-- 退出root登录,使用业务用户登录
EXIT;
mysql -umysql_user -pUserPasswd@123 -S /opt/mysql/tmp/mysql.sock
-- 验证权限(切换到指定数据库)
USE test_db;
-- 尝试增删改查(正常执行即权限生效)
INSERT INTO tb_user (id, name) VALUES (1, 'test');
SELECT * FROM tb_user;
UPDATE tb_user SET name = 'test2' WHERE id = 1;
DELETE FROM tb_user WHERE id = 1;
-- 尝试创建数据库(应报错,无权限)
CREATE DATABASE new_db;
# 临时关闭ufw防火墙(测试用)
sudo ufw disable
# 或永久开放3306端口
sudo ufw allow 3306/tcp
sudo ufw reload
输出示例:mysql Ver 8.0.37 for Linux on x86_64 (MySQL Community Server - GPL)
-- 使用root登录
mysql -uroot -pRootPasswd@123 -S /opt/mysql/tmp/mysql.sock
-- 创建测试库和表
CREATE DATABASE test_db;
USE test_db;
CREATE TABLE TestTable (id INT);
CREATE TABLE testtable (id INT);
-- 查看表列表(应显示2个表,说明大小写敏感生效)
SHOW TABLES;
EXIT;
# 使用业务用户登录并执行操作
mysql -umysql_user -pUserPasswd@123 -S /opt/mysql/tmp/mysql.sock -e "USE test_db; SELECT * FROM TestTable;"
正常返回表数据(无报错)即权限配置成功。
# 修正参数顺序:--defaults-file必须作为第一个参数
sudo /opt/mysql/server/bin/mysqld --defaults-file=/opt/mysql/conf/my.cnf --initialize --user=mysql
# 重新创建tinfo软链接
sudo ln -s /usr/lib/x86_64-linux-gnu/libtinfo.so.6 /usr/lib/x86_64-linux-gnu/libtinfo.so.5
sudo ldconfig
# 重新初始化(清空数据目录)
sudo systemctl stop mysqld
sudo rm -rf /opt/mysql/data/*
sudo /opt/mysql/server/bin/mysqld --defaults-file=/opt/mysql/conf/my.cnf --initialize --user=mysql
# 重新查找密码
sudo grep "temporary password" /opt/mysql/log/mysqld.err
-- 使用root登录补充权限
mysql -uroot -pRootPasswd@123 -S /opt/mysql/tmp/mysql.sock
GRANT [需要的权限] ON 数据库.表 TO 'mysql_user'@'%';
FLUSH PRIVILEGES;
-- 放宽密码策略(测试环境,生产环境不建议)
SET GLOBAL validate_password.policy=LOW;
SET GLOBAL validate_password.length=6;
FLUSH PRIVILEGES;
# 启动/停止/重启MySQL
sudo systemctl start mysqld
sudo systemctl stop mysqld
sudo systemctl restart mysqld
# 查看MySQL状态
sudo systemctl status mysqld
# 查看错误日志(排查问题核心)
sudo tail -f /opt/mysql/log/mysqld.err
# 查看慢查询日志
sudo tail -f /opt/mysql/log/slow.log
# root登录MySQL(指定socket)
mysql -uroot -p -S /opt/mysql/tmp/mysql.sock
# 业务用户登录MySQL
mysql -umysql_user -p -S /opt/mysql/tmp/mysql.sock
- 路径规范:
- 所有 MySQL 相关文件均在
/opt/mysql下,便于备份、迁移和运维
- 禁止随意修改
/opt/mysql目录权限,避免服务异常
- 权限最小化:
- 业务用户仅授予必要的增删改查权限,禁止授予
ALL PRIVILEGES或GRANT OPTION
- 生产环境中,业务用户建议限制仅允许指定 IP 访问(替换
%为具体 IP)
- 大小写敏感:
lower_case_table_names=0是 Linux 默认值,符合 MySQL 官方最佳实践
- 若需兼容 Windows 的不区分大小写,需设置为 1(需重新初始化)
- 生产环境建议:
- 根据服务器内存调整
my.cnf中的innodb_buffer_pool_size(建议为物理内存的 50%-70%)
- 定期备份
/opt/mysql/data(可通过 mysqldump 或二进制日志)
- 定期修改 root 和业务用户密码,避免弱密码
- 依赖适配:
- Ubuntu 24.04 的库文件软链接请勿删除,否则 mysql 客户端 / 服务端会报错
- 若升级系统,需重新检查软链接是否失效
2026-10-23 start:
单机多实例 MySQL 部署:原有 /opt/mysql (3306),新增 /data/opt/mysql (13307)
环境说明:Linux 二进制包安装 MySQL 8.0,一台服务器运行多个独立 MySQL 实例,实例之间数据完全隔离,互不干扰。 原有实例:/opt/mysql,端口 3306 新增实例:/data/opt/mysql,端口 13307
原理说明
二进制方式安装 MySQL 天然支持多实例,核心就是多套数据目录、独立配置文件、不同端口、独立 socket、独立 systemd 服务。 程序二进制文件可以复用,也可以单独解压一份;但是数据目录、日志、socket、pid、server-id 绝对不能共用,否则会冲突甚至损坏数据。
重点隔离清单:
表格
| 项目 |
原有实例 (3306) |
新增实例 (13307) |
| port |
3306 |
13307 |
| datadir |
/opt/mysql/data |
/data/opt/mysql/data |
| socket |
/opt/mysql/tmp/mysql.sock |
/data/opt/mysql/tmp/mysql.sock |
| pid-file |
/opt/mysql/tmp/mysql.pid |
/data/opt/mysql/tmp/mysql.pid |
| 日志路径 |
/opt/mysql/log |
/data/opt/mysql/log |
| server-id |
1 |
2 |
| my.cnf |
/opt/mysql/conf/my.cnf |
/data/opt/mysql/conf/my.cnf |
| systemd 服务名 |
mysqld.service |
mysqld-13307.service |
注意:lower_case_table_names 参数仅初始化阶段生效,初始化完成后不能修改,需要提前在配置文件写好。
1、创建目录并解压 MySQL 二进制包
# 创建目录结构
mkdir -p /data/opt/mysql/{server,data,log,tmp,conf,src}
# 复制原有安装包到新实例src目录,也可以重新下载
cp /opt/mysql/src/mysql-8.0.37-linux-glibc2.28-x86_64.tar.xz /data/opt/mysql/src/
cd /data/opt/mysql/src
tar -xvf mysql-8.0.37-linux-glibc2.28-x86_64.tar.xz
mv mysql-8.0.37-linux-glibc2.28-x86_64 /data/opt/mysql/server
mv mysql-8.0.37-linux-glibc2.28-x86_64/* ./
rmdir mysql-8.0.37-linux-glibc2.28-x86_64
2、目录权限配置
沿用系统 mysql 用户,不需要新建用户:
chown -R mysql:mysql /data/opt/mysql
chmod 755 /data/opt/mysql/server
chmod 700 /data/opt/mysql/data
chmod 755 /data/opt/mysql/log
chmod 755 /data/opt/mysql/tmp
系统依赖(libaio、ncurses 软链接)整机只需要配置一次,新实例无需重复操作。
3、编写新实例配置文件 /data/opt/mysql/conf/my.cnf
[mysqld]
user = mysql
basedir = /data/opt/mysql/server
datadir = /data/opt/mysql/data
socket = /data/opt/mysql/tmp/mysql.sock
pid-file = /data/opt/mysql/tmp/mysql.pid
port = 13307
server-id = 2
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
lower_case_table_names = 0
log-error = /data/opt/mysql/log/mysqld.err
slow_query_log = 1
slow_query_log_file = /data/opt/mysql/log/slow.log
long_query_time = 2
log_bin = /data/opt/mysql/log/mysql-bin
binlog_format = row
max_connections = 1000
innodb_buffer_pool_size = 1G
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
[client]
socket = /data/opt/mysql/tmp/mysql.sock
port = 13307
default-character-set = utf8mb4
[mysqld_safe]
log-error = /data/opt/mysql/log/mysqld.err
pid-file = /data/opt/mysql/tmp/mysql.pid
4、初始化 MySQL 实例
重要:--defaults-file 必须放在命令第一个参数!
/data/opt/mysql/server/bin/mysqld --defaults-file=/data/opt/mysql/conf/my.cnf --initialize --user=mysql
初始化完成后,临时 root 密码会写入错误日志:
grep "temporary password" /data/opt/mysql/log/mysqld.err
5、配置 systemd 服务文件 /usr/lib/systemd/system/mysqld-13307.service
[Unit]
Description=MySQL Server 13307
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
Type=notify
TimeoutSec=0
PermissionsStartOnly=true
ExecStart=/data/opt/mysql/server/bin/mysqld --defaults-file=/data/opt/mysql/conf/my.cnf $MYSQLD_OPTS
LimitNOFILE = 5000
Restart=on-failure
RestartPreventExitStatus=1
Environment=MYSQLD_PARENT_PID=1
PrivateTmp=false
6、加载服务、启动、开机自启
systemctl daemon-reload
systemctl start mysqld-13307
systemctl enable mysqld-13307
systemctl status mysqld-13307
查看实时日志:
tail -f /data/opt/mysql/log/mysqld.err
7、登录实例并修改 root 密码
# 通过socket登录13307实例
mysql -uroot -p -S /data/opt/mysql/tmp/mysql.sock
该 root 账号属于 13307 独立实例,和 3306 的 root 账号完全隔离,互不影响。
8、两个实例登录方式区分
# 原有实例 3306
mysql -uroot -p -S /opt/mysql/tmp/mysql.sock
# 新增实例 13307
mysql -uroot -p -S /data/opt/mysql/tmp/mysql.sock
# 远程连接方式
mysql -hIP -P13307 -uroot -p
9、防火墙放行端口(按需)
ufw allow 13307/tcp
10、启停命令汇总
# 旧实例3306
systemctl start|stop|restart mysqld
# 新实例13307
systemctl start|stop|restart mysqld-13307
踩坑 & 注意事项
- PATH 环境变量里的 mysql bin 目录不影响多实例运行,连接时指定 socket / 端口即可;
- 内存规划:多个 MySQL 的
innodb_buffer_pool_size 总和不要超过物理内存的 50%~70%,防止 OOM;
- 严禁不同实例共用 datadir、socket、pid 文件,会直接导致数据损坏;
- 主从复制场景下,
server-id 必须全局唯一;
- 初始化失败优先看
mysqld.err 日志,权限、目录、参数错误基本都会在日志里体现。
end