当前位置: 首页 > news >正文

从零到一:在Rocky Linux 9.6上源码编译部署MySQL 8.0全记录

1. 环境准备:打造坚实的编译基础

在Rocky Linux 9.6上源码编译MySQL 8.0,就像盖房子需要打好地基。我遇到过不少新手直接开干,结果被各种依赖问题卡住。咱们先花10分钟把基础环境收拾妥当,后面能省下几小时的排错时间。

首先确保你的系统是最新状态。我习惯先做个全面升级,这个命令会更新所有已安装的包:

sudo dnf update -y && sudo dnf upgrade -y

接下来是开发工具链的安装,这是编译的基石。Rocky Linux 9.6默认最小化安装时不会包含这些,需要手动安装开发工具组:

sudo dnf groupinstall "Development Tools" -y

编译MySQL 8.0需要特别注意几个关键依赖。有次我漏装了ncurses-compat-libs,导致编译到一半报错退出。完整依赖列表如下:

sudo dnf install -y wget vim libaio ncurses-compat-libs rpcgen \ gcc ncurses-devel libaio bison gcc-c++ git cmake \ gcc-toolset-12-gcc gcc-toolset-12-gcc-c++ \ gcc-toolset-12-binutils gcc-toolset-12-annobin-annocheck \ gcc-toolset-12-annobin-plugin-gcc

磁盘空间是另一个容易踩坑的地方。建议至少准备30GB可用空间。有次我在虚拟机里只分配了15GB,编译到80%时空间耗尽,前功尽弃。可以用这个命令检查空间:

df -h

如果空间不足,可以通过LVM扩容。比如我的根目录在/dev/rl/root卷组,添加新磁盘后:

vgextend rl /dev/nvme0n2 lvresize -L +19G -r /dev/rl/root

2. 特殊依赖处理:那些容易忽略的关键组件

MySQL 8.0编译对OpenSSL版本有特定要求。官方文档不会告诉你的是,某些场景下需要OpenSSL 1.0.x版本。我推荐手动编译安装,避免与系统自带的OpenSSL 3.0冲突。

先下载OpenSSL 1.0.2u源码包(注意这是个长期支持版本):

wget https://www.openssl.org/source/old/1.0.2/openssl-1.0.2u.tar.gz tar xvf openssl-1.0.2u.tar.gz cd openssl-1.0.2u

配置时加上shared参数很重要,否则MySQL编译时会找不到动态库:

./config --prefix=/opt/openssl-1.0.2u shared zlib make && sudo make install

最后要让系统找到这个新装的OpenSSL,执行:

echo '/opt/openssl-1.0.2u/lib' | sudo tee /etc/ld.so.conf.d/openssl-1.0.2u.conf sudo ldconfig

另一个常被忽略的是libtirpc。在Rocky Linux 9.6上,默认仓库可能没有合适的版本。我建议直接从EPEL仓库安装:

sudo dnf install -y epel-release sudo dnf install -y libtirpc libtirpc-devel

3. MySQL源码编译:魔鬼在细节里

现在来到重头戏——MySQL源码编译。我建议先创建专用用户和数据目录,避免使用root带来的安全隐患:

sudo useradd -r -s /sbin/nologin mysql sudo mkdir -p /data/mysql sudo chown -R mysql:mysql /data/mysql

下载MySQL 8.0.34源码包后,有个小技巧能节省大量时间。Boost库在线下载特别慢,我们可以提前下载好放到指定位置:

tar -zxf mysql-8.0.34.tar.gz cd mysql-8.0.34 mkdir boost cp -a ../boost_1_77_0.tar.bz2 boost/

CMake配置阶段是最容易出错的环节。这是我优化过的配置参数,包含了生产环境需要的所有引擎和特性:

cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \ -DEXTRA_CHARSETS=all \ -DDEFAULT_CHARSET=utf8mb4 \ -DDEFAULT_COLLATION=utf8mb4_general_ci \ -DWITH_MYISAM_STORAGE_ENGINE=1 \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_MEMORY_STORAGE_ENGINE=1 \ -DWITH_READLINE=1 \ -DENABLED_LOCAL_INFILE=1 \ -DMYSQL_USER=mysql \ -DMYSQL_TCP_PORT=3306 \ -DMYSQL_DATADIR=/data/mysql \ -DWITH_XTRADB_STORAGE_ENGINE=1 \ -DWITH_PARTITION_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITH_BIG_TABLES=1 \ -DDOWNLOAD_BOOST=1 \ -DWITH_BOOST=./boost \ -DWITH_SSL=system \ -DOPENSSL_ROOT_DIR=/opt/openssl-1.0.2u \ -DOPENSSL_INCLUDE_DIR=/opt/openssl-1.0.2u/include \ -DOPENSSL_LIBRARIES=/opt/openssl-1.0.2u/lib \ -DWITH_FEDERATED_STORAGE_ENGINE=1 \ -DFORCE_INSOURCE_BUILD=1

编译过程视机器性能可能需要1-3小时。建议使用nohup防止SSH断开导致中断:

make -j$(nproc) && sudo make install

4. 初始化与配置:安全启动的关键步骤

编译完成后,需要精心配置才能确保MySQL稳定运行。先创建配置文件/etc/my.cnf,这是我的生产级配置模板:

cat > /etc/my.cnf << EOF [client] port = 3306 socket = /tmp/mysql.sock [mysqld] user = mysql port = 3306 socket = /tmp/mysql.sock datadir = /data/mysql slow_query_log=1 slow_query_log_file=mysqld-slow.log long_query_time=2 sql-mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION' server-id=1 log-bin=bin_log character-set-server = utf8mb4 collation-server = utf8mb4_general_ci init_connect = 'SET NAMES utf8mb4 COLLATE utf8mb4_general_ci' !includedir /etc/my.cnf.d EOF

初始化数据库时,特别注意保存临时密码:

cd /usr/local/mysql/bin/ sudo ./mysqld --defaults-file=/etc/my.cnf --user=mysql \ --basedir=/usr/local/mysql --datadir=/data/mysql --initialize

把MySQL添加到PATH环境变量,方便日常使用:

echo "export PATH=\$PATH:/usr/local/mysql/bin/" | sudo tee -a /etc/profile source /etc/profile

首次启动建议用mysqld_safe,方便查看日志:

/usr/local/mysql/bin/mysqld_safe --user=mysql &

登录后立即修改root密码,并创建远程管理账号:

mysql -uroot -p ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的强密码'; CREATE USER 'admin'@'%' IDENTIFIED BY '另一个强密码'; GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;

5. 系统服务集成:专业运维的必备技能

生产环境需要将MySQL作为系统服务管理。创建/usr/lib/systemd/system/mysqld.service文件:

[Unit] Description=MySQL Server After=network.target [Service] User=mysql Group=mysql Type=notify ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf LimitNOFILE=10000 Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target

重载systemd并设置开机启动:

sudo systemctl daemon-reload sudo systemctl enable mysqld sudo systemctl start mysqld

验证服务状态时,我习惯用组合命令查看实时日志:

sudo systemctl status mysqld journalctl -u mysqld -f

遇到问题时,可以检查错误日志定位原因,默认位置在:

tail -f /data/mysql/$(hostname).err

6. 性能调优与安全加固

MySQL安装完成后,建议立即进行基础安全设置。执行mysql_secure_installation等效操作:

mysql -uroot -p DELETE FROM mysql.user WHERE User=''; DROP DATABASE IF EXISTS test; FLUSH PRIVILEGES;

调整InnoDB缓冲池大小(根据服务器内存的70-80%):

sudo tee -a /etc/my.cnf << EOF innodb_buffer_pool_size = 4G innodb_log_file_size = 256M innodb_flush_method = O_DIRECT EOF

配置连接数限制和超时设置:

max_connections = 200 wait_timeout = 300 interactive_timeout = 300

最后重启服务使配置生效:

sudo systemctl restart mysqld

7. 常见问题排坑指南

问题1:CMake报错找不到OpenSSL解决方法:检查OPENSSL_ROOT_DIR路径是否正确,确保lib和include目录存在。

问题2:编译过程中内存不足建议:增加swap空间或使用-j2参数限制并行编译线程数。

问题3:启动时报表空间错误可能是数据目录权限问题,执行:

sudo chown -R mysql:mysql /data/mysql

问题4:客户端连接认证失败检查是否使用了mysql_native_password插件:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '密码';

问题5:慢查询日志不生效确认slow_query_log=1且datadir有写入权限,必要时:

sudo touch /data/mysql/mysqld-slow.log sudo chown mysql:mysql /data/mysql/mysqld-slow.log

记得定期备份my.cnf配置文件,我在/usr/local/mysql/backup/下保留了各个版本的配置,方便回滚。源码编译的MySQL在性能调优时有更多灵活性,但也需要更多维护精力。建议设置每周自动日志轮转和每月完整备份的定时任务

http://www.jsqmd.com/news/643323/

相关文章:

  • 2026矿用信号电缆厂家推荐排行榜产能与专利双维度权威解析 - 爱采购寻源宝典
  • YOLOv8涨点新思路:实测SimAM注意力机制在不同检测任务中的效果对比
  • 2026年想高效轻松记账?几款便捷APP你别错过
  • 如何在本地快速部署DeepSeek的Janus-Pro-1B多模态大模型(附避坑指南)
  • 2026焊接蝶阀厂家推荐排行榜产能、专利、质量三维度权威对比 - 爱采购寻源宝典
  • GPEN镜像免配置部署:支持HTTPS+Basic Auth的企业安全访问配置
  • GLM-4.1V-9B-Base与YOLOv5协同实战:构建智能视频分析系统
  • PHP中json浮点精度的解决方法
  • 2026发电机厂家推荐排行榜产能与专利双优的权威选择 - 爱采购寻源宝典
  • GME-Qwen2-VL-2B在计算机网络教学中的应用:协议交互流程图解生成
  • ISSAC SIM机械臂任务封装实战:从控制器到自定义任务类
  • RS232串口硬件调试实战:从波形抓取到故障定位
  • 2026自吸泵厂家推荐排行榜大东海泵业无锡有限公司领衔(产能+专利+服务三重认证) - 爱采购寻源宝典
  • [实战] STM32H743 SAI双缓冲DMA实现零延迟音频流处理
  • 不止于预览:用docx-preview + Vue2打造一个可搜索、可高亮的简易在线文档阅读器
  • 2026玻镁净化板厂家推荐排行榜产能、专利、质量三维度权威对比 - 爱采购寻源宝典
  • 如何快速掌握Obsidian PDF导出:Better Export PDF插件的终极指南
  • AI净界RMBG-1.4在电商场景的应用:自动生成商品白底图实战
  • 2026穿线管厂家推荐排行榜产能、专利、服务三维度权威解析 - 爱采购寻源宝典
  • Qt上位机软件License模块实战:从硬件绑定到安全交付
  • Vue项目实战:海康H5Player多分屏监控播放器开发指南
  • VSCode插件开发:Hunyuan-MT Pro翻译工具扩展
  • java面试必问6:Spring IOC 是什么?从概念到原理,一篇讲透
  • 快速部署FLUX.1-dev镜像:无需复杂配置,直接访问Web界面开始创作
  • 方法概述以及执行原理
  • 2026气动快装球阀厂家推荐 纽顺阀门领衔(产能/专利/质量三维度权威排名) - 爱采购寻源宝典
  • 大场景渲染实战:从LOD算法到切换策略的深度解析
  • 在职转大模型,要不要裸辞?边工作边学真的跟得上吗?
  • 千问3.5-27B多场景落地:HR部门简历图片识别→自动提取教育/工作经历生成结构化JSON
  • 用Python实战解析社交网络影响力最大化:从Linear Threshold到Greedy算法