资讯详情

MariaDB 10.5.11二进制包部署实战:从解压到systemd自启

📅 2026/9/26 21:51:18 | 华诺云谱 👁 阅读
MariaDB 10.5.11二进制包部署实战:从解压到systemd自启
简介本资源为 MariaDB 10.5.11 在 Linux x86_64 平台上的官方二进制安装包面向需要在生产或测试环境中部署开源关系型数据库的运维工程师、后端开发与数据库学习者。MariaDB 由 MySQL 创始人主导开发兼容 MySQL 语法便于迁移适合处理高并发请求与复杂查询的企业级应用。压缩包为 gz 格式整体约 347.07MB包含服务端、客户端及配套工具等完整安装文件解压后即可按需初始化数据库、配置 my.cnf 并启动服务。该版本在 InnoDB 并发性能、GTID 复制管理、线程池、虚拟列、ColumnStore 列式存储及安全审计等方面均有增强可帮助读者搭建稳定可靠的数据环境并深入理解存储引擎选型、主从复制与性能调优等关键知识点。目前已有 291 人学习下载适合希望系统掌握 MariaDB 部署与运维的读者参考使用。1. 拿到 mariadb-10.5.11-linux-x86_64.tar.gz 之后为什么二进制包比 yum 更值得折腾很多人第一次看到mariadb-10.5.11-linux-x86_64.tar.gz这种命名第一反应是「tar.gz 文件怎么解压」第二反应是「为什么不直接 yum install mariadb」。我一开始也这么想直到在一台没有外网、glibc 版本还被锁死的内网机器上被 yum 源里那个 5.5 版本卡了整整两天。二进制 tar.gz 包的核心价值就在这它不依赖系统包管理器不挑发行版CentOS 7、Rocky Linux、银河麒麟 V10 这类国产或老版本系统都能跑只要内核和 glibc 对得上。代价是你得自己建用户、自己初始化数据目录、自己写 systemd 单元。这篇就把这套流程从头到尾走一遍包括 root 密码怎么设、服务怎么开机自启、以及几个我踩过的坑。适合手上已经下载了 tar.gz 包、准备在 Linux x86_64 上落地 MariaDB 的运维和开发。2. 解压前的准备目录规划、用户与依赖检查2.1 先确认系统位数和 glibc 版本别急着 tar -zxvfmariadb-10.5.11-linux-x86_64.tar.gz里的x86_64已经说明它是 64 位包但光看这个还不够。MariaDB 官方编译的二进制包对 glibc 有最低要求10.5 系列一般需要 glibc 2.17 以上。CentOS 7 自带 2.17刚好够一些精简过的国产系统可能被裁到 2.12那就跑不起来。所以第一步不是解压是查环境。# 确认架构输出必须是 x86_64 uname -m # 查 glibc 版本两个命令任选 ldd --version | head -n 1 getconf GNU_LIBC_VERSION # 看系统里有没有残留的 mysql/mariadb避免端口和 socket 冲突 rpm -qa | grep -i -E mysql|mariadb ps -ef | grep -i -E mysql|mariadb | grep -v grep逻辑说明uname -m排除 32 位系统ldd --version拿到的版本号如果低于 2.17这个包基本可以放弃换源码编译或换系统。rpm -qa那一步很关键很多「启动失败」其实是系统自带的 mariadb-libs 占了/var/lib/mysql或/etc/my.cnf后面会专门讲。参数说明grep -i -E里的-i忽略大小写-E启用扩展正则能一次匹配 mysql 和 mariadb 两种写法。2.2 目录规划base 目录和数据目录要分开我一般把程序放/usr/local/mariadb数据放/data/mariadb/data。分开的好处是以后升级二进制包直接换 base 目录软链数据目录不动风险小很多。数据目录所在分区要留足空间MariaDB 的 ibdata、binlog、relay log 都往这写。# 建程序目录 mkdir -p /usr/local/mariadb # 建数据目录独立分区最好 mkdir -p /data/mariadb/data # 建日志目录 mkdir -p /data/mariadb/log # 建专用用户禁止登录 shell groupadd -r mysql useradd -r -g mysql -s /sbin/nologin -M mysql # 把数据目录和日志目录的属主给 mysql chown -R mysql:mysql /data/mariadb逻辑说明-r创建系统用户-s /sbin/nologin禁止这个账号登录系统-M不建家目录。数据库进程只需要读写数据目录不需要登录能力这是最小权限原则。chown必须在初始化之前做否则mysql_install_db会因为权限不足报错。参数说明如果你打算把数据放/var/lib/mysql那要确认这个路径没被系统包占用。我见过有人数据目录权限给成 755 且属主是 root初始化直接失败报Cant create/write to file。2.3 解压 tar.gz 并建立软链接cd /usr/local tar -zxvf mariadb-10.5.11-linux-x86_64.tar.gz # 解压出来通常是一个长名字目录重命名或软链 mv mariadb-10.5.11-linux-x86_64 mariadb-10.5.11 ln -s /usr/local/mariadb-10.5.11 /usr/local/mariadb逻辑说明tar -zxvf里-z走 gzip-x解压-v显示过程-f指定文件。解压后建软链是为了以后升级方便配置文件里统一写/usr/local/mariadb升级时只改软链指向。参数说明如果包很大-v会刷屏可以去掉。解压前用tar -tzf mariadb-10.5.11-linux-x86_64.tar.gz | head先看一眼目录结构确认顶层目录名避免 mv 时名字写错。3. 初始化与配置my.cnf 怎么写、root 密码怎么设3.1 写一份最小可用的 my.cnfMariaDB 会按顺序读/etc/my.cnf、/etc/mysql/my.cnf、$BASEDIR/my.cnf、~/.my.cnf。我习惯在 base 目录下放一份路径清晰不跟系统包打架。[mysqld] basedir /usr/local/mariadb datadir /data/mariadb/data port 3306 socket /data/mariadb/mysql.sock pid-file /data/mariadb/mariadb.pid log-error /data/mariadb/log/error.log character-set-server utf8mb4 collation-server utf8mb4_general_ci skip-name-resolve 1 max_connections 500 innodb_buffer_pool_size 1G [client] socket /data/mariadb/mysql.sock default-character-set utf8mb4逻辑说明basedir和datadir必须写绝对路径。socket我特意放到数据目录下避免和系统默认的/var/lib/mysql/mysql.sock冲突。skip-name-resolve关掉 DNS 反查连接快很多但代价是授权表里不能用主机名只能用 IP 或%。innodb_buffer_pool_size按物理内存的 50% 到 70% 给1G 是保守值。参数说明character-set-server用 utf8mb4别用 utf8后者在 MariaDB 里是 utf8mb3存 emoji 会翻车。max_connections500 对中小业务够用调太高要同步调open_files_limit。3.2 用 mysql_install_db 初始化数据目录10.5 的二进制包里初始化脚本叫mysql_install_db在scripts目录下。注意它默认会去读 my.cnf所以配置文件要先写好。cd /usr/local/mariadb # 初始化指定用户和 basedir、datadir ./scripts/mysql_install_db \ --usermysql \ --basedir/usr/local/mariadb \ --datadir/data/mariadb/data # 确认初始化结果 ls -l /data/mariadb/data | head逻辑说明初始化会创建mysql、performance_schema等系统库以及ibdata1等 InnoDB 文件。执行完必须看到mysql目录和ibdata1否则就是失败了。失败信息在datadir下的.err文件或你配置的log-error里。参数说明--usermysql让初始化出来的文件属主是 mysql。如果之前用 root 跑过一次数据目录里会有 root 属主的文件后面启动会报权限错误得chown -R mysql:mysql重来。3.3 启动服务并给 root 设置密码初始化后 root 是空密码且只允许本机 socket 登录。先手动启动一次确认能起来。# 前台启动方便看报错确认没问题后 CtrlC /usr/local/mariadb/bin/mysqld_safe --defaults-file/usr/local/mariadb/my.cnf # 等几秒用 socket 登录 /usr/local/mariadb/bin/mysql -uroot -S /data/mariadb/mysql.sock登录进去之后第一件事就是设密码。热词里「给 mariadb root 设置密码」是高频问题这里给两种写法。-- 方式一直接改 mysql.user 表10.5 仍可用 ALTER USER rootlocalhost IDENTIFIED BY YourStrongPass!2024; FLUSH PRIVILEGES; -- 方式二用 SET PASSWORD SET PASSWORD FOR rootlocalhost PASSWORD(YourStrongPass!2024); FLUSH PRIVILEGES;逻辑说明10.5 的mysql.user表里密码字段是PasswordALTER USER是更推荐的写法语义清晰。FLUSH PRIVILEGES在直接改表后必须执行用ALTER USER其实可以省略但加上不亏。参数说明密码里带!在 shell 里要小心用单引号包住 SQL 整体。设完密码后后续登录要加-p。如果想让 root 能远程连还得建root%或建独立管理账号生产环境不建议 root 远程。4. 避坑与排查启动失败、密码忘了、端口占用怎么办4.1 现象mysqld 启动即退出error.log 报 Cant open the mysql.plugin table原因数据目录没初始化或者初始化时用的 datadir 和启动时 my.cnf 里的 datadir 不一致。常见于先改了 my.cnf 又忘了重新初始化。解决确认my.cnf里datadir路径清空该目录后重新跑mysql_install_db。清空前务必确认里面没有你要的数据。# 确认配置里的 datadir grep -E datadir|basedir /usr/local/mariadb/my.cnf # 如果目录是空的或只有初始化残留清掉重来 rm -rf /data/mariadb/data/* chown -R mysql:mysql /data/mariadb ./scripts/mysql_install_db --usermysql --basedir/usr/local/mariadb --datadir/data/mariadb/data4.2 现象启动报 Cant create/write to file /data/mariadb/mariadb.pid原因pid 文件所在目录属主不是 mysql或者目录不存在。mysqld_safe以 mysql 身份跑写不了 root 属主的目录。解决把 pid 文件所在目录的属主改成 mysql或者把pid-file指到/tmp下。我一般统一放数据目录省得散。chown -R mysql:mysql /data/mariadb ls -ld /data/mariadb4.3 现象端口 3306 被占用报 Address already in use原因系统里装了 mysql 或 mariadb 的 rpm 包服务已经起来或者上次 mysqld 没退干净残留进程。解决先查是谁占的再决定是停掉还是换端口。# 查端口占用 ss -lntp | grep 3306 # 或 lsof -i :3306 # 如果是系统服务停掉并禁用 systemctl stop mariadb systemctl disable mariadb # 如果是残留进程kill 掉 kill -9 PID参数说明ss -lntp里-l监听-n数字显示端口-tTCP-p显示进程。比 netstat 快新系统都自带。4.4 现象root 密码忘了或者设完密码连不上原因密码记错或者授权表里 root 的 host 不匹配。比如你设的是rootlocalhost但用-h 127.0.0.1连走的是 TCP匹配的是root127.0.0.1可能不存在。解决用--skip-grant-tables跳过权限验证进去改密码。# 停掉当前服务 /usr/local/mariadb/bin/mysqladmin -uroot -p shutdown # 跳过权限表启动 /usr/local/mariadb/bin/mysqld_safe --skip-grant-tables --skip-networking # 无密码登录 /usr/local/mariadb/bin/mysql -uroot -S /data/mariadb/mysql.sock # 在 SQL 里刷新权限并改密码 FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY NewPass!2024; FLUSH PRIVILEGES;逻辑说明--skip-grant-tables让所有账号无需密码即可登录--skip-networking同时关掉 TCP防止别人趁这个窗口连进来。改完密码后正常重启服务。参数说明mysqladmin shutdown需要密码如果密码已经忘了直接killmysqld 进程也行但尽量用正常关闭避免 InnoDB 恢复。4.5 现象客户端连不上报 Cant connect to local MySQL server through socket原因客户端和服务端的 socket 路径不一致。客户端默认找/tmp/mysql.sock或/var/lib/mysql/mysql.sock而你把 socket 配到了/data/mariadb/mysql.sock。解决连接时显式指定 socket或者在[client]段里配好 socket 路径。/usr/local/mariadb/bin/mysql -uroot -p -S /data/mariadb/mysql.sock5. 做成 systemd 服务并验证开机自启5.1 写一个能开机自启的 unit 文件手动mysqld_safe 只能临时用生产环境必须交给 systemd 管。在/etc/systemd/system/下建mariadb.service。[Unit] DescriptionMariaDB 10.5.11 Server Afternetwork.target [Service] Typesimple Usermysql Groupmysql ExecStart/usr/local/mariadb/bin/mysqld_safe --defaults-file/usr/local/mariadb/my.cnf ExecStop/usr/local/mariadb/bin/mysqladmin -uroot -pYourStrongPass!2024 shutdown Restarton-failure RestartSec5 LimitNOFILE65535 [Install] WantedBymulti-user.target逻辑说明Typesimple配合mysqld_safe可以工作但更严谨的做法是直接用mysqld并设Typenotify。ExecStop用 mysqladmin 优雅关闭密码写在 unit 文件里有泄露风险生产上建议用--defaults-extra-file指向一个 600 权限的配置文件。LimitNOFILE调大避免连接数上来后报 too many open files。参数说明Restarton-failure让进程异常退出时自动拉起RestartSec5等 5 秒再拉避免疯狂重启。# 重载 systemd设置开机自启启动 systemctl daemon-reload systemctl enable mariadb systemctl start mariadb # 看状态 systemctl status mariadb5.2 验证连接、建库、看版本服务起来后做一轮最小验证确认不是「假活」。# 看版本确认是 10.5.11 /usr/local/mariadb/bin/mysql -uroot -p -S /data/mariadb/mysql.sock -e SELECT VERSION(); # 建个测试库和表 /usr/local/mariadb/bin/mysql -uroot -p -S /data/mariadb/mysql.sock SQL CREATE DATABASE IF NOT EXISTS testdb DEFAULT CHARACTER SET utf8mb4; USE testdb; CREATE TABLE t1 (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50)) ENGINEInnoDB; INSERT INTO t1 (name) VALUES (hello); SELECT * FROM t1; SQL逻辑说明SELECT VERSION()确认跑的是你解压的那个版本不是系统残留的。建表用 InnoDB验证存储引擎正常。如果这一步报错回头看 error.log。参数说明-e直接执行 SQL 并退出适合脚本里用。heredoc 写法SQL里的单引号防止 shell 变量展开SQL 里有$时尤其要注意。5.3 开机自启的验证方法别只看systemctl enable的输出要真重启一次。# 重启系统 reboot # 起来后看服务是否自动运行 systemctl is-active mariadb systemctl is-enabled mariadb ss -lntp | grep 3306逻辑说明is-active返回 active 才算真起来is-enabled返回 enabled 才算开机自启配好。两个都对了再连一次数据库确认数据还在。6. 进阶技巧用 defaults-extra-file 藏密码、用 mysqladmin 做存活探测密码写在 systemd unit 或命令行里ps -ef一查就露这是很多人忽略的安全细节。我的习惯是建一个/etc/mariadb/client.cnf权限 600属主 root里面放[client]段的 user 和 password然后所有脚本和 unit 都通过--defaults-extra-file引用它。# /etc/mariadb/client.cnf [client] user root password YourStrongPass!2024 socket /data/mariadb/mysql.sockchmod 600 /etc/mariadb/client.cnf chown root:root /etc/mariadb/client.cnf # 之后连接就不用敲密码了 /usr/local/mariadb/bin/mysql --defaults-extra-file/etc/mariadb/client.cnf -e SELECT 1;逻辑说明--defaults-extra-file会在读取默认配置文件之后再读这个文件优先级更高。权限 600 保证只有 root 能看普通用户ps也看不到密码。systemd 的ExecStop也可以改成mysqladmin --defaults-extra-file/etc/mariadb/client.cnf shutdownunit 文件里就不出现明文了。参数说明这个文件里不要写[mysqld]段只写[client]否则可能影响服务端启动参数。文件名随意路径固定即可。再给一个存活探测的小技巧。监控系统经常需要判断 MariaDB 是不是还活着用mysqladmin ping比ps查进程靠谱因为它真的会去连一下。# 存活返回 mysqld is alive退出码 0 /usr/local/mariadb/bin/mysqladmin --defaults-extra-file/etc/mariadb/client.cnf ping # 脚本里用退出码判断 if /usr/local/mariadb/bin/mysqladmin --defaults-extra-file/etc/mariadb/client.cnf ping /dev/null 21; then echo mariadb ok else echo mariadb down fi逻辑说明ping命令会尝试连接并执行一个轻量查询能连上说明服务、socket、账号密码都对。退出码 0 表示正常非 0 表示异常直接拿来做告警触发条件。参数说明如果服务负载很高ping偶尔超时可以加--connect-timeout5控制等待时间避免监控脚本卡死。最后说个我自己的习惯每次升级二进制包之前先把my.cnf、client.cnf和数据目录做一次冷备升级只换 base 目录软链数据目录原地不动。这样万一新版本起不来软链指回旧目录就能回滚比重新初始化省事得多。二进制部署 MariaDB 的坑大多集中在权限、路径和 socket 这三处把这三样对齐剩下的就是常规运维了。希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑