1. 麒麟系统编译安装MariaDB 12.2全记录
最近在国产麒麟系统上部署一套新的数据库服务,考虑到Oracle MySQL的商业授权问题,最终选择了完全开源的MariaDB 12.2版本。由于生产环境服务器无法连接外网,整个编译安装过程需要手动处理所有依赖,这里把完整操作流程和踩坑经验记录下来,给有同样需求的同行参考。
2. 环境准备与依赖检查
2.1 系统版本确认
首先确认基础环境,我使用的是基于openEuler的麒麟服务器操作系统:
bash复制Linux test-kyline-vs1 6.6.0-32.11.v2505.ky11.x86_64
这个内核版本已经包含了常用的开发工具链,但编译MariaDB还需要额外安装一些开发包。
2.2 依赖包安装
执行以下命令安装编译所需的基础依赖:
bash复制yum install -y gcc gcc-c++ openssl-devel ncurses-devel pcre2-devel \
systemd-devel libxml2-devel boost-devel openssl-devel zlib-devel \
pcre-devel curl-devel bzip2-devel lz4-devel xz-devel snappy-devel \
cyrus-sasl-devel openldap-devel
注意:麒麟系统的yum源可能需要先配置好本地或内网镜像源,如果遇到依赖包缺失的情况,建议先检查
/etc/yum.repos.d/目录下的repo文件配置。
这些依赖包主要分为几类:
- 基础编译工具链(gcc/g++)
- 加密相关(openssl)
- 字符界面处理(ncurses)
- 正则表达式支持(pcre/pcre2)
- 系统服务集成(systemd)
- 压缩算法支持(zlib/bzip2/lz4等)
2.3 Java环境配置
虽然MariaDB本身是用C++编写的,但其测试套件和部分工具需要Java环境。配置JDK 1.8的环境变量:
bash复制export JAVA_HOME=/usr/java/jdk1.8.0_261/
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib
实操心得:如果服务器上没有安装JDK,可以到Oracle官网下载对应版本的JDK tar包,解压到/usr/java/目录即可。记得检查
java -version确认环境变量生效。
3. 源码编译配置
3.1 CMake参数解析
MariaDB使用CMake作为构建系统,以下是我使用的配置参数及其含义:
bash复制cmake . \
-DCMAKE_INSTALL_PREFIX=/app/mariadb \ # 安装目录
-DMYSQL_DATADIR=/data/mariadb/ \ # 数据存储目录
-DSYSCONFDIR=/etc/ \ # 配置文件目录
-DMYSQL_USER=mysql \ # 运行用户
-DWITH_INNOBASE_STORAGE_ENGINE=1 \ # 启用InnoDB引擎
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \ # 启用Archive引擎
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ # 启用Blackhole引擎
-DWITH_PARTITION_STORAGE_ENGINE=1 \ # 启用分区支持
-DWITHOUT_MROONGA_STORAGE_ENGINE=1 \ # 禁用Mroonga引擎
-DWITH_DEBUG=0 \ # 关闭调试模式
-DWITH_READLINE=1 \ # 启用readline支持
-DWITH_SSL=system \ # 使用系统SSL库
-DWITH_ZLIB=system \ # 使用系统zlib库
-DWITH_PCRE=system \ # 使用系统PCRE库
-DWITH_BOOST=system \ # 使用系统Boost库
-DWITH_LIBWRAP=0 \ # 禁用TCP包装
-DENABLED_LOCAL_INFILE=1 \ # 允许本地文件加载
-DMYSQL_UNIX_ADDR=/data/mariadb/mariadb.sock \ # Socket文件路径
-DDEFAULT_CHARSET=utf8mb4 \ # 默认字符集
-DDEFAULT_COLLATION=utf8mb4_general_ci \ # 默认排序规则
-DWITH_SYSTEMD=yes # 支持systemd管理
关键参数说明:
WITH_*_STORAGE_ENGINE:按需启用存储引擎,生产环境通常只需要InnoDBWITH_SYSTEMD=yes:如果要使用systemd管理服务必须开启DEFAULT_CHARSET:建议使用utf8mb4以支持完整Unicode字符(包括emoji)- 路径相关参数需要提前创建好目录并设置正确的权限
3.2 离线环境特殊处理
在没有外网连接的环境中,fmt库需要手动处理:
-
从GitHub下载fmt-12.1.0.zip:
bash复制
wget https://github.com/fmtlib/fmt/releases/download/12.1.0/fmt-12.1.0.zip -
创建目标目录并复制文件:
bash复制mkdir -p extra/libfmt/src/ cp fmt-12.1.0.zip mariadb-12.2.2/extra/libfmt/src/
避坑指南:如果编译时仍然报fmt相关错误,可以尝试在CMake参数中添加
-DFORCE_BUNDLED_FMT=ON强制使用bundled版本。
4. 编译与安装
4.1 并行编译优化
使用make的-j参数可以显著加快编译速度,数值一般为CPU核心数的1.5倍左右:
bash复制make -j10
编译过程中需要关注:
- 内存消耗:并行编译会占用大量内存,建议至少有8GB可用内存
- 错误日志:如果某个线程失败,可以尝试降低并行度重新编译
- 临时文件空间:确保/tmp分区有足够空间(至少10GB)
4.2 安装与目录结构
编译完成后执行安装:
bash复制make install
安装后的目录结构如下:
code复制/app/mariadb/
├── bin/ # 可执行文件
├── data/ # 数据目录(符号链接到/data/mariadb)
├── include/ # 头文件
├── lib/ # 库文件
├── share/ # 支持文件
└── support-files/ # 初始化脚本
4.3 系统服务配置
由于启用了systemd支持,可以创建服务单元文件:
bash复制cp /app/mariadb/support-files/systemd/mariadb.service /usr/lib/systemd/system/
systemctl daemon-reload
服务文件需要根据实际路径调整以下参数:
ExecStart=/app/mariadb/bin/mysqldLimitNOFILE=10000# 建议根据负载调整
5. 初始化与安全设置
5.1 数据库初始化
创建mysql用户并初始化数据目录:
bash复制useradd -r -s /sbin/nologin mysql
mkdir -p /data/mariadb
chown -R mysql:mysql /data/mariadb
/app/mariadb/scripts/mysql_install_db --user=mysql --datadir=/data/mariadb
5.2 基础安全配置
编辑/etc/my.cnf添加最小安全配置:
ini复制[mysqld]
datadir=/data/mariadb
socket=/data/mariadb/mariadb.sock
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d
创建必要的日志和运行时目录:
bash复制mkdir /var/log/mariadb /var/run/mariadb
chown -R mysql:mysql /var/log/mariadb /var/run/mariadb
5.3 服务启动与验证
启动服务并设置开机自启:
bash复制systemctl start mariadb
systemctl enable mariadb
验证安装是否成功:
bash复制/app/mariadb/bin/mysqladmin -u root version
6. 常见问题排查
6.1 编译阶段问题
问题1:缺少fmt库导致编译失败
解决方案:
- 确认fmt-12.1.0.zip已正确放置在extra/libfmt/src/目录
- 检查zip文件完整性:
unzip -t fmt-12.1.0.zip - 尝试清理CMake缓存重新配置:
rm CMakeCache.txt && cmake ...
问题2:内存不足导致编译中断
解决方案:
- 减少并行编译线程数:
make -j4 - 创建swap空间临时解决:
bash复制dd if=/dev/zero of=/swapfile bs=1G count=4 chmod 600 /swapfile mkswap /swapfile swapon /swapfile
6.2 运行阶段问题
问题1:无法通过socket连接
典型错误:
code复制ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/data/mariadb/mariadb.sock'
排查步骤:
- 确认服务正在运行:
systemctl status mariadb - 检查socket文件权限:
ls -l /data/mariadb/mariadb.sock - 确认my.cnf中socket路径配置正确
问题2:表大小写敏感问题
麒麟系统默认使用区分大小写的文件系统,可能导致表名大小写问题。可以在my.cnf中添加:
ini复制[mysqld]
lower_case_table_names=1
重要提示:此参数需要在初始化数据库前设置,否则需要重建整个数据库。
7. 性能优化建议
7.1 内存配置优化
根据服务器内存调整以下参数(在/etc/my.cnf中):
ini复制[mysqld]
innodb_buffer_pool_size = 4G # 建议为物理内存的50-70%
innodb_log_file_size = 512M # 通常设置为buffer pool的25%
innodb_flush_log_at_trx_commit = 2 # 平衡性能与持久性
7.2 存储引擎配置
禁用不必要的存储引擎以减少内存占用:
ini复制[mysqld]
skip-archive
skip-blackhole
7.3 连接池优化
调整连接相关参数:
ini复制[mysqld]
max_connections = 200
thread_cache_size = 20
table_open_cache = 2000
这些参数需要根据实际业务负载进行调整,建议先使用默认值运行,再通过监控逐步优化。