ARTICLE DETAIL

建站实战干货

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

麒麟V10服务器版部署MariaDB实战:从装包到初始化全流程

2026/9/17 7:53:03 拓冰建站 浏览量
麒麟V10服务器版部署MariaDB实战:从装包到初始化全流程 银河麒麟服务器版操作系统这几年在政企项目和行业落地里出现得非常多很多团队拿到机器后的第一件事就是部署数据库而MariaDB因为兼容MySQL、在Linux生态里默认存在、又不涉及商业授权门槛往往成为首选。但“麒麟系统上装MariaDB”和网上通用MySQL教程并不是完全同一件事最容易把人卡住的有三处软件仓库里的默认版本、初始化命令的选择、服务管理和加固方式的细节。我就在这几处踩过不大不小的坑最后把整个流程理顺了。这篇文章是一份偏实战的完整记录基于我在银河麒麟V10服务器版含SP1/SP2下的部署经验写成目标是把你在裸麒麟系统上从零安装并初始化MariaDB的全部过程说清数据目录准备、安全加固、字符集整理、业务库和用户创建、远程访问权限以及几个异常恢复流程。无论你是刚接触Linux的新手还是要写自动化脚本的运维都能从中找到可以直接照做的内容。如果你拿到的是飞腾、鲲鹏这类ARM平台的机器或基于CentOS 7的老版麒麟系统第5章也有针对性说明。1. 动手安装前先把系统的底细摸一遍很多人装包失败问题其实出在安装之前——不清楚自己用的到底是哪个版本分支的麒麟也不知道默认仓库里有没有MariaDB。在麒麟这种发行版迭代比较快的系统上版本决定了后续所有操作的姿势这一步绝对不能省。1.1 查看发行版和CPU架构登录系统后优先执行下面几行命令cat /etc/os-release cat /etc/kylin-release uname -m第一行输出里的VERSION_ID和ID字段决定你后续用yum还是dnf也决定软件源的配置方式。银河麒麟V10一般会报告VERSION_ID10再往下的小版本如SP1、SP2会体现在版本字段里不同小版本对应的默认软件仓库内容会有差异。uname -m输出的是CPU架构x86_64是最常见的Intel/AMD平台aarch64对应飞腾、鲲鹏这类ARM平台mips64el对应龙芯平台sw_64对应申威平台。这一步必须确认因为后面如果手动配置软件源架构字段填错会导致全程装不上包。我见过有人在一台aarch64机器上用x86_64的源地址yum解析软件包时不是报404就是报架构不匹配白白折腾半天。1.2 确认仓库里到底有没有mariadb-server运行这行命令yum list available mariadb-server如果能看到输出说明默认仓库里有MariaDB服务端包可以直接跳到第2章。如果提示“没有可用软件包”就要先检查仓库配置yum repolist yum makecache在无外网或内网镜像环境下仓库没有配置好是最常见的原因。解决办法是把麒麟官方源或对应的本地镜像源写入/etc/yum.repos.d/目录下的.repo文件里然后重新执行yum makecache。这里有个容易忽略的细节.repo文件的后缀名必须是.repo而且文件里的baseurl要和系统架构匹配否则yum不会读取或读取后报错。1.3 默认MariaDB版本决定初始化姿势麒麟不同小版本默认仓库里的MariaDB版本可能差别很大。基于CentOS 8技术栈的麒麟V10默认源里的MariaDB通常不低于10.3部分小版本能到10.5而基于CentOS 7的老版麒麟默认一般是MariaDB 5.5.x。这两个系列在初始化时用的命令完全不同后面会具体区分。版本系列初始化命令默认字符集root默认认证方式MariaDB 5.5 / 10.0-10.3mysql_install_dbutf8空密码MariaDB 10.4mariadb-install-dbutf8mb4unix_socket安装后用mysql -V确认版本再决定用哪套初始化命令。我见过有人拿MariaDB 10.3的mariadb-install-db去初始化5.5的数据目录表面看能跑但权限表结构不一致后来绕了一圈只能重装。版本和初始化命令的匹配属于一开始就要做对的选择题。1.4 安装前预检清单装包前顺手把下面几项也检查一遍能省掉不少启动后的排查时间检查项命令异常时的处理方式剩余磁盘空间df -h/var/lib/mysql至少预留10GB以上SELinux状态getenforceEnforcing时需处理数据目录上下文或临时设为Permissive3306端口占用ss -lntp | grep 3306被占用时停掉旧服务或改数据库端口是否已有mysql/mariadb残留rpm -qa | grep -iE mysql|mariadb有旧包时先卸载或用旧实例的数据目录2. 从yum装包到服务启动三步串起完整流程这一章的结论先行安装命令本身很简单但软件包的选择粒度、数据目录的初始化方式、服务启动后的验证动作这三件事决定你后面是否顺利。2.1 一条yum命令装齐服务端、客户端和开发库通常使用下面这条命令yum install -y mariadb mariadb-server mariadb-devel这三个包各有分工mariadb命令行客户端、mysqldump等管理工具日常连接数据库需要它mariadb-server服务端进程mysqld和相关辅助脚本mariadb-devel头文件和静态库后续如果在服务器上编译PHP/Python/C程序连接数据库就需要它。如果只是临时跑一个Web应用装mariadb和mariadb-server就够了但devel的尺寸不大建议顺手装上否则后续某个组件需要编译时再补装又会碰一次依赖解析的麻烦。安装过程中yum会自动拉进perl-DBD-MySQL等一堆依赖这在麒麟上是正常现象不需要手动干预。安装完成后验证一下rpm -qa | grep -i mariadb mysql -VMariaDB的命令行客户端和服务端进程长期复用mysql前缀所以mysql -V输出的是MariaDB版本号这是正常现象不是装错了。2.2 数据目录初始化装完包后先检查数据目录/var/lib/mysql是否已经包含系统库文件ls -l /var/lib/mysql如果目录不存在或只有空的子目录就需要手动初始化。基于CentOS 8技术栈的麒麟V10执行mariadb-install-db --usermysql --datadir/var/lib/mysql如果提示找不到mariadb-install-db说明是较老的版本改用mysql_install_db --usermysql --datadir/var/lib/mysql手动初始化完成后必须确认目录属主是mysql用户chown -R mysql:mysql /var/lib/mysql为什么建议手动初始化而不是直接启动服务让它自动初始化因为麒麟的某些软件包在安装时后置脚本可能没有完整执行或者系统安全策略拦住了自动写数据目录的操作导致第一次启动时报“找不到mysql系统库”。手动初始化把这个问题控制在服务启动之前是最稳的排查方式。这里还要留意一个10.4版本的行为变化默认情况下mariadb-install-db会把root用户配置成通过unix_socket认证也就是说只有系统root用户能直接登录数据库用密码登录会被拒绝。如果后续你希望通过密码认证来管理数据库初始化时显式指定mariadb-install-db --usermysql --datadir/var/lib/mysql --auth-root-authentication-methodnormal这行命令让root用户保持“空密码密码认证”的初始状态后面用mysql_secure_installation设置密码时就不会出现登录方式与预期不符的问题。2.3 启动服务并确认监听执行systemctl start mariadb systemctl enable mariadb systemctl status mariadb看到active (running)之后再检查端口和socket文件ss -lntp | grep 3306 find / -name mysql.sock 2/dev/null默认情况下socket文件一般位于/var/lib/mysql/mysql.sock或/run/mariadb/mariadb.sock。如果客户端连接时报找不到socket大概率是配置里的socket路径和实际不一致这个在排错章节会细说。systemctl enable mariadb这步很容易被忽略但不执行的话服务器重启后数据库不会自动拉起。对我这种经常忘记手动启动数据库的人来说这是最冤枉的一种故障。3. 初始化配置把数据库从“能跑”变成“敢用”服务起来只是第一步真正决定生产可用性的是接下来这几个配置动作。我按重要性把它们排了个序root账户加固、字符集、时区、连接数。这几个弄完数据库才算有了上生产的基本条件。3.1 安全初始化脚本新版MariaDB自带一个交互式安全配置脚本执行mysql_secure_installation它会按顺序问几个问题我把实际操作时的取舍列出来输入当前root密码如果刚初始化完且用的是--auth-root-authentication-methodnormal直接回车即可是否切换到unix_socket认证如果只想用系统root免密管理数据库可以选y但我一般选n因为后续如果有自动化脚本用root通过socket做备份或迁移切换后反而多一层限制是否设置root密码首次初始化强烈建议设为强密码是否删除匿名用户选y匿名用户在公网环境下等于白送一个入口是否禁止root远程登录选yroot只在本地管理远程访问用业务账号是否删除test数据库选ytest库是默认存在的多余内容是否重载权限表选y让修改立即生效。这个脚本做完之后数据库的基本安全基线才算立住。在基于老版麒麟的MariaDB 5.5上mysql_secure_installation同样可用交互内容基本一致只是密码认证机制更老。3.2 字符集、排序规则和时区如果你在后续使用过程中遇到中文乱码绝大多数情况逃不出两个原因建库时指定的字符集不是utf8mb4或者客户端连接时的字符集被自动改成别的。在服务器全局层面我习惯在配置文件的[mysqld]段里一次性固定vim /etc/my.cnf.d/server.cnf写入[mysqld] character-set-server utf8mb4 collation-server utf8mb4_general_ci skip-character-set-client-handshake default-time-zone 08:00解释一下这几行的取舍utf8mb4是utf8的超集能存emoji和四字节中文生僻字新库没有理由再用utf8utf8mb4_general_ci是大小写不敏感的排序规则适合绝大多数业务场景排序速度快skip-character-set-client-handshake的意思是忽略客户端传入的字符集参数强制统一走服务端设置避免同一个库被不同语言的客户端连出不同编码default-time-zone按服务器所在时区来如果希望数据库统一显示北京时间就写08:00。改完重启服务systemctl restart mariadb进入数据库验证SHOW VARIABLES LIKE character_set%; SHOW VARIABLES LIKE collation%; SELECT NOW();前几行应该都是utf8mb4相关的值SELECT NOW()返回正确时间就说明时区没问题。3.3 连接数与缓冲池的建议值默认情况下MariaDB的max_connections在151左右innodb_buffer_pool_size则按内存自动分配但很多默认逻辑偏保守。针对一台内存8GB以上的服务器我一般这样调整[mysqld] max_connections 200 innodb_buffer_pool_size 2Ginnodb_buffer_pool_size不要盲目设成物理内存的80%操作系统还要留内存给文件缓存和应用进程先用总内存的1/4到1/2压测后再调。max_connections同理每个连接都要占用线程栈设得过大只会让内存更早耗尽。如果你没有足够把握保持默认也可以但至少要清楚这两个参数的含义而不是遇到连接数报错时到处乱猜。4. 业务初始化库、用户、权限一次理清很多教程讲完密码加固就结束了但实际项目中你会面对更具体的问题为哪个应用建哪个库用哪个账号权限给到哪个层级这一节直接给出一套我常用的初始化脚本模板。4.1 用SQL脚本完成业务库、用户、授权把下面内容保存成init_app.sqlCREATE DATABASE IF NOT EXISTS appdb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER app_rwlocalhost IDENTIFIED BY App#123456; CREATE USER app_rw127.0.0.1 IDENTIFIED BY App#123456; GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO app_rwlocalhost; GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO app_rw127.0.0.1; FLUSH PRIVILEGES;然后执行mysql -u root -p init_app.sql这里有几个实际经验账号密码里尽量包含大小写、数字和特殊字符但别用单引号、分号这类在SQL和shell脚本里都要转义的符号否则排错成本非常高权限尽量不用ALL PRIVILEGES除非确需给应用开DDL权限。SELECT、INSERT、UPDATE、DELETE四个权限是绝大多数业务应用的全部诉求同时创建localhost和127.0.0.1两个账号是因为某些程序通过127.0.0.1连接时匹配host为127.0.0.1的记录而另一些程序通过unix socket连接时匹配host为localhost两个都建好排错上更省心。如果应用确实需要建表和改表结构可以单独再给一个“部署账号”CREATE USER app_ddllocalhost IDENTIFIED BY Deploy#123456; GRANT ALL PRIVILEGES ON appdb.* TO app_ddllocalhost;这是把变更权限和运行权限分离的常规做法日常运行只用app_rw发版或迁移时再用app_ddl。权限分离能在数据库出问题时快速定位操作来源。4.2 远程访问怎么开才不埋雷默认配置下bind-address只监听127.0.0.1远程连接必然被拒。需要允许特定网段访问时先在配置里放开监听[mysqld] bind-address 0.0.0.0然后授权给网段CREATE USER app_rw192.168.10.% IDENTIFIED BY App#123456; GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO app_rw192.168.10.%; FLUSH PRIVILEGES;这表示仅允许192.168.10.0/24网段使用该账号。我强烈不建议用app_rw%这种写法等于把所有来源IP都放进来一旦密码泄露整个库就是你的裸奔状态。接着放行防火墙端口firewall-cmd --permanent --add-port3306/tcp firewall-cmd --reload如果麒麟上用的不是firewalld而是ufw对应执行ufw allow 3306/tcp额外提醒一句即使开放了远程访问也建议在应用和数据库之间加一层访问控制比如在应用服务器上改用SSH隧道或只允许跳板机IP访问3306而不是让数据库端口直接暴露在整个网络中。4.3 验证和权限收敛连接验证mysql -u app_rw -pApp#123456 -h 192.168.10.5 -P 3306 appdb -e SELECT 1;确认账号权限SHOW GRANTS FOR app_rw192.168.10.%;如果发现临时开的账号已经不用了立刻清理DROP USER app_rw192.168.10.%;我见过很多数据库被攻破或拖垮不是因为密码太弱而是因为积累了一堆没人用的授权账号。隔段时间做一次权限审计把这个习惯列入常态化运维清单比只关注安装本身更重要。5. 麒麟环境下我踩过的典型坑和恢复流程这部分是全文最想说的地方。把MariaDB装好不难真正难的是出了问题之后能快速定位。以下按我遇到的概率排个序每个都附带完整排查链路。5.1 启动失败或客户端连不上socket典型报错ERROR 2002 (HY000): Cant connect to local MySQL server through socket /var/lib/mysql/mysql.sock (2)我建议按下面这个顺序排查不要跳步骤systemctl status mariadb看服务是否在运行journalctl -u mariadb -n 50看日志尾部重点看数据目录权限报错发现数据目录属主不对时执行chown -R mysql:mysql /var/lib/mysql后再启动如果日志提示找不到mysql系统库执行第2章的手动初始化命令。这类问题80%以上出在目录属主和SELinux上下文上。如果SELinux处于Enforcing状态光改属主还不够还需要恢复安全上下文restorecon -Rv /var/lib/mysql一个容易被忽略的细节是如果以前装过MySQL数据目录里残留了旧版本的系统表启动新版MariaDB也可能报版本不兼容。这种情况最稳妥的做法是备份业务数据后清空数据目录再重新初始化而不是强行升级。5.2 忘记root密码后的重置流程忘记root密码几乎是运维必遇场景麒麟上同样适用。恢复步骤如下systemctl stop mariadb mysqld_safe --skip-grant-tables --skip-networking 然后用root进入数据库mysql -u root如果版本较新10.4执行FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY NewPass123; FLUSH PRIVILEGES;如果版本较老5.5/10.0-10.3执行USE mysql; UPDATE user SET passwordPASSWORD(NewPass123) WHERE Userroot; FLUSH PRIVILEGES;最后关掉跳过权限表的进程并正常重启pkill -f mysqld_safe systemctl restart mariadb这里必须严肃强调--skip-grant-tables状态下数据库不做任何权限校验等于裸奔所以务必同时加上--skip-networking只允许本机socket访问。重置完成后要立刻恢复正常服务这个窗口期越短越好。5.3 ARM平台上的初始化差异在飞腾、鲲鹏这类ARM架构的麒麟系统上如果官方源里没有可用的mariadb-server往往需要下载官方二进制包或通过源码编译部署。手动部署时初始化命令要显式指定base目录mariadb-install-db --usermysql --basedir/usr/local/mariadb --datadir/var/lib/mysql同时提前装好依赖yum install -y libaio libaio-devel ncurses ncurses-libs perlARM平台上编译安装时我还遇到过因编译器优化选项不同导致初始化直接失败的情况。如果你的数据库目录在纯ARM源码编译的包上反复初始化报错我建议直接用官方发布页里的预编译二进制包替换不要在编译选项上钻牛角尖实际收益很低。另外要注意ARM平台的mariadb客户端连接工具社区里也叫“mariadb arm客户端”它和x86_64平台的客户端用法完全相同只是二进制架构不同需要从对应架构的源获取。判断方法很简单file $(which mysql)确认ELF文件是ARM还是x86架构如果架构和系统不匹配执行时会直接报无法执行二进制文件。5.4 开机自启不生效明明执行过systemctl enable mariadb重启后服务还是没起来。这种情况先检查服务是否被masksystemctl status mariadb如果输出里带有masked字样说明有同事执行过systemctl mask mariadb解决方式是解除mask和重新启用systemctl unmask mariadb systemctl enable --now mariadb另一种常见原因是数据库目录放在独立的数据盘挂载点开机时服务先于磁盘挂载完成就尝试启动结果必然失败。解决方法是在服务单元里声明挂载依赖systemctl edit mariadb写入[Unit] Afterdata-backup.mount Requiresdata-backup.mount这里的挂载单元名要以systemctl list-units --typemount输出为准。判断“服务有意禁用”和“挂载顺序问题”这两种情况的区别是排错的关键——前者看unit状态后者看启动日志里有没有“No such file or directory”指向数据目录的报错。最后说几句实际经验MariaDB在麒麟上的安装和初始化本质上跟CentOS系Linux没有太大不同。它真正考验你的是两件事第一能否在装包之前把系统版本和数据库版本匹配清楚不要等到初始化阶段才发现命令选错了第二遇到权限、socket、自启这类问题时能不能按“日志、目录权限、防火墙”的顺序去排查而不是一上来就重装。如果你按这篇文章的流程走一遍后仍有问题最可能出在仓库配置和SELinux这两处。把journalctl -u mariadb和dmesg的输出拿来和报错对一下通常很快就能定位。毕竟数据库这种基础服务装了只是开始能稳定跑起来才是目标。