尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
ARM64 CentOS 7手工安装MySQL 5.7实战:从二进制包到systemd全流程
1. 为什么ARM64的MySQL 5.7安装不像x86_64那样“无脑”如果你以前在x86_64的CentOS 7上装过MySQL大概率会有这种体验下载官方Yum源然后yum install mysql-server等进度条跑完就完事了。整个过程顺得就像在应用商店里装了个App。但同样是CentOS 7一旦把CPU架构换成ARM64比如华为鲲鹏、飞腾、AWS Graviton、阿里倚天这些平台上面的流程基本就走不通了。第一个坑就是MySQL官方虽然提供了ARM64的RPM包但CentOS 7自带的Yum仓库里默认源根本没有mysql-server的ARM64版本。这就导致你执行yum install mysql-server的时候系统大概率会提示“没有可用软件包”。哪怕你换了阿里云、清华等镜像源结果也差不多——因为上游仓库里ARM64的MySQL 5.7 RPM包就是缺的。为什么会这样说白了CentOS 7发布那个年代ARM服务器还是小众中的小众官方源里压根没考虑过这套架构的数据库支持。MySQL 5.7时代的官方Yum仓库也是以x86_64为主ARM64的软件包要么没有要么只提供tar.gz通用二进制包版本更新也不积极。所以到了今天想在ARM64的CentOS 7上装MySQL 5.7最省心的路线其实是放弃Yum改用“通用二进制包手工安装”。这篇文章要写的就是我在ARM64 CentOS 7上装MySQL 5.7的完整过程。包括为什么选二进制包而不是Yum、下载安装的每一步、初始化数据库时遇到的坑、systemd服务配置以及装完之后的性能参数和日常运维建议。如果你手头正好有一台ARM64架构的CentOS 7机器不管是生产环境还是自己折腾玩照着这份笔记走大概率能少走不少弯路。2. 安装前的环境准备磁盘、依赖和系统配置在动手之前先把机器状态搞清楚。很多人装数据库装到一半突然失败回头一看全是前期环境没准备好。2.1 确认系统版本和架构登录机器后先执行两件事cat /etc/redhat-release uname -m正常情况下输出应该是CentOS Linux release 7.9.2009 (AltArch) aarch64注意这个aarch64它就是ARM64架构在Linux内核里的叫法。如果你看到的是x86_64那说明你拿到的机器不是ARM架构后面所有针对ARM64的操作就不适用了。有些朋友可能会问uname -m显示的是aarch64但外面到处都叫“ARM64”这俩是什么关系简单说aarch64是ARM公司为64位架构定的官方名字Linux社区认这个名字而“ARM64”是广义叫法大家平时口语混用指的都是同一种东西。你在下载软件包的时候认准这两个关键词就行。2.2 磁盘和分区规划MySQL的数据目录、日志文件、binlog这些东西都吃磁盘而且MySQL 5.7的redo log、undo log都是预分配文件启动时如果磁盘空间不足会直接拒绝初始化。所以安装前务必确认磁盘空间。建议最保守的配置是数据库数据盘至少预留20GB可用空间如果后面要导入大批量数据或者做OLAP类分析50GB以上更稳妥。用df -h看一下df -h如果发现根分区空间紧张最好在安装MySQL之前先扩容或者单独挂一块数据盘。之前我写过CentOS 7根目录扩容的笔记方法同样适用于ARM64架构这里不重复展开但提醒一句数据库这种写密集型的组件千万别往没空间的分区上怼。另外数据库目录单独放一个分区是很有必要的。我自己习惯把数据目录放到/data挂载点独立分区的好处是即使系统盘满了、日志撑爆了数据库的数据盘一般不受影响反过来数据库崩溃或者写爆了数据盘也不至于把根分区也塞满导致系统整体卡死。2.3 必备依赖包MySQL 5.7的通用二进制包对依赖要求不算多但它运行时依赖libaio和libaio.so.1这个动态链接库没有它mysqld启动的时候会报错error while loading shared libraries: libaio.so.1: cannot open shared object file。这是新手最容易忽视的一个点。CentOS 7上安装libaio很简单yum install -y libaio libaio-devel另外建议把numactl也装上。MySQL 5.7在多核环境下会调用numa相关的系统接口有些精简版系统缺少numa库时mysqld的初始化步骤会异常。虽然不一定每次都会遇到但装了它相当于给后面省一个可能的坑yum install -y numactl如果机器上有Percona或者MariaDB的残留文件建议一并清理干净避免端口、目录、socket路径冲突。检查一下rpm -qa | grep -E mysql|mariadb|percona有输出的话按需移除。2.4 关闭防火墙和SELinux这是一个“平时没事、出事就要命”的配置。我见过不少人在本机用mysql -uroot -p连得很爽但从另一台机器远程连接却一直卡在Cant connect to MySQL server最后排查下来就是防火墙没放行3306端口。我这里说的关闭防火墙仅限开发和内部测试环境。生产环境的正确做法是放行3306端口而不是直接关掉防火墙# 开放3306端口推荐 firewall-cmd --zonepublic --add-port3306/tcp --permanent firewall-cmd --reloadSELinux也一样虽然它和MySQL的冲突没有Nginx那么明显但SELinux enforcing模式下MySQL对数据目录的访问权限可能会受限导致初始化失败或者无法启动。临时测试或者内部环境可以直接关闭setenforce 0 sed -i s/^SELINUXenforcing/SELINUXdisabled/ /etc/selinux/config改完SELinux配置后建议重启一下系统让设置生效或者至少确认getenforce显示Permissive或Disabled。2.5 时间同步如果MySQL部署在有多台机器的集群环境时间不同步会引发复制异常、日志错乱等问题。CentOS 7自带chrony启动并确认同步状态即可systemctl start chronyd systemctl enable chronyd chronyc sources -v如果不方便用chrony手动执行ntpdate ntp.aliyun.com做一次时间校准也可以。单机部署的话这一步可以跳过但集群环境必须处理。3. 下载MySQL 5.7 ARM64二进制包选对源下载才不迷路架构确认了、依赖装好了、系统也准备好了接下来才是真正的重头戏——拿到一个能用的安装包。3.1 为什么不用Yum源回到最开始说的那个问题在ARM64 CentOS 7上yum install mysql-server为什么装不上因为MySQL官方Yum仓库repo.mysql.com对ARM64的支持主要体现在MySQL 8.0系列5.7的ARM64 RPM包非常不齐全。而且CentOS 7的官方Base源和EPEL源里也没有mysql-server的aarch64版本。有些第三方源比如某些国产镜像站可能有打包好的包但我不建议生产环境用这些来路不明的RPM。原因很简单MySQL二进制包的编译参数、目录规划都是有讲究的第三方打包者的修改你无法完全掌控。对数据库这种存储核心数据的组件可控性和可追溯性比“省事”重要得多。所以我最终选择的是MySQL官方提供的Linux通用二进制包Generic Linux它同时支持x86_64和aarch64。下载的时候认准带aarch64标识的tar包就行别下成x86_64版本否则解压完一运行就报Exec format error。3.2 从官网找到ARM64下载链接MySQL官网的下载地址经常变但核心路径是稳定的历史版本都放在https://downloads.mysql.com/archives/community/这个页面里。搜索MySQL Community Server 5.7选好版本后在下载列表里找到类似这样的文件mysql-5.7.44-linux-glibc2.12-aarch64.tar.gz注意三个关键点5.7.44这是MySQL 5.7系列的最后一个版本5.7系列2023年10月EOL5.7.44是收官版。glibc2.12CentOS 7用的glibc就是2.17兼容glibc 2.12起的包所以这个版本在CentOS 7上跑完全没问题。aarch64这就是ARM64架构的意思。当然如果你不方便打开官网页面也可以直接用命令行式的下载方式。先找一台有外网的机器或者直接在目标机器上执行cd /opt wget https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.44-linux-glibc2.12-aarch64.tar.gz用wget下载时注意一下文件大小是否正常。这个包一般在600MB左右如果下下来只有几百KB基本就是下载失败或者被墙了建议换个网络环境或者用国内镜像源加速。3.3 下载失败怎么办有的朋友反馈官网下载速度慢甚至会中断。这里提供一个备用方案先在一台能访问外网的机器上下载好tar包然后通过scp或者内网传输工具把包传到目标ARM64机器上。转移完成之后记得用md5sum或者sha256sum校验一下文件完整性sha256sum mysql-5.7.44-linux-glibc2.12-aarch64.tar.gz核验标准和官网页面提供的SHA-256值比对一致再继续操作。这一步不是走过场我遇到过tar包解压到一半报“gzip: stdin: unexpected end of file”的情况就是下载不完整导致的。分包传输的时候断点续传没用对、网络抖动都可能导致文件损坏。3.4 解压并移动到安装目录依赖补齐、包也拿到了接下来就是常规操作cd /opt tar -zxvf mysql-5.7.44-linux-glibc2.12-aarch64.tar.gz mv mysql-5.7.44-linux-glibc2.12-aarch64 /usr/local/mysql为什么挪到/usr/local/mysql这是MySQL二进制包的习惯路径很多脚本和工具默认会去这个位置找mysqld。当然这是软链接还是直接改名随个人习惯。我自己更推荐保留版本号目录然后建一个软链接指向它好处是以后升级版本时只需要切换软链接不需要动配置里写死的路径mv mysql-5.7.44-linux-glibc2.12-aarch64 /usr/local/mysql-5.7.44 ln -s /usr/local/mysql-5.7.44 /usr/local/mysql检查一下目录里的核心文件是否齐全ls -l /usr/local/mysql/bin/mysqld ls -l /usr/local/mysql/bin/mysql如果这两个文件存在说明解压正常。顺便验证一下架构是否匹配file /usr/local/mysql/bin/mysqld输出里应该包含ARM aarch64字样。4. 创建mysql用户、配置文件和初始化数据库安装包到位不等于数据库就能跑起来。MySQL出于安全考虑不允许用root用户直接运行mysqld加上数据目录规划、配置文件、初始化命令这些细节每一步都有讲究。4.1 创建专用的mysql系统用户按官方规范MySQL需要有一个专门的系统用户来运行。创建命令groupadd mysql useradd -r -g mysql -s /bin/false mysql-r表示创建系统用户-s /bin/false表示这个用户禁止登录shell既满足运行需要又降低安全风险。顺便说一句很多人喜欢用sbin/nologin效果类似用/bin/false也行实测都没问题。4.2 准备数据目录老规矩数据目录和数据文件分开。假如我们要把数据存到/data/mysqlmkdir -p /data/mysql chown -R mysql:mysql /data/mysql注意这里必须把数据目录的所有者改成mysql用户否则初始化时mysqld没有权限在目录里写文件会直接报错Couldnt create temp file之类的问题。权限问题在数据库安装里几乎是大头后面我会专门总结。4.3 编写my.cnf配置文件MySQL 5.7初始化时会读取/etc/my.cnf。我们提前把配置文件写好避免初始化完成后又要改一堆参数。一个适合大多数ARM64 CentOS 7场景的基础配置如下[mysqld] user mysql port 3306 socket /tmp/mysql.sock basedir /usr/local/mysql datadir /data/mysql pid-file /data/mysql/mysqld.pid log-error /data/mysql/error.log character-set-server utf8mb4 collation-server utf8mb4_general_ci skip-name-resolve max_connections 500 innodb_buffer_pool_size 1G innodb_log_file_size 256M innodb_flush_log_at_trx_commit 1 sync_binlog 1 lower_case_table_names 1简单解释一下几个关键参数datadir数据文件存放位置必须跟你在4.2里创建的目录一致。basedir安装目录指向/usr/local/mysql即可。character-set-server utf8mb4现在基本是编码首选兼容emoji和生僻字别再选utf8了MySQL 5.7里的utf8实际是utf8mb3存不了emoji。skip-name-resolve跳过反向DNS解析连数据库时不用等DNS超时很多“本地连得快、远程连得慢”的问题就是它引起的。innodb_buffer_pool_size 1G这是InnoDB最重要的性能参数。ARM64服务器内存16G以下可以给1G如果你内存够大可以按物理内存的50%-70%来调。lower_case_table_names 1表名大小写不敏感。这个参数尽量在初始化之前确定数据库初始化之后再去改是要出事的后面细说。关于innodb_buffer_pool_size再啰嗦一句ARM64服务器的内存带宽、频率和x86_64略有差异但不是设置这个参数的关键。关键还是看你的内存总量和数据库并发量。我的建议是DBA没把握的话先给1G跑起来观察一段时间后按需调整不必一上来就调满。4.4 初始化数据库mysqld --initialize配置写好了用root用户执行初始化命令cd /usr/local/mysql ./bin/mysqld --defaults-file/etc/my.cnf --initialize --usermysql这一步是MySQL 5.7和5.6的一个重大区别5.6时代用mysql_install_db脚本初始化5.7起官方推荐直接执行mysqld --initialize。初始化过程中会自动创建数据字典、系统表、root用户并在日志里生成临时密码。如果一切正常你会看到类似“Done”的提示。然后打开错误日志找初始密码grep temporary password /data/mysql/error.log日志里会有一行[Note] A temporary password is generated for rootlocalhost: xxxxxxxx这个xxxxxxxx就是临时密码赶紧记下来后面登录要用。如果日志里显示这句话说明初始化已经完成。如果初始化报错常见的有几类Missing required option user说明执行时没加--usermysql补上。Cant create directory /data/mysql权限问题确认目录所有者和权限。[ERROR] --initialize specified but the data directory has files in it数据目录不是空的。要么换一个目录要么把目录清空绝不要带着旧数据初始化。error while loading shared libraries: libaio.so.1说明前面步骤漏了libaio回头装依赖。4.5 初始化完成后的目录结构初始化成功后/data/mysql目录下会生成一堆文件包括auto.cnf、ib_buffer_pool、ibdata1、ib_logfile0/1、mysql、performance_schema、sys等子目录。看到ibdata1和ib_logfile0/1就说明InnoDB表空间和redo log已经建出来了。这时候要注意一个细节初始化之后绝对不要用kill -9直接杀mysqld进程该发SIGTERM就发SIGTERM否则redo log没落盘下次启动时恢复过程会变得很慢甚至异常。5. 配置systemd服务让mysqld开机自启二进制包安装的MySQL默认不会注册成systemd服务每次手动mysqld_safe启动太不专业了。我们需要自己写一个unit文件。5.1 编写mysqld.service在/etc/systemd/system/下创建mysqld.service[Unit] DescriptionMySQL Server Afternetwork.target Aftersyslog.target [Service] Typesimple Usermysql Groupmysql ExecStart/usr/local/mysql/bin/mysqld --defaults-file/etc/my.cnf LimitNOFILE 65535 Restarton-failure RestartSec5 [Install] WantedBymulti-user.target几个参数值得说明Typesimplemysqld直接以前台方式运行systemd直接接管日志。LimitNOFILE 65535文件句柄数限制默认只有1024的话高并发下数据库很容易报“Too many open files”这个参数必须提前放宽。Restarton-failuremysqld意外退出后自动拉起对于内部测试环境很友好生产环境可以根据策略决定是否开启。写完unit文件后重新加载并启动systemctl daemon-reload systemctl start mysqld systemctl enable mysqld执行systemctl status mysqld看一下服务状态。如果显示active (running)说明服务已经正常起来了。如果启动失败最有效的排查方式还是看错误日志tail -100 /data/mysql/error.log5.2 临时密码登录并修改root密码服务跑起来之后先用之前记下的临时密码登录/usr/local/mysql/bin/mysql -uroot -p输入临时密码后进入MySQL命令行。注意MySQL 5.7有个安全策略刚登录时除了改密码别的啥操作都不让干。所以第一步就是改root密码ALTER USER rootlocalhost IDENTIFIED BY YourStrongPass2024; FLUSH PRIVILEGES;这里强烈建议把密码设得复杂一点因为MySQL 5.7默认的validate_password组件要求密码必须包含大小写字母、数字和特殊字符太简单的密码会直接报错。5.3 创建远程连接账号如果需要从其他机器连数据库root默认只监听了localhost还需要创建一个远程访问账号CREATE USER app_user% IDENTIFIED BY AppPass2024; GRANT ALL PRIVILEGES ON *.* TO app_user%; FLUSH PRIVILEGES;注意生产环境不要用app_user%这种“从任何机器都能连”的账号最好指定网段比如app_user192.168.10.%把允许访问的网段收窄一点安全性会高很多。6. 数据库加固与性能参数调整装好数据库只是第一步能稳运行、跑得快才是真正的目标。这一节把我实际操作中调整过的参数和策略整理出来不分先后每个都很重要。6.1 validate_password组件让密码安全策略不那么“烦人”MySQL 5.7默认启用了密码强度校验之前改密码时已经体会过了。新建业务账号时也会受这个策略限制比如你只想给测试库设一个简单的123456系统会直接拒绝。如果你确定这是内部测试环境可以降低校验等级SET GLOBAL validate_password_policy LOW;或者干脆卸载这个组件UNINSTALL COMPONENT file://component_validate_password;不过我不建议在生产环境这么干。密码复杂度是数据库安全的一条基础防线用我的话说就是你连密码都不想设复杂凭什么指望黑客对你温柔6.2 InnoDB缓冲池大小的计算与实践innodb_buffer_pool_size是InnoDB性能的核心参数它决定了InnoDB可以在内存里缓存多少数据页和索引页。读多写少的业务buffer pool越大磁盘IO越少整体性能提升非常明显。个人经验公式如下buffer_pool_size min(物理内存总量 * 70%, 所需数据集大小)举例16GB内存的ARM64服务器如果业务常用数据在8GB左右那设置10GB-11GB是合理的如果数据集只有2GB给4GB就足够了再大就是浪费内存。注意别一次给满。Linux本身还要留一部分page cache和系统进程内存如果buffer pool占了90%以上的内存遇到内存压力时容易触发OOM反而得不偿失。另外MySQL 5.7支持在线修改buffer pool大小SET GLOBAL innodb_buffer_pool_size 2G;但这里有个细节参数在线修改后必须用innodb_buffer_pool_dump_at_shutdown和innodb_buffer_pool_load_at_startup配合否则实例重启后热数据缓存就没了启动后的一段时间性能会明显下滑。建议在my.cnf里固定配置innodb_buffer_pool_dump_at_shutdown 1 innodb_buffer_pool_load_at_startup 16.3 savepoint和binlog策略innodb_flush_log_at_trx_commit 1和sync_binlog 1是数据安全要求比较高的配置。前者保证每次事务提交都把redo log刷到磁盘后者保证binlog也实时落盘。这个组合的好处是即使操作系统突然断电也不会丢已经提交的事务代价是磁盘写入次数变多性能有损耗。对要求没那么高的业务比如内部报表系统可以考虑innodb_flush_log_at_trx_commit 2 sync_binlog 0理论上每秒左右刷一次盘性能提升很明显。但请注意这样做在数据库实例宕机时可能会丢最近1秒的已提交事务。选哪个取决于你的业务容忍度。6.4 连接数和文件句柄限制max_connections默认是151这个值对很多业务来说确实偏低。之前配置文件里我写了500如果业务并发较高可以适当往上调SET GLOBAL max_connections 1000;同时确认操作系统的open file限制已经调大。前面systemd单元文件里写了LimitNOFILE65535这里再做一道保险在/etc/security/limits.conf里加mysql soft nofile 65535 mysql hard nofile 65535否则系统层的限制比MySQL层还低并发一高就会被系统提前挡住。6.5 slow_query_log低配机器的排查利器ARM64机器上排查数据库性能问题时慢查询日志比啥监控工具都直接slow_query_log 1 slow_query_log_file /data/mysql/slow.log long_query_time 2 log_queries_not_using_indexes 1把执行超过2秒的查询全部记录下来配合mysqldumpslow工具聚合分析很快就能找到拖垮数据库的元凶SQL。7. 启动失败、权限报错这些坑我能想到的都列出来这一节专门讲踩坑。装MySQL这种事情步骤不算多但每个环节都有对应的坑而且这些坑不踩一遍根本不会长记性。7.1 libaio.so.1缺失症状执行systemctl start mysqld时服务启动秒退看日志才发现/usr/local/mysql/bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file原因就是系统缺少libaio解决方法前面2.3节已经写了这里再强调一次。如果yum install libaio装完还报错检查一下是不是64位系统的库路径有问题必要时直接ln -s /usr/lib64/libaio.so.1 /usr/lib/libaio.so.1。7.2 数据目录权限导致的初始化失败症状初始化时报Cant create/write to file /data/mysql/ibdata1或者Permission denied。原因几乎只有一个/data/mysql的所有者不是mysql。解决办法chown -R mysql:mysql /data/mysql chmod 750 /data/mysql这里提醒一句绝对不要因为嫌麻烦直接用root用户来运行mysqld。MySQL官方文档和所有生产环境实践都明确禁止这一点。用root跑数据库一旦应用层被注入或者拿到数据库权限攻击者就能通过MySQL的INTO OUTFILE之类的功能往系统上写文件后果非常严重。该遵守的底线还是要遵守。7.3 skip-name-resolve导致远程连接变慢有一个现象本地连MySQL秒连但从应用服务器远程连接偶尔要等好几秒。这是因为MySQL默认会对客户端的IP做反向DNS解析。如果应用服务器IP没有对应的PTR记录每次连接都要等DNS超时。前面配置文件里已经加了skip-name-resolve这个参数直接跳过反向解析远程连接速度立竿见影。副作用是授权表里用app_userlocalhost这种写法就不能按主机名识别了得用IP或%。所以用了这个参数之后账号授权时注意别写主机名。7.4/tmp/mysql.sock找不到症状客户端执行mysql -uroot -p时报Cant connect to local MySQL server through socket /tmp/mysql.sock。原因其实不超过三个mysqld没起来、socket路径配置不一致、或者客户端和服务端读的配置文件不同。检查方法systemctl status mysqld cat /etc/my.cnf | grep socket我遇到过一种情况配置里写的是/data/mysql/mysql.sock但客户端默认找/tmp/mysql.sock自然连不上。解决方法是在[client]段也补上socket路径[client] socket /tmp/mysql.sock配置文件两边保持一致这个问题就不会发生。7.5 初始化后改lower_case_table_names导致表找不到lower_case_table_names这个参数只能在初始化前确定。如果你初始化后从1改成0或者反过来会出现一个诡异的现象数据库还能启动但应用报“Table doesnt exist”。原因在于MySQL在初始化阶段就根据这个参数决定了系统表文件的存储和查找方式中途改动会导致表名大小写匹配混乱。网上不少人确实因为改了它导致整个库需要重导。所以我在这篇文章里特意把它写进默认配置目的就是让你一开始就想清楚而不是装完再折腾。7.6 二进制日志文件堆积导致磁盘写满如果开启了binlog生产环境应该开长时间运行后/data/mysql目录下的mysql-bin.000001、mysql-bin.000002等文件会越堆越大。默认情况下binlog从不自动清理除非你设置了expire_logs_days。建议在my.cnf里加上expire_logs_days 7 max_binlog_size 100M这样单个binlog到达100MB就轮转超过7天的binlog自动清理。注意如果你后面要搭主从复制清理策略要考虑从库的消费进度别把从库还没拉取的binlog切掉。7.7 ARM64上glibc版本不兼容的罕见情况理论上CentOS 7的glibc是2.17而MySQL官方aarch64包要求glibc 2.12以上所以一般不会有兼容性问题。但如果你用的不是纯正CentOS 7而是某种裁剪过的衍生系统建议先确认ldd --version如果glibc版本低于2.12那这个二进制包就没法跑只能换系统或者升级glibc。这种属于极端情况遇到概率极低但如果真卡住了可以先想到这个排查方向。8. 安装完之后的验收、自启动验证和日常维护数据库装好、服务跑起来还不算完。我习惯在交付之前做一轮完整验收确保这库在无人值守的情况下也能安安稳稳地活着。8.1 服务状态检查清单按顺序执行这一组命令# 检查进程是否存在 ps -ef | grep mysqld # 检查监听端口 ss -tlnp | grep 3306 # 检查服务运行时长 systemctl status mysqld # 确认开机自启 systemctl is-enabled mysqldss -tlnp输出里看到0.0.0.0:3306或者:::3306说明端口监听正常。如果只看到127.0.0.1:3306说明配置里可能开启了bind-address限制默认只允许本机连接。需要远程访问的话在[mysqld]段指定监听地址比如bind-address 0.0.0.0生产环境建议设置成具体内网IP而不是裸奔的0.0.0.0。8.2 功能验收建库建表、启停测试光看进程在还不够建议实测一遍数据库功能/usr/local/mysql/bin/mysql -uroot -p -e SELECT VERSION(); /usr/local/mysql/bin/mysql -uroot -p -e CREATE DATABASE IF NOT EXISTS testdb DEFAULT CHARSET utf8mb4;接着做一个重启测试模拟服务器重启后数据库是否能自动恢复systemctl stop mysqld systemctl start mysqld重启后执行SELECT 1;如果正常返回说明数据文件和redo log恢复流程没有异常。这一步在刚装完机时做一次能提前暴露掉很多隐蔽问题。8.3 忘记root密码的抢救办法最后分享一个实用技巧如果哪天root密码搞忘了用下面的步骤可以安全重置systemctl stop mysqld然后在my.cnf的[mysqld]段临时加一行skip-grant-tables启动服务此时可以无密码登录/usr/local/mysql/bin/mysql -uroot进去后立刻改密码FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY NewPassword2024;改完记得把my.cnf里那一行skip-grant-tables删掉再重启服务。这一步漏掉的话数据库就长期处于无认证状态等于门户大开。8.4 备份策略别拖到最后再想这个建议本来想放在前面说但既然是收尾就放在这里提醒安装过程不是终点数据库的生命才开始。我见过太多人装好库不配备份等到数据丢了才追悔莫及。最简单的入门方案是逻辑备份/usr/local/mysql/bin/mysqldump -uroot -p --single-transaction --routines --events --triggers --all-databases /backup/alldb_$(date %F).sql配合crontab定时执行起码保证有一个基础容灾手段。条件允许的话再上物理备份比如Percona XtraBackup但那个对ARM64环境的依赖库要求更高这里不展开。先跑起来备份策略后面再逐步完善。9. ARM64版MySQL 5.7的真实表现与性能小建议这篇文章写到最后说说我实际用下来的感受。很多人担心ARM64跑MySQL性能不行真的是想多了。我这台机器上跑着MySQL 5.7.44连续跑了几个月用sysbench压过oltp_read_write读写混合的性能表现和同价位x86_64服务器差距并不大。ARM64架构在单核性能上虽然不如Intel/AMD的高端核心但胜在核心多、功耗低跑MySQL这种多线程模型非常合适。尤其是存储密集型业务ARM服务器通常搭配高速NVMe盘整体IO能力并不会拖后腿。唯一要注意的是内存带宽。ARM64服务器在内存带宽上不同型号差距明显如果你跑的是大并发联表查询排序这类内存密集型场景选型时多看看内存通道数和频率别只看核心数。实际调优中我的体会是与其纠结架构差异不如先把MySQL自身的参数调好。buffer pool大小、redo log容量、连接数、慢查询日志这几项做对了不管什么架构都能跑出不错的性能。架构差异在数据库这种成熟组件身上远没有网上传的那么玄乎。真心建议碰到ARM64环境别慌按部就班来这玩意能稳稳干活。
RELATED

相关推荐

OpenHarmony上适配dcli_common:构建鸿蒙CLI工具链实践

OpenHarmony上适配dcli_common:构建鸿蒙CLI工具链实践

说实话,第一次在 OpenHarmony 设备上正经跑通一套基于 Dart 的 CLI 工具流时,我的第一反应不是兴奋,而是恍惚。过去几年我们在 Linux 服务器和 macOS 上写习惯了各种dcli脚本,处理文件、读环境变量、拉起子进程,一切都…

📅 2026/10/5 7:53:54
插件加载失败排查指南:从IAR到Harness与MusicFree的实战解析

插件加载失败排查指南:从IAR到Harness与MusicFree的实战解析

搞技术这些年,我见过太多人被“plugins”这三个字母折磨得够呛。装了IDE,它提示failed to load plugins;跑了CI流水线,它提示harness failed to load plugins web boot;就连电脑上装个开源播放器,也动不动来…

📅 2026/10/5 7:53:54
Win11 安装配置 Node.js 完全指南:从 LTS 到环境变量与 npm 提速

Win11 安装配置 Node.js 完全指南:从 LTS 到环境变量与 npm 提速

1. 先说清楚:Node.js 是干嘛的,哪些人需要装 1.1 一句话理解 Node.js Node.js 是什么?说人话,它就是一套能让 JavaScript 脱离浏览器、直接在操作系统上跑起来的运行环境。以前 JS 只能在网页里写点交互逻辑,装上 Nod…

📅 2026/10/5 7:53:54
MORE NEWS

更多资讯

📰

蓝幕微缩特效:灾难片拍摄的底层逻辑与实操指南

1. 灾难大片是怎么拍的?先搞懂蓝幕微缩特效的底层逻辑很多人第一次看到灾难片里大楼倒塌、洪水吞没城市的镜头,第一反应都是“这得花多少钱做CG啊”。其实不然。真正让观众肾上腺素飙升的那些大场面,相当一部分是靠蓝幕微缩特效完成的——用物…

📰

Codex 安装配置与项目实战:从零跑通 AI 编程助手全链路

1. 从零上手 Codex:这套工具到底能帮你做什么第一次接触 Codex 的人,十有八九是被“AI 助手”这四个字吸引进来的。但真到动手那一刻,问题就来了:装哪个版本、怎么配置、为什么别人的能跑我的报错、项目实战到底怎么落地。我自己从…

📰

Python字符串实战指南:驻留机制、拼接性能与编码陷阱全解

写Python这些年,字符串处理是最让我"真香"又"打脸"的主题。光看官方文档,会觉得字符串就是"不可变、支持切片、自带一堆方法",但真到了生产环境,踩到的坑往往藏在细节里:两个字符串肉眼…

📰

ChatGPT Work 从零上手:Agent、token 与定时任务实战指南

1. 从零上手 ChatGPT Work:这套东西到底解决什么问题 2026 年再聊 ChatGPT,如果还停留在“打开网页、输入问题、复制答案”这个层面,那基本等于只用了它三成能力。我身边不少做开发、做运营、做内容的朋友,最近半年陆续把工作流搬…

📰

把 AgentScope Harness 装进 RuoYi-Vue-Plus:纯 Java AI 平台的集成实践

前两篇讲了「是什么」和「权限怎么落地」。这一篇讲工程:智能体内核怎么与一个成熟的 Java 中台对接,以及我们踩过的坑。 一、目标:让中台「长出」智能体内核 我们不想要一个独立的 Agent 服务,再让业务系统去调它。目标是把智能…

📰

西电计组实验二:8位单周期ALU的VHDL实现与时序优化

1. 项目概述:从“西电计组实验二”看运算器设计的底层逻辑“西电计组实验二 运算器实验”——这行字在西安电子科技大学计算机学院学生的课表、实验报告封面上反复出现,背后不是简单的代码拼凑或波形仿真,而是一次对数字系统最核心部件的亲手…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬