简介:这份资源是 MySQL 4.1.11 版本的源码压缩包,面向需要在 Linux/Unix 环境下回溯旧版数据库的开发者、运维人员及数据库学习者,可用于搭建兼容性测试环境、研究早期 MySQL 架构或复现历史项目部署。包内共 4541 个文件,以 C 源码(829 个)、头文件(441 个)、C++ 源码(363 个 hpp、351 个 cpp)为主体,辅以大量测试用例(result、test、tcl)、构建脚本(am、in、sh)及 Java、Perl 相关组件,完整保留了源码编译所需的目录结构与配置脚本,压缩包约 21.82MB。已有 197 人学习下载。读者可从中获得从 configure、make 到初始化数据目录的完整源码构建素材,并借助内置测试套件与文档了解 4.1 分支的功能边界,适合作为旧版本兼容验证与源码级学习的参考。
1. 老版本 MySQL 源码包安装:从 mysql-4.1.11.tar.gz 说起
上周帮某实验室迁移一台老业务机,交接文档里只写了一行「数据库:mysql-4.1.11.tar.gz 源码编译」。我第一反应是这版本比我入行还早,第二反应是麻烦了——这种 4.x 时代的老包,没有现成的二进制分发包,也没有现代包管理器能直接拉,只能老老实实走./configure && make && make install那条路。更坑的是,它默认的编译参数、字符集、socket 路径跟现在主流的 5.7/8.0 完全不是一套逻辑,照着新版本教程抄,十有八九在configure阶段就翻车。这篇笔记就是记录我怎么把 mysql-4.1.11.tar.gz 这套环境从零装到能连、能建库、能跑一条查询的完整过程,适合手里攥着这个老包、又不想在编译报错里反复试错的开发者。装不好会怎样?轻则mysql客户端连不上 socket,重则编译到一半缺库直接中断,前面半小时白等。
2. 装前把环境和依赖列清楚:4.1.11 挑系统也挑编译器
2.1 版本定位与系统选择
mysql-4.1.11 是 2004 年前后的产物,那个年代的源码包对编译器和系统库的假设跟现在差得很远。我一般会先确认三件事:系统位数、GCC 版本、有没有老式开发库。这个包在 64 位系统上能编,但它的configure脚本对某些新编译器的默认行为不买账,常见做法是显式指定CFLAGS和CXXFLAGS压一压优化级别,避免高版本 GCC 把老代码优化出警告甚至错误。
系统层面,我倾向用相对保守的 Linux 发行版环境,glibc 不要太新。原因很直接:4.1.11 里有些代码依赖老的头文件行为,glibc 太新时编译期会出现隐式声明之类的告警,虽然多数能过,但会干扰你判断真正的错误。下面这张表是我这次实际核对过的环境基线,照着对一遍能省不少事。
| 项目 | 建议值 | 说明 |
|---|---|---|
| 操作系统 | 保守版 Linux,glibc 不追新 | 避免老代码与新库行为冲突 |
| 编译器 | GCC 4.x 或较低版本 GCC | 高版本需降优化级别 |
| 位数 | 32 位最稳,64 位可编 | 64 位注意--enable-assembler取舍 |
| 磁盘 | 源码 + 编译产物预留 2GB 以上 | make中间文件不小 |
| 内存 | 512MB 以上 | 编译期链接阶段吃内存 |
2.2 依赖库清单与安装
源码编译 MySQL 绕不开几个基础开发库:ncurses(客户端命令行编辑)、readline(历史命令)、zlib(压缩相关)、openssl(如果启用 SSL,4.1 时代这块可选)。缺哪个,configure或make阶段就会报出来。我习惯在动手前一次性把开发包装齐,命令如下:
# 以常见的包管理方式安装编译依赖,包名按实际发行版调整 # ncurses/readline 提供客户端交互能力,zlib 供压缩相关模块使用 sudo yum install -y gcc gcc-c++ make ncurses-devel readline-devel zlib-devel这段命令的逻辑是先保证编译工具链齐全,再补上 MySQL 客户端和底层会用到的库。gcc-c++不能漏,因为源码里有 C++ 部分;ncurses-devel和readline-devel是mysql命令行客户端能正常回显、能上下翻历史的前提,缺了它们configure会直接提示找不到终端库。装完可以用rpm -q或dpkg -l复核一遍,确认-devel包都在,别只装了运行时库。
2.3 专用用户与目录规划
MySQL 不该用 root 跑,这是从 4.x 时代就该守的规矩。我会先建一个不可登录的系统用户,再把数据目录、安装目录、socket 目录分开规划,避免后面权限问题反复折腾。
# 创建专用运行用户,禁止登录 shell sudo useradd -r -s /sbin/nologin mysql # 规划目录:安装目录、数据目录、socket 与 pid 目录 sudo mkdir -p /usr/local/mysql /data/mysql /var/run/mysqld # 数据目录和运行目录归属 mysql 用户 sudo chown -R mysql:mysql /data/mysql /var/run/mysqld这里的关键是目录职责分离:/usr/local/mysql放编译安装出来的程序,/data/mysql放实际数据文件,/var/run/mysqld放 socket 和 pid。分开的好处是将来升级或重装程序时,数据目录可以原地保留,不至于把库一起删了。chown那一步别省,后面mysql_install_db初始化数据目录时如果属主不对,会直接报权限拒绝。
3. 编译安装 mysql-4.1.11:configure 参数怎么取舍
3.1 解包与 configure 参数逐项说明
拿到 mysql-4.1.11.tar.gz 后先解包进源码目录,然后进目录跑configure。这一步是整个安装里最需要动脑的地方,参数选错,后面要么编不过,要么装出来路径对不上。
# 解包并进入源码目录 tar -zxvf mysql-4.1.11.tar.gz cd mysql-4.1.11 # 配置编译参数:前缀、数据目录、socket、字符集、端口 ./configure \ --prefix=/usr/local/mysql \ --datadir=/data/mysql \ --with-unix-socket-path=/var/run/mysqld/mysqld.sock \ --with-charset=utf8 \ --with-extra-charsets=all \ --with-tcp-port=3306 \ --without-debug \ --enable-thread-safe-client逐项说清楚:--prefix决定程序装到哪,后面所有 bin 路径都基于它;--datadir是数据文件落地位置,必须和前面建好的目录一致;--with-unix-socket-path指定 socket 文件路径,客户端连本地库默认找这个,路径写错就是经典的「Can't connect to local MySQL server through socket」;--with-charset=utf8设默认字符集,4.1 时代 utf8 已经可用,比默认 latin1 少很多乱码麻烦;--with-extra-charsets=all把其他字符集一起编进去,省得以后要转字符集还得重编;--without-debug去掉调试符号,产物小一些;--enable-thread-safe-client让客户端库线程安全,老业务里多线程连库的场景用得上。
提示:
configure跑完一定要看最后几行汇总,确认datadir、socket、charset都是你写的值。有次我把 socket 路径写错一个字母,编译安装全过,结果客户端死活连不上,排查了半小时才回头发现是配置阶段埋的雷。
3.2 make 与 make install 的等待与观察
configure通过后就是make,这一步耗时最长,老机器上十几分钟很正常。我一般会加-j并行编译,但老代码并行有时会出顺序问题,稳妥起见先单线程跑,确认没问题再考虑加速。
# 编译,老代码建议先不加 -j,稳定优先 make # 安装到 --prefix 指定的目录 sudo make installmake阶段要盯的是有没有Error字样,警告可以暂时忽略,但错误必须当场解决。常见的中断是缺头文件或某个函数在新编译器下签名不匹配,前者回去补-devel包,后者通常要在CFLAGS里加兼容选项。make install成功后,/usr/local/mysql/bin下应该出现mysql、mysqld、mysql_install_db等程序,ls一眼确认,别急着往下走。
3.3 初始化数据目录与配置文件
程序装好后数据目录还是空的,要用mysql_install_db初始化系统表。4.1.11 的这个脚本在scripts目录下,跑的时候要指定basedir和datadir,并且用 mysql 用户身份执行。
# 初始化系统数据库表,指定安装目录与数据目录 cd /usr/local/mysql sudo ./bin/mysql_install_db \ --basedir=/usr/local/mysql \ --datadir=/data/mysql \ --user=mysql--basedir告诉脚本程序在哪,--datadir告诉它数据往哪写,--user保证生成的文件属主正确。跑完/data/mysql下会出现mysql、test等目录,说明初始化成功。接着写配置文件,我一般放/etc/my.cnf,把关键路径固化下来,避免每次启动靠默认值猜。
[mysqld] # 程序与数据目录,和编译参数保持一致 basedir=/usr/local/mysql datadir=/data/mysql # socket 与端口 socket=/var/run/mysqld/mysqld.sock port=3306 # 运行用户 user=mysql # 默认字符集 default-character-set=utf8 [client] socket=/var/run/mysqld/mysqld.sock default-character-set=utf8[mysqld]段是服务端读的,[client]段是客户端读的,两边的 socket 路径必须一致,否则本地连接照样失败。字符集两边都写 utf8,减少建库建表时的隐式转换。配置写完后启动服务,用mysqld_safe拉起比较稳,它会顺带做崩溃重启。
# 后台启动服务,指定配置文件 sudo /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &启动后别急着连,先ps看一眼mysqld进程在不在,再看/var/run/mysqld/mysqld.sock有没有生成。进程在、socket 在,基本就成功了一大半。
4. 避坑与排查:4.1.11 编译安装最常见的五个坑
4.1 坑一:configure 报找不到终端库
现象是configure中途停下,提示No curses/termcap library found。原因是系统只装了运行时库,没装开发头文件。解决办法就是回到依赖安装那步,补ncurses-devel,然后清掉config.cache重新configure。我踩过一次,当时以为是源码包损坏,重下了一遍才发现是缺-devel包,白折腾。
4.2 坑二:客户端连不上 socket
现象是mysql命令报Can't connect to local MySQL server through socket '/tmp/mysql.sock'。原因是客户端默认去/tmp/mysql.sock找,而你编译时把 socket 指到了别处。解决有两种:一是在[client]段把 socket 路径写对,二是连接时显式加-S /var/run/mysqld/mysqld.sock。我倾向改配置文件,一劳永逸。
4.3 坑三:make 阶段报隐式声明或类型冲突
现象是编译到某个源文件时报函数隐式声明、指针类型不匹配。原因是高版本 GCC 对老代码更严格。解决办法是在configure时给CFLAGS加-fpermissive之类的兼容选项,或者降优化级别到-O0先编过再说。这类报错看着吓人,多数不是逻辑错误,是编译器变严了。
4.4 坑四:初始化数据目录权限拒绝
现象是mysql_install_db报无法创建文件。原因是数据目录属主不是 mysql,或者你用 root 跑但没加--user=mysql。解决是先chown -R mysql:mysql /data/mysql,再带--user=mysql重跑。权限问题在老版本里特别常见,因为它的报错信息不够直白。
4.5 坑五:启动后进程立刻退出
现象是mysqld_safe拉起后进程秒退,日志里能看到错误。原因通常是配置文件路径写错、数据目录没初始化、或端口被占。排查顺序是:先看/data/mysql下有没有host.frm之类的系统表文件,再看my.cnf里basedir/datadir是否和实际一致,最后netstat确认 3306 没被别的进程占。按这个顺序走,基本能定位。
5. 装完怎么验证跑通:三条命令确认环境可用
装完不验证等于没装。我习惯用三条命令把服务端、客户端、数据读写全串一遍,任何一条不过就回头查对应环节。先确认进程和端口:
# 确认 mysqld 进程存在 ps -ef | grep mysqld | grep -v grep # 确认 3306 端口在监听 netstat -tlnp | grep 3306进程在、端口在监听,说明服务端起来了。接着用客户端连进去,走 socket 连接:
# 用 root 本地连接,指定 socket 路径 /usr/local/mysql/bin/mysql -u root -S /var/run/mysqld/mysqld.sock -e "SELECT VERSION();"这条命令能返回版本号,说明客户端与服务端通信正常。最后做一次真实的建库建表写入,验证数据目录可写、字符集生效:
-- 建库建表并插入一条数据,验证读写与字符集 CREATE DATABASE verify_db DEFAULT CHARACTER SET utf8; USE verify_db; CREATE TABLE t_check (id INT PRIMARY KEY, note VARCHAR(50)); INSERT INTO t_check VALUES (1, '安装验证'); SELECT * FROM t_check;能查出安装验证这行中文且不乱码,这套 mysql-4.1.11 环境就算真正跑通了。如果中文变问号,回去检查[mysqld]和[client]的字符集是否都写了 utf8,以及建库时有没有显式指定字符集。
我自己的习惯是,每次装完这种老版本源码包,都会把上面三条验证命令原样存进一个verify.sh,下次迁移或重装直接跑,省得凭记忆漏步骤。血泪经验是:老包的坑大多不在编译本身,而在路径和字符集这些「看起来不重要」的配置上,验证时多花五分钟,比事后排查半小时划算。希望帮到你。
本文还有配套的精品资源,点击获取