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

资讯详情

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

ARM64 CentOS 7安装MySQL 5.7:yum源配置到初始化完整指南

ARM64 CentOS 7安装MySQL 5.7:yum源配置到初始化完整指南

前阵子在一台ARM64架构的CentOS 7服务器上装MySQL 5.7,一开始觉得这事挺简单——yum装个包、初始化、启动,十几分钟搞定。结果真正动手才发现,ARM64架构下装MySQL 5.7跟x86_64完全是两回事,官方通用包装不上、yum源需要单独配、连二进制包都要自己找合适的版本,这一路坑踩下来,代码没跑起来,时间倒是耗进去整整一下午。折腾完之后我特意把整个过程整理成了这篇文章,希望能让需要CentOS 7、MySQL 5.7、ARM64三者同时凑齐的朋友少走这些弯路。内容适合服务器运维、项目部署和那些手里刚好有鲲鹏、飞腾、Ampere这类ARM服务器的同学,我会把从系统确认、环境准备、仓库配置到数据库初始化的完整链路都讲明白,每个坑都配上排查方法。

1. 写在前面:ARM64版CentOS 7装MySQL 5.7到底难在哪

1.1 先确认你手里的机器真的是ARM64

很多人拿到一台服务器,没看架构就往下装软件,我这次就差点栽在开头。Linux上看CPU架构非常直接,三条命令任选其一:

uname -m # 输出 aarch64 或 arm64,都是ARM64架构 # 输出 x86_64,就是传统Intel/AMD架构 lscpu | grep Architecture cat /proc/cpuinfo | grep -i "model name\|CPU part"

CentOS 7的ARM64版本,内核和用户空间都必须针对aarch64编译,也就是说你装系统时用的ISO镜像本身就是CentOS-7-aarch64开头的那种,而不是x86_64的镜像。如果你是用虚拟机装ARM版本的CentOS 7,那宿主机要么是真实的ARM服务器,要么是通过QEMU这类方式模拟出来的aarch64环境。虚拟化环境下还要多确认一步,是不是真的模拟出了ARM,别装了个x86_64的CentOS再说MySQL装不上。

ARM64和x86_64的差别,用个生活中的例子来说就是两种不同的语言体系:x86_64是英语的话,ARM64就相当于中文,同一个软件如果只在英语世界里写了一遍,中文世界跑不起来。Linux二进制、共享库、rpm包都跟CPU指令集直接绑定,ARM64机器上装x86_64的rpm包,装完一定启动不了,这一点是绕不过去的。这也是为啥我看到有人直接yum install mysql-community-server报“no package”或者“not found”时,第一反应都是让他先查架构。

1.2 为什么常见的安装方法在ARM64上会翻车

MySQL官方对Linux提供的安装包,历史上很长时间只发布x86_64和少数几种架构的二进制,5.7也不是一开始就有aarch64的rpm包。如果按照网上大多数教程直接下载那几个经典的tar.gz包,例如mysql-5.7.x-linux-glibc2.12-x86_64.tar.gz,在aarch64机器上解压是解压了,可里面全是x86_64的二进制,一执行直接报Exec format error,根本跑不起来。

那有人会想,编译安装总行吧?源码总跟架构无关。这话没错,但MySQL 5.7的源码编译依赖非常多,cmake、boost、gcc、openssl、ncurses,缺一个都编不过,ARM64平台上编译一个大版本动辄两三个小时,中间遇到单个测试项失败还不好定位。我的建议是能不用编译就别编译,有仓库就用仓库,有二进制包就用二进制包,后面我会给出几种实测能走的路径。

另外还有一个容易被忽略的点:CentOS 7本身已经停止维护了,自带的基础yum源早就被官方撤掉,如果你手里的ARM64 CentOS 7一直没换过源,yum install什么都失败。这个问题看起来跟MySQL无关,但90%的“装不上”最终都卡在这里。所以正式安装MySQL前,必须先解决yum源问题,这件事我在后面单独讲。

1.3 三条可行路线,先看结论

根据我这段时间在ARM64 CentOS 7上的实际测试,有三条能跑通的路:

方案内容适合场景难度
方法A用MySQL官方Yum仓库安装mysql-community-server 5.7网络正常、能用repo.mysql.com的场景低
方法B用Percona仓库安装percona-server-57官方源不可用或需要更灵活备份工具的场景中
方法C下载Generic Linux ARM64版tar.gz手动部署离线环境、需要自定义安装目录的场景高

我这次重点讲方法A,因为它是大多数人最理想的状态,也是我最终采用的方式。方法B和方法C我把关键操作列出来,给有需要的人做备选。

2. 环境准备:先把系统收拾利索再动手

2.1 系统版本、内核与基本的坑

安装MySQL之前,先用几个命令把环境摸清楚:

cat /etc/redhat-release # 期望输出 CentOS Linux release 7.x uname -r # 内核版本,多数ARM64 CentOS 7用3.10.0-xxx.el7.aarch64 free -h df -h

MySQL 5.7跑起来最低内存建议是512MB到1GB,当然这只是能启动的下限,现场大数据量、多连接的情况建议2GB起步。磁盘上,/var/lib/mysql作为默认数据目录至少留出几个GB的空间,df -h看清楚再动。

还有一个经常会掉坑的地方:CentOS 7的minimal安装通常不带perl、net-tools、wget这些包,而MySQL安装脚本和systemd在做依赖检查时需要它们。提前一次性装好:

yum install -y wget perl net-tools vim

如果你想使用Percona方案,后面还需要用到libaio和numactl-libs,这个方法A装了mysql-community-server后系统会自动带上,但手动方式就要自己装。

2.2 关闭SELinux和防火墙的选择

CentOS 7默认开启SELinux,MySQL在标准策略下启动有时会遇到权限拒绝,最典型的表现就是mysqld起来以后立刻退出,日志里全是Permission denied。排查的时候可以把SELinux临时切到permissive试试:

setenforce 0

如果想彻底关闭,改/etc/selinux/config,把SELINUX=enforcing改成SELINUX=disabled,注意这行改完要重启系统才完全生效。生产环境建议保持强制模式但也得配好对应策略,不过我个人在内部测试机上直接关掉,省心最重要。

防火墙的取舍取决于你需不需要远程连数据库。本地安装不开放端口,firewalld保持默认就行;如果应用服务器在另一台机器上,那就要开放3306端口。先把规则准备好,等MySQL配置完成之后再统一放行,这样能避免端口开着但数据库密码是初始密码这种危险状态。

2.3 换一个能用的yum源:几乎所有人都会忽略的前提

这一点我必须放到最前面反复说,因为CentOS 7的默认源已经失效了。当你在ARM64 CentOS 7上执行yum install的时候报错、超时、404,一大半都是因为/etc/yum.repos.d/里的repo文件还在指向已被关闭的官方仓库。

处理方式很简单,把系统自带的CentOS-Base.repo里的镜像地址替换成阿里云或者华为云的镜像地址(只要镜像源明确支持aarch64就行)。以阿里云为例,替换核心是这一组配置:

[base] name=CentOS-$releasever - Base baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/os/$basearch/ gpgcheck=1 gpgkey=https://mirrors.aliyun.com/centos-vault/7.9.2009/os/$basearch/RPM-GPG-KEY-CentOS-7 [extras] name=CentOS-$releasever - Extras baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/extras/$basearch/ gpgcheck=1 gpgkey=https://mirrors.aliyun.com/centos-vault/7.9.2009/os/$basearch/RPM-GPG-KEY-CentOS-7 [updates] name=CentOS-$releasever - Updates baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/updates/$basearch/ gpgcheck=1 gpgkey=https://mirrors.aliyun.com/centos-vault/7.9.2009/os/$basearch/RPM-GPG-KEY-CentOS-7

注意里面的$basearch变量,在ARM64机器上会被自动替换成aarch64,所以这个配置是架构无关的。CentOS 7的yum源问题,几乎每次都会有同学卡在这里,但处理完之后世界就清静了。

配置完之后执行:

yum clean all yum makecache yum repolist

如果能正常列出好多包,说明源已经通了。

3. 核心安装过程:用官方Yum仓库装MySQL 5.7

3.1 配置MySQL官方仓库

管理MySQL官方Yum仓库的RPM是mysql57-community-release-el7-*.noarch.rpm,这个包本身是noarch的,任何架构都能装。下载并安装:

wget https://repo.mysql.com/mysql57-community-release-el7-11.noarch.rpm yum localinstall -y mysql57-community-release-el7-11.noarch.rpm

安装完成后,/etc/yum.repos.d/下会多出mysql-community.repo和mysql-community-source.repo两个文件。打开一下mysql-community.repo,重点看MySQL 5.7的enabled配置:

vim /etc/yum.repos.d/mysql-community.repo

在5.7小节里确认enabled=1,其他版本小节(比如8.0)enabled=0。如果你之前部署过8.0的仓库,别忘了改回来。

然后执行yum makecache,看看能不能拉到MySQL相关的包信息。如果这一步就报错,多半是repo文件里有baseurl不可达的问题,先把仓库文件里指向mysql官方CDN的baseurl换成国内镜像源,或者临时用percona仓库代替。

接下来看看官方仓库里到底有没有ARM64的5.7包:

yum list mysql-community-server --showduplicates

正常情况下会看到mysql-community-server.x86_64和一两个aarch64的记录。如果只有x86_64,说明你下载的release包版本太老,或者仓库缓存有问题,我的建议是换个较新的release版本,比如el7-11、el7-10,然后重新makecache。

3.2 安装服务器与客户端

仓库通了以后,安装就是一条命令的事:

yum install -y mysql-community-server mysql-community-client

这里我把client也带上,因为后面登录数据库直接用mysql命令,没必要单独下载客户端。安装过程会提示导入MySQL GPG公钥,确认即可。

安装完看一下版本:

mysqld --version

输出类似mysqld Ver 5.7.44 for Linux on aarch64 (MySQL Community Server (GPL)),看到aarch64就放心了,架构匹配说明装对了。很多同学在这步只看到5.7.44就以为完事,不看后面的aarch64,其实这也是一种排查信息缺失。

如果装完发现mysqld版本是8.x,那就是yum配置的默认版本优先级出了问题。处理方法:直接把mysql-community-release里8.0小节的enabled改成0,5.7小节的enabled改成1,然后yum install再跑一次。

3.3 备选方案:用Percona Server 5.7顶上

有些场景下官方仓库的aarch64包真就不兼容或者下不动。我现在也会直接用Percona Server 5.7做替代,因为它跟MySQL 5.7二进制兼容,命令、配置、JDBC驱动全都一样,而且Percona在ARM64上的支持历史比MySQL官方还要更长一些。

Percona的安装步骤也不复杂:

yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm percona-release setup ps57 yum install -y percona-server-server-57 percona-server-client-57

安装完成后,service的名字在CentOS 7上叫mysqld,跟官方版一致。Percona还会额外装一些工具,比如xtrabackup,这个对后续备份运维来说反而是加分项。

3.4 备选方案:Generic ARM64二进制包手动部署

如果你的环境完全离线,或者需要把MySQL放到自定义目录(比如/data/mysql),那方法A/方法B的rpm方式就不太合适。MySQL官方在5.7后期版本里,确实发布了针对aarch64的Linux Generic二进制包,下载的时候要认准文件名里带aarch64字样的。

实际下载地址形如:

wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.44-linux-glibc2.12-aarch64.tar.gz

注意我标出来的aarch64关键字,不要下成x86_64版本。解压之后手动放到/usr/local/mysql,进行数据目录初始化:

tar -xzf mysql-5.7.44-linux-glibc2.12-aarch64.tar.gz -C /usr/local/ mv /usr/local/mysql-5.7.44-linux-glibc2.12-aarch64 /usr/local/mysql useradd -r -s /sbin/nologin mysql mkdir -p /data/mysql chown -R mysql:mysql /data/mysql /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql

二进制包方式的坑主要在依赖:系统里必须提前装好libaio和numactl库,否则mysqld起不来。先执行:

yum install -y libaio numactl-libs

再启动,并且把/etc/my.cnf里的basedir、datadir、socket路径都对应改好。这种方式之后我会专门再写一篇详细版,这里先列主干。

4. 初始化、配置与启动:让数据库真正能干活

4.1 初始化数据目录

rpm方式安装后,MySQL已经把mysqld放到/usr/sbin/,数据目录默认/var/lib/mysql。首次启动前要执行初始化,5.7之后的初始化命令是mysqld --initialize,系统会自动生成临时root密码。CentOS 7上通常直接用systemd来启动并初始化:

mysqld --initialize --user=mysql

如果这条命令没报错,数据目录就已经准备好了;如果报错,绝大多数是/var/lib/mysql目录权限问题,执行:

chown -R mysql:mysql /var/lib/mysql

再重新初始化。注意,初始化只会做一次,重复执行会报“Data Dictionary already initialized”之类的错误,所以看到这个提示不要慌,说明目录已经初始化过了。

4.2 启动服务、查看状态、设置开机自启

CentOS 7上一切围绕systemd进行:

systemctl start mysqld systemctl status mysqld systemctl enable mysqld

启动失败时,第一步永远是看错误日志:

tail -f /var/log/mysqld.log

常见日志几类:

  • 缺库缺文件:排查libaio、libnuma一类依赖
  • 路径错误:查看my.cnf里datadir与--initialize时是否一致
  • SELinux权限:把SELinux临时关掉再试一次,确认问题后再决定怎么配策略
  • socket文件路径错:客户端连不上时,看/var/lib/mysql/mysql.sock是否存在

4.3 获取临时密码并完成安全配置

5.7初始化的临时密码会写进日志,格式是:password is generated for root@localhost后面的那一段字符串:

grep "temporary password" /var/log/mysqld.log

拿到临时密码后用root登录:

mysql -uroot -p

第一次登录会让你改密码,也可以直接执行:

ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码'; FLUSH PRIVILEGES;

注意5.7默认的validate_password插件会强制密码复杂度,至少要包含大小写字母、数字、特殊符号,长度8位以上。如果你在开发环境想关掉这个限制,可以这样:

SET GLOBAL validate_password_policy=LOW; SET GLOBAL validate_password_length=6; ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

但这只对当前会话生效,想让配置持久化,把它写进my.cnf,或者使用mysql_secure_installation一步步做安全加固。mysql_secure_installation会问你删除匿名用户、禁止root远程登录、删除test库,生产环境建议全选yes。

4.4 字符集与排序规则,避免中文变问号

MySQL 5.7默认字符集是latin1,如果不改,数据表里存中文会出现乱码风险。这也是老生常谈但总有人忘的一步。建议启动前就在/etc/my.cnf里配置好:

[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_general_ci init_connect='SET NAMES utf8mb4' [client] default-character-set=utf8mb4

设置完之后重启MySQL:

systemctl restart mysqld

最后验证一下:

SHOW VARIABLES LIKE '%character%'; SHOW VARIABLES LIKE '%collation%';

character_set_server和character_set_database都应该是utf8mb4。这里多说一句,较新的MySQL 8.0默认就是utf8mb4,而5.7需要我们手动配,这也是5.7环境部署中经常会漏掉的步骤。

4.5 开启远程访问:授权和防火墙

本地安装只连localhost的话,不需要额外配置。如果应用服务器不在同一台主机上,那远程连接就要做两件事:分配账号权限、放行防火墙。

第一步,创建一个专门给远程用账号,最好不要用root:

CREATE USER 'remote_user'@'%' IDENTIFIED BY '你的密码'; GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%'; FLUSH PRIVILEGES;

第二步,放开3306端口。CentOS 7默认用firewalld:

firewall-cmd --permanent --add-port=3306/tcp firewall-cmd --reload

如果你把防火墙停掉或者换用了iptables,也要对应地做端口放行。

第三步,确认mysqld的bind-address配置。默认值是0.0.0.0,代表监听所有网卡;如果把my.cnf里改成了127.0.0.1,那远程就永远连不上,只能本地连接。出现“Can't connect to MySQL server on 'xxx' (10060)”这类错误时,排查顺序是:网络、端口、账号host、bind-address,这四个检查一遍基本就能定位。

5. 实战中常见的坑和排查实录

5.1 yum源失效,导致所有安装都以404告终

这个现象在ARM64 CentOS 7上触发概率极高。如果你执行yum install mysql-community-server,结果提示没有可用包,或者报一堆404,那基本就是repo指向了已经关闭的CentOS 7官方源。处理方式参考2.3节,把Base.repo改成aliyun或huaweicloud的vault镜像。这里我再补一句:修改repo文件之后,记得rm -rf /var/cache/yum/*,把缓存彻底清掉再重新makecache。

5.2 mysqld启动不了,日志直接刷Permission denied

这类情况通常集中在两个方向:SELinux和目录权限。先看status的输出,再用grep去捞日志:

journalctl -u mysqld --no-pager -n 50

如果看到响亮的Permission denied,就先setenforce 0验证,再决定是否关闭或配策略。目录权限方面,chown -R mysql:mysql /var/lib/mysql是基础操作,另外还要留意mysqld运行用户是否对/var/log/mysqld.log有写权限。

5.3 初始化生成的临时密码找不到了

初始化完成以后,/var/log/mysqld.log里就一行临时密码,但有几次日志刷新太快我没找到。这时候的解决方法是重置密码。先停止服务,然后以跳过授权表的方式临时启动:

systemctl stop mysqld mysqld_safe --skip-grant-tables &

然后登录:

mysql -uroot

手动改密码:

FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; FLUSH PRIVILEGES;

改完退出,把mysqld_safe停掉,再用systemctl start mysqld正常启动。注意mysqld_safe只是紧急救援手段,生产环境确认密码改好后就立刻恢复正常模式。

5.4 ARM64机器上没有ping通外网的判断顺序

经常有同学在装MySQL时顺便遇到ping不通百度的问题,然后两边互相干扰无从下手。排查思路很简单:

  • ping本机网关,通不通代表链路
  • ping 223.5.5.5(一个公共DNS),通就说明外网可达但DNS解析有问题
  • 都不通就检查网卡、网关、IP配置

DNS解析问题要改/etc/resolv.conf,设置一个可用的nameserver,比如nameserver 223.5.5.5和nameserver 114.114.114.114。这个问题独立于MySQL安装,但如果不理顺,yum源、MySQL下载、wget全都会一起失败。

5.5 架构不对装出来的各种奇怪表现

这个是ARM64环境特有的。如果你不小心下了一个x86_64的MySQL二进制,在aarch64机器上执行会直接提示Exec format error,或者chmod +x之后还是不行,这时候就可以确定是架构不匹配。慢慢养成一个习惯:所有下载的二进制和rpm,先问一句“这包是不是aarch64的”。

6. 一段实用经验:收尾之前再做这几件事

6.1 验证安装结果

安装和配置都结束之后,我自己会习惯性地把整条路径从头到尾完整验证一遍:

systemctl status mysqld | head -5 mysql -uroot -p -e "select version();" mysql -uroot -p -e "show variables like 'port';" mysql -uroot -p -e "show variables like 'character_set_server';"

6.2 一些粗调建议与习惯

如果你是部署给生产项目用的,5.7默认配置其实挺保守。常见粗调项:

[mysqld] max_connections=500 innodb_buffer_pool_size=1G innodb_log_file_size=256M

配完之后systemctl restart mysqld即可。buffer pool的大小根据物理内存调整,通常设为物理内存的50%~70%左右,小机器就适当调低。不要一上来就堆一个大buffer pool,否则系统内存紧张还可能触发OOM。

我个人的习惯是装完MySQL后顺手给/etc/my.cnf做一次完整备份,命名成my.cnf.bak.日期,之后每次改配置前都保持这个习惯,回滚会快很多。


最后再分享一个小技巧:ARM64机器上安装软件,判断软件包是否匹配架构,最直接的方法就是装好之后跑一下--version,看输出里有没有aarch64后缀。MySQL这种运行时间长的服务,装之前花20分钟确认架构、仓库、字符集、防火墙这四件事,一定比装完之后报错再修快得多。

返回列表