简介:本资源为MySQL 8.0.31官方原版Linux ARM64架构二进制发行包,专为搭载ARM处理器的国产服务器、边缘计算设备及信创环境下的数据库部署与开发测试场景设计。适用于系统运维工程师、数据库管理员及信创适配工程师,解决在aarch64平台(如鲲鹏、飞腾等)快速安装、验证及调试MySQL 8.0核心功能的需求。压缩包共337个文件,含88个动态链接库(so)、39个可执行二进制文件(bin)、25个XML配置模板、24个系统表定义(sys)及16个头文件(h),覆盖服务启动(mysqld)、安全加固(mysql_secure_installation)、备份恢复(mysqldump)、日志分析(mysqlbinlog)等全生命周期工具链,整体体积488.08MB。目前已有1078人下载学习,资源结构完整、无第三方修改,可直接解压部署,是信创环境下MySQL 8.0适配验证与生产环境搭建的可靠基础组件。
1. 先看懂这个安装包的名字,才知道它有多稀罕
1.1 从文件名拆解每个字段
mysql-8.0.31-linux-glibc2.17-aarch64.tar.gz这个文件名乍一看很长,拆开其实就五个关键信息:MySQL 8.0.31版本、Linux平台、glibc 2.17编译、aarch64架构、tar.gz压缩格式。前三个还算常见,但"glibc2.17"和"aarch64"这两个字段凑在一起,就有点讲究了。
先说说glibc2.17。glibc是Linux系统最底层的C运行时库,几乎所有用户态程序都依赖它。MySQL官方发布的Linux通用二进制包,会针对不同glibc版本分别编译,比如glibc2.12、glibc2.17、glibc2.28这些常见版本。为什么非要区分?因为glibc版本决定了二进制包的运行底线——你用glibc 2.17编译出来的程序,理论上能跑在glibc版本不低于2.17的系统上;反过来,你用高版本glibc编译的包,放到低版本系统上就会报"GLIBC_2.28 not found"之类的错误,装都装不上。
再说aarch64。这是ARM 64位架构的官方名称,也叫ARM64。x86服务器老老实实下载x86_64的包就行,但ARM服务器(比如鲲鹏、飞腾、Ampere Altra这些)必须选aarch64的版本,选错了跑不起来。这年头ARM服务器在云上和自建机房都越来越常见,但网上很多教程还停留在x86套路,照着抄很容易翻车。
所以这个包的核心价值在于:它是专门给"老系统 + ARM芯片"准备的MySQL 8.0.31。对还在用CentOS 7这种老系统的ARM服务器来说,这几乎是唯一能直接装上跑的官方版本。
1.2 为什么glibc 2.17是一个关键的门槛
很多人在装MySQL时报过这个错:installer requires glibc >=2.28, but system has 2.17。这不是MySQL独有的问题,而是所有用C/C++编译的软件都会遇到的事情。glibc版本就像地基,地基太低,楼盖得再好看也立不住。
glibc 2.17对应的是哪个时代的系统?CentOS 7、RHEL 7、Oracle Linux 7,这些系统的glibc版本都是2.17。CentOS 7的生命周期在2024年6月正式结束,但在生产环境里,还有大量CentOS 7系统的服务器在跑,尤其是政企和传统行业的机房。这些机器因为各种原因没法升系统,但业务又需要新版本的MySQL,那这个glibc2.17的包就成了救命稻草。
另外,glibc 2.17和新版本之间有个比较麻烦的兼容性特点:glibc是向后兼容的,高版本能跑低版本编译的程序,但反过来不行。MySQL官方提供的glibc2.17版本包,你拿到glibc 2.28的Ubuntu 20.04或22.04上装,完全没问题;但你要是拿glibc 2.28的包去装CentOS 7,直接报错。
注意:在生产环境选择安装包时,优先级应该是"glibc版本匹配 > 架构匹配 > 版本新旧"。一个能跑起来的老版本MySQL,比一个装不上的新版本MySQL有用一百倍。
1.3 tar.gz格式与rpm、deb的区别
Linux下装软件有三种常见形式:源码编译、包管理器安装(rpm/deb)、免编译二进制包。这个tar.gz就是第三种。它的好处很明显:解压就能用,不依赖包管理器,不污染系统数据库,想卸载直接删文件夹。团队内部批量部署时,把整个目录打包分发就很方便。
缺点也明显:不自动处理依赖,不自动注册系统服务,所有初始化、启动、自启配置都得手工来。但这正是这篇博文要解决的问题,接下来就按实际操作的顺序,把这个包从头到尾装明白。
2. 安装前别急着敲命令,先做三件事
2.1 确认系统架构是不是aarch64
这一步看似多余,但我在实际工作中见过不少人拿x86的包往ARM机器上硬装,最后报Exec format error。这不是MySQL的问题,是架构不匹配。
检查架构的命令很简单:
uname -m如果输出是aarch64,那恭喜,架构没问题。如果输出是x86_64,那这个包你装不了,得去下载x86_64版本。还有一个更详细的命令:
lscpu | grep Architecturelscpu的输出还会带上CPU型号、核心数、NUMA节点信息,这些信息后面做性能调优时也用得上。
2.2 确认glibc版本是否满足要求
这个包要求glibc >= 2.17,检查当前系统的glibc版本:
ldd --version | head -1输出示例:
ldd (GNU libc) 2.17也可以用这个命令:
getconf GNU_LIBC_VERSION不同系统的glibc版本对应关系大致如下,方便你快速判断手里的系统能不能装:
| 操作系统版本 | glibc版本 | 能否用这个包 |
|---|---|---|
| CentOS 7.x / RHEL 7.x | 2.17 | 可以 |
| Ubuntu 16.04 | 2.23 | 可以 |
| Ubuntu 18.04 | 2.27 | 可以 |
| Ubuntu 20.04 | 2.31 | 可以 |
| Ubuntu 22.04 | 2.35 | 可以 |
| CentOS 8 / Rocky 8 | 2.28 | 可以 |
| Debian 10 | 2.28 | 可以 |
| Debian 11 | 2.31 | 可以 |
只要你的系统glibc版本大于等于2.17,这个包就能用。系统glibc版本高反而更宽松,不用担心兼容问题。
2.3 检查依赖库和系统环境
MySQL运行时还需要一些动态库,最常见的坑是缺libaio。检查方法:
ldconfig -p | grep libaio如果没有输出,说明libaio没装。CentOS等yum系列的安装方式:
yum install -y libaioUbuntu等apt系列的安装方式:
apt-get install -y libaio1还有一个老版本MySQL需要的libncurses,但MySQL 8.0基本不需要了。如果你在初始化时报错缺某个.so文件,大概率是依赖库没装齐,用ldconfig -p逐个排查就行。
磁盘空间和内存也顺手看一眼,MySQL安装完在1GB左右,数据目录建议预留至少10GB,内存方面8.0版本跑起来建议至少2GB,不然一会儿OOM一会儿崩溃,排查起来心累。
重要:安装前先备份好系统环境,或者在虚拟机/容器里验证一遍流程。别在业务高峰直接对生产环境动手。
3. 完整安装实操流程(可直接抄作业)
3.1 解压并规划目录结构
先把安装包上传到服务器,一般放在/opt或/usr/local/src下,然后解压:
cd /usr/local/src tar -xzvf mysql-8.0.31-linux-glibc2.17-aarch64.tar.gz解压后会得到目录mysql-8.0.31-linux-glibc2.17-aarch64。为了后续操作方便,我会做两件事:重命名成一个简洁的目录名,并创建软链接。
mv mysql-8.0.31-linux-glibc2.17-aarch64 /usr/local/mysql-8.0.31 ln -s /usr/local/mysql-8.0.31 /usr/local/mysql以后版本升级时,只需要重新做一次软链接并重启MySQL,就能把整个数据目录无缝切换到新版本,业务无感知。这种目录规划的思路在运维里非常实用,强烈建议养成习惯。
3.2 创建mysql用户和目录权限
MySQL官方建议用独立的系统用户来运行,而不是直接用root。这样即使MySQL被攻破,攻击者拿到的也是mysql用户的权限,而不是root权限,能减少损失。
groupadd mysql useradd -r -g mysql -s /sbin/nologin mysql参数说明:-r表示创建系统用户,-s /sbin/nologin表示不允许这个用户登录shell,只用来跑服务。数据目录我这里规划到/data/mysql,放到独立的数据盘上,避免系统盘写满影响系统。创建数据目录并设置权限:
mkdir -p /data/mysql chown -R mysql:mysql /data/mysqlMySQL软件目录本身不需要给mysql用户写权限,只要有读和执行权限就能跑:
chown -R mysql:mysql /usr/local/mysql-8.0.31这里我建议直接把整个安装目录授权给mysql用户。虽然不授权也能跑,但后续你要在安装目录下建配置文件、写日志文件时,没权限就会很难受。
3.3 初始化数据目录
MySQL 8.0的初始化命令和5.7不太一样,关键点是--initialize和--initialize-insecure的区别:前者会生成一个随机root密码并打印到日志里,后者生成空密码的root用户。
第一次部署时,我用的是--initialize-insecure,因为后续会紧接着用一条命令把密码改掉,这样流程更顺滑。
/usr/local/mysql/bin/mysqld \ --basedir=/usr/local/mysql \ --datadir=/data/mysql \ --initialize-insecure \ --user=mysql需要特别注意:datadir目录必须是空的,否则会报Directory not empty。如果之前已经初始化过,需要清空目录再重新执行。初始化过程如果成功,不会有任何输出,直接退出。如果报错,八成是缺依赖库或者目录权限问题。
初始化完成后,检查一下数据目录里是否生成了系统库文件:
ls -l /data/mysql | head你应该能看到mysql、performance_schema、sys这些目录,说明初始化成功。
3.4 编写my.cnf配置文件
在/etc/my.cnf写一个最小可用的配置文件。MySQL读取配置文件的顺序是/etc/my.cnf → /etc/mysql/my.cnf → 安装目录下的my.cnf,一般我们写第一个就行。
[mysqld] basedir=/usr/local/mysql datadir=/data/mysql socket=/tmp/mysql.sock port=3306 pid-file=/tmp/mysql.pid log-error=/var/log/mysql.log user=mysql # InnoDB 相关配置按需调整 innodb_buffer_pool_size=1G innodb_log_file_size=128M几个关键参数的作用:
basedir:MySQL安装目录,必须是绝对路径。datadir:数据目录,指向刚才初始化的目录。socket:本地连接使用的Unix socket文件,PHP等本地连接MySQL时默认走这个。pid-file:进程PID文件,systemd管理时经常会用到。log-error:错误日志路径,建议单独指定,排错时第一优先看这个文件。innodb_buffer_pool_size:MySQL最重要的性能参数,通常配置为物理内存的60%~70%,小内存机器可以给512M。
关于server-id,这个参数要不要现在就设?如果以后要做主从复制,建议一开始就把server-id=1写上,哪怕现在用不到。以后要复制时再改配置就要重启MySQL,提前留好省事。
3.5 启动MySQL并验证
首次启动用mysqld_safe比较多,它会在后台启动MySQL,并在MySQL异常退出时自动拉起:
/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &等几秒钟,检查是否启动成功:
ps -ef | grep mysqld /usr/local/mysql/bin/mysqladmin -uroot -p status如果报错,去翻错误日志/var/log/mysql.log,80%的问题都能在里面找到答案。检查端口监听:
ss -tlnp | grep 3306看到LISTEN状态说明MySQL已经在正常监听了。
3.6 设置开机自启
通过mysqld_safe手动启动的MySQL,重启系统后不会自动启动,需要配置自启。制作systemd服务是最标准的方式。在/etc/systemd/system/mysqld.service创建如下内容:
[Unit] Description=MySQL Server After=network.target [Service] Type=forking User=mysql Group=mysql PIDFile=/tmp/mysql.pid ExecStart=/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf ExecReload=/bin/kill -s HUP $MAINPID PrivateTmp=false [Install] WantedBy=multi-user.target然后执行:
systemctl daemon-reload systemctl enable mysqld systemctl start mysqld systemctl status mysqld注意:PrivateTmp=false这个配置一定要加。systemd有时候会把/tmp隔离成私有命名空间,MySQL的socket文件写不到/tmp/mysql.sock里,导致本地连接失败。这个坑我在CentOS 7上踩过好几次。
4. 踩坑实录:aarch64平台安装MySQL的常见问题
4.1 报错"GLIBC_2.28 not found"的排查思路
如果你用的是glibc 2.28编译的MySQL包,装到glibc 2.17的系统上,执行任何二进制都会报这个错:
./mysqld: /lib64/libc.so.6: version `GLIBC_2.28' not found (required by ./mysqld)解决办法有两个方向:要么换低版本glibc编译的MySQL包(比如本文标题这个),要么升级系统glibc。升级glibc是系统级的重大变更,存在很大风险,不要轻易在生产环境做。正确的做法是选对包,这正是标题中带glibc2.17的意义所在。
如果先下载了某个MySQL二进制包,想确认它依赖的glibc版本,可以用objdump或readelf查看:
objdump -T /usr/local/mysql/bin/mysqld | grep GLIBC_ | sort -u也可以直接看它需要的最低glibc版本:
strings /usr/local/mysql/bin/mysqld | grep GLIBC_ | sort -u | tail这个方法在判断"手里的包能不能在当前系统上跑"时非常有效,建议保存备用。
4.2 架构错误的"Exec format error"
-bash: ./mysqld: cannot execute binary file: Exec format error,这个报错的意思就是CPU架构不兼容。ARM机器上运行x86编译的程序,就是这个结果。
常见的还有这种情况:你从官网下载页面看到有x86_64和aarch64两个链接,手滑下错了。下载后用file命令检查一下:
file mysql-8.0.31-linux-glibc2.17-aarch64.tar.gz输出里会显示ARM aarch64字样,这样就稳妥了。
4.3 aarch64平台上的内存与性能相关注意事项
aarch64架构的服务器,内存管理机制和x86_64确实有差异。Linux内核在ARM64上使用的内存分配机制包括memblock(启动早期的物理内存管理)、buddy(物理页分配器)、slab(内核对象缓存)和vmalloc(内核虚拟地址连续内存)。这些对MySQL本身是透明的,但有几个层面的配置会影响MySQL在ARM机器上的表现。
第一个是透明大页(Transparent Huge Pages)。CentOS 7等系统的THP默认是always,数据库场景建议关闭,因为THP的自动合并可能会导致MySQL出现偶发性的性能抖动和延迟飙升。修改方式:
echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag第二个是NUMA感知。多路ARM服务器的NUMA拓扑和x86有所不同,MySQL官方建议关闭NUMA或使用numactl进行绑定。一种比较通用的做法:
numactl --interleave=all /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &但更精细的做法是先看NUMA拓扑(numactl --hardware),再结合业务的活跃线程分布决定绑定策略。这一块可以单独写一篇长文,这里先记住一个原则:在MySQL跑起来之后,用numastat观察节点内存分配是否均衡,如果某一节点内存压力特别大,就需要进行优化。
4.4 localhost连接不上:socket文件权限问题
MySQL刚装好时,本地用mysql -uroot -p连接,有时会报:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock'排查思路按顺序来:
- 先看MySQL进程还在不在:
ps -ef | grep mysqld。 - 再看到底监听了什么socket:
ss -lx | grep mysql。 - 如果是权限问题,检查MySQL用户能否在
/tmp目录下创建文件。
CentOS 7的systemd服务如果没加PrivateTmp=false,MySQL看到的是私有的tmp,socket文件的路径对客户端来说是不可见的,需要把参数加上并重启MySQL。
如果socket文件正常存在但还是连接不上,检查/tmp目录的粘滞位权限:
ls -ld /tmp输出应该是drwxrwxrwt。有些安全加固脚本会改掉权限,导致普通用户无法访问socket文件。
5. 初始化完成后必须做的事
5.1 修改root密码与安全加固
我前面用了--initialize-insecure初始化,root用户初始密码为空,进来之后第一件事就是设置密码:
/usr/local/mysql/bin/mysql -uroot --socket=/tmp/mysql.sock进入MySQL命令行后执行:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPassword123!'; FLUSH PRIVILEGES;然后建议跑一遍安全加固配置:
/usr/local/mysql/bin/mysql_secure_installation这个脚本会一步步引导你:设置root密码、删除匿名用户、禁止root远程登录、删除test测试库。生产环境建议全程选择yes。
5.2 创建业务用户与授权
root账号不要给业务用,这是基本素养。给业务单独建一个最小权限账号:
CREATE USER 'app_user'@'%' IDENTIFIED BY 'AppUserPass123!'; GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_user'@'%'; FLUSH PRIVILEGES;'%'表示允许任意IP连接,实际生产环境建议换成具体网段或IP,比如'192.168.1.0/255.255.255.0',避免暴露到公网。如果业务需要远程连接,记得在防火墙或安全组里放行3306端口,并优先限制来源IP。
5.3 基础性能参数建议
MySQL 8.0默认配置在大多数场景下能跑,但要让它吃满aarch64服务器的性能,几个参数必须认真调:
| 参数 | 建议值 | 说明 |
|---|---|---|
| innodb_buffer_pool_size | 物理内存的60%~70% | InnoDB缓冲池,直接影响读写性能 |
| innodb_log_file_size | 128M~512M | redo日志大小,过小会导致频繁刷盘 |
| max_connections | 300~500 | 按业务量调整,别盲目开大 |
| innodb_flush_log_at_trx_commit | 1 | 安全模式,每次提交都刷盘;可改成2提升性能 |
| innodb_io_capacity | 2000~5000 | 影响后台刷脏页速度,SSD可以调大 |
一个比较实用的内存估算公式:
innodb_buffer_pool_size = 物理内存 × 70% key_buffer_size + 其他线程相关内存 ≈ 剩余内存 × 30%比如服务器有16GB内存,innodb_buffer_pool_size通常给10GB~11GB。但别忘记系统本身和MySQL的连接缓冲、排序缓冲等也要吃内存,留20%~30%的余量比较稳。
6. 我的一点经验与建议
这套安装流程我在aarch64架构的服务器上反复跑过很多次,从CentOS 7到Ubuntu 20.04、22.04,踩过的坑基本都有对应解法。如果只记住三句话:下载安装包之前,先从uname -m和ldd --version确认架构和glibc版本是否匹配;配置文件一定要写对datadir和basedir,别让MySQL自己猜;遇到问题先翻错误日志,不要瞎猜。
还有一个容易忽略的点:MySQL 8.0.31的默认字符集是utf8mb4,排序规则是utf8mb4_0900_ai_ci。如果你和旧的5.7程序交互,要注意排序规则的兼容性,部分旧场景需要显式指定为utf8mb4_general_ci或utf8mb4_unicode_ci,否则联表查询或程序写入时可能报排序规则冲突。
最后一个小技巧:升级MySQL时,新版本解压后,先停旧服务,改软链接,然后直接启动新版本。MySQL 8.0.31对数据文件格式有自动升级机制,启动时如果检测到旧版本的数据文件,会自动进行升级处理,前提是数据目录的owner是mysql用户,并且磁盘空间足够。这个策略我用了很久,从8.0.20升到8.0.31,一直很顺利。把这套方案保存好,以后在ARM服务器上部署MySQL,基本可以照着走一遍就完事了。
本文还有配套的精品资源,点击获取