简介本资源为MariaDB 10.5.11在Linux x86_64平台上的完整安装包面向需要在Linux服务器上部署开源关系型数据库的运维人员、后端开发者及数据库学习者。MariaDB由MySQL创始人Michael Widenius主导开发保持开源与MySQL高度兼容适合企业级高并发、复杂查询场景。压缩包为gz格式整体约347.07MB上游未提供文件总数与类型明细解压后可直接用于安装部署。该版本在InnoDB并发性能、GTID复制管理、线程池、ColumnStore列式存储、虚拟列、半同步与多源复制、安全加密与审计等方面均有增强并支持全文搜索、GIS、JSON等可插拔组件。安装后需配置环境变量、初始化数据库、设置root密码并调整my.cnf参数。目前已有291人学习下载适合希望从MySQL平滑迁移或搭建高可用数据库环境的中高级用户参考。1. 从 tar.gz 到能用的数据库mariadb-10.5.11-linux-x86_64.tar.gz 到底解决什么问题很多人第一次拿到mariadb-10.5.11-linux-x86_64.tar.gz这种包第一反应是「解压完不就能用了吗」结果./bin/mysql一敲报错error while loading shared libraries: libncurses.so.5或者Cant create/write to file /tmp/...直接卡住。这个包本质上是 MariaDB 官方提供的 Linux x86_64 通用二进制发行版它不依赖系统包管理器不写死安装路径适合在没网、没 root、系统自带版本太老、或者需要多版本共存的机器上快速拉起一个可用的关系型数据库。它解决的核心问题是「我不想动系统环境但我要一个能跑业务 SQL 的 MariaDB 10.5.11」。适合谁运维在客户内网机器上临时搭库、开发在容器里做集成测试、DBA 做版本回退验证以及那些被yum install mariadb-server装出来的 5.5 版本折磨过的人。这一章先把「它是什么、为什么选它、边界在哪」讲清楚后面再动手。2. 解压之前先想清楚目录布局与依赖检查2.1 为什么通用二进制包不能直接tar -zxvf完就用通用二进制包Generic Binary和 RPM/DEB 包最大的区别是它不帮你解决动态链接库依赖也不帮你创建mysql用户、不写/etc/my.cnf、不注册 systemd 服务。它只给你一堆编译好的可执行文件和 SQL 脚本。所以拿到mariadb-10.5.11-linux-x86_64.tar.gz之后第一件事不是解压而是确认目标机器的 glibc 版本和基础库是否满足。MariaDB 10.5 官方构建通常要求 glibc 2.17 以上CentOS 7 刚好卡线并且依赖libaio、libncurses、libtinfo这几个库。缺libaio会在初始化 InnoDB 时直接崩缺libncurses连客户端都起不来。常见做法是先跑一遍依赖检查# 查看 glibc 版本低于 2.17 基本可以放弃这个包 ldd --version | head -n 1 # 检查关键动态库是否存在缺哪个装哪个 ldconfig -p | grep -E libaio|libncurses|libtinfo # 确认 CPU 架构必须是 x86_64 uname -m逻辑说明ldd --version输出的是当前系统 glibc 版本MariaDB 10.5 的二进制是在较新的构建环境里编译的glibc 太老会出现GLIBC_2.xx not found。ldconfig -p列出所有已注册的动态库grep过滤出三个关键库。uname -m确认是x86_64如果是aarch64这个包直接不能用得换 ARM 版本。参数说明libaio是异步 IO 库InnoDB 的innodb_use_native_aio默认开启没有它启动就报错libncurses和libtinfo是mysql命令行客户端画表格用的缺了客户端直接退出。如果系统里只有libncurses.so.6而没有.so.5可以做个软链接临时顶一下但更稳妥的是装对应版本的 compat 包。2.2 解压路径怎么选别放在/tmp也别放在家目录解压路径决定了后续basedir和datadir的写法。我一般会选/usr/local/mariadb-10.5.11作为basedir然后单独用一个数据盘挂载点比如/data/mysql-data作为datadir。为什么不放/tmp因为很多系统/tmp是 tmpfs重启数据全丢而且tmpdir默认指向/tmp大查询排序时会把 tmpfs 撑爆。为什么不放家目录因为家目录权限通常是 700mysql用户根本进不去初始化阶段就会报Permission denied。# 创建 basedir 并解压注意 --strip-components1 去掉顶层目录 mkdir -p /usr/local/mariadb-10.5.11 tar -zxvf mariadb-10.5.11-linux-x86_64.tar.gz \ -C /usr/local/mariadb-10.5.11 \ --strip-components1 # 创建独立的数据目录和属主 mkdir -p /data/mysql-data groupadd -r mysql 2/dev/null || true useradd -r -g mysql -s /sbin/nologin mysql 2/dev/null || true chown -R mysql:mysql /data/mysql-data chown -R mysql:mysql /usr/local/mariadb-10.5.11逻辑说明--strip-components1是因为 tar 包解压出来通常带一层mariadb-10.5.11-linux-x86_64/目录去掉这层后basedir直接就是/usr/local/mariadb-10.5.11里面就是bin、lib、share、scripts。groupadd和useradd加了|| true是为了幂等重复执行不报错。chown必须做否则mysql_install_db写数据目录时权限不够。参数说明-C指定解压目标目录--strip-components1是 GNU tar 的参数BSD tar 上叫-s写法不同。-r创建系统用户-s /sbin/nologin禁止登录这是数据库服务账号的标准做法。3. 初始化数据目录mysql_install_db的四个关键参数3.1 用mysql_install_db还是mariadb-install-dbMariaDB 10.5 里mysql_install_db已经是一个指向mariadb-install-db的软链接两个命令等价。但要注意这个脚本在bin目录下不在scripts目录下老版本在scripts。初始化时最容易翻车的地方是--basedir和--datadir写错导致它去默认的/usr下面找文件报FATAL ERROR: Could not find ./bin/my_print_defaults。cd /usr/local/mariadb-10.5.11 # 初始化数据目录指定 basedir 和 datadir ./bin/mysql_install_db \ --basedir/usr/local/mariadb-10.5.11 \ --datadir/data/mysql-data \ --usermysql \ --auth-root-authentication-methodnormal # 初始化完成后确认关键文件是否生成 ls -l /data/mysql-data/ | grep -E mysql|ibdata1|ib_logfile逻辑说明--basedir告诉脚本去哪里找my_print_defaults、fill_help_tables.sql这些支撑文件--datadir告诉它把系统表、InnoDB 表空间写到哪里--usermysql让生成的文件属主直接是mysql省去再chown一遍--auth-root-authentication-methodnormal是 MariaDB 10.4 之后的新参数默认是unix_socket意味着 root 只能通过本地 socket 免密登录如果你后面想用密码从远程连初始化时就得改成normal否则改密码都进不去。参数说明--auth-root-authentication-method有两个值unix_socket和normal。unix_socket更安全但限制多normal就是传统的用户名密码方式。生产环境如果只允许本地运维用unix_socket没问题如果要用监控工具连、要跑自动化脚本建议normal并设强密码。初始化成功后/data/mysql-data下会出现mysql、performance_schema、sys三个目录以及ibdata1、ib_logfile0、ib_logfile1。如果只看到mysql目录而没有 InnoDB 文件说明 InnoDB 初始化失败往上翻日志找[ERROR]行。3.2 配置文件my.cnf的最小可用集合通用二进制包不会自动生成/etc/my.cnf你得自己写。最小可用配置只需要指定basedir、datadir、socket、port、pid-file、log-error这几项。但 10.5 版本有几个默认值需要留意innodb_buffer_pool_size默认 128M生产环境肯定不够character-set-server默认latin1建库不指定字符集就会踩中文乱码的坑。# /etc/my.cnf [mysqld] basedir /usr/local/mariadb-10.5.11 datadir /data/mysql-data socket /data/mysql-data/mysql.sock port 3306 pid-file /data/mysql-data/mysql.pid log-error /data/mysql-data/mysql-error.log user mysql # 字符集统一 utf8mb4避免 emoji 和生僻字翻车 character-set-server utf8mb4 collation-server utf8mb4_general_ci # InnoDB 基础参数按机器内存调整 innodb_buffer_pool_size 1G innodb_log_file_size 256M innodb_flush_log_at_trx_commit 2 # 连接数默认 151 对多数场景够用高并发再调 max_connections 500 [client] socket /data/mysql-data/mysql.sock default-character-set utf8mb4逻辑说明[mysqld]段是服务端配置[client]段是客户端配置两边socket必须一致否则mysql命令连不上。innodb_buffer_pool_size设成物理内存的 50%70% 是常见做法1G 只是示例。innodb_flush_log_at_trx_commit 2在性能和安全性之间取平衡每次事务提交写 OS cache每秒刷盘宕机可能丢 1 秒数据如果要求金融级不丢改成 1。参数说明character-set-server utf8mb4是 MariaDB 10.5 里真正支持四字节字符的字符集utf8在 MariaDB 里是utf8mb3的别名只支持三字节存 emoji 会报Incorrect string value。collation-server用utf8mb4_general_ci还是utf8mb4_unicode_ci看业务前者快一点后者排序更准。4. 启动与验证从mysqld_safe到 systemd 的取舍4.1 第一次启动用mysqld_safe看日志配置写好后不要急着注册 systemd先用mysqld_safe前台启动一次观察错误日志。mysqld_safe是一个包装脚本它会监控mysqld进程挂了自动拉起同时把启动信息写到log-error指定的文件里。# 用 mysqld_safe 启动 放后台然后立刻 tail 日志 /usr/local/mariadb-10.5.11/bin/mysqld_safe \ --defaults-file/etc/my.cnf # 等 3 秒看日志确认没有 ERROR sleep 3 tail -n 30 /data/mysql-data/mysql-error.log # 确认端口和进程 ss -lntp | grep 3306 ps -ef | grep mysqld | grep -v grep逻辑说明--defaults-file指定配置文件路径必须放在第一个参数位置否则不生效。sleep 3是给 InnoDB 恢复和系统表加载留时间。ss -lntp看 3306 是否监听ps确认进程存在。如果日志里出现[ERROR] InnoDB: Cannot allocate memory说明innodb_buffer_pool_size设太大超过可用内存如果出现[ERROR] Cant start server: Bind on TCP/IP port说明端口被占改port或杀掉占用进程。参数说明mysqld_safe的--defaults-file和mysqld的--defaults-file行为一致都是只读指定文件不读/etc/my.cnf默认路径。如果你把配置写在/etc/my.cnf可以省略这个参数但显式指定更不容易出错。4.2 设置 root 密码与远程访问边界初始化时用了--auth-root-authentication-methodnormalroot 初始密码为空。第一次登录后必须立刻设密码并且决定是否允许远程连接。生产环境我一般只允许本地 socket 登录远程通过跳板机或应用账号不给 root 远程权限。# 本地 socket 登录初始无密码 /usr/local/mariadb-10.5.11/bin/mysql -u root --socket/data/mysql-data/mysql.sock # 在 mysql 交互界面里执行 ALTER USER rootlocalhost IDENTIFIED BY YourStrongPassword123!; FLUSH PRIVILEGES; # 创建一个应用账号只允许从内网网段连 CREATE USER app_user192.168.1.% IDENTIFIED BY AppPassword456!; GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO app_user192.168.1.%; FLUSH PRIVILEGES;逻辑说明ALTER USER直接改 root 密码MariaDB 10.5 里SET PASSWORD也能用但ALTER USER是标准语法。FLUSH PRIVILEGES在改密码后不是必须的但改权限表后建议执行。CREATE USER的 host 部分用192.168.1.%限定网段比%安全。GRANT只给业务需要的 DML 权限不给DROP、CREATE防止应用误删表。参数说明--socket指定 socket 文件路径必须和my.cnf里[mysqld]段的socket一致。如果忘了 socket 路径可以cat /etc/my.cnf | grep socket找。密码强度方面MariaDB 10.5 默认安装了simple_password_check插件吗不一定通用二进制包默认没装所以弱密码也能设但生产环境必须自己上强度。5. 避坑与排查五个真实翻车现场5.1 坑一libncurses.so.5缺失导致客户端无法启动现象./bin/mysql执行后报error while loading shared libraries: libncurses.so.5: cannot open shared object file。原因MariaDB 10.5 的二进制客户端链接的是libncurses.so.5而较新的系统比如某些 CentOS 8 或 Ubuntu 20.04只带libncurses.so.6版本不兼容。解决先ldconfig -p | grep libncurses看有没有.so.6如果有做个软链接ln -s /usr/lib64/libncurses.so.6 /usr/lib64/libncurses.so.5再ldconfig。但更稳妥的是装ncurses-compat-libs包CentOS或libncurses5Debian/Ubuntu。如果系统完全没网就从同版本机器上拷贝.so.5文件到/usr/lib64再ldconfig。5.2 坑二mysql_install_db报FATAL ERROR: Could not find ./bin/my_print_defaults现象初始化时脚本找不到my_print_defaults即使basedir写对了。原因mysql_install_db内部会调用my_print_defaults来解析配置文件它默认去basedir/bin找。如果你解压时没加--strip-components1basedir下面多了一层目录脚本就找不到了。解决确认basedir下面直接就是bin、lib、share。如果是basedir/mariadb-10.5.11-linux-x86_64/bin要么重新解压加--strip-components1要么把basedir改成带那层目录的路径。另外--defaults-file如果指向了一个不存在的文件也会触发类似错误检查配置文件路径。5.3 坑三启动后mysql命令连不上报Cant connect to local MySQL server through socket现象mysqld_safe显示启动成功ps也有进程但mysql -u root报 socket 连接失败。原因[client]段的socket路径和[mysqld]段不一致或者mysql命令默认去/tmp/mysql.sock找而实际 socket 在/data/mysql-data/mysql.sock。解决mysql命令显式加--socket/data/mysql-data/mysql.sock或者在/etc/my.cnf的[client]段写对路径。如果还是不行ls -l /data/mysql-data/mysql.sock看文件是否存在不存在说明mysqld没真正启动成功回去看mysql-error.log。5.4 坑四innodb_buffer_pool_size设太大导致 OOM现象启动过程中mysqld进程被系统 kill日志里出现[ERROR] InnoDB: Cannot allocate memory for the buffer pool。原因innodb_buffer_pool_size设成了物理内存的 80% 以上加上系统其他进程占用触发 OOM Killer。解决先free -g看可用内存把innodb_buffer_pool_size降到物理内存的 50%60%。如果是容器环境还要看 cgroup 限制cat /sys/fs/cgroup/memory/memory.limit_in_bytes看容器实际可用内存按那个值来设。改完配置重启如果还不行检查ulimit -v是否限制了虚拟内存。5.5 坑五字符集不统一导致中文乱码现象建库时没指定字符集插入中文后SELECT出来是???或者报Incorrect string value: \xF0\x9F...。原因character-set-server默认latin1客户端连接时又用了utf8三字节存四字节 emoji 就报错。解决my.cnf里[mysqld]和[client]都设utf8mb4建库建表时显式DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_general_ci。已经建好的库用ALTER DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;改表用ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4;改。注意改之前备份大表转换会锁表。6. 进阶技巧把通用二进制包做成可迁移的 systemd 服务6.1 写一个不依赖mysqld_safe的 systemd unitmysqld_safe适合调试生产环境用 systemd 管理更干净。unit 文件里直接调mysqld不用包装脚本日志走 journald 或log-error都行。# /etc/systemd/system/mariadb-10.5.11.service [Unit] DescriptionMariaDB 10.5.11 Generic Binary Afternetwork.target [Service] Typesimple Usermysql Groupmysql ExecStart/usr/local/mariadb-10.5.11/bin/mysqld --defaults-file/etc/my.cnf ExecStop/usr/local/mariadb-10.5.11/bin/mysqladmin --defaults-file/etc/my.cnf -u root -pYourStrongPassword123! shutdown Restarton-failure RestartSec5 LimitNOFILE65535 [Install] WantedBymulti-user.target逻辑说明Typesimple表示mysqld前台运行systemd 直接跟踪主进程。ExecStop用mysqladmin shutdown优雅关闭比kill安全。Restarton-failure让进程异常退出后自动拉起RestartSec5等 5 秒再拉避免频繁重启。LimitNOFILE65535提高文件描述符上限MariaDB 在高连接数下需要。参数说明--defaults-file必须放在mysqld后面mysqladmin的-p和密码之间不能有空格写成-ppassword。如果密码里有特殊字符用单引号包起来。LimitNOFILE也可以写成LimitNOFILEinfinity但 65535 对多数场景够用。6.2 用mysqladmin做存活检测与快速状态查看systemd 只管进程在不在不管数据库能不能响应 SQL。我习惯在监控脚本里用mysqladmin ping和mysqladmin status做两级检测。# 存活检测返回 mysqld is alive 表示正常 /usr/local/mariadb-10.5.11/bin/mysqladmin \ --defaults-file/etc/my.cnf \ -u root -pYourStrongPassword123! ping # 状态查看关注 Threads、Questions、Slow queries /usr/local/mariadb-10.5.11/bin/mysqladmin \ --defaults-file/etc/my.cnf \ -u root -pYourStrongPassword123! status # 查看当前连接数和最大连接数 /usr/local/mariadb-10.5.11/bin/mysql \ --defaults-file/etc/my.cnf \ -u root -pYourStrongPassword123! \ -e SHOW STATUS LIKE Threads_connected; SHOW VARIABLES LIKE max_connections;逻辑说明mysqladmin ping只检查 server 是否响应不执行 SQL开销极低适合秒级监控。mysqladmin status输出Uptime、Threads、Questions、Slow queries、Opens、Flush tables、Open tables其中Threads是当前连接数Slow queries是慢查询累计数。SHOW STATUS和SHOW VARIABLES对比可以算出连接使用率超过 80% 就该调max_connections或查连接泄漏。参数说明--defaults-file让mysqladmin读[client]段的 socket 和字符集配置。-e后面跟 SQL多个 SQL 用分号隔开适合写进 shell 脚本做定时采集。密码明文写在命令行有安全风险生产环境可以用mysql_config_editor生成加密登录路径或者用--defaults-extra-file指定一个权限 600 的临时文件。6.3 迁移与版本回退为什么我保留这个 tar.gz 包通用二进制包最大的好处是可迁移。把/usr/local/mariadb-10.5.11整个目录rsync到另一台同架构机器改一下my.cnf里的datadir路径重新初始化或直接挂载原数据目录就能拉起一个同版本实例。版本回退时也一样把旧版本的 tar.gz 解压到新目录停掉新版本服务用旧版本二进制指向原数据目录启动只要数据文件格式兼容10.5 和 10.6 之间通常兼容跨大版本要跑mysql_upgrade就能快速回退。我一般会在/opt/backup/下保留最近三个版本的 tar.gz 包每个包不到 500MB占不了多少空间但关键时刻能省几小时。注意直接挂载原数据目录启动前务必确认目标版本的 InnoDB 日志文件格式兼容不兼容时mysqld会拒绝启动并在日志里提示需要innodb_force_recovery不要盲目设这个参数先备份数据目录。希望帮到你。本文还有配套的精品资源点击获取