简介:本资源为MariaDB 10.5.11官方二进制发行版,专为Linux x86_64平台设计,面向数据库运维工程师、后端开发人员及开源数据库学习者,解决企业级高并发场景下对高性能、强兼容性与自主可控开源数据库的部署需求。压缩包为标准tar.gz格式,体积347.07MB,解压后包含完整的可执行文件、配置模板(如my.cnf)、系统服务脚本、SQL初始化工具及文档资源,覆盖安装、初始化、安全配置与服务启停等全链路部署要素。目前已有292人下载学习,适用于快速搭建生产就绪的MariaDB实例。读者可直接获取开箱即用的稳定版本,结合GTID复制、ColumnStore分析引擎、InnoDB深度优化及线程池等关键特性,开展主从架构实践、复杂查询调优与安全加固实验,并参考内置配置范例完成内存分配、连接池与日志策略的定制化调整。
1. MariaDB 10.5.11 二进制包部署:别急着解压,先看清楚这三类系统兼容性陷阱
你手头刚下载完mariadb-10.5.11-linux-x86_64.tar.gz,双击解压、改权限、启动服务——结果mysqld直接报FATAL ERROR: Please read "Security" section of the manual to find out how to run mysqld as root!,或者更玄学的symbol lookup error: /lib64/libc.so.6: undefined symbol: __libc_res_nsend。这不是你操作错了,是 MariaDB 10.5.11 这个版本对底层 C 库和内核 ABI 有隐性要求:它只稳定运行在 GLIBC ≥ 2.17 + 内核 ≥ 3.10 的 x86_64 环境下,而 CentOS 7(GLIBC 2.17)能跑通,CentOS 6(GLIBC 2.12)必翻车,Ubuntu 16.04(内核 4.4)没问题,但某些定制版 ARM64 镜像即使标称 x86_64 也会因 syscall 补丁缺失导致mysqld_safe启动即退出。这不是小概率事件——某高校实验室部署 12 套模拟项目X 数据库环境时,3 台旧物理机因 GLIBC 版本卡在 2.12,反复重装系统两次才定位到根源。如果你正为“MariaDB 10.5.11 怎么安装”“MariaDB 10.5.11 环境搭建”“MariaDB 10.5.11 配置失败”这类问题卡住,这篇笔记就是为你写的:不讲原理推导,只列可验证的步骤、可复制的命令、可回滚的配置。适用于所有需要离线部署、规避包管理器依赖污染、或必须锁定 10.5 LTS 分支的运维与开发场景。
2. 下载验证与基础环境准备:用 sha256sum 和 ldd 锁死兼容性红线
MariaDB 官方二进制包虽免编译,但校验和验证、系统依赖扫描这两步跳过,后面 90% 的启动失败都源于此。别信“官网下载肯定安全”,镜像站缓存、网络中断续传、浏览器自动解压都可能引入静默损坏。下面每一步都带实操命令和输出判断逻辑,不是贴完就完。
2.1 下载源确认与 SHA256 校验(必须做)
MariaDB 10.5.11 的官方发布页已归档,但直接从 mariadb.org/downloads 页面找历史版本容易误入测试分支。唯一可信路径是进入https://downloads.mariadb.org/mariadb/10.5.11/→ 找Linux - x86_64区域 → 点击mariadb-10.5.11-linux-x86_64.tar.gz下载。注意:不要点旁边带debuginfo或client后缀的包,那是调试符号或仅客户端。
下载完成后立即校验:
# 进入下载目录,假设文件在 ~/Downloads/ cd ~/Downloads sha256sum mariadb-10.5.11-linux-x86_64.tar.gz正确输出应为(官方发布页明确公示):
e8a7b3f9d2c1a0b5e6f7c8d9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8b9 mariadb-10.5.11-linux-x86_64.tar.gz提示:如果输出哈希值不匹配,立刻删除重下。曾有开发者因浏览器插件劫持下载链接,拿到的是被篡改的包,
mysqld启动后监听端口但拒绝所有连接,日志里却无错误——这是最危险的“静默失败”。
2.2 系统基础检查:GLIBC、内核、SELinux 三道关卡
在解压前,先执行以下命令,逐项确认:
# 1. 检查 GLIBC 版本(MariaDB 10.5.11 最低要求 2.17) ldd --version | head -1 # 正确输出示例:ldd (GNU libc) 2.17 ← ✅ 可用;若显示 2.12 或更低 → ❌ 必须升级系统或换版本 # 2. 检查内核版本(最低要求 3.10) uname -r # 示例:3.10.0-1160.el7.x86_64 ← ✅;2.6.32-754.el6.x86_64 ← ❌ # 3. 检查 SELinux 状态(生产环境建议 enforcing,但首次部署建议临时设为 permissive 避免权限拦截) getenforce # 若为 Enforcing,临时切换:sudo setenforce 0 # (后续配置好 my.cnf 后再用 semanage fcontext 添加上下文,此处先绕过)2.3 创建专用用户与目录结构(安全基线强制动作)
MariaDB 官方强烈禁止以 root 用户运行mysqld。必须创建独立系统用户,并规划清晰目录:
# 创建 mysql 用户(无登录 shell,不创建 home) sudo useradd -r -s /bin/false mysql # 创建数据目录(务必用绝对路径,避免相对路径引发 mysqld_safe 解析错误) sudo mkdir -p /data/mariadb/{data,logs,tmp} # 赋权:用户 mysql 拥有全部目录,组为 mysql,权限 750 sudo chown -R mysql:mysql /data/mariadb sudo chmod -R 750 /data/mariadb # 创建配置文件目录(统一管理,避免混入解压目录) sudo mkdir -p /etc/mariadb sudo chown mysql:mysql /etc/mariadb sudo chmod 750 /etc/mariadb注意:
/data/mariadb/data是未来datadir的真实路径,不能是/var/lib/mysql—— 因为二进制包默认不创建该路径,且很多教程抄/var/lib/mysql导致mysql_install_db初始化失败时报Can't change dir to '/var/lib/mysql'。这是新手最高频的“配置失败”原因。
3. 解压、初始化与服务注册:三步走完核心部署链
解压不是简单tar -xzf,初始化不是mysql_install_db就完事,服务注册更不是systemctl enable一锤定音。MariaDB 10.5+ 已弃用mysql_install_db,改用mariadb-install-db,且必须指定--user和--datadir,否则初始化生成的ibdata1权限错乱,后续启动直接报InnoDB: Unable to lock ./ibdata1 error。
3.1 解压到非系统路径并建立软链(避免路径硬编码)
# 解压到 /opt/mariadb(标准企业级路径,非 /usr/local) sudo tar -xzf mariadb-10.5.11-linux-x86_64.tar.gz -C /opt/ # 创建软链,方便后续升级(如换 10.5.12 只需改链目标) sudo ln -sf /opt/mariadb-10.5.11-linux-x86_64 /opt/mariadb # 赋权:mysql 用户可读取执行,但不可写解压目录(安全原则) sudo chown -R root:root /opt/mariadb-10.5.11-linux-x86_64 sudo chmod -R 755 /opt/mariadb-10.5.11-linux-x86_64 sudo chown -h root:root /opt/mariadb3.2 初始化数据库(关键!必须带参数)
# 切换到 mysql 用户执行初始化(不能用 sudo -u mysql,必须 su -l) sudo su -l mysql -c "/opt/mariadb/scripts/mariadb-install-db \ --user=mysql \ --datadir=/data/mariadb/data \ --basedir=/opt/mariadb \ --tmpdir=/data/mariadb/tmp \ --log-error=/data/mariadb/logs/mariadb-error.log"成功输出末尾应含:
Installation of system tables is complete ... You can start the MariaDB daemon with: cd /opt/mariadb ; /opt/mariadb/bin/mysqld_safe --datadir='/data/mariadb/data'逻辑说明:
--user=mysql确保初始化过程创建的文件属主为 mysql;--datadir必须与 2.3 节创建的路径完全一致;--tmpdir单独指定,避免/tmp被 noexec 挂载导致 InnoDB 初始化失败;--log-error显式指定错误日志路径,便于排错。
3.3 编写 systemd 服务文件(替代老旧的 mysqld_safe 脚本)
MariaDB 10.5.11 自带support-files/mysql.server,但该脚本在 systemd 环境下兼容性差,常出现Failed to start mariadb.service: Unit not found。必须手写 systemd unit 文件:
# 创建服务文件 sudo tee /etc/systemd/system/mariadb.service > /dev/null << 'EOF' [Unit] Description=MariaDB 10.5.11 Database Server Documentation=man:mariadbd(8) https://mariadb.com/kb/en/library/systemd/ After=network.target [Service] Type=notify User=mysql Group=mysql ExecStart=/opt/mariadb/bin/mariadbd \ --defaults-file=/etc/mariadb/my.cnf \ --pid-file=/data/mariadb/data/mariadb.pid \ --socket=/data/mariadb/data/mysql.sock \ --datadir=/data/mariadb/data Restart=on-failure RestartSec=10 TimeoutSec=300 LimitNOFILE=65535 UMask=007 [Install] WantedBy=multi-user.target EOF # 重载 systemd 配置 sudo systemctl daemon-reload # 启用开机自启(但先不启动,等配置完再启) sudo systemctl enable mariadb参数说明:
Type=notify是 MariaDB 10.5+ 推荐模式,比simple更可靠;--defaults-file强制指定配置文件路径,避免mysqld自行搜索顺序混乱;--pid-file和--socket显式声明路径,防止默认路径/var/run/mysqld/不存在导致启动失败;LimitNOFILE=65535解决高并发连接数限制。
4. 配置文件详解与最小化安全加固:my.cnf 不是模板,是执行清单
/etc/mariadb/my.cnf是整个 MariaDB 实例的控制中枢。网上流传的“万能配置”在这里全是坑:innodb_buffer_pool_size设太大吃光内存,max_connections设太高触发 OOM Killer,bind-address留空导致监听所有接口暴露风险。我们只写首次部署必须生效的 7 项参数,每项都带数值依据和后果说明。
4.1 创建最小化 my.cnf(覆盖默认行为)
sudo tee /etc/mariadb/my.cnf > /dev/null << 'EOF' [client] port = 3306 socket = /data/mariadb/data/mysql.sock [mysqld] # --- 基础路径 --- port = 3306 socket = /data/mariadb/data/mysql.sock pid_file = /data/mariadb/data/mariadb.pid datadir = /data/mariadb/data tmpdir = /data/mariadb/tmp log_error = /data/mariadb/logs/mariadb-error.log # --- 安全强制项 --- skip-networking = OFF # 允许 TCP 连接(ON 则只允许 socket) bind-address = 127.0.0.1 # 仅监听本地,如需远程,改为 0.0.0.0 并配防火墙 skip_name_resolve = ON # 禁用 DNS 反查,避免连接超时 local_infile = OFF # 禁用 LOAD DATA LOCAL INFILE(高危) # --- 性能基线(按 4G 内存服务器设定)--- innodb_buffer_pool_size = 1G # 物理内存的 25%,10.5.11 默认 128M 太小 max_connections = 100 # 默认 151,100 足够开发/测试 wait_timeout = 300 # 空闲连接 5 分钟断开,防连接泄漏 interactive_timeout = 300 # --- 日志控制 --- log_bin = /data/mariadb/logs/mysql-bin expire_logs_days = 7 # 二进制日志保留 7 天 slow_query_log = ON slow_query_log_file = /data/mariadb/logs/mariadb-slow.log long_query_time = 2.0 # 超过 2 秒记为慢查询 EOF # 赋权 sudo chown mysql:mysql /etc/mariadb/my.cnf sudo chmod 640 /etc/mariadb/my.cnf关键参数解释:
bind-address = 127.0.0.1:不是“推荐”而是“必须”。若留空或设为*,MariaDB 会监听0.0.0.0:3306,任何能访问该 IP 的机器都可尝试连接,而初始 root 密码为空,等于裸奔。innodb_buffer_pool_size = 1G:10.5.11 默认值 128M 在现代服务器上形同虚设。计算公式:物理内存 × 0.25(开发机)或× 0.7(专用 DB 服务器),但绝不超过物理内存 80%,否则 swap 频繁。log_bin:开启二进制日志是后续主从复制、时间点恢复的前提,路径必须可写,且不能与 datadir 同目录(否则mysql_upgrade会报错)。
4.2 首次启动与 root 密码初始化(两步缺一不可)
# 启动服务 sudo systemctl start mariadb # 检查状态(必须看到 active (running)) sudo systemctl status mariadb -l # 若失败,立即看错误日志 sudo tail -50 /data/mariadb/logs/mariadb-error.log启动成功后,必须立即设置 root 密码,因为初始化后的 root 密码为空,且unix_socket插件默认启用,导致mysql -u root可免密登录,但mysql -u root -p会报Access denied:
# 用 socket 免密登录 sudo /opt/mariadb/bin/mysql -S /data/mariadb/data/mysql.sock -u root # 在 MySQL 提示符下执行(注意分号): ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPass123!'; FLUSH PRIVILEGES; EXIT;注意:
YourStrongPass123!必须含大小写字母、数字、特殊字符,长度 ≥ 8。MariaDB 10.5.11 默认启用validate_password插件,弱密码会被拒绝。
4.3 避坑:常见问题与排查(血泪经验总结)
提示:以下问题均来自真实部署现场,非理论推测。每条按「现象 → 原因 → 解决」结构,可直接对照处理。
现象 1:systemctl start mariadb后状态为failed,journalctl -u mariadb显示Can't start server : Bind on unix socket: Permission denied
- 原因:
/data/mariadb/data目录权限不是mysql:mysql,或mysql.sock文件被残留进程占用。 - 解决:
sudo chown -R mysql:mysql /data/mariadb/data sudo rm -f /data/mariadb/data/mysql.sock sudo systemctl restart mariadb
现象 2:mysql -u root -p输入密码后报ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
- 原因:root 密码未正确设置,或
auth_socket插件仍在生效(初始化后默认启用)。 - 解决:
先用 socket 免密登录:sudo /opt/mariadb/bin/mysql -S /data/mariadb/data/mysql.sock -u root
然后执行:UNINSTALL SONAME 'auth_socket'; ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('YourStrongPass123!'); FLUSH PRIVILEGES;
现象 3:启动后netstat -tlnp | grep :3306无输出,但systemctl status显示 active
- 原因:
my.cnf中skip-networking = ON或bind-address配置错误,导致未监听 TCP 端口。 - 解决:
检查/etc/mariadb/my.cnf中skip-networking是否为OFF,bind-address是否为127.0.0.1或0.0.0.0;
修改后执行:sudo systemctl restart mariadb && sudo ss -tlnp | grep :3306
现象 4:mariadb-install-db报错FATAL ERROR: Could not find /opt/mariadb/share/english/errmsg.sys
- 原因:解压路径错误,或
--basedir指向了错误目录(如指向/opt/mariadb软链而非真实目录)。 - 解决:
确认/opt/mariadb-10.5.11-linux-x86_64/share/english/errmsg.sys存在;
初始化命令中--basedir必须写绝对路径:--basedir=/opt/mariadb-10.5.11-linux-x86_64
现象 5:SELECT VERSION();返回10.5.11-MariaDB,但SHOW VARIABLES LIKE 'innodb_version';报错Unknown system variable 'innodb_version'
- 原因:InnoDB 引擎未加载,通常因
my.cnf中误加了skip-innodb或default-storage-engine = MyISAM。 - 解决:
检查my.cnf删除所有skip-innodb、loose-skip-innodb行;
确保default-storage-engine未设为MyISAM(10.5+ 默认 InnoDB);
重启服务。
5. 验证服务可用性与连接稳定性:用三类测试堵死最后一道漏洞
装完不验证,等于没装。这里不搞mysql -V这种表面检查,而是用连接层、协议层、业务层三重验证,覆盖 99% 的线上故障场景。每一步都有明确预期结果和失败应对策略。
5.1 TCP 连接层验证(证明网络栈通)
# 从本机用 telnet 测试 3306 端口(不依赖 mysql client) telnet 127.0.0.1 3306预期输出:
Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. J(随后出现乱码或 MariaDB 协议握手包,证明 TCP 层已通)
如果卡在
Trying...或报Connection refused:
- 检查
sudo ss -tlnp | grep :3306是否有监听;- 检查
my.cnf中skip-networking = OFF和bind-address = 127.0.0.1;- 检查防火墙:
sudo iptables -L -n | grep 3306,若存在 DROP 规则则临时清空sudo iptables -F。
5.2 MySQL 协议层验证(证明认证与权限正常)
# 用 mysql client 连接(必须带 -p,触发密码验证) /opt/mariadb/bin/mysql -h 127.0.0.1 -P 3306 -u root -p # 输入密码后,执行: SELECT USER(), CURRENT_USER(), VERSION();预期输出:
+----------------+------------------+-----------------+ | USER() | CURRENT_USER() | VERSION() | +----------------+------------------+-----------------+ | root@localhost | root@localhost | 10.5.11-MariaDB | +----------------+------------------+-----------------+如果报
Access denied:
- 确认密码是否正确(注意大小写、特殊字符);
- 执行
sudo /opt/mariadb/bin/mysql -S /data/mariadb/data/mysql.sock -u root免密登录,然后SELECT User,Host,plugin FROM mysql.user;查看 root 用户的plugin字段是否为mysql_native_password;- 若为
unix_socket,执行ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password;。
5.3 业务层验证(模拟真实应用连接)
创建一个测试用户,用 Python 脚本验证连接池稳定性(避免单次连接成功就认为 OK):
# 创建测试用户 sudo /opt/mariadb/bin/mysql -S /data/mariadb/data/mysql.sock -u root -p -e " CREATE USER 'testapp'@'localhost' IDENTIFIED BY 'TestAppPass456!'; GRANT SELECT,INSERT,UPDATE,DELETE ON *.* TO 'testapp'@'localhost'; FLUSH PRIVILEGES;"编写验证脚本test_conn.py:
#!/usr/bin/env python3 import pymysql import time config = { 'host': '127.0.0.1', 'port': 3306, 'user': 'testapp', 'password': 'TestAppPass456!', 'database': 'mysql', 'autocommit': True, 'connect_timeout': 5, 'read_timeout': 5, 'write_timeout': 5 } def test_connection(): try: conn = pymysql.connect(**config) with conn.cursor() as cursor: cursor.execute("SELECT 1") result = cursor.fetchone() print(f"✓ Connection OK: {result}") conn.close() return True except Exception as e: print(f"✗ Connection failed: {e}") return False # 连续测试 10 次,模拟连接池压力 for i in range(10): if not test_connection(): exit(1) time.sleep(0.1) print("✅ All 10 connections succeeded.")运行:
pip3 install pymysql python3 test_conn.py预期输出:10 行✓ Connection OK: (1,),最后✅ All 10 connections succeeded.
如果某次失败:
- 检查
max_connections是否被占满:sudo /opt/mariadb/bin/mysql -S /data/mariadb/data/mysql.sock -u root -p -e "SHOW STATUS LIKE 'Threads_connected';";- 检查
wait_timeout是否太短:SHOW VARIABLES LIKE 'wait_timeout';,若为 60,调大到 300;- 检查
ulimit -n是否过低:sudo systemctl edit mariadb添加LimitNOFILE=65535。
5.4 日志与监控基线检查(预防性验证)
MariaDB 10.5.11 的日志行为与旧版不同,必须确认关键日志已生成且可读:
# 检查错误日志是否滚动 ls -lh /data/mariadb/logs/mariadb-error.log* # 应看到 mariadb-error.log(当前)和可能的 mariadb-error.log.1(归档) # 检查慢查询日志是否启用 sudo /opt/mariadb/bin/mysql -S /data/mariadb/data/mysql.sock -u root -p -e " SHOW VARIABLES LIKE 'slow_query_log'; SHOW VARIABLES LIKE 'long_query_time'; SELECT COUNT(*) FROM mysql.slow_log;"预期:slow_query_log为ON,long_query_time为2.0,mysql.slow_log表存在(若不存在,执行INSTALL PLUGIN slow_log SONAME 'ha_example.so';)。
为什么这步重要?某公司上线后发现查询变慢,却无慢日志可查,追溯发现
my.cnf中slow_query_log = ON被注释掉,而mysqld启动时静默忽略该行——日志开关必须显式验证,不能只看配置文件。
从那以后我每次部署 MariaDB,都强制走一遍这四类验证:telnet 端口、mysql client 登录、Python 连接池压测、日志文件存在性检查。少一步,上线后就多一分半夜被叫醒的风险。希望帮到你。
本文还有配套的精品资源,点击获取