ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MySQL 8.0.31 aarch64 glibc2.17 安装实战:ARM服务器部署全流程

MySQL 8.0.31 aarch64 glibc2.17 安装实战:ARM服务器部署全流程 简介本资源为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.x2.17可以Ubuntu 16.042.23可以Ubuntu 18.042.27可以Ubuntu 20.042.31可以Ubuntu 22.042.35可以CentOS 8 / Rocky 82.28可以Debian 102.28可以Debian 112.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 \ --usermysql需要特别注意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 port3306 pid-file/tmp/mysql.pid log-error/var/log/mysql.log usermysql # InnoDB 相关配置按需调整 innodb_buffer_pool_size1G innodb_log_file_size128M几个关键参数的作用basedirMySQL安装目录必须是绝对路径。datadir数据目录指向刚才初始化的目录。socket本地连接使用的Unix socket文件PHP等本地连接MySQL时默认走这个。pid-file进程PID文件systemd管理时经常会用到。log-error错误日志路径建议单独指定排错时第一优先看这个文件。innodb_buffer_pool_sizeMySQL最重要的性能参数通常配置为物理内存的60%~70%小内存机器可以给512M。关于server-id这个参数要不要现在就设如果以后要做主从复制建议一开始就把server-id1写上哪怕现在用不到。以后要复制时再改配置就要重启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.log80%的问题都能在里面找到答案。检查端口监听ss -tlnp | grep 3306看到LISTEN状态说明MySQL已经在正常监听了。3.6 设置开机自启通过mysqld_safe手动启动的MySQL重启系统后不会自动启动需要配置自启。制作systemd服务是最标准的方式。在/etc/systemd/system/mysqld.service创建如下内容[Unit] DescriptionMySQL Server Afternetwork.target [Service] Typeforking Usermysql Groupmysql PIDFile/tmp/mysql.pid ExecStart/usr/local/mysql/bin/mysqld_safe --defaults-file/etc/my.cnf ExecReload/bin/kill -s HUP $MAINPID PrivateTmpfalse [Install] WantedBymulti-user.target然后执行systemctl daemon-reload systemctl enable mysqld systemctl start mysqld systemctl status mysqld注意PrivateTmpfalse这个配置一定要加。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 --interleaveall /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): Cant connect to local MySQL server through socket /tmp/mysql.sock排查思路按顺序来先看MySQL进程还在不在ps -ef | grep mysqld。再看到底监听了什么socketss -lx | grep mysql。如果是权限问题检查MySQL用户能否在/tmp目录下创建文件。CentOS 7的systemd服务如果没加PrivateTmpfalseMySQL看到的是私有的tmpsocket文件的路径对客户端来说是不可见的需要把参数加上并重启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 rootlocalhost 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_size128M~512Mredo日志大小过小会导致频繁刷盘max_connections300~500按业务量调整别盲目开大innodb_flush_log_at_trx_commit1安全模式每次提交都刷盘可改成2提升性能innodb_io_capacity2000~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基本可以照着走一遍就完事了。本文还有配套的精品资源点击获取
返回列表