简介:本资源为MariaDB 10.5.11在Linux x86_64平台上的完整安装包,面向需要在Linux服务器上部署开源关系型数据库的运维人员、后端开发者及数据库学习者。MariaDB由MySQL创始人Michael Widenius主导开发,保持开源与MySQL高度兼容,适合企业级高并发与复杂查询场景。压缩包为gz格式,大小约347.07MB,上游未提供文件总数与类型明细,解压后即可获得该版本的完整安装文件。该版本在InnoDB并发性能、GTID复制管理、线程池、ColumnStore列式存储、虚拟列、半同步与多源复制、安全加密及审计日志等方面均有改进,并支持全文搜索、GIS、JSON等可插拔组件。目前已有291人浏览学习,读者可据此完成环境变量配置、数据库初始化、root密码设置与服务启动,并结合my.cnf调优内存、连接与日志参数,快速搭建稳定可用的数据库环境。
1. 从 tar.gz 到能跑的业务库:这份 MariaDB 10.5.11 二进制包到底怎么落地
很多人第一次拿到mariadb-10.5.11-linux-x86_64.tar.gz这种二进制包,第一反应是解压、./bin/mysql一把梭,结果要么报libaio.so.1找不到,要么mysql_install_db跑完不知道数据目录在哪,最后默默回去apt install mariadb-server。这份资源解决的就是这个尴尬:它是一份免编译、免包管理器的 Linux x86_64 通用二进制发行包,解压即用,不依赖发行版的软件源,适合内网离线部署、需要锁定 10.5.11 这个具体小版本、或者想在同一台机器上并行跑多个实例的场景。它不适合只想快速装个数据库写两行 SQL 的人——那种情况包管理器更省事。这篇笔记按「解压 → 初始化 → 配置 → 启动 → 排错」的顺序拆一遍,参数怎么改、坑在哪,都落到具体命令上。
2. 解压与目录规划:别把数据目录塞进安装目录
2.1 为什么二进制包要拆成 basedir 和 datadir
包管理器安装时,二进制、配置、数据默认分散在/usr/bin、/etc/mysql、/var/lib/mysql,升级和备份边界很清楚。二进制包解压出来是一个自包含的目录树,如果你把数据也放在里面,下次想换版本、想重新解压一份新的,数据目录就会跟着被覆盖或误删。所以第一件事是把「程序目录」和「数据目录」物理分开。
常见做法是程序放/usr/local/mariadb,数据放/data/mariadb/data,配置放/etc/my.cnf或独立目录。这样升级时只替换程序目录,数据原地不动。
# 建程序目录和数据目录,两者分开 mkdir -p /usr/local/mariadb mkdir -p /data/mariadb/data mkdir -p /data/mariadb/log # 解压,注意 --strip-components=1 去掉顶层目录名 tar -xzf mariadb-10.5.11-linux-x86_64.tar.gz \ -C /usr/local/mariadb \ --strip-components=1 # 确认关键二进制存在 ls /usr/local/mariadb/bin/ | grep -E 'mysqld|mysql_install_db|mariadbd'--strip-components=1是因为 tar 包顶层通常有一层mariadb-10.5.11-linux-x86_64/目录,去掉它才能让bin/、lib/直接落在/usr/local/mariadb下。如果你不解这一层,后面所有路径都要多写一级,配置里容易写错。
2.2 依赖检查:libaio 和 ncurses 是高频翻车点
二进制包虽然免编译,但不是完全零依赖。10.5 系列的mysqld在 Linux 上通常依赖libaio(异步 IO)和libncurses(客户端交互),部分精简镜像里这两个库是缺的。
# 检查动态库依赖是否齐全 ldd /usr/local/mariadb/bin/mysqld | grep 'not found' # 常见缺失:libaio.so.1 # Debian/Ubuntu 系 apt-get install -y libaio1 libncurses5 # RHEL/CentOS 系 yum install -y libaio ncurses-libsldd输出里出现not found就是缺库,别急着往下走。这里有个血泪经验:有些环境libaio.so.1装上了但mysqld还是起不来,多半是libnuma或libcrypt版本对不上,继续用ldd逐个确认,不要凭感觉猜。
2.3 建专用系统用户,别用 root 跑 mysqld
mysqld以 root 身份运行会带来权限过大和后续--user参数冲突的问题。标准做法是建一个不可登录的系统用户专门跑数据库。
# 建系统用户,禁止登录 shell groupadd -r mysql useradd -r -g mysql -s /sbin/nologin mysql # 把数据目录和程序目录的属主交给它 chown -R mysql:mysql /data/mariadb chown -R mysql:mysql /usr/local/mariadb-r表示系统用户,-s /sbin/nologin禁止交互登录。数据目录属主必须是这个用户,否则初始化时会报Can't create/write to file。程序目录的属主其实读权限够就行,但统一交给 mysql 用户能避免后续日志写入的权限问题。
3. 初始化数据目录:mysql_install_db 的参数怎么设
3.1 初始化命令与关键参数
10.5 系列初始化用mysql_install_db(底层调用mariadbd --bootstrap),它会创建mysql、performance_schema等系统库和ibdata1等表空间文件。
cd /usr/local/mariadb # 初始化,指定 basedir 和 datadir ./scripts/mysql_install_db \ --basedir=/usr/local/mariadb \ --datadir=/data/mariadb/data \ --user=mysql \ --auth-root-authentication-method=normal--basedir告诉脚本程序文件在哪,--datadir指定数据落地位置,--user让文件属主正确。--auth-root-authentication-method=normal这个参数值得单独说:10.5 默认 root 走unix_socket认证,本地用 root 系统用户直接mysql就能进,但如果你要用密码从别的机器连,或者用应用账号连,就得设成normal走密码认证。内网部署我一般直接设normal,省得后面改认证插件。
3.2 初始化后该检查什么
初始化不是跑完就完事,要确认几个关键文件真的生成了。
# 看数据目录内容 ls -lh /data/mariadb/data/ # 关键文件:ibdata1(共享表空间)、ib_logfile0/1(redo log)、 # mysql/ 目录(系统库)、aria_log_control(Aria 引擎控制文件)如果ibdata1没生成或者大小为 0,说明初始化中途失败了,往上翻日志找ERROR。常见原因是数据目录非空——mysql_install_db要求目标目录为空,如果你之前解压时手滑把东西放进去过,先清空再重来。另一个坑是--datadir路径里有软链接,初始化能过但启动时路径解析不一致,建议用绝对物理路径。
3.3 表空间与字符集的前置决策
初始化时有两个决策后面很难改:innodb_file_per_table和默认字符集。10.5 默认innodb_file_per_table=ON,每张表独立.ibd文件,备份和回收空间方便,建议保持。字符集方面,10.5 默认latin1,如果业务有中文,初始化后要立刻在配置里设utf8mb4,否则建库建表时忘了指定就会踩乱码的坑。
# 初始化完成后,先别启动,把配置写好再启 # 字符集在 my.cnf 里设,见下一章4. my.cnf 配置与启动:参数写错比不写更危险
4.1 一份能直接用的最小配置
配置文件我一般放/etc/my.cnf,用[mysqld]、[client]分段。下面这份是能直接抄的最小可用版本。
[mysqld] basedir = /usr/local/mariadb datadir = /data/mariadb/data port = 3306 socket = /tmp/mariadb.sock pid-file = /data/mariadb/mariadb.pid log-error = /data/mariadb/log/error.log # 字符集,业务有中文必须设 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 # 连接数 max_connections = 500 [client] socket = /tmp/mariadb.sock default-character-set = utf8mb4innodb_buffer_pool_size是最重要的性能参数,一般设物理内存的 50%~70%,但别超过实际可用内存,否则会触发 swap 反而更慢。innodb_flush_log_at_trx_commit=2是性能与安全的折中:每次事务提交写 OS 缓存,每秒刷盘,机器断电可能丢 1 秒数据,但比默认的1(每次提交都刷盘)快很多。金融级场景别改这个值。
4.2 启动、验证与关闭
# 后台启动,指定配置文件 /usr/local/mariadb/bin/mysqld_safe \ --defaults-file=/etc/my.cnf & # 或者用 mysqld 直接起(不推荐,少了自动重启) # /usr/local/mariadb/bin/mysqld --defaults-file=/etc/my.cnf --user=mysql & # 验证进程和端口 ps -ef | grep mysqld ss -lntp | grep 3306 # 用客户端连一下 /usr/local/mariadb/bin/mysql -S /tmp/mariadb.sock -u rootmysqld_safe是个包装脚本,崩了会自动拉起,生产环境常用。验证时先看进程在不在,再看端口监听没有,最后用 socket 连进去执行SELECT VERSION();确认版本是10.5.11-MariaDB。三步都过才算启动成功。
4.3 用 systemd 托管,别裸跑
裸跑mysqld_safe &在会话断开后可能被挂断,正规做法是写 systemd unit。
# /etc/systemd/system/mariadb.service [Unit] Description=MariaDB 10.5.11 After=network.target [Service] Type=simple User=mysql Group=mysql ExecStart=/usr/local/mariadb/bin/mysqld_safe --defaults-file=/etc/my.cnf ExecStop=/usr/local/mariadb/bin/mysqladmin -S /tmp/mariadb.sock shutdown Restart=on-failure LimitNOFILE=65535 [Install] WantedBy=multi-user.targetLimitNOFILE=65535很关键,默认文件描述符上限可能只有 1024,连接数一上来就报Too many open files。Restart=on-failure让进程异常退出时自动重启。写完systemctl daemon-reload && systemctl start mariadb即可。
5. 避坑与排查:这几类报错我踩过不止一次
5.1 启动报Can't open the mysql.plugin table
现象:mysqld启动失败,error.log 里写Can't open the mysql.plugin table. Please run mysql_upgrade。 原因:数据目录是用旧版本初始化的,或者初始化没跑完就启动了,系统表结构不匹配。 解决:确认mysql/目录下plugin.frm等文件存在;如果是跨版本,跑/usr/local/mariadb/bin/mysql_upgrade -S /tmp/mariadb.sock;实在不行清空数据目录重新mysql_install_db。
5.2 客户端连不上,报Can't connect to local MySQL server through socket
现象:mysql -u root -p报 socket 路径找不到。 原因:客户端默认找/tmp/mysql.sock或/var/lib/mysql/mysql.sock,而你的my.cnf里 socket 设的是/tmp/mariadb.sock,两边不一致。 解决:要么在[client]段也写socket=/tmp/mariadb.sock,要么连接时显式-S /tmp/mariadb.sock。我一般两边都写,省得记。
5.3 中文乱码,存进去变问号
现象:插入中文,查出来是???或者乱码。 原因:服务端字符集是latin1,或者建库建表时没指定utf8mb4。 解决:先SHOW VARIABLES LIKE 'character%';确认服务端是不是utf8mb4;不是就改my.cnf重启。已经建好的库表用ALTER DATABASE ... CHARACTER SET utf8mb4;和ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4;补救,但已有乱码数据救不回来,只能重导。
5.4mysqld_safe启动后进程秒退,日志无明显报错
现象:执行mysqld_safe &后ps看不到进程,error.log 只有几行就断了。 原因:多半是innodb_buffer_pool_size设得比物理内存还大,或者innodb_log_file_size改了但旧的 redo log 文件大小不匹配。 解决:先把 buffer pool 调小到 128M 试启动;如果改过innodb_log_file_size,要停库后删掉旧的ib_logfile0/1再启(注意:删之前确认没有未刷盘数据,生产环境谨慎)。
5.5 端口被占用,报Bind on TCP/IP port: Address already in use
现象:启动失败,日志提示端口占用。 原因:机器上已有 MySQL/MariaDB 实例在跑,或者上次没关干净。 解决:ss -lntp | grep 3306找到占用进程,要么停掉它,要么在my.cnf里把port改成 3307 等空闲端口,同时socket和pid-file也要跟着改,避免多实例互相干扰。
6. 多实例并行与版本锁定:二进制包真正的价值场景
二进制包最实用的地方,是能在一台机器上并行跑多个版本、多个实例,互不干扰。做法是每个实例一套独立的 basedir、datadir、my.cnf、socket、port。比如再解压一份到/usr/local/mariadb-10.5.11-b,数据放/data/mariadb-b/data,配置里 port 设 3307、socket 设/tmp/mariadb-b.sock,初始化时--datadir指向新目录,启动时--defaults-file指向新配置。这样两个实例完全隔离,升级或测试新版本时不影响线上那个。
验证多实例是否真的隔离,看三个东西:ps -ef | grep mysqld应该有两个进程,各自的--defaults-file不同;ss -lntp应该看到 3306 和 3307 都在监听;分别用各自的 socket 连进去SELECT @@datadir, @@port;,确认返回的路径和端口对得上。三个都对,才算隔离成功。
版本锁定这块,二进制包的优势是「所见即所得」:你解压的是 10.5.11,跑起来就是 10.5.11,不会因为系统源更新被悄悄升到 10.5.12。对于需要严格复现某个 bug 或做兼容性测试的场景,这点比包管理器可靠。我一般会在程序目录里留一个VERSION文本文件,记录解压日期和来源,半年后回头看还能对上号。
从那以后我每次拿到二进制包,都强制先跑一遍ldd查依赖、再确认数据目录为空、最后才初始化,这三步走完基本不会再翻车。希望帮到你。
本文还有配套的精品资源,点击获取