Ubuntu源码编译安装MySQL多实例配置指南
本文详细介绍在Ubuntu环境下通过源码编译方式安装MySQL并配置多实例的流程。内容涵盖CMake编译参数设置、用户权限处理及初始化过程,重点解析字符集不匹配和权限拒绝等常见错误的排查方法。
准备条件与环境清理
由于目标服务器(Ubuntu)之前已通过 apt-get 自动安装了MySQL,这会干扰后续的多实例配置。因此,第一步是彻底清理原有的系统级MySQL环境,避免配置文件和服务冲突。
- 创建基础目录与用户组: 为源码安装准备专用的用户和组。
# 创建mysql用户组
groupadd mysql
# 创建mysql系统用户并加入mysql组
useradd -r -g mysql mysql
- 清理残留文件: 防止旧的配置文件(如
/etc/my.cnf)影响新实例的加载。
# 进入源码解压后的顶层目录
make clean
rm -f CMakeCache.txt
rm -rf /etc/my.cnf
第1步:配置并编译MySQL源码
使用CMake工具进行源码配置,关键在于指定安装路径、数据目录以及字符集,以避免后续的乱码或兼容性问题。
- 目的: 生成Makefile文件并准备编译环境。
- 入口: MySQL源码解压后的根目录。
- 动作: 执行 cmake 命令,传入关键参数。
cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DENABLED_LOCAL_INFILE=1
- 参数说明:
-DCMAKE_INSTALL_PREFIX: 指定MySQL的安装主目录。-DDEFAULT_CHARSET: 设置为 utf8,避免默认 latin1 导致的多语言兼容问题。-DEXTRA_CHARSETS=all: 支持所有扩展字符集(可选,视需求而定)。
执行编译与安装:
make
make install
第2步:初始化单实例并验证成功状态
MySQL 5.7及以上版本推荐使用 mysqld --initialize,但在较早版本或特定源码环境中,常使用 scripts/mysql_install_db。多实例的核心在于为每个实例提供独立的配置文件和数据目录。
2.1 设置基本权限
在安装目录下,将根目录所有者设为 root,data 目录所有者设为 mysql 用户。
cd /usr/local/mysql
chown -R root:mysql .
chown -R mysql:mysql data
2.2 复制并修改配置文件 (以端口 3307 为例)
首先需要为第一个额外实例创建一个配置文件。假设我们将数据存放在 /usr/local/mysql/data_3307。
# 复制模板到指定位置作为新实例的my.cnf
cp support-files/my-medium.cnf /usr/local/mysql/data_3307/my.cnf
注意:需确保 /usr/local/mysql/data_3307/my.cnf 中的 port 设置为 3307,且 datadir 指向正确路径。
2.3 执行数据库初始化(关键点:--user=mysql)
这是最容易出错的环节。如果忽略 --user=mysql 参数,生成的文件将归属 root,导致后续启动失败。
错误场景演示:
若未加 --user=mysql,可能会遇到如下错误:
[ERROR] COLLATION 'latin1_swedish_ci' is not valid for CHARACTER SET 'utf8'
[ERROR] Fatal error: Can't open and lock privilege tables: Can't find file: './mysql/host.frm' (errno: 13)
原因分析: 1. 字符集配置冲突(上文已在 CMake 阶段解决)。 2. 权限不足(Errno 13),因为初始化时以 root 身份运行,生成的库文件归 root 所有,而 mysqld_safe 以 mysql 用户运行时无法读取。
正确操作:
cd /usr/local/mysql
./scripts/mysql_install_db \
--user=mysql \
--defaults-file=/usr/local/mysql/data_3307/my.cnf \
--datadir=/usr/local/mysql/data_3307/
完成判断: 命令行输出 "Installing MySQL system tables... OK" 且无 ERROR 日志,即表示该实例初始化成功。
第3步:启动MySQL多实例服务
分别针对不同的端口启动 mysqld_safe 进程。以下以 3307 端口为例。
3.1 启动单个实例
- 目的: 后台启动指定配置的MySQL服务。
- 动作: 使用 mysqld_safe 调用对应的配置文件。
mysqld_safe --defaults-file=/usr/local/mysql/data_3307/my.cnf &
3.2 验证启动状态
检查进程是否存活,以及监听是否正常:
ps -ef | grep mysql
netstat -tlnp | grep 3307
常见问题排查与总结
连接被拒或Socket找不到
在启动了多个实例后,直接输入 mysql 可能仍然连接到默认的 3306 端口(如果存在),或者出现 Can't connect to local MySQL server through socket '/tmp/mysql.sock' 错误。
解决方法: 必须明确指定主机地址和端口进行登录:
mysql -h127.0.0.1 -P3307 -u root -p
排错清单回顾
- 权限错误 (Errno 13): 初始化时必须添加
--user=mysql参数。 - 字符集错误: 编译时需统一指定
DDEFAULT_CHARSET=utf8。 - 旧环境干扰: 务必清理
/etc/my.cnf和已存在的 systemd/apt 服务。
以上就是基于Ubuntu源码编译安装MySQL多实例的详细流程。通过严格把控初始化阶段的权限与字符集参数,可以有效规避大部分部署陷阱。更多关于MySQL高级配置的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













