
简介MariaDB 10.5.11 Linux x86_64 安装包面向需要在 Linux 服务器上部署或升级 MariaDB 的数据库管理员、运维人员及开发测试者用于搭建高性能、高可用数据库环境。压缩包大小 347.07MB包含 MariaDB 10.5.11 在 x86_64 平台上的完整二进制安装文件文件总数与类型明细无有效数据因此不做展开。此版本在存储引擎、SQL 兼容性、GTID 复制、线程池、查询优化与安全审计等方面均有改进支持 InnoDB、Aria、ColumnStore 等引擎其中 InnoDB 支持事务处理MyISAM 适合快速读取Aria 侧重快速崩溃恢复XtraDB 为增强型 InnoDB用户可根据业务场景灵活选择同时也可利用虚拟列、多源复制、半同步复制等特性处理复杂查询与大规模并发访问。已有291人学习下载便于完成数据库初始化、配置与上线使用也可为主从复制、性能调优、安全加固等实践提供直接软件基础。1. MariaDB 10.5.11 的 Linux 二进制包为什么我还要手动装它在绝大多数 Linux 主机上用自带源装 MySQL 或 MariaDB 是默认选择但总有限制环境逼你换思路某内网服务器既连不上公共镜像站又不允许用 yum 往生产机器上装东西或者你需要在同一台机器上跑两个不同版本的数据库而包管理器只提供一个固定版本。这时候直接拿一份 MariaDB 10.5.11-linux-x86_64.tar.gz 丢到服务器上解压、初始化、启动反而最可控。这份二进制包是官方预编译产物不依赖目标机的编译器基础内核是 glibc 2.17 以上就能跑。它解决的不仅是“能不能装”而是“装在哪个目录、用什么参数、怎么独立管理”都能自己说了算。适合不想被系统源绑架、又需要快速复现一套数据库环境的同行。2. 安装前准备版本选型、依赖检查与目录规划2.1 为什么选 10.5 而不是 10.4 或 10.6特性与兼容性平衡MariaDB 10.5 在官方长期支持系列里属于一个相对稳妥的折中。它继承了 10.4 里已经洗过的 InnoDB 参数默认值又比 10.6 多了点保守气质——10.6 在窗口函数和 CTE 上改动更大有些旧应用里的 SQL 写法到 10.6 的优化器下执行计划会变提前翻车也常见。10.5 的 InnoDB 支持部分在线 DDL临时表引擎默认改成内存中的临时表结构整体性能比 10.3/10.4 更可预期。另外一点10.5.x 系列在 x86_64 上的 glibc 兼容面比较广你在 CentOS 7、Ubuntu 18.04 或者更老的内核环境里都能解压跑起来。10.6 以后编译参数对新内核特性依赖更多老系统上反而容易出现“初始化成功但启动即崩溃”的玄学问题。如果是新部署且没有历史包袱选 10.5.11 这个具体版本的二进制包踩坑资料也多网上搜得到的问题基本都能覆盖到。2.2 检查依赖libaio、ncurses 与 glibc 缺一不可二进制包不是纯静态编译它动态链接了一部分系统库。最常见的问题是缺 libaio。InnoDB 在初始化数据目录和启动时都会调io_setup缺少 libaio.so.1 会直接导致mysqld: error while loading shared libraries报错。可以先查一遍ldd mariadb-10.5.11-linux-x86_64/bin/mysqld | grep not found这条命令会把所有动态库缺失情况列出来。如果缺 libaio用系统的包管理器装CentOS 系执行yum install libaio -yUbuntu 系执行apt install libaio1 -y。注意 64 位环境别漏了libaio.so.1的软链有些精简容器镜像里只有libaio.so没有带版本号的那个文件手动建一个软链也能解决。ncurses 库一般在mysql_upgrade和mysqld_safe里会被调用但实际缺的少。另外检查libstdc是否在 6.0 以上10.5 的二进制用到了 C11 的 ABI老版本 libstdc.so.5 跑不起来。这块用上面的ldd基本一眼能看出来。2.3 目录规划与用户创建用独立用户跑数据库更稳解压之前先决定三件事安装目录放哪、数据目录放哪、谁来启动进程。我习惯把二进制放在/opt/mariadb-10.5.11数据目录独立放在/opt/mariadb-datasocket 文件放在/opt/mariadb-run。这样升级时只动安装目录数据目录不受影响备份也只盯数据目录。创建专用系统用户一般叫mysql或mariadb避免用 root 跑数据库。虽然二进制包的脚本里有--userroot的选项但 root 跑 mysqld 风险太大一旦 SQL 注入拿到文件权限就是灾难。创建用户和目录groupadd mariadb useradd -g mariadb -s /sbin/nologin mariadb mkdir -p /opt/mariadb-10.5.11 /opt/mariadb-data /opt/mariadb-run chown -R mariadb:mariadb /opt/mariadb-10.5.11 /opt/mariadb-data /opt/mariadb-run这里-s /sbin/nologin让该用户不能登录 shell只用于服务运行。目录属主必须给到mariadb否则后面初始化时写数据目录会提示Permission denied。注意/opt/mariadb-run权限不能是 777否则会让普通用户往里面塞文件被利用来做符号链接攻击。3. 解压、初始化与启动三个命令把实例跑起来3.1 校验文件完整性sha256 与 md5 不是玄学从网上下载的 tar.gz 包第一件事不是解压是校验。官方一般会提供sha256sum校验值。原始文件名里没有校验和需要你从发布页拿到对应的.sha256sum文件或直接核对发布页给出的哈希。常见做法是echo 目标哈希值 mariadb-10.5.11-linux-x86_64.tar.gz | sha256sum -c - --quiet sha256sum mariadb-10.5.11-linux-x86_64.tar.gz-c -表示从标准输入读取校验文件内容--quiet让匹配成功时不输出额外信息。输出mariadb-10.5.11-linux-x86_64.tar.gz: OK说明完整如果无输出或显示 FAILED别继续重下吧。这一步不费事但能拦掉 99% 的“解压后发现少了文件”或“被中间人替换”的坑。3.2 解压迁移与目录权限文件属主必须改解压时注意保留文件权限tar 包里的目录结构是预设好的用-xzf解压即可。不建议直接在/root下解压再 mv因为 mv 会保留原属主如果原属主是 root后面启动就会因为无法读写数据目录而失败。我的做法是cd /opt tar -xzf /tmp/mariadb-10.5.11-linux-x86_64.tar.gz -C /opt mv /opt/mariadb-10.5.11-linux-x86_64 /opt/mariadb-10.5.11 chown -R mariadb:mariadb /opt/mariadb-10.5.11移动后必须重设属主。有些人在 mv 后省略chown直接用 root 开始初始化之后用--usermariadb启动时数据目录里生成的ibdata1等文件还是 root 属主于是 mysqld 只能报权限错退出。这个问题发生频率极高先改了省事。3.3 初始化数据目录scripts/mysql_install_db 的正确姿势10.5 的二进制包内置了scripts/mysql_install_db它是基于--initialize的封装。初始化命令要明确指定数据目录和用户cd /opt/mariadb-10.5.11 scripts/mysql_install_db --usermariadb --datadir/opt/mariadb-data \ --basedir/opt/mariadb-10.5.11 --auth-root-authentication-methodnormal--datadir指向刚才建好的数据目录不是安装目录别搞反。--basedir指向二进制包解压目录。--auth-root-authentication-methodnormal让 root 用户使用常规密码认证否则默认用unix_socket认证你会发现自己用 mysql 客户端连 root 时永远需要先切到系统 mariadb 用户。初始化过程中会往--datadir写入系统表、ibdata1、undo日志和默认的mysql库。初始化完成后/opt/mariadb-data下会多出一批文件属主已经是mariadb。如果中途报FATAL ERROR: Could not find ./bin/my_print_defaults说明--basedir指错了路径因为初始化脚本会基于 basedir 找辅助工具。3.4 启动 mysqld_safe 与登录验证默认 root 怎么进初始化完成后先别急着配 systemd直接手动启动一次看能不能跑起来/opt/mariadb-10.5.11/bin/mysqld_safe \ --usermariadb --datadir/opt/mariadb-data \ --socket/opt/mariadb-run/mysql.sock --port3306 mysqld_safe是守护外壳mysqld 崩了它会自动拉起。--socket一定要显式指定因为默认它会在/var/lib/mysql/mysql.sock或编译时的默认路径而你数据目录不在那。端口不写也行默认 3306但多实例部署时端口是区分品。启动后等两三秒用mysqladmin ping探活/opt/mariadb-10.5.11/bin/mysqladmin --socket/opt/mariadb-run/mysql.sock -u root ping如果返回mysqld is alive说明服务正常。此时 root 密码是空但你用的是 socket 连接且 root 只允许本机登录。用mysql -u root进去后第一件事设密码ALTER USER rootlocalhost IDENTIFIED BY 你的强密码; FLUSH PRIVILEGES;注意 10.5 里已经不支持SET PASSWORD旧语法建议统一用ALTER USER。4. 参数调优与基础配置my.cnf 里值得调的七个关键项4.1 数据目录、socket 与 pid路径统一才能少踩坑启动成功后要把参数固化到配置文件里不能每次启动都靠命令行拼。默认配置路径有几个候选/etc/my.cnf、/etc/mysql/my.cnf、$basedir/my.cnfmysqld 启动时会按先后顺序读取。我用固定一套[mysqld] basedir/opt/mariadb-10.5.11 datadir/opt/mariadb-data socket/opt/mariadb-run/mysql.sock pid-file/opt/mariadb-run/mysqld.pid port3306配置好后无论用mysqld_safe还是 systemd都不需要再传路径参数。如果有多个实例port和socket必须不同且 pid 文件也要区分。socket 路径如果和客户端默认路径不一致客户端连接时要么--socket指定要么配置[client]节[client] socket/opt/mariadb-run/mysql.sock否则你会碰到“服务器明明启动了但mysql命令连不上”的幻觉错误后面避坑章节细说。4.2 InnoDB 缓冲池与日志内存多大决定性能起点10.5 的 InnoDB 缓冲池默认是 128MB对生产实例通常不够。设置缓冲池大小的原则是如果机器内存只有 4GB就设 1GB8GB 内存可以给到 23GB。别把整个内存都塞给数据库系统本身和查询排序也要留余量。日志文件大小innodb_log_file_size默认是 96MB写入压力大的应用建议调到 256MB 或 512MB。innodb_buffer_pool_size2G innodb_log_file_size256M innodb_flush_log_at_trx_commit1 innodb_file_per_tableONinnodb_flush_log_at_trx_commit1每次事务提交都刷盘保证不丢数据适合数据库应用如果对一致性要求不高、追求吞吐可以改成 2但掉电可能丢最近一秒的事务。innodb_file_per_tableON每张表一个独立表空间drop 表时直接删文件回收磁盘空间方便10.5 默认已经是 ON但显式写出来能防哪些my.cnf是否被覆盖。4.3 binlog 与慢查询开审计前先想清楚代价binlog 是主从复制和时间点恢复的基础但开了 binlog 会带来写入开销。如果不需要复制且备份走全量快照可以不开。需要开的消费者先确定格式server-id1 log-bin/opt/mariadb-binlog/mysql-bin binlog_formatROW expire_logs_days7 max_binlog_size256Mserver-id在单机可以设 1多实例必须唯一。log-bin路径最好独立目录别和数据目录混在一起。binlog_formatROW在 10.5 是默认值比 statement 更安全不会因为 SQL 里用NOW()导致主从数据不一致。expire_logs_days建议设 7太久会撑爆磁盘日志清理脚本往往依赖这个参数10.5 以后的参数名变成了binlog_expire_logs_seconds以秒为单位两套都写上能兼容老客户端。慢查询日志平时可以关闭排查问题时再开避免额外 IO。我一般只在性能调优期间临时开slow_query_logOFF long_query_time24.4 字符集与排序规则utf8mb4 统一天下10.5 默认字符集是utf8mb4但为了保险还是显式写清楚character-set-serverutf8mb4 collation-serverutf8mb4_general_ci skip-character-set-client-handshakeskip-character-set-client-handshake会忽略客户端声明的字符集强制走服务端设置否则某些老 JDBC 驱动会在连接时把自己的latin1声名传给服务端导致新写入的中文乱码。排序规则用general_ci还是unicode_ci看业务要求general_ci速度快unicode_ci排序更符合 Unicode 规范国内业务用前者足够。5. 避坑与排查二进制包部署最常见的六个翻车现场5.1 初始化时报缺少 libaio.so.1现象执行scripts/mysql_install_db时报error while loading shared libraries: libaio.so.1: cannot open shared object file。原因系统没有安装 libaio 或者只有 libaio.so 没有带版本号的软链。mysqld 初始化时调用了io_setup系统调用这个调用由 libaio 提供缺了就直接跑不起来。解决CentOS/RHEL 系使用yum install -y libaioDebian/Ubuntu 系使用apt install -y libaio1。装完用ldd bin/mysqld | grep libaio确认能解析到/usr/lib64/libaio.so.1或/usr/lib/x86_64-linux-gnu/libaio.so.1。如果装完还找不到可以查一下/sbin/ldconfig -p | grep libaio手动建立ln -s /usr/lib64/libaio.so /usr/lib64/libaio.so.1。这个坑在精简版 Docker 容器里尤其常见。5.2 mysql_install_db 提示该脚本已弃用现象10.5 的scripts/mysql_install_db输出mysql_install_db is deprecated. Please consider switching to mysqld --initialize。原因这不是报错是提示。MariaDB 官方从 10.4 左右就开始推荐用mysqld --initialize或mariadb-install-db老的 mysql_install_db 是 MySQL 5.7 时代的产物。解决如果你更想用新方式直接执行/opt/mariadb-10.5.11/bin/mysqld --initialize --usermariadb --datadir/opt/mariadb-data注意--initialize不会像老脚本那样把 root 密码留空而是生成一段临时密码写在 stdout 里。启动后mysql -u root -p输入该临时密码登录后再ALTER USER改密。实际使用中老脚本也能完成初始化只是会有弃用提示。如果不想每次都看到改用mariadb-install-db10.5 包里提供了这个软链。5.3 启动时提示 datadir 不存在或权限错误现象mysqld_safe 启动后立刻退出日志里出现[ERROR] Cant find error-message file或[ERROR] Could not open required defaults file更常见的是Permission denied指向/opt/mariadb-data。原因数据目录是 root 创建的或者初始化时用了 root 用户导致目录属主不是 mariadb。mysqld 切换到--usermariadb后无法写目录。解决检查目录属主ls -ld /opt/mariadb-data /opt/mariadb-10.5.11如果属主是 root执行chown -R mariadb:mariadb重设。还有一个隐性原因父目录/opt权限如果是 755没给mariadb写权限但子目录属主正确也不受影响真正要命的是 SELinux 开启状态下mysqld 对自定义目录的上下文不对。解决方法是暂时用setenforce 0验证如果是 SELinux 导致再为自定义目录打上下文标签chcon -R -t mysqld_db_t /opt/mariadb-data。我一般直接关掉 SELinux 或设置为 permissive生产环境谨慎对待。5.4 socket 连不上/tmp/mysql.sock 与 /opt/mariadb-run/mysql.sock 之争现象执行mysql -u root -p后报ERROR 2002 (HY000): Cant connect to local MySQL server through socket /tmp/mysql.sock但明明看到 mysqld 进程活着。原因客户端默认找/tmp/mysql.sock但你在配置里指定了/opt/mariadb-run/mysql.sock。两边路径不一致客户端自然找不到。如果你只改了服务端配置文件没改客户端配置就会出现这个经典幻觉。解决两种办法任选其一。一是给客户端加绝对路径mysql --socket/opt/mariadb-run/mysql.sock -u root -p二是写进配置文件的[client]节如上章所说。我更推荐后者因为以后所有本地命令行工具都会自动用对 socket包括mysqldump。注意mysqladmin ping也一样要指定 socket否则也会误判数据库死掉。5.5 忘记 mysql_upgrade跨小版本后权限表报错现象从旧版本数据目录直接换到 10.5.11 二进制包启动正常但执行查询时报Table mysql.proc doesnt exist或Unknown column Password in mysql.user。原因10.5 的 mysql 系统库结构和旧版本可能不同比如mysql.user表中的认证插件字段变了老数据目录里的系统表没有升级。单纯替换二进制不会自动迁移系统库。解决启动新版后别急着用业务先跑升级工具/opt/mariadb-10.5.11/bin/mysql_upgrade \ --socket/opt/mariadb-run/mysql.sock -u root -p它会扫描所有库表比对版本并修正系统表和已损坏的旧表。注意在升级前先备份数据目录。这个工具在 10.5 里还会执行CHECK TABLE如果检查到旧表引擎不支持会提示你转换。如果平时是停机升级建议跑完后重启一次实例让新参数全面生效。5.6 systemd 接管后卡在启动超时现象手写 systemd service 文件之后systemctl start mariadb一直卡在activating等 90 秒后超时失败但手动跑mysqld_safe却正常。原因systemd 的 Type 没有设置对。mysqld_safe 会 fork 出 mysqld 进程systemd 默认认为主进程退出服务就结束而 mysqld_safe 作为守护壳不会退出导致 systemd 以为启动失败。另一个原因是TimeoutStartSec设置太短大内存实例初始化缓冲池耗时就超过默认 90 秒。解决service 文件里用Typeforking配合PIDFile指向 pid 文件路径[Service] Typeforking Usermariadb Groupmariadb ExecStart/opt/mariadb-10.5.11/bin/mysqld_safe --defaults-file/etc/my.cnf ExecStop/opt/mariadb-10.5.11/bin/mysqladmin shutdown --socket/opt/mariadb-run/mysql.sock PIDFile/opt/mariadb-run/mysqld.pid TimeoutStartSec180mysqld_safe启动时会把 mysqld 的 pid 写到配置指定路径systemd 靠这个 pid 判断服务是否拉起。我试过不用Typeforking改用Typesimple直接跑mysqld也可以但日志输出会直接打到 stdout需要自己处理重定向。从稳定性来说forking模式兼容性最好。6. 验证安装与后续维护从版本号到日常备份的收尾动作6.1 用 mysqladmin ping 与 status 确认实例健康安装完成后建议做一次完整的状态验证不要只看到进程存在就认为万事大吉。执行/opt/mariadb-10.5.11/bin/mysqladmin --socket/opt/mariadb-run/mysql.sock -u root -p ping /opt/mariadb-10.5.11/bin/mysqladmin --socket/opt/mariadb-run/mysql.sock -u root -p statusping返回mysqld is alive只说明连接有效status会给你 uptime、线程数、查询数、每秒流量等关键指标。我还会顺手查一下版本和关键参数是否真正生效SELECT VERSION(); SHOW VARIABLES LIKE innodb_buffer_pool_size; SHOW VARIABLES LIKE character_set_server;这里有个坑SHOW VARIABLES显示的参数值可能和你配置文件写的不同如果配置里写错了节名mysqld 会静默忽略。务必确认输出值别只看文件里写了什么。6.2 配置 systemd 服务让数据库跟开机自启手动启动只是临时验证生产环境必须由 systemd 管理。将上述 service 文件置于/etc/systemd/system/mariadb.service然后执行systemctl daemon-reload systemctl enable mariadb systemctl start mariadb systemctl status mariadb --no-pager注意enable是创建开机软链start是立即启动。如果status显示Active: active (running)说明接入成功。有一个细节ExecStart里如果不写--defaults-filesystemd 环境下 mysqld_safe 会按默认顺序找配置文件可能找到/etc/my.cnf而不是你放在别处的配置。我习惯在 service 文件里显式指定--defaults-file/etc/my.cnf避免默认搜索顺序造成的意外。6.3 备份恢复演练xtrabackup 与 mysqldump 的取舍收尾阶段最后一步也是我每次部署都要强制执行的一步备份和恢复演练。只用 mysqldump 是不够的它备份逻辑数据对大数据量恢复太慢。常见做法是冷备或物理备份10.5 官方支持mariadb-backup它是 xtrabackup 的分支。做一次全量备份/opt/mariadb-10.5.11/bin/mariadb-backup \ --backup --target-dir/opt/backup/full \ --userbackup_user --password****恢复时先准备全量备份/opt/mariadb-10.5.11/bin/mariadb-backup --prepare --target-dir/opt/backup/full /opt/mariadb-10.5.11/bin/mariadb-backup --copy-back --target-dir/opt/backup/full--prepare会把备份文件中的未提交事务回滚让数据文件达到一致性状态--copy-back才把数据写回数据目录。这一步极容易漏很多人直接 copy 备份文件到 datadir 然后启动结果 InnoDB 崩溃恢复时报错。从那以后我每次部署完都会强迫自己完整走一遍“备份 → 清空数据目录 → 恢复 → 启动 → 查询数据”循环确认备份不是只能写在脚本里的摆设。很多事故都是备份存在但恢复不了赶上一次就够刻骨铭心了。希望这篇笔记能帮你把二进制包这条路走顺省下来的那几小时留着好好休息。本文还有配套的精品资源点击获取