十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

ARM架构MySQL 5.7部署:从tar.gz解压到systemd托管全指导

ARM架构MySQL 5.7部署:从tar.gz解压到systemd托管全指导 简介面向ARM64架构Linux环境的MySQL 5.7.32二进制安装包专门解决树莓派、飞腾、鲲鹏等平台缺少官方预编译版本、自行搭建编译环境成本高且耗时长的问题可支撑直接解压部署与后续运维。资源共14882个文件包体约510MB除大量test与result测试用例文件外还包含opt/inc配置及头文件、cnf配置模板、so共享库、dat数据文件、frm表结构文件、pem安全证书和sql脚本等目录沿用官方源码树结构便于检索、裁剪与二次开发。MySQL 5.7.32的InnoDB存储引擎、Performance Schema监控、JSON数据类型、查询优化器以及认证安全机制均有增强配合glibc-2.28在主流ARM64系统上具备良好稳定性与性能表现内置测试套件也有助于功能验证和问题排查。平台显示已有1416人学习下载适合数据库运维、ARM平台研发及需要离线交付数据库服务的团队使用能大幅缩短编译验证周期也可作为深入理解MySQL目录结构和运行机制的参考。 手上有这么一包mysql-5.7.32-linux-glibc-2.28-aarch64.tar.gz的时候很多人第一反应是直接解压安装结果折腾半天起不来报错一堆。这几年国产化进程加快ARM 架构的服务器越来越常见MySQL 的 aarch64 版本成了刚需但这个文件名里其实藏着不少信息读懂了才能少踩坑。这篇文章就从这个压缩包入手带你把“一个 tar.gz 变成一台能跑的 MySQL 实例”这件事完整过一遍。包括文件名解读、环境审查、二进制部署、初始化配置、systemd 托管和日常运维避坑适合刚接触 Linux 下 MySQL 部署的运维新人也适合给正在做 ARM 迁移的老手做个参考。内容都是实操经验不是文档搬运尤其里面的坑基本是网上教程不会明说的。1. 文件名里的信息量先看懂再动手1.1 每一段字符都在说什么mysql-5.7.32-linux-glibc-2.28-aarch64.tar.gz这个文件名拆开看是这样的mysql-5.7.32MySQL 版本号5.7 是当前生产环境保有量最大的版本之一5.7.32 属于 5.7 系列中期的稳定小版本官方已停止维护但大量存量项目还在用。linux目标操作系统为 Linux。glibc-2.28要求系统 glibc 版本不低于 2.28。glibc 是 Linux 下最基础的 C 运行库MySQL 二进制包编译时链接了特定版本运行时需要向下兼容。aarch64ARM 64 位架构对应uname -m输出里的 aarch64。注意它不是 x86_64。tar.gzgzip 压缩的 tar 归档没有任何安装程序解压即用属于“绿色版”。这一段里面最容易踩坑的是 glibc 版本。很多人在 CentOS 7.6、7.7 上装这个包cat /etc/redhat-release看着没问题但ldd --version一查 glibc 是 2.17直接低于要求的 2.28后面mysqld --initialize必报错。所以拿到包第一步不是解压而是先验证环境到底能不能用。1.2 为什么要用官方“通用二进制包”MySQL 的安装方式有源码编译、RPM、Deb 包、Docker 镜像和这种通用二进制包。源码编译最灵活但最费时RPM/Deb 包和发行版绑定太死Docker 可以一键起但很多传统环境不支持或不想引入容器。通用二进制包是“免安装版”解压改配置就能跑依赖少适合批量复制到多台机器做版本固定和离线部署尤其方便。这个包还有一个关键词“glibc-2.28”。如果系统 glibc 更高通常没问题如果更低要么换系统要么换低版本的 MySQL 包要么老老实实走源码编译。不要尝试去升级系统 glibc那是把整台机器往火坑里推系统底层库一换连 ls、cat 都可能挂。2. 环境准备动手前先做三件小事2.1 确认架构和 glibc 真的达标很多人在uname -m输出aarch64之后就以为万事大吉其实还要再看一眼 glibc。两个命令必须执行uname -m # 输出应为 aarch64 或 arm64 ldd --version # 第一行会显示 glibc 版本比如 2.28-11.el8 或 2.36-9这里有个差异要提一下有些国产系统比如基于 openEuler 或统信 UOS 的发行版虽然架构是 aarch64但 glibc 版本较新通常满足 2.28 要求。CentOS 7 的 ARM 版只有 GLIBC 2.17就不要指望装这个包了。可以用下面这条命令精确检查动态库依赖是否满足ldd mysql-5.7.32-linux-glibc-2.28-aarch64.tar.gz 2/dev/null # 或者解压后检查 bin/mysqld更实际的做法是解压后直接看lib/mysqld的依赖如果输出里出现libc.so.6 not found那就是 glibc 版本不够。还有一种情况是 libaio 缺失这个不归 glibc 管但同样会导致初始化直接失败。2.2 创建用户和规划目录MySQL 官方要求不要用 root 跑实例生产环境也必须遵守。先建专用用户和目录groupadd mysql useradd -r -g mysql -s /sbin/nologin mysql mkdir -p /data/mysql/data chown -R mysql:mysql /data/mysql安装目录我习惯放在/usr/local/mysql数据目录独立放在/data/mysql/data。安装目录和数据目录分离是运维的基本原则系统盘坏了重装不影响数据盘备份和扩容也更灵活。顺便把/data所在的磁盘空间查一下df -h /data数据目录至少预留实际数据量的两倍别等撑爆了才想起扩容。提示-s /sbin/nologin是为了让 mysql 用户无法登录 Shell这是安全基线要求。测试环境无所谓生产环境一定要加。2.3 确认基础依赖已安装aarch64 平台下有些依赖是必须的少了任何一个后面都会报各种奇怪错误# CentOS/RHEL 系 yum install -y libaio numactl-libs # Debian/Ubuntu 系 apt install -y libaio1 libnuma1 tarlibaio 是异步 IO 库MySQL 的 InnoDB 存储引擎默认会调用没有它mysqld --initialize会报error while loading shared libraries: libaio.so.1: cannot open shared object file。numactl-libs 在 NUMA 架构下用得到ARM 服务器不少是多路建议一起装。tar 命令不用说了解压都靠它。这些依赖装上不会额外引入太大开销但能避开后面很多幺蛾子。3. 核心实操从压缩包到可用数据库3.1 解压、改名、建软链先把包传到目标机器上建议放到/usr/local/src再解压到/usr/local不要直接在数据盘解压。整个流程如下cd /usr/local/src tar -xf mysql-5.7.32-linux-glibc-2.28-aarch64.tar.gz -C /usr/local/ cd /usr/local mv mysql-5.7.32-linux-glibc-2.28-aarch64 mysql ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql ln -s /usr/local/mysql/bin/mysqldump /usr/local/bin/mysqldump ln -s /usr/local/mysql/bin/mysqld /usr/local/bin/mysqld软链这一步很多人忽略后面敲mysql -uroot -p直接command not found。其实不建软链也能干活每次全路径/usr/local/mysql/bin/mysql执行就行但没人愿意一直敲这么长的路径。建软链后顺手再配一下 PATH 更稳妥编辑/etc/profile.d/mysql.shexport PATH$PATH:/usr/local/mysql/bin然后source /etc/profile.d/mysql.sh或重新登录。装完我一般习惯用ls -l /usr/local/mysql确认软链指对了再用/usr/local/mysql/bin/mysqld --version验证目录权限和二进制可执行。3.2 初始化数据目录两个参数差别很大初始化是部署过程中最容易翻车的一步。5.7 版本用mysqld --initialize但有个小岔路要先说清楚--initialize生成一个随机临时 root 密码日志里输出。--initialize-insecureroot 账号无密码可以直接空密码登录。我自己的习惯是测试环境用--initialize-insecure省得还要去日志里翻临时密码生产环境则用--initialize严格走密码生成流程。执行初始化前要先把配置文件准备好否则它会用默认配置之后路径可能和预期不符。先创建一个最小可用的配置文件/etc/my.cnf[mysqld] basedir/usr/local/mysql datadir/data/mysql/data socket/tmp/mysql.sock pid-file/tmp/mysql.pid port3306 log-error/data/mysql/logs/mysql-error.log character-set-serverutf8mb4 collation-serverutf8mb4_general_ci usermysql注意log-error的目录需要先存在最好同时建好mkdir -p /data/mysql/logs chown -R mysql:mysql /data/mysql然后执行初始化/usr/local/mysql/bin/mysqld --defaults-file/etc/my.cnf --initialize-insecure如果看到输出空空如也、没有报错就是成功了。用--initialize的话临时密码会写在 error log 里tail -20 /data/mysql/logs/mysql-error.log # 找到类似这样的行 # [Note] A temporary password is generated for rootlocalhost: xxxxxxxx注意初始化时--defaults-file必须放在最前面放在后面会导致 MySQL 不识别这是一个常见的低级错误。另外配置文件里的usermysql也很关键如果漏了mysqld 会以 root 身份运行并告警虽然能跑但不建议。3.3 目录属主和权限不能马虎初始化完成后立刻复查数据目录的属主chown -R mysql:mysql /data/mysql /usr/local/mysql这一步必须做否则启动时mysqld_safe会报权限问题。还要注意/tmp目录不能是 noexec 挂载MySQL 会在/tmp下创建 socket 和临时表文件如果/tmp是 noexec启动会异常。这个坑在等保加固后的服务器上很常见一般排查方式是用mount | grep /tmp看一眼挂载参数。3.4 首次启动和登录验证执行启动时用mysqld_safe还是直接用mysqld我建议先用前台方式验证配置没问题/usr/local/mysql/bin/mysqld --defaults-file/etc/my.cnf 或者用官方推荐的mysqld_safe5.7 自带/usr/local/mysql/bin/mysqld_safe --defaults-file/etc/my.cnf 启动后检查端口和进程ps -ef | grep mysqld ss -lntp | grep 3306看到 3306 LISTEN 就说明起来了。如果起不来tail -f /data/mysql/logs/mysql-error.log看最后的报错。登录测试# 如果是 --initialize-insecure mysql -uroot -p # 如果是 --initialize用日志里的临时密码登录然后立即改密 ALTER USER rootlocalhost IDENTIFIED BY YourStrongPassword;测试环境我给的建议是设置一个强密码先让它跑起来生产环境下一步必须走安全加固脚本这个后面第五节讲。4. 启动验证与常见问题排查4.1 常见报错速查表这一节直接把我在 aarch64 环境中实际遇到的报错整理成表比一个个看日志高效多了。报错信息或现象根本原因解决方案error while loading shared libraries: libaio.so.1libaio 缺失yum install libaio或apt install libaio1libc.so.6: version GLIBC_2.28 not found系统 glibc 低于 2.28升级系统到更高版本或换低版本 MySQL 包[ERROR] Cant find error-message file/usr/local/mysql/share路径不对检查basedir是否正确[ERROR] The server quit without updating PID file数据目录权限或路径问题检查datadir属主确认/data/mysqlowner 为 mysqlCant connect to local MySQL server through socket /tmp/mysql.socksocket 路径不一致客户端和配置文件 socket 必须一致[ERROR] unknown variable defaults-file/etc/my.cnf--defaults-file放错位置确保它是 mysqld 的第一个参数[ERROR] InnoDB: Operating system error number 13数据目录无写权限chown -R mysql:mysql /data/mysql[ERROR] Table mysql.plugin doesnt exist初始化未完成重新执行初始化前清空 datadir 再跑这张表里第一个和第二个是最常见的。第三个Cant find error-message file很多人会忽略它不影响启动但客户端报错时看不到中文或正常的错误提示排查问题难度直接翻倍根源基本是basedir指定错误或 share 目录缺失。4.2 初始化报错的排查思路初始化失败时不要反复原地重跑先查日志再确认环境。举个例子第一次初始化报 InnoDB 的错误可能是/data/mysql/data下残留了半成品文件这时候必须清空数据目录再重新初始化否则反复报错。清理命令要小心rm -rf /data/mysql/data/*数据目录如果已有业务数据这个操作是灾难性的所以生产环境执行前一定确认这是新部署的机器。初始化不成功的另一个常见原因是磁盘空间不足df -h /data看一下InnoDB 初始化需要写 redo 和 system tablespace空间不够会直接静默失败。另外要说一下aarch64 架构下偶尔能遇到 glibc 2.28 版本“高于”所需但仍然报错的情况这通常是系统里存在多个 glibc 环境比如 conda、python 虚拟环境自带的 libc 覆盖了系统路径。这类问题比较隐蔽判断方法是LD_LIBRARY_PATH是否被污染执行echo $LD_LIBRARY_PATH如果有非常规路径临时清空再启动unset LD_LIBRARY_PATH /usr/local/mysql/bin/mysqld_safe --defaults-file/etc/my.cnf 5. 让它稳定跑起来systemd 管理与安全建议5.1 用 systemd 管理而不是裸进程mysqld_safe 方式适合临时排查问题但重启机器后不能自动拉起还是建议用 systemd 托管。创建/etc/systemd/system/mysqld.service[Unit] DescriptionMySQL Server 5.7.32 Afternetwork.target [Service] Typenotify Usermysql Groupmysql ExecStart/usr/local/mysql/bin/mysqld --defaults-file/etc/my.cnf LimitNOFILE65535 Restarton-failure TimeoutSec300 [Install] WantedBymulti-user.target注意Typenotify是 5.7 版本推荐的启动类型它会让 systemd 等待 mysqld 自己发出 ready 通知避免出现“服务显示启动成功但实际还没就绪”的误判。写好后systemctl daemon-reload systemctl enable mysqld systemctl start mysqld systemctl status mysqld如果ExecStart直接启动失败先看journalctl -u mysqld -n 50确认 error log 里有没有相关内容。Restarton-failure保证了 mysqld 崩溃后自动拉起对线上稳定性很有帮助LimitNOFILE也要给足不然高并发下连接数一多Too many open files就来了。5.2 安全加固脚本和新密码策略5.7 自带一个安全加固脚本强烈建议装完就跑/usr/local/mysql/bin/mysql_secure_installation按提示做几件事设置 root 密码、删除匿名用户、禁止 root 远程登录、删除 test 数据库、刷新权限表。生产环境这几项全部选是测试环境至少把匿名用户和 test 库删掉。还有几点是我实际踩过的不要把 root 暴露给外部 IP 连接。应用账号要单独创建例如CREATE USER app10.0.0.% IDENTIFIED BY StrongPass;然后按最小权限GRANT SELECT,INSERT,UPDATE,DELETE ON appdb.* TO app10.0.0.%;。skip_name_resolve建议开启关闭反查 DNS 可以减少连接延迟但开启后必须使用 IP 授权不能使用 hostname 授权。修改bind-address测试环境可以注释掉或0.0.0.0生产环境只监听内网 IPbind-address10.0.0.10这种写法。提示安全加固脚本执行后 root 密码会改变所有已建立的应用连接会全部断开属于正常现象。部署时建议选业务低峰期。5.3 备份习惯和数据目录规划数据库跑起来之后第一件事不是做功能测试而是先配备份。5.7 可以用mysqldump也可以直接用物理备份工具xtrabackup。小数据量场景直接用mysqldump每天定时全量备一次就够了核心命令如下/usr/local/mysql/bin/mysqldump -uroot -p --single-transaction --master-data2 --all-databases /backup/mysql_$(date %F).sql--single-transaction保证 InnoDB 备份期间数据一致性不会锁死业务--master-data2会在备份文件里记录 binlog 位置后面要做从库或恢复时非常有用。备份文件最好放到独立磁盘别跟数据目录同盘否则磁盘一起坏就全没了。数据目录这块多说一句/data/mysql/data和 binlog 目录最好分开。可以在 my.cnf 里单独指定log-bin/data/mysql/binlog/mysql-bin expire_logs_days7 max_binlog_size512Mbinlog 独立目录的好处是备份时可以单独对数据目录做快照日志文件不会被一次性清掉。expire_logs_days7控制只保留 7 天日志避免 binlog 把磁盘写满这个参数在 5.7 里是expire_logs_days8.0 之后换成了binlog_expire_logs_seconds用 5.7 的同学别混淆。5.4 资源限制和内核参数微调跑 MySQL 的机器建议顺手把内核参数和资源限制调一下。编辑/etc/security/limits.conf追加mysql soft nofile 65535 mysql hard nofile 65535 mysql soft nproc 65535 mysql hard nproc 65535同时在/etc/sysctl.conf里追加net.core.somaxconn 65535 vm.swappiness 10vm.swappiness设为 10 是降低 swap 的使用倾向让 MySQL 尽量用内存尤其 5.7 的 InnoDB buffer pool 很吃内存频繁 swap 会导致性能断崖式下跌。net.core.somaxconn调大是为了应对短连接风暴Linux 默认 128在高并发连接场景下很容易成为瓶颈。执行sysctl -p使其生效。这些都是常规调优如果只是搭个测试库可以不做但生产环境千万别省。6. 个人经验几个让我印象深刻的事这次部署 5.7.32 aarch64 包最大的教训就是“别急着解压先看文件名的每一段”。很多同事一拿到包就tar -xf然后初始化报错才想起来查 glibc 版本一来一回浪费半小时。我自己现在养成的习惯是任何二进制包到手第一步ldd --version第二步uname -m第三步查file确认架构file mysql-5.7.32-linux-glibc-2.28-aarch64.tar.gz这个file命令会输出压缩包类型和字节序信息如果目标机器是 x86_64运行 aarch64 包会直接Exec format error这是架构不匹配最直观的信号。还有一个小技巧是不管用什么方式部署我始终保留一份my.cnf的备份放在/etc/my.cnf.bak.$(date %F)。改配置前先备份出了问题 3 秒钟回滚这个习惯救过我很多次。数据库这种东西慢是小事挂才是大事所有操作都留一条退路永远没错。本文还有配套的精品资源点击获取
返回列表