ARTICLE DETAIL

资讯详情

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

ARM64架构CentOS 7服务器MySQL 5.7安装实战与排错

ARM64架构CentOS 7服务器MySQL 5.7安装实战与排错 搞运维这么多年最怕听到的一句话就是帮我在那台ARM服务器上装个MySQL 5.7。CentOS 7本身就是老系统MySQL 5.7也早已停止维护再加上ARM64的生态坑三个buff叠一起照着网上x86_64的教程抄作业基本都会翻车。这里记录的是我实际在ARM64架构的CentOS 7服务器上安装MySQL 5.7的完整过程包括在线Yum方式、离线RPM方式、通用二进制包方式以及远程连接和排错技巧。如果你正好拿到一台鲲鹏、飞腾或者其他ARM平台的机器需要在上面跑MySQL 5.7这篇可以直接当操作手册用。先提醒一句除非项目强制指定MySQL 5.7否则我会劝你换8.0或者MariaDB。但既然标题都写了5.7那我默认你已经评估过兼容性这篇文章只解决怎么装得稳的问题。1. 装之前先确认三件事1.1 系统到底是不是真正的ARM64ARM64和x86_64虽然都是64位但指令集完全不通用下载错一个包后面全部白干。所以第一件事不是到处找rpm而是先确认机器架构。uname -m arch lscpu | grep Architecture输出是aarch64就是标准ARM64如果出现armv7l说明是32位ARM那对应的是另一个世界前面的路走不通。有些国产ARM服务器虽然型号五花八门但在Linux内部基本都是aarch64少数使用自研内核的会显示其他名字需要根据厂商文档确认。另外还要看一下/etc/os-release把CentOS的版本号也确认了我装的这台是 7.9.2009。1.2 MySQL 5.7 在这台机器上到底能不能装MySQL 5.7 的通用二进制包后续版本里包含ARM64版本但在官方Yum仓库里EL7的aarch64资源并不是每个版本都全。这就导致一个尴尬局面你系统是 ARM64安装包却是基于 x86_64 命名的一装就报wrong ELF class或architecture conflict。我的建议是先尝试Yum仓库如果仓库里没有 aarch64 的rpm立刻转通用二进制包。别在Yum里死磕浪费时间。另外MySQL 5.7 已经EOL官方不再做安全修复生产环境敢继续用通常是因为业务代码里用了老语法或者DBA对老版本的脾气更熟。既然你确定了要装5.7那就不要再被“为什么不用8.0”这种问题干扰先把安装跑通再说。1.3 三种安装方式的取舍这里整理一下我试过的三条路方式适用场景优点缺点Yum在线安装有外网、官方源可用依赖自动解决升级方便ARM64的rpm可能不全官网源慢本地RPM安装内网、已提前拿到包可控性强适合批量依赖必须自己拉全通用二进制包官方没有对应rpm或跨架构环境最通用解压就能用初始化、权限、服务脚本要自己配如果只是临时验证一次优先走第三条。你要是问我不通外网怎么拉RPM往下看。2. 在线安装Yum源方案闭坑的关键是版本开关2.1 添加官方Yum仓库并调整5.7版本CentOS 7默认Yum源里没有MySQL官方提供了一个noarch的release包装完会在/etc/yum.repos.d/下生成mysql-community.repo和mysql-community-source.repo两个文件。执行rpm -ivh https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm这个release包是noarch所以在ARM64上可以正常安装。装完先别急着yum install因为5.7版本的repo可能默认没启用或者同时启用了8.0导致最后装出来不是你要的版本。打开/etc/yum.repos.d/mysql-community.repo检查两个关键字vi /etc/yum.repos.d/mysql-community.repo找到[mysql57-community]和[mysql80-community]分别把enabled设为1和0。注意repo路径里的$basearch会被Yum自动替换成aarch64所以在ARM机器上看不到x86_64字样是很正常的。如果官网源拉不动可以把baseurl换成国内镜像站的路径具体以镜像站页面显示的目录为准。这里不写死链接因为镜像站目录经常调整但核心逻辑不变确保baseurl指向el/7/aarch64/不然64位架构匹配不上。2.2 安装启动yum repolist enabled | grep mysql yum install -y mysql-community-server如果仓库里存在aarch64的rpm到这里依赖都会自动装好。启动systemctl start mysqld systemctl enable mysqld systemctl status mysqld这里有个很常见的坑你以为start了就一定好了实际上MySQL 5.7初始化失败时也可能是active (exited)状态得看日志和3306端口才能确认。稳妥一点启动后执行ss -lntp | grep 3306没有输出就是没起来马上回去看错误日志。2.3 初始化后第一件事找临时密码MySQL 5.7 初始化的root密码默认写在/var/log/mysqld.log里grep temporary password /var/log/mysqld.log拿到密码后立刻登录并修改mysql -uroot -p ALTER USER rootlocalhost IDENTIFIED BY NewPass_123;这里要提醒5.7默认开启了密码校验插件密码必须包含大小写字母、数字、特殊字符长度至少8位。你要是设置了弱密码哪怕步骤全对也过不去。可以先设置个强密码之后再用set global validate_password_policy0调低策略或者改完后把插件关掉。3. 离线安装用RPM包在断网环境装3.1 在联网机器上把依赖包拉全很多生产网段没有外网yum install是跑不了的。这时要在一台能联网、同架构aarch64的机器上先把所有rpm拉下来再拷进去。推荐用repotrack因为yumdownloader --resolve在有本地rpm已满足依赖时会少拉包repotrack会把依赖树完整抓下来。yum install -y yum-utils mkdir -p /opt/mysql-rpms cd /opt/mysql-rpms repotrack mysql-community-server --enablerepomysql57-community如果因为某种原因没有MySQL repo也可以直接从镜像站手动下载文件名里一定要带aarch64。之前有人在x86机器上用repotrack拉包拿去ARM服务器装必然报wrong ELF class或者cannot execute binary file这个坑别踩。3.2 内网机器本地安装把/opt/mysql-rpms整个目录拷到目标机器任意目录比如/tmp/rpmscd /tmp/rpms yum localinstall -y *.rpm使用yum localinstall而不是rpm -ivh是让Yum自行解析依赖内网只要本地多了所有依赖包就不会报错。如果实在依赖不齐可以用rpm -ivh加上--nodeps先装上但后面启动十有八九失败这不是好习惯。装完后的启动和改密码流程和在线安装一样。3.3 依赖缺口libaio、numactl、perlARM64的CentOS 7基础环境里perl一般自带但libaio和numactl经常缺失。报错形如error: Failed dependencies: libaio.so.1()(64bit) is needed by mysql-community-server-5.7.44-1.el7.aarch64解决办法是在联网机器上用yum install -y libaio numactl先把包拉下来再一起拷到内网。也可以直接从CentOS ARM64仓库下载对应的rpm。总之离线装MySQL最耗费时间的不是MySQL本身而是这些边角依赖。4. 通用二进制包把MySQL5.7直接拷到ARM服务器4.1 下载哪个包怎么放如果官方Yum的aarch64 rpm不好找通用二进制包是最保底的方法qemu模拟ARM64的虚拟机里也能用。到MySQL官网下载页选择Linux - Generic (glibc 2.12) (ARM, 64-bit)文件名大概是mysql-5.7.x-linux-glibc2.12-aarch64.tar.gz这样的格式不同小版本命名略有差异下载后传到服务器cd /usr/local tar zxvf /path/to/mysql-5.7*.tar.gz ln -s /usr/local/mysql-5.7*/ /usr/local/mysql mkdir -p /usr/local/mysql/data /usr/local/mysql/logs /usr/local/mysql/tmp有人会问为什么要用软链因为MySQL版本会更新以后升级5.7.x时直接换解压目录、改软链不用动数据目录。这个习惯我保留到现在。4.2 创建用户、写配置、初始化数据目录创建运行用户顺便把目录属主改成mysqlgroupadd mysql useradd -r -g mysql -s /bin/false mysql chown -R mysql:mysql /usr/local/mysql然后写/etc/my.cnf这是生是死的关键[mysqld] basedir/usr/local/mysql datadir/usr/local/mysql/data socket/usr/local/mysql/mysql.sock pid-file/usr/local/mysql/mysqld.pid log-error/usr/local/mysql/logs/error.log port3306 usermysql character-set-serverutf8mb4 collation-serverutf8mb4_general_ci用--initialize-insecure初始化root账号初始为空密码适合内网环境上完线马上改密码。如果希望像Yum安装那样自动生成随机密码就把参数换成--initialize/usr/local/mysql/bin/mysqld --initialize-insecure --usermysql --basedir/usr/local/mysql --datadir/usr/local/mysql/data注意这一步必须在数据目录为空且属主为mysql的前提下执行。如果目录里残留了上次初始化的文件会报[ERROR] Failed to find valid data directory或Initialization of datadir failed。4.3 配置systemd服务和环境变量直接运行mysqld_safe也能启动但每次开机要手动起太麻烦建议做成systemd服务。在/etc/systemd/system/mysqld.service写入[Unit] DescriptionMySQL Server 5.7 Afternetwork.target [Service] Typeforking Usermysql Groupmysql PIDFile/usr/local/mysql/mysqld.pid ExecStart/usr/local/mysql/support-files/mysql.server start ExecStop/usr/local/mysql/support-files/mysql.server stop Restarton-failure [Install] WantedBymulti-user.target然后加载并启动systemctl daemon-reload systemctl enable --now mysqld systemctl status mysqld这里要特别检查support-files/mysql.server脚本里的basedir、datadir是否和my.cnf一致。我自己遇到过脚本默认basedir/usr/local/mysql但datadir写死为/var/lib/mysql的情况启动后一直报找不到数据最后发现是配置文件没被脚本读取需要在脚本里把basedir和datadir变量也补上。通用二进制包附带的服务脚本默认读取/etc/my.cnf一般不用改但如果你的目录不在默认位置还是检查一下保险。5. 远程连接与安全收尾5.1 创建远程用户并授权装好的MySQL默认root只允许本机登录远程连不上几乎都是这一步没做。登录后mysql -uroot -p CREATE USER app% IDENTIFIED BY App_123456; GRANT ALL PRIVILEGES ON appdb.* TO app%; FLUSH PRIVILEGES;如果只是为了运维方便直接给root开远程一定不要用这种裸奔写法GRANT ALL ON *.* TO root%。最好创建独立用户只授权业务库。遇到连上但无法选择库的情况多半是授权粒度不对。5.2 防火墙放行3306CentOS 7默认是firewalld没放行端口时远程连接会报10060超时或10061拒绝。执行firewall-cmd --permanent --add-port3306/tcp firewall-cmd --reload如果机器上用的是iptables就执行iptables -A INPUT -p tcp --dport 3306 -j ACCEPT service iptables save这里还有一个常被忽略的坑云服务器裸机没有firewalld但云平台安全组默认拦截。所以即使本地防火墙放行了3306远程客户端连不上时还要去控制台安全组检查入站规则。5.3 重置root密码的兜底操作密码忘了或者初始化空密码进不去最常用的套路是skip-grant-tables。在/etc/my.cnf的[mysqld]段加一行skip-grant-tables重启后免密登录systemctl restart mysqld mysql -uroot然后执行FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY NewPass_456;改完把skip-grant-tables删掉再重启一次。这里有个顺序问题不加FLUSH PRIVILEGES直接ALTER USER有些版本会报ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement。老办法update mysql.user set authentication_stringpassword(xxxx) where userroot;在5.7里也能用但改完后必须重启不然权限表状态是乱的。6. 排错实录从启动不了到连不上6.1 启动失败先看日志别拍脑袋MySQL 5.7的日志位置取决于my.cnf配置在线安装默认是/var/log/mysqld.log二进制包我上面配了/usr/local/mysql/logs/error.log。启动失败别反复看systemctl status直接开日志tail -n 100 /usr/local/mysql/logs/error.log我遇到频率最高的几个错误[ERROR] Cant start server: Bind on TCP/IP port: Permission denied端口被占用或SELinux拦截先netstat -lntp查3306。[ERROR] Could not open required defaults filemy.cnf路径写错MySQL的默认读取顺序是/etc/my.cnf、/etc/mysql/my.cnf如果配置文件路径比较特殊启动命令要用--defaults-file显式指定。[ERROR] InnoDB: Unable to lock ./ibdata1数据目录权限不对多半是chown丢了一步。6.2 网络不通ping不通百度很多内网环境初始化时要访问外网结果一ping www.baidu.com不通就慌。先区分是DNS问题还是路由问题先ping一个IPping 114.114.114.114如果IP能通域名不通是DNS配置问题编辑/etc/resolv.confnameserver 1.1.1.1 nameserver 8.8.8.8如果IP也不通检查默认路由和网卡配置ip route show cat /etc/sysconfig/network-scripts/ifcfg-eth0还有一种情况机器在办公网出网必须走代理。这时ping永远不通但Yum只要在/etc/yum.conf里配置proxyhttp://代理IP:端口就能用。别在ping上死磕。6.3 其他高频问题速查现象原因解决安装时提示libaio.so.1缺失ARM64基础环境缺少libaioyum install -y libaio启动后mysqladmin ping失败socket路径不一致检查my.cnf里的socket客户端连接加-S参数远程客户端报Host ... blockedMySQL用户未允许远程创建%或具体IP网段账号写入中文乱码初始化未指定utf8mb4加character-set-serverutf8mb4已有库需要重建克隆虚拟机后无法启动server_uuid冲突删除auto.cnf后重启说明一下字符集问题如果业务表建好之前没设置utf8mb4后面改动配置文件只影响新建连接已有库还是老字符集。最保险的做法是在写my.cnf时就把字符集参数固定别等出现中文乱码再去补救。装完不代表结束最近又处理过一台二进制包装的MySQL跑了两周突然连接中断日志里有一堆Native table structure的报错最后发现是内核OOM把mysqld杀了。在ARM64内存小的服务器上跑MySQLswap最好给足不然装得再好也白搭。最后说个心得能装成不是本事装完之后能明确知道日志在哪、密码策略是什么、远程授权怎么做才算真正把MySQL 5.7在这个ARM环境下驯服了。
返回列表