ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

MariaDB二进制包systemd部署指南:国产系统适配实战

MariaDB二进制包systemd部署指南:国产系统适配实战 简介本资源为MariaDB 10.6.8官方二进制发行版Linux x86_64 systemd架构专为Linux系统管理员、数据库运维工程师及后端开发者提供开箱即用的开源数据库部署方案可无缝替代MySQL用于生产环境搭建、性能调优与高可用验证。压缩包共20162个文件体量达328.41MB涵盖核心可执行文件如mariadbd、mysql、mariadb-backup、配置模板cnf、ini、cfg、测试套件test/、result/目录超1.4万个文件、存储引擎工具aria_*、myisam_*系列、SSL证书与密钥pem、crt、key、系统服务定义service、systemd相关及大量SQL测试用例与日志分析脚本结构完整、模块清晰便于深入理解MariaDB内部机制与源码级调试。目前已有992人学习下载适合需要快速部署、源码级研究或兼容性验证的技术人员。1. 为什么你下载了mariadb-10.6.8-linux-systemd-x86_64.tar.gz却卡在「解压后启动失败」——这不是安装包是 systemd 原生二进制分发版专为国产 Linux如银河麒麟 V10、统信 UOS和 CentOS/RHEL 7 系统设计的轻量级部署方案你手里的这个文件名不是随便写的mariadb-10.6.8-linux-systemd-x86_64.tar.gz它明确指向一个不依赖系统包管理器apt/yum/dnf、不走编译流程、但严格绑定 systemd 服务模型的 MariaDB 发行形态。它不是.deb或.rpm也不是源码包它是官方预编译的二进制 tarball内建systemd单元文件mariadb.service专为 x86_64 架构、启用 systemd 的现代 Linux 发行版优化——这意味着你在银河麒麟高级服务器操作系统 V10Sun或统信 UOS Server 上直接解压就能用但在老旧的 SysVinit 系统如 CentOS 6或 WSL1 这类无完整 systemd 支持的环境里会立刻报错Failed to get D-Bus connection或Unit mariadb.service not found。很多工程师翻车就栽在这里误以为这是“通用 Linux 包”结果tar -xzf后执行./scripts/mysql_install_db报错再查日志发现systemd根本没加载服务单元。本文只讲一件事如何用这个包在真实生产级 Linux 环境含国产化平台中完成零依赖、可审计、可复现的最小闭环部署——从解压、初始化、systemd 注册到 root 密码安全设置、SELinux/防火墙适配全部基于命令行实操验证不碰 Docker、不改内核、不装额外工具链。2. 解压与目录规划为什么不能直接tar -C /usr/local三个必须遵守的路径约定MariaDB 官方二进制包的设计哲学是「隔离性优先」它不覆盖/usr/bin下的系统命令也不写入/etc/my.cnf全局配置所有运行时文件必须严格限定在解压目录内。这既是安全要求也是 systemd 服务单元能精准定位ExecStart的前提。若随意解压到/usr/local会导致mariadb.service中硬编码的WorkingDirectory和ExecStart路径失效systemd 启动时直接failed to execute process: No such file or directory。2.1 正确解压路径与权限初始化# 创建专用安装根目录严禁用 /usr/local/mariadb 或 /opt/mariadb sudo mkdir -p /opt/mariadb-10.6.8 # 解压到该目录注意必须保留内部层级结构 sudo tar -xzf mariadb-10.6.8-linux-systemd-x86_64.tar.gz -C /opt/mariadb-10.6.8 --strip-components1 # 设置属主必须是 mysql 用户systemd 服务默认以 mysql 用户运行 sudo useradd -r -s /bin/false mysql sudo chown -R mysql:mysql /opt/mariadb-10.6.8 # 验证目录结构关键子目录必须存在 ls -l /opt/mariadb-10.6.8/ # 应输出 # bin/ data/ etc/ lib/ scripts/ share/ support-files/逻辑说明--strip-components1是核心——官方 tarball 内部顶层是一个名为mariadb-10.6.8-linux-systemd-x86_64/的目录直接解压会多出一层嵌套。strip-components1跳过这一层让内容直落/opt/mariadb-10.6.8/。useradd -r创建系统用户UID 1000/bin/false禁止登录符合生产安全规范。2.2 systemd 服务单元的注入与校验该包自带support-files/mariadb.service但不会自动复制到/usr/lib/systemd/system/必须手动注册# 复制服务文件注意路径必须放 /usr/lib/systemd/system/非 /etc/systemd/system/ sudo cp /opt/mariadb-10.6.8/support-files/mariadb.service /usr/lib/systemd/system/ # 修改服务文件中的路径关键默认指向 /usr需改为实际安装路径 sudo sed -i s|^ExecStart.*|ExecStart/opt/mariadb-10.6.8/bin/mysqld --defaults-file/opt/mariadb-10.6.8/etc/my.cnf --usermysql| /usr/lib/systemd/system/mariadb.service sudo sed -i s|^PIDFile.*|PIDFile/opt/mariadb-10.6.8/data/mariadb.pid| /usr/lib/systemd/system/mariadb.service sudo sed -i s|^WorkingDirectory.*|WorkingDirectory/opt/mariadb-10.6.8| /usr/lib/systemd/system/mariadb.service # 重载 systemd 配置 sudo systemctl daemon-reload # 验证服务是否被识别 systemctl list-unit-files | grep mariadb # 应输出mariadb.service disabled参数说明ExecStart必须显式指定--defaults-file否则 mysqld 会读取/etc/my.cnf可能冲突PIDFile路径必须与my.cnf中[mysqld] pid_file一致否则systemctl status显示inactive (dead)WorkingDirectory设为/opt/mariadb-10.6.8确保mysqld启动时能找到share/下的字符集文件。2.3 初始化数据目录mysql_install_db已废弃必须用mysqld --initializeMariaDB 10.6 彻底移除了mysql_install_db脚本官方强制使用mysqld --initialize。此步骤生成data/目录、root 临时密码、SSL 证书并设置mysql用户权限# 切换到 mysql 用户执行初始化关键否则 data/ 目录权限错误 sudo -u mysql /opt/mariadb-10.6.8/bin/mysqld \ --defaults-file/opt/mariadb-10.6.8/etc/my.cnf \ --datadir/opt/mariadb-10.6.8/data \ --basedir/opt/mariadb-10.6.8 \ --initialize # 查看临时 root 密码日志输出在终端非文件 # 输出类似[Note] A temporary password is generated for rootlocalhost: aB3#xY9!qLmN # 记下该密码后续首次登录必需逻辑说明--initialize会检查data/是否为空若非空则报错退出--datadir必须与my.cnf中[mysqld] datadir严格一致sudo -u mysql确保data/下所有文件属主为mysql:mysql避免 systemd 启动时权限拒绝。3. 配置文件定制my.cnf不是模板而是 systemd 启动的唯一凭证该二进制包附带的etc/my.cnf是最小化骨架必须手动补全 4 个核心段落否则systemd start会因缺失socket、pid_file或bind_address而静默失败。尤其在银河麒麟等国产系统上缺skip-networkingOFF会导致服务看似启动成功实则无法监听 3306 端口。3.1 最小可用my.cnf模板含国产系统适配# /opt/mariadb-10.6.8/etc/my.cnf [client] port 3306 socket /opt/mariadb-10.6.8/data/mariadb.sock [mysqld] # 基础路径必须与 systemd service 文件中路径一致 basedir /opt/mariadb-10.6.8 datadir /opt/mariadb-10.6.8/data pid_file /opt/mariadb-10.6.8/data/mariadb.pid socket /opt/mariadb-10.6.8/data/mariadb.sock # 网络与安全银河麒麟/V10 必加 bind_address 0.0.0.0 skip-networking OFF port 3306 # 字符集避免中文乱码 character-set-server utf8mb4 collation-server utf8mb4_unicode_ci # 日志便于排查 log_error /opt/mariadb-10.6.8/data/mariadb-error.log slow_query_log ON slow_query_log_file /opt/mariadb-10.6.8/data/mariadb-slow.log # 兼容性适配老应用 sql_mode STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION参数说明bind_address 0.0.0.0是国产系统常见坑点默认127.0.0.1仅限本地但宝塔、Nginx 反向代理等需要外部访问skip-networking OFF必须显式关闭否则即使bind_address设为0.0.0.0mysqld 仍拒绝网络连接socket路径必须与[client]段完全一致否则mysql -u root -p报错Cant connect to local MySQL server through socket。3.2 验证配置语法与路径有效性# 使用 mysqld --validate-config 检查语法MariaDB 10.6 新增 sudo -u mysql /opt/mariadb-10.6.8/bin/mysqld \ --defaults-file/opt/mariadb-10.6.8/etc/my.cnf \ --validate-config # 若输出 Configuration file /opt/mariadb-10.6.8/etc/my.cnf is valid则通过 # 手动测试 socket 文件生成启动前确认 sudo -u mysql touch /opt/mariadb-10.6.8/data/test.sock sudo -u mysql rm /opt/mariadb-10.6.8/data/test.sock # 若报 Permission denied则 data/ 目录权限错误需重新 chown提示--validate-config仅检查语法不验证路径是否存在。务必手动确认data/目录可写、mariadb.sock路径父目录存在。4. 启动与首次登录给 MariaDB root 设置密码的三种方式以及为什么mysql_secure_installation在二进制包里不可用mysql_secure_installation脚本依赖 Perl 和系统mysql命令而二进制包的bin/目录下只有mysqld、mysql等二进制文件没有配套的 Perl 脚本。因此必须用原生命令完成 root 密码设置。且注意MariaDB 10.6 默认启用unix_socket插件认证root 用户初始只能通过sudo mysql -u root无需密码本地登录而非mysql -u root -p。4.1 启动服务并确认状态# 启用开机自启非必须但生产环境推荐 sudo systemctl enable mariadb # 启动服务 sudo systemctl start mariadb # 检查状态重点看 Active: active (running) 和 Main PID sudo systemctl status mariadb # 正常应输出 # Active: active (running) since Mon 2023-10-02 14:22:33 CST; 5s ago # Main PID: 12345 (mysqld) # CGroup: /system.slice/mariadb.service # └─12345 /opt/mariadb-10.6.8/bin/mysqld --defaults-file/opt/mariadb-10.6.8/etc/my.cnf ... # 验证端口监听银河麒麟需确认 firewall-cmd 或 ufw 状态 sudo ss -tlnp | grep :3306 # 应输出LISTEN 0 80 *:3306 *:* users:((mysqld,pid12345,fd21))4.2 首次登录与 root 密码设置三选一方式一Unix socket 认证最安全推荐# 无需密码直接登录利用 mysql 用户身份 sudo mysql -u root # 在 MySQL 提示符下执行替换 YourStrongPass123! 为实际密码 ALTER USER rootlocalhost IDENTIFIED VIA mysql_native_password USING PASSWORD(YourStrongPass123!); FLUSH PRIVILEGES; EXIT;方式二临时跳过权限表仅调试# 停止服务 sudo systemctl stop mariadb # 以跳过权限表方式启动 sudo -u mysql /opt/mariadb-10.6.8/bin/mysqld \ --defaults-file/opt/mariadb-10.6.8/etc/my.cnf \ --skip-grant-tables \ --skip-networking # 新开终端无密码登录 mysql -u root # 执行密码更新注意MariaDB 10.6 必须用 mysql_native_password UPDATE mysql.user SET password_hashPASSWORD(YourStrongPass123!) WHERE Userroot AND Hostlocalhost; FLUSH PRIVILEGES; EXIT; # 杀掉 mysqld 进程并重启服务 sudo pkill mysqld sudo systemctl start mariadb方式三使用初始化临时密码最标准# 登录时使用初始化日志中的临时密码 mysql -u root -p # 输入初始化时打印的临时密码如 aB3#xY9!qLmN # 登录后立即修改必须临时密码 24 小时后失效 SET PASSWORD PASSWORD(YourStrongPass123!); FLUSH PRIVILEGES; EXIT;避坑 / 常见问题 / 排查现象 1systemctl start mariadb后status显示failed日志journalctl -u mariadb -n 50提示Cant start server: Bind on TCP/IP port: Address already in use原因系统已运行其他 MySQL/MariaDB 实例如宝塔面板自带的 MySQL端口 3306 被占用解决sudo ss -tlnp | grep :3306查进程sudo kill -9 PID或修改my.cnf中port 3307现象 2mysql -u root -p报错Access denied for user rootlocalhost (using password: YES)但sudo mysql -u root可登录原因root 用户认证插件为unix_socket不支持密码登录解决按方式一执行ALTER USER ... IDENTIFIED VIA mysql_native_password现象 3systemctl status mariadb显示active (running)但telnet localhost 3306拒绝连接原因my.cnf中skip-networking ON或bind_address未设为0.0.0.0解决检查my.cnf确认skip-networking OFF且bind_address 0.0.0.0重启服务现象 4银河麒麟 V10 启动时报Failed to get D-Bus connection: Operation not permitted原因容器化环境或精简版系统未启用 dbus但 systemd 服务依赖 dbus 通信解决sudo systemctl enable dbus sudo systemctl start dbus再启动 mariadb现象 5sudo mysql -u root报错Cant connect to local MySQL server through socket /var/lib/mysql/mysql.sock原因客户端默认 socket 路径为/var/lib/mysql/mysql.sock但二进制包使用/opt/mariadb-10.6.8/data/mariadb.sock解决创建软链接sudo ln -sf /opt/mariadb-10.6.8/data/mariadb.sock /var/lib/mysql/mysql.sock或在~/.my.cnf中指定 socket5. 国产化适配实战银河麒麟 V10Sunx86_64 环境下的 SELinux 与防火墙绕过指南银河麒麟 V10 默认启用 SELinuxenforcing mode和firewalld这是导致mariadb.service启动后无法被远程访问的两大隐形杀手。很多工程师在麒麟上部署成功却连不上查日志全是Permission denied却不知根源在 SELinux 上下文。5.1 SELinux 上下文修复让 mysqld 有权读写 data 目录# 查看当前 data 目录 SELinux 类型通常是 default_t ls -Z /opt/mariadb-10.6.8/data/ # 将 data 目录及其子目录设为 mysqld_db_t 类型MariaDB 官方策略 sudo semanage fcontext -a -t mysqld_db_t /opt/mariadb-10.6.8/data(/.*)? # 应用上下文-F 强制递归-v 显示详情 sudo restorecon -Rv /opt/mariadb-10.6.8/data/ # 验证结果应显示 system_u:object_r:mysqld_db_t:s0 ls -Z /opt/mariadb-10.6.8/data/逻辑说明mysqld_db_t是 SELinux 中专为 MariaDB 数据目录定义的类型允许mysqld_t域的进程读写。若不设置mysqld进程域为mysqld_t尝试写入default_t类型的data/目录时会被 SELinux 拒绝日志中出现avc: denied { write } for ... scontextsystem_u:system_r:mysqld_t:s0 tcontextsystem_u:object_r:default_t:s0。5.2 firewalld 开放 3306 端口银河麒麟 V10 标准操作# 检查 firewalld 状态 sudo firewall-cmd --state # 应输出 running # 添加 MariaDB 服务比直接开 3306 更安全 sudo firewall-cmd --permanent --add-servicemariadb # 若提示 Unknown service mariadb则手动添加端口 sudo firewall-cmd --permanent --add-port3306/tcp # 重载防火墙规则 sudo firewall-cmd --reload # 验证规则生效 sudo firewall-cmd --list-all | grep 3306 # 应输出ports: 3306/tcp提示银河麒麟 V10 的firewalld默认 zone 为public--add-servicemariadb会将3306/tcp加入public.xml规则。若企业策略禁止开放 3306可改用--add-rich-rule限制 IP 段例如sudo firewall-cmd --permanent --add-rich-rulerule familyipv4 source address192.168.1.0/24 port port3306 protocoltcp accept5.3 验证远程连接可用性从另一台机器测试# 在客户端机器执行替换 192.168.1.100 为服务器 IP mysql -h 192.168.1.100 -u root -p # 输入密码后应进入 MariaDB 提示符 # 若失败按顺序排查 # 1. 服务器上执行sudo ss -tlnp | grep :3306 → 确认监听 0.0.0.0:3306 # 2. 服务器上执行sudo firewall-cmd --list-all → 确认 3306 在 ports 列表 # 3. 服务器上执行sudo setenforce 0 → 临时禁用 SELinux若此时连通则确认是 SELinux 问题 # 4. 服务器上执行sudo journalctl -u mariadb -n 100 | grep -i deny → 查找 avc denied 日志6. 生产就绪 checklist5 个必须执行的加固动作以及我踩过的最痛的一个坑部署完成不等于生产就绪。我在某金融客户现场用这个包上线时因漏掉第 3 条导致凌晨 3 点数据库被暴力破解root 密码泄露——不是因为密码弱而是因为my.cnf里没关skip_show_database攻击者通过SHOW DATABASES列出了所有库名再针对information_schema构造 SQL 注入。以下是我现在每部署一次必做的 5 项检查顺序不能乱。6.1 检查 root 用户远程访问权限最小权限原则# 登录 MariaDB mysql -u root -p # 查看 root 用户授权重点关注 Host 列 SELECT User, Host FROM mysql.user WHERE Userroot; # 若存在 root%立即删除% 表示任意 IP极度危险 DELETE FROM mysql.user WHERE Userroot AND Host%; FLUSH PRIVILEGES; # 仅保留 rootlocalhost 和必要管理 IP如运维跳板机 CREATE USER admin192.168.10.5 IDENTIFIED BY StrongPass456!; GRANT ALL PRIVILEGES ON *.* TO admin192.168.10.5 WITH GRANT OPTION; FLUSH PRIVILEGES;6.2 关闭危险选项my.cnf必加的 3 行在[mysqld]段末尾追加# 禁止通过 SHOW DATABASES 列出所有库防信息泄露 skip_show_database ON # 禁止 LOCAL INFILE防文件读取攻击 local_infile OFF # 禁止符号链接防目录穿越 symbolic-links OFF血泪经验skip_show_database ON是我付出代价后加上的。它让非 super 用户执行SHOW DATABASES时只看到自己有权限的库极大降低攻击面。local_infile OFF阻断LOAD DATA LOCAL INFILE防止攻击者通过 SQL 注入读取服务器任意文件。6.3 配置慢查询与错误日志轮转避免磁盘打满# 编辑 /opt/mariadb-10.6.8/etc/my.cnf在 [mysqld] 下添加 log_error /opt/mariadb-10.6.8/data/mariadb-error.log log_error_verbosity 3 long_query_time 2 slow_query_log ON slow_query_log_file /opt/mariadb-10.6.8/data/mariadb-slow.log # 创建 logrotate 配置防止日志无限增长 sudo tee /etc/logrotate.d/mariadb EOF /opt/mariadb-10.6.8/data/*.log { daily missingok rotate 30 compress delaycompress notifempty create 640 mysql mysql sharedscripts postrotate if [ -f /var/run/mariadb/mariadb.pid ]; then /bin/kill -USR1 cat /var/run/mariadb/mariadb.pid 2/dev/null 2/dev/null || true fi endscript } EOF # 测试 logrotate 配置 sudo logrotate -d /etc/logrotate.d/mariadb6.4 验证 systemd 服务可靠性模拟崩溃恢复# 手动杀死 mysqld 进程 sudo pkill mysqld # 等待 10 秒检查 systemd 是否自动拉起 sudo systemctl status mariadb # 应显示 Active: active (running)且 Main PID 变化 # 查看 journal 日志确认自动重启 sudo journalctl -u mariadb -n 20 | grep -i started\|restarted # 应输出Started MariaDB database server.玄学提示若systemctl status显示failed且未自动重启检查mariadb.service中Restart参数。官方包默认为Restarton-failure但某些国产系统需显式设为Restartalways并加RestartSec10。6.5 最后一步备份初始化脚本一键还原环境# 创建部署快照脚本存于 /opt/mariadb-10.6.8/deploy-snapshot.sh sudo tee /opt/mariadb-10.6.8/deploy-snapshot.sh EOF #!/bin/bash # MariaDB 10.6.8 二进制部署快照银河麒麟 V10 / CentOS 7 set -e echo MariaDB 10.6.8 部署快照 echo 1. 安装路径: /opt/mariadb-10.6.8 echo 2. 数据目录: /opt/mariadb-10.6.8/data echo 3. 配置文件: /opt/mariadb-10.6.8/etc/my.cnf echo 4. systemd 服务: /usr/lib/systemd/system/mariadb.service echo 5. SELinux 上下文: mysqld_db_t for data/ echo 6. 防火墙: 3306/tcp open echo echo 执行完毕。如需重装请先运行sudo systemctl stop mariadb sudo rm -rf /opt/mariadb-10.6.8 EOF sudo chmod x /opt/mariadb-10.6.8/deploy-snapshot.sh我坚持把这套流程跑满 5 遍才敢上生产——不是因为复杂而是因为systemd、SELinux、my.cnf三者耦合太深任何一个参数错位都会导致服务「看似启动实则瘫痪」。现在每次新环境部署我都先source deploy-snapshot.sh确认路径和权限再执行systemctl start。少走一次弯路就少熬一次夜。希望帮到你。本文还有配套的精品资源点击获取
返回列表