麒麟V10上不能源码编译MySQL 8.0,因官方未适配其定制glibc(2.28/2.34)及ICU 69+/OpenSSL 3.0+头文件,cmake阶段频报std::filesystem缺失、libatomic链接失败等错误,且运行时易触发GLIBCXX_3.4.29缺失和Segmentation fault。

mysqld 二进制部署是麒麟V10上最稳、最可控的方式;不建议在麒麟V10上源码编译 MySQL 8.0——官方未提供针对 Kylin V10 的 glibc 和内核头文件适配支持,实测中 cmake 阶段频繁报 std::filesystem 缺失、libatomic 链接失败、icu 版本冲突等错误,且耗时超 2 小时仍难通过。
为什么不能直接源码编译?
麒麟V10(SP1/SP3)基于 CentOS 8 衍生,但其 glibc 实际为定制版(如 glibc-2.28 或 2.34),而 MySQL 8.0.33+ 官方源码要求 glibc >= 2.29 且依赖完整 ICU 69+ 和 OpenSSL 3.0+ 头文件。麒麟仓库中默认不提供这些开发组件,手动补全后仍会触发 libstdc++.so.6: version `GLIBCXX_3.4.29' not found 类运行时错误。
- 官方只对
mysql-8.0.xx-linux-glibc2.28-x86_64.tar.xz这类二进制包做 Kylin V10 x86_64 兼容性验证 -
make过程中innodb子模块常因原子操作指令集不匹配(如缺少cmpxchg16b检测逻辑)静默失败 - 即使强行编译成功,
mysqld启动时大概率报Segmentation fault (core dumped),调试难度极高
该用哪种安装包?认准 glibc 和架构后缀
必须严格匹配系统 glibc 版本和 CPU 架构,否则 mysqld 直接无法执行:
解析 MySQL 8.0 的 DDL 脚本,并将表结构导出为 Excel 格式。适用于用户需将 MySQL 的 `CREATE TABLE` 语句转换为结构化的 Excel 文件场景,导出内容包含字段名、数据类型、长度及精度等信息。支持多张表的批量处理,每张表对应 Excel 中的一个独立工作表。适用于数据库文档编写、数据字典生成及模式分析等任务。
- 先查真实环境:
ldd --version看 glibc 主版本(如2.28),uname -m确认是x86_64 - 去 MySQL 官网归档页下载对应包:
mysql-8.0.43-linux-glibc2.28-x86_64.tar.xz(不是.rpm,也不是glibc2.12或glibc2.34) - 避免使用
.tar.gz包:它体积大、解压慢,且部分 Kylin V10 的gzip版本对长路径支持异常 - 跳过
mysql-test和debuginfo包:纯浪费磁盘空间,无实际部署价值
初始化时 --lower-case-table-names=1 必须加,且只能加一次
这是麒麟V10上最容易翻车的点:MySQL 8.0 默认开启表名大小写敏感(lower_case_table_names=0),但麒麟文件系统(ext4 + 默认挂载参数)实际不区分大小写。若初始化时不显式指定,后续建库/导入 SQL 时可能报 Table 'xxx' doesn't exist,而 SHOW TABLES 却能列出该表。
- 初始化命令必须带参数:
bin/mysqld --initialize --user=mysql --lower-case-table-names=1 --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data - 该参数仅在首次初始化生效;改配置文件再重启无效,强行修改会导致
mysqld启动失败并循环打印InnoDB: Assertion failure - 若已初始化错,唯一办法是删掉整个
data/目录,清空log/,重新执行初始化
服务注册后启动失败?重点查 socket 和 pid-file 路径权限
麒麟V10 的 systemd 对路径权限更敏感,mysqld 常因目录不可写而静默退出,journalctl -u mysql 只显示 Failed with result 'timeout',实际日志在 log-error 文件里。
-
socket路径不能放在/tmp:麒麟安全策略限制非 root 进程在/tmp创建 socket 文件 -
pid-file不能指向/run/mysqld/:该目录默认属主为root:root,mysql用户无权写入 - 正确做法是统一放在
/usr/local/mysql/data/下,并确保该目录chown -R mysql:mysql - 检查 SELinux 状态:
getenforce若为Enforcing,临时设为Permissive(setenforce 0),否则mysqld会被拒绝访问datadir
最终跑通的关键,往往卡在初始化参数是否写对、socket 是否避开 /tmp、以及 SELinux 是否被忽略——这三个点没踩准,其他步骤做得再细也白搭。

















