☰
MariaDB 10.5.11二进制包部署实战:从解压到开机自启
2026/9/25 10:30:47 网站建设 项目流程

简介:本资源为MariaDB 10.5.11在Linux x86_64平台上的完整安装包,面向需要在Linux服务器上部署开源关系型数据库的运维人员、后端开发者及数据库学习者。MariaDB由MySQL创始人Michael Widenius主导开发,保持开源与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 包的核心价值就在这儿:它把编译好的 mysqld、客户端工具、插件、字符集一股脑塞进一个压缩包,解压即用,不依赖系统包管理器,也不挑发行版——银河麒麟、Rocky Linux、CentOS 7.9 甚至一些裁剪过的国产 Linux,只要内核和 glibc 对得上,就能跑起来。

这篇笔记讲的就是怎么把mariadb-10.5.11-linux-x86_64.tar.gz从一堆文件变成一个能对外服务、能设 root 密码、能开机自启的数据库实例。适合两类人:一类是运维,手里有台离线服务器要装 MariaDB;另一类是开发,想在本机快速起一个和线上版本一致的实例做验证。全程不需要联网,不需要 root 之外的额外权限,跟着命令走就能复现。

2. 解压前的准备:目录规划、依赖核对与用户隔离

2.1 先确认 glibc 和 CPU 架构,别等解压完才发现跑不起来

linux-x86_64这个后缀说明它是给 64 位 x86 架构准备的,但光看架构不够。MariaDB 10.5 的二进制包对 glibc 有最低要求,一般需要 2.17 及以上。CentOS 7.9 自带 2.17,银河麒麟 V10 一般在 2.28 左右,都没问题;但如果你手上是某些精简过的嵌入式 Linux,glibc 可能只有 2.12,那 mysqld 启动时会直接报version GLIBC_2.14 not found。

核对命令很简单:

# 查看 glibc 版本,输出里找 release version ldd --version | head -n 1 # 确认 CPU 架构是 x86_64 uname -m # 确认内核位数 getconf LONG_BIT

三条命令的输出分别是ldd (GNU libc) 2.17、x86_64、64,就说明环境合格。如果 glibc 低于 2.17,别硬上,换一个为老系统编译的版本,或者干脆用系统自带的包管理器装。

提示:uname -m返回aarch64的话,这个包直接不能用,得去找linux-aarch64的版本,别浪费时间解压。

2.2 目录规划:base 目录和数据目录必须分开

我见过太多人把 tar.gz 解压到/usr/local/mysql,然后数据也往那儿塞,结果升级的时候一删全没了。正确做法是 base 目录和数据目录分离:

用途推荐路径说明
程序 base 目录/usr/local/mariadb存放解压出来的 bin、lib、share
数据目录/data/mariadb/data存放 ibdata、表文件、binlog
配置文件/etc/my.cnf全局配置,也可放 base 目录下
socket 与 pid/data/mariadb/run避免和系统其他 mysql 冲突
错误日志/data/mariadb/log排查问题的第一现场

数据目录单独放还有个好处:磁盘满了可以单独挂一块盘,迁移的时候直接搬数据目录,程序目录不用动。

2.3 建一个专用系统用户,别用 root 跑 mysqld

mysqld 以 root 身份运行是安全大忌,一旦被提权,整个系统就交出去了。建一个不能登录的mysql用户:

# 创建系统用户,-r 表示系统用户,-s /sbin/nologin 禁止登录 groupadd -r mysql useradd -r -g mysql -s /sbin/nologin -M mysql # 创建目录并授权 mkdir -p /usr/local/mariadb /data/mariadb/{data,run,log} chown -R mysql:mysql /data/mariadb

-M表示不创建家目录,因为 mysqld 不需要。授权只给数据相关目录,程序目录保持 root 所有,防止被进程意外改写。

3. 解压、初始化与 root 密码设置:把 tar.gz 变成能连的实例

3.1 解压 tar.gz 并建立软链接

假设包已经传到/root下,解压命令:

cd /usr/local # 解压到当前目录,会生成 mariadb-10.5.11-linux-x86_64 目录 tar -zxvf /root/mariadb-10.5.11-linux-x86_64.tar.gz # 建立软链接,方便后续升级时只改链接指向 ln -s /usr/local/mariadb-10.5.11-linux-x86_64 /usr/local/mariadb # 确认目录结构 ls /usr/local/mariadb

解压后你会看到bin、lib、share、support-files等目录。bin里是mysqld、mysql、mariadb-install-db等可执行文件;support-files里有现成的my.cnf模板和启动脚本,后面会用到。软链接这一步不是必须,但强烈建议做,升级时只需把链接指向新版本目录,配置文件和数据都不用动。

3.2 写一份最小可用的 my.cnf

不要直接抄support-files里那个几 KB 的大模板,里面很多参数对 10.5 已经过时。我一般从最小配置开始,跑通再按需加:

[mysqld] # base 目录,必须和实际解压路径一致 basedir = /usr/local/mariadb # 数据目录 datadir = /data/mariadb/data # socket 文件位置 socket = /data/mariadb/run/mysql.sock # 进程 pid 文件 pid-file = /data/mariadb/run/mysql.pid # 错误日志 log-error = /data/mariadb/log/error.log # 端口 port = 3306 # 服务端字符集 character-set-server = utf8mb4 # 默认存储引擎 default-storage-engine = InnoDB # 禁止 DNS 反查,加快连接速度 skip-name-resolve [client] socket = /data/mariadb/run/mysql.sock default-character-set = utf8mb4

把这份内容存到/etc/my.cnf。skip-name-resolve这个参数在连接慢的时候特别有用,它让服务端不再对客户端 IP 做反向解析,代价是授权表里不能用主机名,只能用 IP 或%。

3.3 用 mariadb-install-db 初始化数据目录

10.5 的初始化脚本叫mariadb-install-db,老版本叫mysql_install_db,别搞混:

cd /usr/local/mariadb # 以 mysql 用户身份初始化,指定用户和 basedir、datadir ./scripts/mariadb-install-db \ --user=mysql \ --basedir=/usr/local/mariadb \ --datadir=/data/mariadb/data

执行完会看到Installing MariaDB/MySQL system tables in '/data/mariadb/data' ... OK。这一步会生成mysql、performance_schema等系统库,以及ibdata1等 InnoDB 文件。如果报FATAL ERROR: Could not find ./bin/my_print_defaults,说明 basedir 写错了,检查软链接是否指向正确。

3.4 启动服务并给 root 设置密码

初始化完成后 root 是空密码,且只允许本机 socket 登录。先启动:

# 后台启动,指定配置文件 /usr/local/mariadb/bin/mysqld_safe --defaults-file=/etc/my.cnf & # 等 3 秒,确认进程在 sleep 3 ps -ef | grep mysqld | grep -v grep # 用 socket 登录,此时无需密码 /usr/local/mariadb/bin/mysql -uroot --socket=/data/mariadb/run/mysql.sock

登录进去后立刻设密码,这是「给 mariadb root 设置密码」的标准动作:

-- 设置 root 本地密码 ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPass!2024'; -- 如果要从其他机器连,再建一个远程 root(生产环境不建议) -- CREATE USER 'root'@'%' IDENTIFIED BY 'YourStrongPass!2024'; -- GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;

改完密码后退出,再用新密码验证一次。如果ALTER USER报语法错误,说明你连的是 5.5 的老实例,检查mysql --version确认版本。

4. 开机自启、远程访问与字符集:让实例真正可用

4.1 用 systemd 托管 mysqld,别再手写 init 脚本

support-files里虽然有mysql.server,但那是 SysV 时代的产物,在 systemd 系统上管理起来别扭。直接写一个 unit 文件:

[Unit] Description=MariaDB 10.5.11 After=network.target [Service] Type=simple User=mysql Group=mysql ExecStart=/usr/local/mariadb/bin/mysqld --defaults-file=/etc/my.cnf ExecStop=/bin/kill -TERM $MAINPID Restart=on-failure LimitNOFILE=65535 [Install] WantedBy=multi-user.target

存到/etc/systemd/system/mariadb.service,然后:

systemctl daemon-reload systemctl enable mariadb systemctl start mariadb systemctl status mariadb

LimitNOFILE=65535这行别省,MariaDB 在高并发下会打开大量文件描述符,默认的 1024 很容易触发Too many open files。Restart=on-failure让进程意外退出时自动拉起,配合错误日志排查。

4.2 开放远程访问的三个必要条件

本地能连不代表远程能连,远程连不上通常是三个地方没配对:

第一,配置文件里bind-address。10.5 默认监听所有地址,但如果你在my.cnf里写了bind-address = 127.0.0.1,那就只能本机连。要远程访问就注释掉或改成0.0.0.0。

第二,授权表里的 host。root@localhost只允许本机,远程要用root@'%'或具体 IP。建用户时注意:

CREATE USER 'appuser'@'192.168.1.%' IDENTIFIED BY 'AppPass!2024'; GRANT SELECT,INSERT,UPDATE,DELETE ON appdb.* TO 'appuser'@'192.168.1.%'; FLUSH PRIVILEGES;

第三,防火墙。CentOS 7 用 firewalld,银河麒麟 V10 可能用 ufw 或直接 iptables:

# firewalld firewall-cmd --permanent --add-port=3306/tcp firewall-cmd --reload # 或者 ufw ufw allow 3306/tcp

三个条件缺一不可,排查时按这个顺序查,能省不少时间。

4.3 字符集统一成 utf8mb4,别留 emoji 存不进去的坑

10.5 默认字符集已经是latin1还是utf8mb4取决于编译选项,但保险起见在my.cnf里显式指定。除了前面[mysqld]段的character-set-server,客户端和连接层也要统一:

[client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4

改完重启,登录后执行:

SHOW VARIABLES LIKE 'character%'; SHOW VARIABLES LIKE 'collation%';

确认character_set_server、character_set_database、character_set_client、character_set_connection全是utf8mb4。只要有一个是latin1,中文和 emoji 就可能乱码或报Incorrect string value。建库建表时也显式写DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci,别依赖默认值。

5. 二进制部署 MariaDB 的避坑清单:五个血泪教训

5.1 现象:mysqld 启动报Can't create/write to file '/tmp/...'

原因:/tmp被挂载成noexec或空间满,或者 mysql 用户对临时目录没写权限。MariaDB 启动时会往tmpdir写临时文件,默认是/tmp。

解决:在my.cnf里显式指定tmpdir = /data/mariadb/tmp,并提前建好目录授权给 mysql 用户。别用/tmp,很多安全加固脚本会把它锁死。

5.2 现象:mysql -uroot报Access denied for user 'root'@'localhost'

原因:初始化后 root 是空密码,但如果你之前用mysql_secure_installation或手动改过,密码可能已经变了;另一种情况是 socket 路径不一致,客户端连到了另一个实例。

解决:先确认 socket 路径,mysql --socket=/data/mariadb/run/mysql.sock -uroot -p。如果密码忘了,用--skip-grant-tables启动跳过权限验证,进去改完再正常启动。这个操作有风险,改完立刻重启。

5.3 现象:远程连接报Host 'x.x.x.x' is not allowed to connect

原因:授权表里没有对应 host 的用户,或者skip-name-resolve开启后用了主机名授权。

解决:SELECT user, host FROM mysql.user;看有没有匹配的 host。没有就CREATE USER补上。开了skip-name-resolve就只能用 IP 或%,别写主机名。

5.4 现象:数据目录权限报Permission denied但ls -l看着是对的

原因:SELinux 在拦。CentOS 和麒麟默认可能开着 enforcing。

解决:getenforce看状态。临时setenforce 0验证是不是它的问题,确认后要么关掉,要么用semanage fcontext给数据目录打正确的标签。生产环境建议配置策略而不是直接关。

5.5 现象:升级或迁移后表打不开,报Table 'xxx' doesn't exist in engine

原因:只拷了.frm和.ibd文件,没拷ibdata1,或者 InnoDB 的innodb_file_per_table设置不一致。

解决:迁移时整个数据目录一起搬,包括ibdata1、ib_logfile*、mysql系统库。别只挑表文件。如果已经出问题,用innodb_force_recovery逐级尝试恢复,能导出数据就赶紧导。

6. 版本锁定与平滑升级:把 10.5.11 当成一个可替换的零件

二进制部署最大的好处,是升级可以做到「换目录不换数据」。我现在的习惯是:每个版本解压到独立目录,软链接指向当前版本,升级时只改链接。

具体做法:新版本解压到/usr/local/mariadb-10.5.12-linux-x86_64,停掉旧实例,把/usr/local/mariadb软链接重新指向新目录,然后启动。数据目录完全不动,my.cnf里的basedir因为走的是软链接路径,也不用改。启动后执行mysql_upgrade(10.5 里叫mariadb-upgrade)检查系统表:

/usr/local/mariadb/bin/mariadb-upgrade -uroot -p --socket=/data/mariadb/run/mysql.sock

这个命令会检查并修复系统表结构,跨小版本升级基本都能平滑过。跨大版本(比如 10.5 到 10.11)要先读 release note,有些参数被废弃,有些默认值变了,直接换目录可能起不来。

验证升级是否成功,除了看版本号,还要抽查几张业务表:

SELECT VERSION(); CHECK TABLE appdb.orders; SELECT COUNT(*) FROM appdb.orders LIMIT 1;

CHECK TABLE返回status OK才算踏实。我一般还会把错误日志从头到尾扫一遍,搜ERROR和Warning,很多问题在启动阶段就有征兆,只是被忽略了。

最后说个习惯:每次动数据库之前,先把数据目录tar一份冷备,哪怕只是改个参数。二进制部署没有包管理器帮你回滚,后悔药得自己提前备好。这套流程我在麒麟 V10 和 Rocky Linux 上都跑过,差异只在防火墙和 SELinux 的默认策略,核心步骤一模一样。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询