ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

麒麟V10服务器部署MySQL 8.0全指南:从依赖处理到远程连接的完整实操

2026/9/18 19:26:23 拓冰建站 浏览量
麒麟V10服务器部署MySQL 8.0全指南:从依赖处理到远程连接的完整实操 先说说我和这套系统的缘分。前一阵帮朋友在银河麒麟V10的服务器上部署MySQL原本以为半小时能搞定的小事结果从下午折腾到晚上——不是缺依赖就是目录权限不对好不容易装完了客户端又连不上最后还因为字符集问题被一长串乱码教育了一顿。网上关于麒麟系统装MySQL的资料不少但很多是零散片段要么写得过于简略要么命令直接照搬CentOS结果各种报错。所以这次把完整过程整理成一篇能照着抄的实操记录尤其是那些不说就很容易踩的坑一并写清楚给需要在麒麟系统上部署MySQL的朋友省点时间。这篇内容主要解决三个问题怎么确认自己的麒麟系统该装什么包怎么用最稳的方式把MySQL 8.0装好并启动装完之后怎么处理远程连接、字符集、开机自启这些绕不开的细节。无论你是刚接触Linux的新手还是被国产系统迁移折腾的运维老哥这套流程都适用。1. 安装前的系统确认与方案选型1.1 先确认麒麟版本和CPU架构别装错包很多人上来就搜“麒麟系统安装MySQL”然后复制一段命令直接执行结果各种报错。第一个坑就出在“麒麟系统”这四个字上——银河麒麟V10严格来说是一个系列有桌面版、服务器版底层有的基于Debian系有的基于RHEL/CentOS系CPU架构又有x86_64和aarch64ARM之分。装错包最典型的现象就是执行mysqld时提示“cannot execute binary file: Exec format error”或者干脆命令不存在。所以动手之前先跑三行命令确认环境cat /etc/os-release cat /etc/kylin-release 2/dev/null uname -m第一行看系统版本和包管理基础第二行看具体的麒麟发行版本信息第三行看CPU架构。我这次安装的机器输出是x86_64系统是基于CentOS系的银河麒麟服务器版后面命令就是按这个环境来的。如果你的输出是aarch64那下载MySQL安装包时要选ARM版本其余流程基本一致。还有一个判断技巧看系统自带的是apt还是yum/dnf。有apt的走Debian系安装逻辑有yum的走RHEL系安装逻辑。这篇内容主线以RHEL系为主Debian系的差别我在对应位置会额外标注。1.2 三种安装方式怎么选同一个MySQL在不同Linux发行版上安装方式五花八门归纳起来无非三种系统源安装、官方二进制包安装、源码编译安装。安装方式优点缺点适用场景系统源yum/apt命令简单依赖自动处理版本通常偏老有的麒麟源里默认是MariaDB而非MySQL内网测试、对版本不敏感官方二进制tar包可自定义版本不污染系统库离线可部署依赖需要自己补齐服务脚本要自己配置生产环境、内网部署本文采用源码编译可深度定制编译参数编译慢、依赖多、后期升级麻烦有特殊优化需求时才考虑系统源安装确实省事但在麒麟上有个很尴尬的问题你执行yum install mysql-server装出来可能不是MySQL而是MariaDB。不是说MariaDB不好而是很多业务系统是按MySQL特性开发的迁移过去容易出现兼容性问题。源码编译又太折腾一个make install跑下来可能就是一晚上对大多数人来说没必要。1.3 我为什么选官方通用二进制包对比下来官方提供的Linux通用二进制包glibc版本是最平衡的方案。它本质上就是一套已经编译好的MySQL程序文件解压就能用不依赖系统的包管理器x86和ARM都有对应版本而且完全可以离线部署——在一台能联网的机器上把包下载好传到内网麒麟机器上解压即可这在很多要求离线交付的环境里很关键。缺点是依赖库需要自己留意比如libaio、numactl这种基础库后面会专门讲怎么装。另外MySQL的启动服务、开机自启这些也需要手工配置但一次配好之后基本不用再动。整体流程可控、思路清晰出了问题也知道从哪里排查。2. 环境准备与依赖处理2.1 清理冲突组件腾出3306端口麒麟系统尤其是服务器版预装软件里可能已经有mariadb相关的包了如果直接装MySQL两者抢数据库目录、抢3306端口轻则启动失败重则数据错乱。先检查一下rpm -qa | grep -i mariadb ss -lntp | grep 3306第一行查MariaDB包第二行查3306端口占用。如果rpm -qa有输出执行yum remove -y mariadb*清理掉如果3306端口被其他进程占着要确认是谁在用避免误杀别的服务。另外仔细看一下系统是否装了libaio这个库MySQL 8.0必须用到缺失时初始化或启动会直接报错error while loading shared libraries: libaio.so.1。就算当前还没报也不代表后面不会踩建议现在就把依赖补齐。2.2 把依赖包装齐少一个都起不来基于RHEL系的麒麟系统执行yum install -y libaio numactl-libs如果是Debian系的麒麟系统执行apt install -y libaio1 libnuma1numactl-libs或libnuma1是NUMA内存管理相关的库MySQL在启动时会调用缺少同样会报共享库加载错误。这两个包装了基本就能覆盖MySQL 8.0在Linux上的起步依赖。有朋友会问系统里没有外网能不能离线装依赖可以。找一台相同架构、相同版本的麒麟机器用yumdownloader libaio numactl-libs把rpm包下载下来再拷贝到目标机器上执行yum localinstall安装或者直接用麒麟系统安装ISO里的 Packages 目录里面就能找到对应rpm包。Debian系则用apt download或dpkg -i处理。这也再次印证了选官方二进制包的好处最大头的事前依赖就这两三个其他的随包自带。2.3 规划目录和专用账户专业一点的部署习惯是“程序目录、数据目录、日志目录分离”。程序目录放安装文件数据目录放数据文件日志目录放错误日志和运行日志。这样做的好处很直白数据盘挂载、备份、灾备时可以只针对数据目录操作权限控制也更清晰没有那么容易误删程序文件。我这次按下面的结构规划/usr/local/mysql # 程序安装目录 /data/mysql/data # 数据文件目录 /data/mysql/logs # 日志文件目录 /data/mysql/run # pid、socket等运行时文件然后创建MySQL专用账户groupadd mysql useradd -r -g mysql -s /sbin/nologin mysql mkdir -p /data/mysql/{data,logs,run} chown -R mysql:mysql /data/mysql这里有个细节useradd -r创建的是系统账户-s /sbin/nologin表示这个账户不能登录shell。MySQL服务以这个低权限用户运行即便后续被入侵攻击者拿到的也不是一个能直接登录系统的shell这是非常基础但重要的安全习惯。生产环境别用root直接跑MySQL回头看这条建议你会感谢自己。3. 核心安装流程全实录3.1 从官网拿包上传解压MySQL官方下载页面里选择“Linux - Generic”类别下的tar包。注意区分版本号x86_64对应Intel/AMD架构aarch64对应ARM架构glibc2.12一般适配较老系统glibc2.17适配较新系统麒麟V10基本两种都能跑优先按系统实际架构选。下载命令示例以x86_64的8.0.32为例wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.32-linux-glibc2.12-x86_64.tar.xz如果服务器不方便联网就在本地下载后通过scp、U盘等方式传到服务器。传到目标机器后解压到/usr/local目录cd /usr/local tar -xJf mysql-8.0.32-linux-glibc2.12-x86_64.tar.xz mv mysql-8.0.32-linux-glibc2.12-x86_64 mysql加上环境变量让自己能在任意目录直接敲mysql命令echo export PATH/usr/local/mysql/bin:$PATH /etc/profile source /etc/profile验证一下mysql --version如果输出版本号说明程序和PATH配置没问题继续往下走。3.2 写一份能直接用的my.cnf/etc/my.cnf是MySQL的主配置文件。很多新手装完不写配置直接初始化后面遇到字符集乱码、pid文件找不到、端口被占用等问题再回头补反而更乱。我建议初始化之前就把配置写好这是整篇教程里最值得多花两分钟的地方。我的配置文件如下你可以在这个基础上删减[mysqld] usermysql basedir/usr/local/mysql datadir/data/mysql/data socket/tmp/mysql.sock pid-file/data/mysql/run/mysqld.pid port3306 server-id1 log-binmysql-bin binlog_formatrow character-set-serverutf8mb4 collation-serverutf8mb4_general_ci max_connections500 default-storage-engineInnoDB innodb_buffer_pool_size512M innodb_flush_log_at_trx_commit1 sync_binlog1 skip-name-resolve [client] default-character-setutf8mb4几个关键点character-set-serverutf8mb4和collation-serverutf8mb4_general_ci是字符集设置现在的新项目建议直接用utf8mb4能完整支持中文和emoji别再用已经过时的utf8它实际是utf8mb3字符集支持不全。innodb_buffer_pool_size是InnoDB缓冲区大小一般设为物理内存的60%~70%。测试机内存2G设512M就够了内存大的机器可以按比例调高。注意别贪多给系统和其他进程留一些余量不然启动后发现内存吃紧反而得不偿失。skip-name-resolve这个参数建议开启作用是让MySQL不通过DNS反向解析客户端主机名连接速度会变快也能避免DNS异常导致的连接超时。代价是远程授权时不能用域名匹配用户要用IP或%通配符。提示如果业务系统涉及Windows上的存量数据库迁移你可能会想到lower_case_table_names1让表名不区分大小写。这个参数必须在MySQL 8.0初始化之前就定好初始化之后再改基本不生效而且容易引发数据目录异常。要不要用先用脑再用命令。其实pid-file和socket路径也要和配置一致否则后面用mysql客户端登录时找不到socket文件会提示“Cant connect to local MySQL server through socket”。3.3 初始化数据目录认清临时密码数据目录在初始化前必须为空。如果刚才创建目录时里面有文件或者是从别处拷贝过数据先清空再动手rm -rf /data/mysql/data/* chown -R mysql:mysql /data/mysql执行初始化/usr/local/mysql/bin/mysqld --defaults-file/etc/my.cnf --initialize --usermysql--initialize表示初始化系统数据并生成root用户的随机临时密码。命令执行完没有输出是正常的重点看日志tail -20 /data/mysql/data/*.err日志里会出现一行类似[Note] A temporary password is generated for rootlocalhost: xxxxxxxx的内容冒号后面那串就是MySQL给你的初始密码先复制保存下来后面第一次登录要用。如果初始化时报错先看是不是以下三种包缺失、目录权限不对、datadir非空。前两种按前面步骤就能解决第三种清理目录后再跑一次。3.4 启动MySQL并验证初始化完成后启动方式有两种先讲最快的手动启动/usr/local/mysql/support-files/mysql.server startmysql.server是MySQL官方自带的服务脚本内部会调用mysqld_safe帮我们拉起并守护进程。启动后确认一下状态ps -ef | grep mysqld看到mysqld进程在跑再用初始密码登录mysql -uroot -p提示输密码时粘贴刚才保存的临时密码注意终端不支持CtrlV粘贴时可能要用鼠标右键或ShiftInsert登录成功后执行SHOW VARIABLES LIKE version; SELECT 1;能正常返回数字和版本号说明核心功能已经通了。此时MySQL还没开机自启重启系统后会消失下一步处理。3.5 配置开机自启重启不失联生产环境重启后MySQL必须自动拉起这里用systemd来管最简单也符合麒麟V10的习惯。先停掉手动启动的MySQL/usr/local/mysql/support-files/mysql.server stop然后创建服务文件/etc/systemd/system/mysqld.service[Unit] DescriptionMySQL Server Afternetwork.target [Service] Typeforking Usermysql Groupmysql PIDFile/data/mysql/run/mysqld.pid ExecStart/usr/local/mysql/bin/mysqld_safe --defaults-file/etc/my.cnf ExecReload/bin/kill -HUP $MAINPID PrivateTmptrue [Install] WantedBymulti-user.target加载并启用服务systemctl daemon-reload systemctl enable mysqld systemctl start mysqld systemctl status mysqld这里有个容易踩的坑PIDFile路径必须和my.cnf里的pid-file完全一致否则systemd会警告“PID file ... not readable (yet?) after start”虽然有时候服务能跑但状态显示不准确后面管理起来很别扭。Typeforking是这套配置的关键。mysqld_safe启动后会fork出子进程并后台运行所以要用这个类型systemd靠PID文件来确认主进程。如果启动失败第一件事看状态输出和MySQL错误日志后面第五章有排查清单。4. 密码安全与远程访问配置4.1 拿到初始密码后第一步改密用临时密码登录MySQL后执行的第一个SQL一定是改root密码ALTER USER rootlocalhost IDENTIFIED BY YourStrongPassword_2025!;MySQL 8.0默认密码校验策略是validate_password对密码强度有要求——至少包含大写、小写、数字和特殊字符长度一般不少于8位。如果你设置简单密码被拒绝别急着关策略那是在保护你。实在想换回宽松策略可以执行SET GLOBAL validate_password.policy LOW;但生产环境强烈不建议。顺手把匿名用户和测试库清理一下DELETE FROM mysql.user WHERE User; DROP DATABASE IF EXISTS test; FLUSH PRIVILEGES;另外建议顺手执行mysql_secure_installation这个交互脚本会引导你完成匿名用户清理、root远程登录禁用、测试库删除等安全配置简单回答几步就行比手动执行SQL更不容易漏。4.2 新建业务账号开放远程登录直接用root账号给业务应用连数据库属于高危操作。规范做法是建一个按业务划分的专用账号权限精确到库表。CREATE USER app_user% IDENTIFIED BY AppPassword_2025!; GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO app_user%; FLUSH PRIVILEGES;上面这条只给了appdb库的增删改查权限够大部分业务用了。%表示允许从任意IP连接如果业务服务器IP固定更稳的写法是app_user192.168.1.100可以缩小暴露面。需要让root也能远程连的话建议新建一个管理员账号而不是直接改root%方便后期审计和权限回收。这里有一个麒麟系统上经常被忽略的细节如果前面配置了skip-name-resolve连接时MySQL不会做DNS反解授权时用%或用具体IP都没影响但如果两个参数之间的理解有偏差容易出现在本机用localhost能连、远程IP却始终提示“Host is not allowed to connect”。4.3 防火墙与SELinux两个隐藏拦路虎装完后远程连不上十有八九不是MySQL的问题而是防火墙没放行3306端口。麒麟系统如果开着firewalldsystemctl status firewalld firewall-cmd --permanent --add-port3306/tcp firewall-cmd --reload如果不想开防火墙仅限内网测试环境直接systemctl stop firewalld systemctl disable firewalldSELinux是另一个容易忽略的因素。执行getenforce如果输出Enforcing建议先临时关闭测试连接setenforce 0确保不是SELinux在拦截后再决定长期策略。要永久关就在/etc/selinux/config里把SELINUXenforcing改成SELINUXdisabled改完重启生效。麒麟V10有些版本的SELinux默认就是disabled没有这个问题的机器可以跳过。4.4 客户端连不上先检查认证插件这是我在麒麟上遇到频率最高的问题。MySQL 8.0默认认证插件是caching_sha2_password安全性更高但老的客户端驱动——比如Navicat 12及以下版本、老版本Python的pymysql、Java老版本的JDBC驱动——不支持这种认证方式连接时会报Authentication plugin caching_sha2_password cannot be loaded解决办法有两个方向。升级客户端到支持MySQL 8.0的版本是最好的选择如果客户端暂时没法升级可以把账号的认证插件改成老式的mysql_native_passwordALTER USER app_user% IDENTIFIED WITH mysql_native_password BY AppPassword_2025!; FLUSH PRIVILEGES;另外Navicat连接时如果勾选了SSL但服务器没配置证书也会报SSL错误。稳妥做法是连接参数里选择“不加密”或“如果可用则使用SSL”避免认证协议不一致导致来回折腾。5. 高频问题与排查实录5.1 初始化就翻车八成是这三种原因初始化阶段报错概率最高而且错误信息往往隐藏在一长串日志里。最常见的三类一是缺依赖库报错关键词libaio.so.1或libnuma.so.1解决命令前面已经给了多执行一次不丢人。二是目录权限不对报错关键词Cant create/write to file /data/mysql/data/...或者The designated data directory /data/mysql/data is unusable。原因基本就是/data/mysql的属主不是mysql或者datadir里有残留文件。执行chown -R mysql:mysql /data/mysql rm -rf /data/mysql/data/*再初始化一次即可。三是配置文件路径和实际目录不一致。比如my.cnf里写了basedir/usr/local/mysql但解压时放了别的路径初始化时用--basedir显式指定就能定位问题。5.2 启动后进程莫名其妙退出初始化成功、执行mysql.server start也提示success但几秒后进程没了。碰到这种情况别急着重复启动先看错误日志tail -100 /data/mysql/data/*.err dmesg | tail -20日志里常见的错误有InnoDB: Unable to lock ./ibdata1一般是MySQL已经在运行或者上次异常退出有残留进程使用ps -ef | grep mysqld查杀再启动Out of memory那就是innodb_buffer_pool_size配得太大系统内存不足调小后重试还有socket file /tmp/mysql.sock already exists说明上次没有干净退出删掉socket文件再启动。有一个实用习惯进程反复异常退出时用/usr/local/mysql/bin/mysqld_safe --defaults-file/etc/my.cnf 前台模式启动报错信息会直接打在终端不用在日志文件里大海捞针。5.3 从问题表象到解决命令的速查表把这次安装和平时运维遇到的典型问题整理成表放到手边排查时直接对照问题现象可能原因解决命令/方法mysql: command not foundPATH未配置export PATH/usr/local/mysql/bin:$PATHlibaio.so.1: cannot open shared object file缺少依赖库yum install -y libaiolibnuma.so.1: cannot open shared object file缺少依赖库yum install -y numactl-libsThe designated data directory is unusabledatadir非空或权限错清空目录chown -R mysql:mysqlCant connect to local MySQL server through socket /tmp/mysql.sock服务没启动或socket路径不一致检查进程确认my.cnf里socket路径Access denied for user rootlocalhost (using password: YES)密码错误用临时密码登录后改密或走密码重置流程Host x.x.x.x is not allowed to connect to this MySQL server无远程授权创建远程用户并授权Authentication plugin caching_sha2_password cannot be loaded客户端驱动过旧升级客户端或改用mysql_native_password中文写入后查询乱码字符集不是utf8mb4改my.cnf后重启确认库表字符集服务启动后自动退出内存不足/残留进程/数据页锁看错误日志调小buffer清理进程最后再分享一个个人经验在麒麟上装MySQL最忌讳的就是“抄命令式部署”。同样的命令在这台机器能跑换一台机器就报错环境差异太大了。动手前先花两分钟确认系统版本、包管理器、CPU架构配置文件和目录规划好再动手反而最快。像libaio、numactl这类依赖直接在准备阶段装好能省掉后面一大半的报错时间。还有一点很实用——整套流程建议先在临时测试环境完整走一遍再上生产。麒麟V10版本众多不同SP版本、不同内核形态确实存在细微差别测试环境跑通后形成一份适合自己单位的操作记录后面批量部署就是复制粘贴的事了。踩过坑不可怕就怕同一个坑反复踩。这篇内容如果你顺利走通后续主从复制、备份恢复这些进阶配置建议也一并规划起来有了这套底子数据库层面的高可用方案会顺畅很多。