尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

MySQL源码编译参数全解析:从CMake到生产部署的完整实践

发布时间:2026/9/29 23:48:13

资讯中心
01
ARTICLE

MySQL源码编译参数全解析:从CMake到生产部署的完整实践

MySQL源码编译参数全解析:从CMake到生产部署的完整实践
朋友前不久在Linux服务器上自己编译了一套MySQL结果卡在了cmake那一步来回折腾了快两个小时。他看着满屏的-D选项问我“这些参数到底都是干什么的哪些必须留哪些可有可无”说实话这个问题我问过自己很多遍。MySQL从源码编译安装这件事难点从来不在编译本身而在你对那一大堆编译参数的理解深度——搞懂它们等于把这个数据库的“骨架”亲手搭了一遍。很多人在网上找现成的编译命令复制粘贴一把梭。能用但一旦遇到报错、想定制功能、或者换了一台机器就懵了。这篇文章我打算把MySQL编译参数从头到尾掰开揉碎讲一遍包括每个参数默认是什么、选什么值、为什么这么选、踩过哪些坑。同时也给出一套可以直接复制的完整编译部署流程方便你在CentOS、Ubuntu这类Linux系统上从零搞出一套干净的MySQL实例。适合准备折腾源码安装、做离线部署、或者单纯想把MySQL原理摸透的同学。1. 为什么要碰编译参数源码安装的本质是什么1.1 三种安装方式三种策略MySQL的安装方式大致分三类用发行版自带的RPM或deb包、用官方编译好的二进制tar包、以及从源码现场编译。三种方式解决的问题不一样。RPM和deb包最省事但它能装的参数是被打包者锁死的。比如包管理器装出来的MySQL默认把数据目录放在/var/lib/mysql字符集、插件范围也都固定了。你没法在安装阶段就砍掉不需要的存储引擎也没法把local_infile默认打开。更麻烦的是很多定制化编译选项RPM包你压根看不到。官方二进制tar包比RPM灵活一些毕竟可以解压到任意目录。但它的构建配置同样是官方统一编译的默认开启了很多你未必需要的功能比如性能诊断、企业版相关组件的一部分依赖等。对绝大多数场景够用但如果你是安全要求很高的环境、想彻底裁剪体积或者需要把MySQL装到特定目录配合自己的一套体系它也不完美。源码编译安装说白了就是“自己动手做一份官方二进制”。你用cmake告诉MySQL源码“我要什么、我不要什么、东西放哪、依赖哪些库。”所以它能提供最强可控性。代价是编译过程耗时、依赖库得齐、出了问题得自己排查。1.2 什么样的人真正需要源码编译我的建议是如果只是装个数据库来跑业务直接选官方二进制包就行没必要折腾编译。但如果你属于下面几类情况源码编译就是正路有离线部署需求想把编译好的MySQL连同依赖一起打包带到内网。需要定制安装路径和数据目录比如公司要求统一挂载到某个业务磁盘下。需要裁剪功能比如只保留InnoDB去掉MyISAM、ARCHIVE等不用的引擎。需要固定字符集和排序规则从一开始就锁定utf8mb4免得后面应用连接出现乱码或排序不符合预期。需要结合安全基线在编译阶段就要禁掉local_infile、关掉不必要的组件。纯属学习研究想搞清楚MySQL的构建系统、依赖关系把基础打牢。1.3 编译参数本质上是什么MySQL从5.7时代开始就用CMake作为构建工具取代了旧的configure脚本。所以现在说的“编译参数”本质上就是传给cmake的以-D开头的一系列宏定义。每个-DXXXYYY都会影响两件事一是源码中的C/C预处理器宏二是生成的Makefile里的路径和编译规则。举个例子-DCMAKE_INSTALL_PREFIX/usr/local/mysql会让后续的make install把所有文件放到这个目录。而-DDEFAULT_CHARSETutf8mb4则会在编译期间把默认字符集写死在二进制里比在my.cnf里配置更“硬核”。理解这个区别很重要编译参数是编译时生效的底层配置运行时参数是进程启动后读取的配置文件两者互相配合但不完全互相覆盖。很多人编译好了之后随便写个my.cnf结果一些变量报错“unknown variable”就是因为在编译阶段没有启用对应功能运行时配置自然就认不出来。2. 编译前的准备依赖环境与源码包2.1 依赖库清单先行确认源码编译MySQL最烦人的就是缺依赖。官方文档列了一堆实际踩下来核心依赖就那几个gcc、g也就是gcc-c、cmake、make、bison、ncurses-devel、libaio-devel、openssl-devel以及zlib-devel。如果是CentOS 7这类老系统gcc版本可能偏旧编译MySQL 8.0会报错建议先升级devtoolset或者直接选能对应上的MySQL小版本。我常用的一套命令CentOS/RHEL系yum install -y gcc gcc-c cmake make bison ncurses-devel libaio-devel openssl-devel zlib-devel如果是Ubuntu/Debian系apt-get install -y gcc g cmake make bison libncurses-dev libaio-dev libssl-dev zlib1g-dev注意Ubuntu 20.04及以上系统的libncurses-dev包名可能带-dev后缀而不是-devel。另外老版本MySQL还依赖perl新版本基本放开了但如果你要跑mysql_upgrade或mysql_ssl_rsa_setup这类工具最好也把perl装上。2.2 源码包下载与版本选择源码包可以从MySQL官网下载也可以从镜像站拉。文件名通常是mysql-8.x.x.tar.gz或mysql-boost-x.x.x.tar.gz。第二个带boost的包会把Boost源码直接打包进来cmake阶段就不需要额外指定Boost路径一条-DWITH_BOOSTboost目录就能搞定。版本怎么选我的建议是尽量用同大版本的较新小版本。8.0系列选8.0.30以上因为之前版本在编译依赖和后续性能优化上有差距8.4和9.x是最新LTS和创新版追求新特性可以试但生产环境保守一点。5.7虽然还在一些老项目里大量存在但它已经接近生命周期尾期新环境不建议从源码编5.7了。解压源码包tar -xzf mysql-8.0.36.tar.gz cd mysql-8.0.36到这里不要急着执行cmake。先想清楚你要把MySQL装到哪、数据放哪、用什么字符集、打不打开SSL、要不要systemd支持。后面这一大堆问题都要落实成一行一行的-D参数。2.3 Boost依赖的处理方式MySQL 8.0源码编译强依赖Boost库而且对Boost版本有要求比如8.0.36要求Boost 1.7.2以上。你系统里如果装了Boost未必满足这个精确版本要求。此时最简单的方式是下载带-boost的源码包或者用-DDOWNLOAD_BOOST1 -DWITH_BOOST/usr/local/boost让cmake自动下载。我第一次编译时没注意Boost版本直接指定系统的Boost路径结果cmake卡在Could NOT find Boost翻遍头文件加路径依然不对最后还是用自动下载方案解决的。所以这块不要在参数上省钱明确写出-DDOWNLOAD_BOOST1 -DWITH_BOOST/usr/local/boost最省心前提是编译机器能联网。3. 核心编译参数逐项拆解每个-D背后都有讲究3.1 路径类参数装在哪数据放哪配置读哪CMAKE_INSTALL_PREFIX这是最基础也最关键的参数设定安装根目录。默认值是/usr/local/mysql这也是很多老教程的默认安装路径。实际生产环境经常有自己规划比如统一装到/opt/mysql或/app/mysql这没毛病。但注意参数一旦写在cmake命令里后续所有工具的默认路径都会跟着它走比如basedir、plugin_dir、share目录。所以建议一开始就定好避免装完再挪窝。MYSQL_DATADIR指定数据目录。MySQL 8.0的官方二进制默认数据目录编译期通常是/usr/local/mysql/data但你如果定制了安装路径数据目录最好也一起显式指定。比如-DCMAKE_INSTALL_PREFIX/usr/local/mysql -DMYSQL_DATADIR/data/mysql编译阶段指定的MYSQL_DATADIR会写进默认路径逻辑里mysqld在读到my.cnf里没有对应项时会拿它当默认值。不过要注意真正的数据目录权限是由初始化阶段决定的编译参数只是默认值运行时还是以配置文件为准。SYSCONFDIR指定my.cnf配置文件的默认搜索目录。默认编译是/etc。如果你想让MySQL读自定义位置的配置文件比如/usr/local/mysql/etc就在cmake时改掉。需要提醒的是MySQL读取配置文件的顺序是先/etc/my.cnf再SYSCONFDIR下的my.cnf最后是basedir下的my.cnf此外还受--defaults-file参数强制指定。所以不要以为编译了SYSCONFDIR就一定会优先读它这个优先级容易把人绕晕。3.2 服务类参数端口、socket与运行用户MYSQL_TCP_PORT指定默认TCP端口默认3306。如果是公司内网有多个MySQL实例并行可能需要把默认端口改成3307、3308这样。编译参数指定后mysqld启动时若没在配置文件中显式写port就会使用编译时的这个端口。平时单实例跑留默认就行不用给自己找麻烦。MYSQL_UNIX_ADDR指定Unix socket文件路径默认是/tmp/mysql.sock。这个参数也和热词里常出现的“error 2002 cant connect through socket /tmp/...”直接相关。很多本地客户端比如命令行mysql默认走socket连接如果客户端和服务端对socket路径的理解不一致连接就会失败。要么显式指定--socket/data/mysql/mysql.sock要么保持编译默认和运行时配置一致。我见过有人在cmake里把socket指到/data/mysql/mysql.sock结果忘了在my.cnf里写最后客户端走默认/tmp/mysql.sock找不到文件折腾半天。MYSQL_USER这个参数是编译期写入的默认运行用户。MySQL官方推荐用专门的mysql账号跑不要用root。cmake时-DMYSQL_USERmysql会在编译后生成的启动脚本和默认配置里体现出来。但注意编译参数不会自动创建系统账号你需要手动groupadd mysql useradd -r -g mysql -s /sbin/nologin mysql初始化数据目录时也用--usermysql这样mysqld进程会以mysql身份运行。如果编译时指定了mysql用户但系统里根本没这个账号初始化会报错。这块是新手比较容易忽略的坑。3.3 字符集类参数从源头锁定utf8mb4DEFAULT_CHARSET和DEFAULT_COLLATION这两个参数直接决定MySQL实例默认字符集和默认排序规则。之前我接手过一个项目MySQL是从老版本升级上来的默认字符集是latin1结果业务部门发现中文乱码查定位半天就是默认字符集的问题。源码编译时如果能一步到位设置成utf8mb4后面少很多麻烦。MySQL 8.0官方二进制默认就是utf8mb4和utf8mb4_0900_ai_ci。如果你是从源码编译5.7默认可能还是latin1就一定要显式指定-DDEFAULT_CHARSETutf8mb4 -DDEFAULT_COLLATIONutf8mb4_general_ci关于排序规则utf8mb4_general_ci和utf8mb4_unicode_ci的区别网上讨论很多简单说unicode_ci对更多语言排序更准确但老规则下性能略逊general_ci更快但排序粗略。8.0里还有utf8mb4_0900_ai_ci是Unicode 9.0标准MySQL官方默认。如果在兼容性和速度之间没特殊偏好建议直接用8.0默认的utf8mb4_0900_ai_ci别乱改。还有一个参数**EXTRA_CHARSETS**控制额外安装哪些字符集默认是all即全量编译。如果你做的是极为精简的副本可以设成none或只留需要的但一般不建议裁剪因为后续业务迁移时可能会用到各类字符集没有就会报错。MYSQL_COLLATION这个参数在某些版本上不生效真正关键的是上面的DEFAULT_COLLATION别搞混。3.4 依赖类参数SSL、压缩库与systemdWITH_SSLMySQL的SSL支持在编译阶段就决定了。参数可选值是yes、no、system、bundled。system表示使用系统自带的OpenSSL库bundled则是编译MySQL附带的SSL实现no就是彻底关掉SSL。我强烈建议生产环境选system同时保证系统的openssl-devel已安装。原因很简单系统的OpenSSL如果出安全漏洞你单独升级系统包就能覆盖MySQL的SSL依赖而bundled方式则要重新编译MySQL才能更新库。热词里有“mysql ssl连接错误”这类问题有相当一部分就出在WITH_SSL选择不当或者系统OpenSSL版本不匹配上。比如你编译时用bundled之后系统补丁升级了OpenSSL客户端和服务端协商SSL时版本差异可能引发奇怪错误。WITH_ZLIBzlib是压缩库关系到COMPRESS协议、备份压缩等功能。生产编译建议-DWITH_ZLIBsystem或bundled。如果是系统自带zlib且版本太老选bundled更稳。这个参数出错一般不会立刻暴露但当你启用压缩协议时才发现行为不对就晚了。WITH_SYSTEMD如果目标机器是用systemd管理服务的LinuxCentOS 7、Ubuntu 16.04都是建议编译时带上-DWITH_SYSTEMD1。这样安装后会有mysqld.service文件能用systemctl start mysqld来管理。不带这个参数就只能用mysqld_safe脚本启停维护体验差一截。但要注意开启了systemd支持后启动时mysqld可能会依赖systemd的Notify机制手动直接跑mysqld反而有些怪。所以要么编译时统一开启systemd要么统一用它自带脚本管理别混着来。WITH_BOOST需要配合DOWNLOAD_BOOST一起用-DDOWNLOAD_BOOST1 -DWITH_BOOST/usr/local/boost这样cmake构建时如果本目录下没有对应版本的boost就会自动下载并解压到/usr/local/boost后续重复编译也不需要重新下载。3.5 功能裁剪与开发模式参数ENABLED_LOCAL_INFILE这个参数控制LOAD DATA LOCAL INFILE是否可用。默认是OFF即不允许客户端通过local文件导入。这个功能很方便但有安全风险如果客户端连接被恶意控制可能诱导服务端读取客户端本地文件。所以如果业务没有一个强劲的理由非要本地导入建议默认保持OFF。只要你搞明白这个取舍编译参数怎么选都不会心虚。WITH_UNIT_TESTS编译时会同步构建单元测试方便开发调试但对生产环境来说纯属浪费时间。生产编译一定要加-DWITH_UNIT_TESTS0能节省不少编译时间。我在8核机器上实测开测试可以多编大几十分钟。MYSQL_MAINTAINER_MODE默认是OFF。开发模式开启后会开启一堆额外的编译器警告并把警告当错误处理适合MySQL源码开发者。普通编译务必保持OFF否则一个无害警告就让你编译失败。CMAKE_BUILD_TYPE生产环境用Release它会开启优化选项得到性能更好的二进制。除非你是调试崩溃问题需要走Debug和GDB否则不要选Debug。Debug版本的mysqld跑业务性能会明显下降体感上差一个档次。WITHOUT_ENGINEMySQL默认编译一堆存储引擎InnoDB、MyISAM、ARCHIVE、BLACKHOLE、MRG_MYISAM等。如果你想裁剪可以用-DWITHOUT_ARCHIVE1 -DWITHOUT_BLACKHOLE1这类方式关掉。但说句实话这些引擎占的体积和运行开销极小剪掉的意义有限。只有在极端精简或安全合规要求下才建议裁剪一般默认全保留即可。MYSQLX和**WITH_ROUTER**MySQL 8.0还有X插件和Router组件的编译开关。X Plugin默认编译提供MySQL X Protocol支持。如果你跑的是标准连接不打算用X DevAPI可以考虑关掉X插件来减少面。Router是独立于server的组件编译时通常-DWITH_ROUTER0可以跳过能缩短一些编译时间。4. 实操过程从cmake到跑起一个完整MySQL4.1 一套完整的cmake配置命令前面把参数讲透了下面直接给出一套我在生产环境用过多次、比较稳妥的8.0编译参数组合可直接对照参考cmake . \ -DCMAKE_INSTALL_PREFIX/usr/local/mysql \ -DMYSQL_DATADIR/data/mysql \ -DSYSCONFDIR/etc \ -DMYSQL_TCP_PORT3306 \ -DMYSQL_UNIX_ADDR/tmp/mysql.sock \ -DMYSQL_USERmysql \ -DDEFAULT_CHARSETutf8mb4 \ -DDEFAULT_COLLATIONutf8mb4_0900_ai_ci \ -DEXTRA_CHARSETSall \ -DWITH_SSLsystem \ -DWITH_ZLIBsystem \ -DWITH_BOOST/usr/local/boost \ -DDOWNLOAD_BOOST1 \ -DWITH_SYSTEMD1 \ -DENABLED_LOCAL_INFILE0 \ -DWITH_UNIT_TESTS0 \ -DMYSQL_MAINTAINER_MODEOFF \ -DCMAKE_BUILD_TYPERelease执行后cmake会做环境检测输出一大段配置信息。看到-- Configuring done和-- Generating done就说明这步过了。如果报错通常会在最底部给出原因比如缺库、Boost版本不对、编译器版本过旧。此时别急着重跑先解决依赖或调整参数再试。这里想重点强调一下cmake是增量工具但你改参数后最好删除CMakeCache.txt再重跑否则上次的参数会以缓存形式残留你以为改了某个-D实际生效的还是旧值。这个坑我踩过不止一次尤其切换Boost路径、修改数据目录时旧值直接影响后续编译结果。4.2 编译与安装阶段cmake成功后开始编译make -j$(nproc)-j参数可以并行编译。$(nproc)会自动读取CPU核心数。机器核数多会快很多但也要注意内存是否足够。make -j16在8G内存机器上可能直接OOM编译进程被Kill。一个实用建议先在top里看下内存如果是小内存机器把-j降到4或2宁可慢一点也别半路崩了。MySQL 8.0完全编译完在8核16G内存的环境下大概需要40到60分钟如果配置低可能要两三个小时。这段时间别闲着把下一步需要的系统账号、目录都先建好。编译完成后make install这步会把编译好的二进制、库文件、头文件、support-files等拷贝到/usr/local/mysql下。之前我们提到cmake要求的数据目录此时并不会自动创建make install只装程序数据目录是后面初始化时的事。接着创建运行用户和数据目录groupadd mysql useradd -r -g mysql -s /sbin/nologin mysql mkdir -p /data/mysql chown -R mysql:mysql /data/mysql chmod 750 /data/mysql4.3 初始化数据目录与启动服务MySQL 8.0没有mysql_install_db脚本了改成了mysqld --initialize/usr/local/mysql/bin/mysqld --initialize --usermysql --basedir/usr/local/mysql --datadir/data/mysql初始化完成后日志里会打印一条临时的root密码格式类似[Note] A temporary password is generated for rootlocalhost: xxxxxxxx这就是网上经常问的“怎么查看MySQL初始密码”的来源。8.0不再支持无密码空登录必须先拿临时密码登录再改。很多人初始化时没注意终端输出把密码漏掉了。解决办法是查看错误日志默认在数据目录下的hostname.err文件里用grep temporary password /data/mysql/*.err就能捞回来。启动前先写一个简单的my.cnf。因为编译时用了SYSCONFDIR/etc所以放到/etc/my.cnf[mysqld] basedir/usr/local/mysql datadir/data/mysql socket/tmp/mysql.sock port3306 usermysql然后启动systemctl start mysqld因为我们编译时加了WITH_SYSTEMD1可以这样托管。如果没有这个参数就用/usr/local/mysql/bin/mysqld_safe --usermysql 登录/usr/local/mysql/bin/mysql -uroot -p输入刚刚找到的临时密码立刻修改root密码ALTER USER rootlocalhost IDENTIFIED BY YourStrongPassword;到这里一个从源码编译的MySQL实例就跑起来了。后续的权限、业务账号、远程访问设置就跟普通MySQL一样了。5. 编译安装后的高频问题与排查思路5.1 error 2002socket连接失败的典型套路热词里有一句“error 2002 (HY000): cant connect to local mysql server through socket /tmp/...”这是本地客户端连接最常见的报错。先说结论这个错绝大多数情况下不是“密码错”而是“服务不在”或“socket路径不一致”。排查顺序我建议这样先确认mysqld进程是否活着ps -ef | grep mysqld。如果没进程就看错误日志。如果进程在确认socket文件是否存在ls -l /tmp/mysql.sock。不存在就说明mysqld没成功建socket大概率是启动中途崩了。再用客户端显式指定socket试一下mysql -uroot -p --socket/data/mysql/mysql.sock。能连上说明就是路径不一致。解决方式要么修改my.cnf里的socket路径给客户端写入一致的值要么干脆用-h127.0.0.1 -P3306走TCP连接绕开socket问题。但注意root用户的默认认证方式在MySQL 8.0里是caching_sha2_password走TCP需要SSL或RSA交换某些场景可能报SSL相关错误此时可以考虑创建专门的应用账号或者配置mysql_native_password。5.2 SSL连接错误编译参数与运行时证书的纠缠热词里也有“mysql ssl连接错误”。编译期WITH_SSL决定的是mysqld是否支持SSL、用哪种SSL后端但证书文件是运行时生成的。MySQL 8.0初始化数据目录时会自动生成一组自动签名的SSL证书和密钥放在数据目录下常见的文件名是ca.pem、server-cert.pem、server-key.pem、client-cert.pem。如果启动日志里出现SSL相关报错比如找不到证书、私钥权限不对先看数据目录下这些文件是否存在。如果缺失可以用/usr/local/mysql/bin/mysql_ssl_rsa_setup --datadir/data/mysql再重启。还有一种情况客户端连接时要求强SSL但服务端因为编译期WITH_SSLno根本没启用SSL就会报“SSL connection error”。这时只能重新编译打开SSL或者把客户端连接参数里的ssl-mode降级为DISABLED。我在实际操作中的经验是能让客户端和服务端都走默认TLS行为最好别轻易在客户端加--ssl-modeREQUIRED因为一旦服务端证书链有问题排查起来很麻烦。安全策略要求强制SSL时也要确保证书文件权限是mysql:mysql且600否则服务端读不了私钥连接时直接中断。5.3 cmake缓存残留与参数不生效刚才说过CMakeCache.txt是元凶。举一个具体场景你第一次编译时指定了CMAKE_INSTALL_PREFIX/usr/local/mysql3306跑了一半发现路径不对改了命令里的参数为/opt/mysql重跑cmake结果生成结果还是/usr/local/mysql3306。就是缓存残留。正确的做法是rm -f CMakeCache.txt rm -rf CMakeFiles然后再重跑cmake。尤其是CMAKE_INSTALL_PREFIX这种变量一旦第一次写入cache不会因为你第二次命令行里没写就消失必须清干净。这块建议做进你的部署文档里。5.4 编译报错速查表现象原因解法Could NOT find BoostBoost路径不对或版本不匹配用DOWNLOAD_BOOST1自动下载指定正确版本目录Failed to find libtinfo缺少ncurses/ncurses-libs安装ncurses-devel或libncurses-devCould not find openssl缺少openssl头文件安装openssl-devel后重跑cmakeNo such file or directory: c缺少gcc-c安装gcc-cError: couldnt identify versioncmake版本太老升级cmake到3.x以上编译中Killed内存不足降-j并发数加swaperror while loading shared libraries: libaio.so.1缺libaio运行库安装libaio或libaio1初始化时报--initialize不识别用错了旧版方式确认二进制路径是mysqld而非mysql_install_db这些报错如果遇到先冷静看最末尾的输出别从头翻log。CMake的错误信息基本都会人性化地指出缺的是哪个库按图索骥装包就行。5.5 与运行时配置混淆的误区还有一个容易踩的误区是“编译参数一定会覆盖运行时配置”。实际规则是只是默认值。mysqld启动时会按优先级读取my.cnf命令行参数优先级最高其次是配置文件最后才是编译期默认值。所以编译时指定MYSQL_TCP_PORT3307如果my.cnf里写了port3306实际监听就是3306。想要某个配置彻底固定不被动摇光靠编译参数不够还要配合权限管理控制谁有权限改my.cnf。这一点在做基线安全整改时挺关键别指望编译参数锁死一切。6. 一套值得反复使用的推荐参数组合总结下来我已经给过一套完整的生产编译命令了。这里再补充两个常见的实际场景组合供你们直接参考。第一类是“通用生产环境”推荐cmake . \ -DCMAKE_INSTALL_PREFIX/usr/local/mysql \ -DMYSQL_DATADIR/data/mysql \ -DMYSQL_TCP_PORT3306 \ -DMYSQL_UNIX_ADDR/tmp/mysql.sock \ -DDEFAULT_CHARSETutf8mb4 \ -DDEFAULT_COLLATIONutf8mb4_0900_ai_ci \ -DWITH_SSLsystem \ -DWITH_ZLIBsystem \ -DWITH_BOOST/usr/local/boost \ -DDOWNLOAD_BOOST1 \ -DWITH_SYSTEMD1 \ -DENABLED_LOCAL_INFILE0 \ -DWITH_UNIT_TESTS0 \ -DCMAKE_BUILD_TYPERelease第二类是“开发测试机快速验证”推荐cmake . \ -DCMAKE_INSTALL_PREFIX$HOME/mysql \ -DMYSQL_DATADIR$HOME/mysql/data \ -DMYSQL_UNIX_ADDR$HOME/mysql/mysql.sock \ -DDEFAULT_CHARSETutf8mb4 \ -DWITH_SSLsystem \ -DWITH_BOOST$HOME/boost \ -DDOWNLOAD_BOOST1 \ -DWITH_UNIT_TESTS0 \ -DCMAKE_BUILD_TYPERelWithDebInfo开发机上可以用RelWithDebInfo既有优化又保留调试信息出问题还能gdb跟一下。装到自己家目录省去root权限的麻烦也不需要单独建mysql系统账号直接当前用户跑。做这套方案时还需要注意一点不要盲目照搬别人的cmake参数。个人的建议是——先想清楚三个问题装在哪个路径、数据放哪个目录、需不需要默认开启额外功能然后再落实成参数。另外编译参数的记录工作值得花三分钟做一下。把完整的cmake命令、make时的内核数和内存情况、时间消耗统一写进部署文档。因为几个月后你要升级小版本、新增插件时翻这些记录远比重新试错快。我自己的习惯是把编译命令保存为一个build.sh脚本放在源码目录里每次重新编译直接调它改什么参数也都在里面留痕。这样即使隔了半年再回来看一眼脚本就能知道这套MySQL是怎么构建出来的。最后再分享一个小技巧如果你在同一个机器上想编译多个不同版本或不同参数组合的MySQL务必给每个build建独立目录。源码包解压后在源码目录外新建build目录比如mkdir build-8.0 cd build-8.0 cmake ../mysql-8.0.36 ...这样构建产物互不干扰CMakeCache.txt也不会因为切换参数而互相污染。我第一次没这么做直接在源码根目录编后来想对比不同SSL方案只能反复删缓存浪费时间。这个习惯建议一开始就养起来。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。