MySQL源码编译超详细教程

张开发
2026/4/9 20:15:53 15 分钟阅读

分享文章

MySQL源码编译超详细教程
MySQL 源码编译完整指南第一部分前置准备1.1 下载安装包方式一使用 wget 下载wgethttps://downloads.mysql.com/archives/get/p/23/file/mysql-boost-8.3.0.tar.gz方式二从官网下载访问https://www.mysql.com/downloads/选择合适的版本进行下载推荐下载带有 boost 库的版本以简化编译过程。1.2 安装依赖环境系统环境要求CentOS/RHEL 9.x 或更高版本# 安装编译依赖 dnf install cmake3 gcc git bison openssl-devel ncurses-devel \ systemd-devel rpcgen.x86_64 libtirpc-devel-1.3.3-9.el9.x86_64.rpm \ gcc-toolset-12-gcc gcc-toolset-12-gcc-c gcc-toolset-12-binutils \ gcc-toolset-12-annobin-annocheck gcc-toolset-12-annobin-plugin-gcc -y # 如果 libtirpc-devel 常规安装失败使用强制安装 rpm -ivh --nodeps libtirpc-devel-1.3.3-9.el9.x86_64.rpm依赖说明cmake3CMake 构建工具gcc、C/C 编译器gcc-cbison语法分析器openssl-develSSL/TLS 库开发文件ncurses-devel终端控制库开发文件systemd-develsystemd 库开发文件第二部分源码编译2.1 解压和准备编译目录# 解压源码包 tar zxf mysql-boost-8.3.0.tar.gz# 进入源码目录 cd mysql-8.3.0 # 创建编译目录 mkdir build cd build说明在 build 目录下进行编译可以保持源码目录的整洁便于后续清理。2.2 配置编译参数cmake3 .. \ -DCMAKE_INSTALL_PREFIX/usr/local/mysql \ -DMYSQL_DATADIR/data/mysql \ -DMYSQL_UNIX_ADDR/data/mysql/mysql.sock \ -DWITH_INNOBASE_STORAGE_ENGINE1 \ -DWITH_EXTRA_CHARSETSall \ -DDEFAULT_CHARSETutf8mb4 \ -DDEFAULT_COLLATIONutf8mb4_unicode_ci \ -DWITH_BOOSTbundled \ -DWITH_SSLsystem \ -DWITH_DEBUGOFF参数详解参数值说明-DCMAKE_INSTALL_PREFIX/usr/local/mysqlMySQL 安装目录-DMYSQL_DATADIR/data/mysql数据库数据存储目录-DMYSQL_UNIX_ADDR/data/mysql/mysql.sockMySQL Socket 文件位置-DWITH_INNOBASE_STORAGE_ENGINE1启用 InnoDB 存储引擎必选-DWITH_EXTRA_CHARSETSall支持所有字符集-DDEFAULT_CHARSETutf8mb4默认字符集推荐-DDEFAULT_COLLATIONutf8mb4_unicode_ci默认排序规则-DWITH_BOOSTbundled使用捆绑的 Boost 库-DWITH_SSLsystem使用系统 SSL 库-DWITH_DEBUGOFF关闭调试信息生产环境推荐2.3 重新配置如需要如果配置过程出错需要重新配置# 方法一删除整个编译目录重新开始 rm -rf build/ mkdir build cd build # 重新执行 cmake 配置 cmake3 .. \ -DCMAKE_INSTALL_PREFIX/usr/local/mysql \ -DMYSQL_DATADIR/data/mysql \ -DMYSQL_UNIX_ADDR/data/mysql/mysql.sock \ -DWITH_INNOBASE_STORAGE_ENGINE1 \ -DWITH_EXTRA_CHARSETSall \ -DDEFAULT_CHARSETutf8mb4 \ -DDEFAULT_COLLATIONutf8mb4_unicode_ci \ -DWITH_BOOSTbundled \ -DWITH_SSLsystem \ -DWITH_DEBUGOFF常见错误排查如果出现 “Could not find” 相关错误检查依赖是否完全安装如果出现权限错误确认当前用户有足够权限2.4 编译源码砰# 使用 2 个进程编译 -j2 表示有几个核心就跑几个进程 make -j2 # 使用 4 个进程编译根据 CPU 核心数调整 make -j4 # 自动检测 CPU 核心数并充分利用推荐 make -j$(nproc)并行编译说明-j参数后的数字表示并行进程数通常设置为 CPU 核心数过多进程会导致内存溢出适度即可编译过程中会输出大量日志不用担心编译时间参考单核30-60 分钟双核15-30 分钟四核以上5-15 分钟第三部分安装和配置3.1 安装 MySQL[rootmysql-node1 build]# make install # 执行安装命令 [rootmysql-node1 build]# cd /usr/local/mysql/ # 进入安装目录 [rootmysql-node1 build]# ls -la # 验证安装预期目录结构bin/ # MySQL 可执行程序 lib/ # 库文件 share/ # 配置文件和文档 support-files/ # 支持脚本3.2 配置环境变量# 编辑用户配置文件 [rootmysql-node1 mysql]# vim ~/.bash_profile添加以下内容# User specific environment and startup programs export PATH$PATH:/usr/local/mysql/bin #设置mysql运行环境的环境变量使配置生效source ~/.bash_profile验证配置# 查看 MySQL 路径 which mysql # 输出应该为/usr/local/mysql/bin/mysql3.3 创建 MySQL 用户和数据目录# 创建 mysql 用户不允许登录 useradd -r -s /sbin/nologin -M mysql # 创建数据目录 mkdir -p /data/mysql # 设置目录权限 chown mysql.mysql /data/mysql参数说明-r创建系统用户-s /sbin/nologin禁用登录-M不创建主目录3.4 配置 MySQL 配置文件[rootmysql-node1 ~]# vim /etc/my.cnf添加以下内容INI[mysqld] datadir/data/mysql socket/data/mysql/mysql.sock第四部分数据库初始化4.1 初始化数据结构砰mysqld --initialize --usermysql说明此命令会在 目录下创建必要的数据库文件/data/mysql会生成一个临时 root 密码记录在错误日志中首次登录时必须修改此临时密码4.2 初始化常见问题问题 1权限不足# 确保 mysql 用户有数据目录权限 chown -R mysql.mysql /data/mysql chmod -R 750 /data/mysql问题 2目录已存在# 如果目录已存在有旧数据需要备份后清空 mv /data/mysql /data/mysql.bak mkdir -p /data/mysql chown mysql.mysql /data/mysql第五部分启动 MySQL5.1 安装启动脚本# 检查系统是否支持 init.d dnf whatprovides /etc/init.d # 如果未安装 initscripts需要先安装 dnf install initscripts -y # 或指定版本安装 dnf install initscripts-10.11.5-1.el9.x86_64 -y# 复制 MySQL 提供的启动脚本到系统目录 cp -p /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld # 设置脚本执行权限 chmod x /etc/init.d/mysqld # 验证脚本 ls -la /etc/init.d/mysqld5.2 启动 MySQL 服务# 启动 MySQL 服务 /etc/init.d/mysqld start # 查看启动状态 echo $? # 输出 0 表示成功其他数字表示失败预期输出代码Starting MySQL.Logging to /data/mysql/mysql-node1.err. . SUCCESS!5.3 设置开机自启# 设置开机启动运行级别 3 和 5 chkconfig --level 35 mysqld on # 验证设置 chkconfig --list mysqld # 输出应该显示mysqld 0:off 1:off 2:off 3:on 4:off 5:on 6:off第六部分安全初始化6.1 首次登录和修改密码# 首次使用临时密码登录 mysql -u root -p # 输入从初始化日志中获取的临时密码 Enter password: [粘贴临时密码]首次登录后必须修改密码-- 设置新密码必须在首次登录时执行 ALTER USER rootlocalhost IDENTIFIED BY 新密码; -- 刷新权限 FLUSH PRIVILEGES; -- 退出 exit;6.2 运行安全初始化脚本# 执行安全初始化向导 mysql_secure_installation交互式提示说明提示建议选择说明输入 root 密码输入初始化时的临时密码-设置新密码n修改 root 密码,因为开始设置过不需要重复启用密码验证n可选生产环境建议 y删除匿名用户y提高安全性禁止 root 远程登录y仅允许本地连接删除测试数据库y清理测试环境重载权限表y使改动生效6.2 验证安装砰# 测试本地连接 mysql -u root -p # 查看 MySQL 版本 mysql --version # 连接后查看数据库 show databases;故障排除完整指南问题 1CMake 配置失败错误表现CMake 命令报错检测不到依赖库无法生成 Makefile解决步骤# 1. 检查依赖是否完整安装 rpm -qa | grep -E cmake|gcc|openssl|ncurses # 2. 删除编译目录重新开始 cd /root/mysql-8.3.0 rm -rf build/ mkdir build cd build # 3. 重新执行 cmake 配置 cmake3 .. \ -DCMAKE_INSTALL_PREFIX/usr/local/mysql \ -DMYSQL_DATADIR/data/mysql \ -DMYSQL_UNIX_ADDR/data/mysql/mysql.sock \ -DWITH_INNOBASE_STORAGE_ENGINE1 \ -DWITH_EXTRA_CHARSETSall \ -DDEFAULT_CHARSETutf8mb4 \ -DDEFAULT_COLLATIONutf8mb4_unicode_ci \ -DWITH_BOOSTbundled \ -DWITH_SSLsystem \ -DWITH_DEBUGOFF # 4. 如果仍然失败查看完整错误信息 cmake3 .. [参数...] 21 | tee cmake.log cat cmake.log | tail -50问题 2编译时间过长或中途卡死错误表现编译进度卡在某个文件内存占用过高编译超过预期时间解决步骤# 1. 检查系统资源 free -h # 查看内存 df -h # 查看磁盘空间 top # 查看 CPU 使用率 # 2. 减少并行进程数 make -j2 # 使用 2 个进程 # 3. 如果编译中断清空后重试 make clean make -j2 # 4. 增加交换空间如内存不足 dd if/dev/zero of/swapfile bs1G count4 mkswap /swapfile swapon /swapfile问题 3启动脚本不存在或权限不足错误表现-bash: /etc/init.d/mysqld: No such file or directory Permission denied解决步骤# 1. 检查 init.d 目录是否存在 ls -la /etc/init.d/ # 2. 安装 initscripts 包 dnf install initscripts -y # 3. 复制启动脚本 cp -p /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld # 4. 设置执行权限 chmod x /etc/init.d/mysqld ls -la /etc/init.d/mysqld # 5. 尝试启动 /etc/init.d/mysqld start问题 4初始化失败或无法生成临时密码错误表现mysqld: error while loading shared libraries: libssl.so.1.1 Error while executing the initialization SQL解决步骤# 1. 检查是否有旧的数据文件 ls -la /data/mysql/ # 2. 备份旧数据如需要 mv /data/mysql /data/mysql.bak.$(date %s) # 3. 重新创建目录并设置权限 mkdir -p /data/mysql chown mysql.mysql /data/mysql chmod 750 /data/mysql # 4. 检查库文件依赖 ldd /usr/local/mysql/bin/mysqld | grep not found # 5. 重新初始化 mysqld --initialize --usermysql # 6. 查看初始化日志 cat /data/mysql/mysql-node1.err | grep -E password|error问题 5无法找到临时密码错误表现临时密码未出现在日志中解决步骤# 1. 查看完整错误日志 cat /data/mysql/mysql-node1.err # 2. 搜索所有可能的密码相关信息 grep -i password\|temporary /data/mysql/mysql-node1.err # 3. 如果真的没有生成密码使用跳过权限方式启动 /usr/local/mysql/bin/mysqld --usermysql --skip-grant-tables # 4. 无密码连接 mysql -u root # 5. 重置密码 FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY 新密码; exit; # 6. 杀死后台进程 killall mysqld # 7. 正常启动 /etc/init.d/mysqld start问题 6启动失败端口占用或其他错误错误表现ERROR: Cant initialize database directory Starting MySQL... /etc/init.d/mysqld: line xxx: /usr/local/mysql/bin/mysqld: No such file解决步骤# 1. 检查端口是否被占用 netstat -tuln | grep 3306 # 2. 查看详细错误信息 /etc/init.d/mysqld start tail -50 /data/mysql/mysql-node1.err # 3. 检查 mysqld 可执行文件 ls -la /usr/local/mysql/bin/mysqld file /usr/local/mysql/bin/mysqld # 4. 检查必要的库文件 ldd /usr/local/mysql/bin/mysqld # 5. 重新启动 /etc/init.d/mysqld restart问题 7首次登录提示密码过期错误表现ERROR 1862 (HY000): Your password has expired. To log in you must change it using a client that supports expired passwords.解决步骤# 1. 使用临时密码登录并立即修改 mysql -u root -p # 2. 执行密码修改 ALTER USER rootlocalhost IDENTIFIED BY 新密码; FLUSH PRIVILEGES; exit; # 3. 用新密码重新登录 mysql -u root -p Enter password: [新密码]常用命令速查表MySQL 服务管理# 启动 MySQL 服务 /etc/init.d/mysqld start systemctl start mysqld # systemd 方式 # 停止 MySQL 服务 /etc/init.d/mysqld stop systemctl stop mysqld # systemd 方式 # 重启 MySQL 服务 /etc/init.d/mysqld restart systemctl restart mysqld # systemd 方式 # 查看 MySQL 状态 /etc/init.d/mysqld status systemctl status mysqld # systemd 方式 # 设置开机自启 chkconfig --level 35 mysqld on systemctl enable mysqld # systemd 方式 # 取消开机自启 chkconfig --del mysqld systemctl disable mysqld # systemd 方式MySQL 连接和查询# 连接到本地 MySQL交互式 mysql -u root -p # 连接到本地 MySQL指定密码不推荐 mysql -u root -p密码 # 连接到远程 MySQL mysql -h 192.168.1.10 -u root -p # 连接后执行单条命令 mysql -u root -p -e show databases; # 导入 SQL 文件 mysql -u root -p dump.sql # 导出数据库 mysqldump -u root -p database_name backup.sql进程和日志管理# 查看 MySQL 进程 ps aux | grep mysqld pgrep -a mysqld # 更简洁的方式 # 查看 MySQL 占用端口 netstat -tuln | grep 3306 lsof -i :3306 # 查看端口占用程序 # 查看 MySQL 错误日志 cat /data/mysql/mysql-node1.err # 实时监控日志 tail -f /data/mysql/mysql-node1.err # 查看慢查询日志若启用 tail -f /data/mysql/slow.log # 查看访问日志大小 du -sh /data/mysql/性能监控# 查看 MySQL 版本 mysql -V # 查看 MySQL 进程内存占用 ps aux | grep mysqld | awk {print $6} | tail -1 # 查看 MySQL 打开的文件数 lsof -p $(pgrep mysqld) | wc -l # 查看数据库大小 mysql -u root -p -e SELECT table_schema, SUM(data_length) FROM information_schema.tables GROUP BY table_schema; # 实时监控 MySQL 状态 watch -n 1 mysql -u root -p -e show processlist; 2/dev/null目录结构# 查看 MySQL 安装目录 ls -la /usr/local/mysql/ # 查看数据存储目录 ls -la /data/mysql/ # 查看配置文件 cat /etc/my.cnf # 查看启动脚本 cat /etc/init.d/mysqld性能优化建议内存配置# 根据物理内存调整参考值 # 内存 2GB innodb_buffer_pool_size 内存的 50% # 2GB 内存 8GBinnodb_buffer_pool_size 内存的 60-70% # 内存 8GB innodb_buffer_pool_size 内存的 70-80% [mysqld] innodb_buffer_pool_size2G # 示例8GB 内存的服务器 innodb_log_file_size512M key_buffer_size256M max_connections1000查询优化-- 启用慢查询日志 SET GLOBAL slow_query_log ON; SET GLOBAL long_query_time 2; -- 查看当前配置 SHOW VARIABLES LIKE %slow%; SHOW VARIABLES LIKE %query_time%;定期维护# 每周备份数据库 mysqldump -u root -p --all-databases backup_$(date %Y%m%d).sql # 清理日志文件 mysql -u root -p -e PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY); # 检查表完整性 mysql -u root -p -e CHECK TABLE database_name.*;安全建议用户权限管理-- 创建用户并授予权限 CREATE USER appuserlocalhost IDENTIFIED BY 密码; GRANT SELECT, INSERT, UPDATE, DELETE ON database_name.* TO appuserlocalhost; -- 远程用户 CREATE USER appuser192.168.1.% IDENTIFIED BY 密码; GRANT SELECT, INSERT, UPDATE, DELETE ON database_name.* TO appuser192.168.1.%; -- 刷新权限 FLUSH PRIVILEGES; -- 查看用户 SELECT user, host FROM mysql.user; -- 删除用户 DROP USER appuserlocalhost;防火墙配置# 允许特定 IP 访问 MySQL3306 端口 firewall-cmd --zonepublic --add-rich-rulerule familyipv4 source address192.168.1.0/24 port protocoltcp port3306 accept --permanent # 只允许本地访问 firewall-cmd --zonepublic --remove-servicemysql --permanent # 重载防火墙 firewall-cmd --reload最后更新2026-04-08MySQL 版本8.3.0t -p -e “CHECK TABLE database_name.*;”------ ## 安全建议 ### 用户权限管理– 创建用户并授予权限CREATE USER ‘appuser’‘localhost’ IDENTIFIED BY ‘密码’;GRANT SELECT, INSERT, UPDATE, DELETE ON database_name.* TO ‘appuser’‘localhost’;– 远程用户CREATE USER ‘appuser’‘192.168.1.%’ IDENTIFIED BY ‘密码’;GRANT SELECT, INSERT, UPDATE, DELETE ON database_name.* TO ‘appuser’‘192.168.1.%’;– 刷新权限FLUSH PRIVILEGES;– 查看用户SELECT user, host FROM mysql.user;– 删除用户DROP USER ‘appuser’‘localhost’;### 防火墙配置允许特定 IP 访问 MySQL3306 端口firewall-cmd --zonepublic --add-rich-rule‘rule family“ipv4” source address“192.168.1.0/24” port protocol“tcp” port“3306” accept’ --permanent只允许本地访问firewall-cmd --zonepublic --remove-servicemysql --permanent重载防火墙firewall-cmd --reload------ **最后更新** 2026-04-08 **MySQL 版本** 8.3.0 **系统要求** CentOS/RHEL 9.x 或更高版本

更多文章