☰
Linux下MariaDB 10.4.21离线安装全指南:从环境准备到踩坑修复
2026/10/21 7:22:15 网站建设 项目流程

咱们直接进入正题。做运维和数据库这块的朋友,十有八九都遇到过这种场景:生产环境是内网隔离的,没有外网权限,或者外网下载速度慢到让人崩溃,但项目上线总不能卡在装数据库这一步。我自己就经历过好几次,客户那边安全审计要求所有软件必须来源可控,不能随便从网上下载最新版,这时候离线安装包就成了唯一的出路。今天这篇就专门讲怎么在Linux系统上离线安装MariaDB 10.4.21,从环境准备到踩坑修复,全程手把手,保证你能照着做下来。

我选MariaDB 10.4.21这个版本,是因为它属于长期支持版本,在稳定性、性能和主流应用兼容性之间平衡得很好,不像10.5、10.6那些新版本在某些老内核上有莫名其妙的兼容问题,也不像10.1、10.2那样已经过了官方维护期。如果你是给某个遗留系统搭数据库,或者客户明确指定了版本,这个版本号大概率不会错。

先说下本文适合谁:第一次在隔离环境部署数据库的Linux新手,被离线依赖折磨得头疼的运维,以及需要在测试环境快速复现生产数据库版本的朋友。文章里的所有操作我都在CentOS 7系和Ubuntu 18.04系上实测过,命令稍作调整也能用在其他发行版上。

1. 为什么必须用离线方式安装MariaDB 10.4.21

离线安装不是矫情,是真有硬性需求。最常见的场景首先是内网机器,比如银行、医院的业务系统,或者军工、能源单位的机房,这些地方的服务器物理上就不连外网,你想用yum或者apt在线装包门儿都没有。其次是版本控制,在线安装拉下来的是发行版源里的最新版本,今天装跟下周装得到的版本号可能都不一样,对于要出验收报告的项目来说,版本漂移是致命的。离线安装把一切都锁死在特定版本上,出问题也好回溯。

还有个很多人忽略的点,就是依赖包的干净程度。在线安装时常会附带一堆你根本用不上的依赖,比如装MariaDB顺手给你拉了个Perl模块更新,哪天排查故障时就会发现系统里多了好多不明不白的包。离线安装我只需要把明确的几个依赖带上,装完之后系统环境几乎不会被污染,这对后续维护和等保测评都很重要。

在动手之前,我强烈建议你先确认一下操作系统的版本和架构。Linux跑MariaDB最常见的就是x86_64架构,但也有遇到ARM架构的情况,比如某些国产化服务器。下载安装包的时候必须选对版本,否则后面做初始化一定会报错,报错信息看起来莫名其妙,其实就是架构不匹配。另外,glibc版本也得看一眼,MariaDB 10.4.21对glibc有要求,太老的内核加老glibc会直接导致二进制无法运行。

2. 离线安装前的准备工作:把家底摸清楚

离线安装的核心思路就是一句话:把需要的东西都提前下载好,然后拎到目标机器上去装。所以准备阶段做得越充分,后面越省事。我习惯给自己列一个清单,每做一步划掉一步,避免到了现场手忙脚乱。

2.1 确认操作系统版本与架构

先执行下面两条命令,把结果记下来:

cat /etc/os-release uname -m

第一条会输出操作系统的名称和版本号,比如"CentOS Linux release 7.9.2009"或者"Ubuntu 18.04.6 LTS"。第二条输出的是机器架构,x86_64是主流,aarch64就是ARM的。这两个信息直接决定了你接下来该下载哪个包。我见过有人拿着x86_64的包去装ARM机器,执行初始化时直接提示"Exec format error",白折腾半小时才反应过来。

如果你是给某国产化操作系统(比如基于CentOS的发行版)做离线安装,最好把os-release里的ID字段也看一下,有些系统在红帽系和Debian系的命令差异上会踩坑。比如有的系统虽然长得像CentOS,但包管理器却不是yum,这时候你就得灵活处理,本文后面会讲到怎么绕开包管理器直接解压安装。

2.2 准备安装源:从rpm包到tar包的选择

MariaDB官方提供了两种离线安装的途径,一种是rpm包集合,一种是tar.gz二进制包。我的建议是:能用rpm包就用rpm包,因为包管理器会帮你处理服务注册、配置文件位置、启动脚本这些杂事,省心很多。tar包的好处是不区分发行版,只要glibc版本对就能跑,适合那种连rpm都装不上的极端情况。

以CentOS 7为例,你需要准备的文件有这些:

  • MariaDB-server-10.4.21-xxx.el7.x86_64.rpm
  • MariaDB-client-10.4.21-xxx.el7.x86_64.rpm
  • MariaDB-common-10.4.21-xxx.el7.x86_64.rpm
  • MariaDB-compat-10.4.21-xxx.el7.x86_64.rpm
  • MariaDB-shared-10.4.21-xxx.el7.x86_64.rpm

除了这些,还有一类特别容易遗漏的:依赖包。MariaDB-server依赖的常见包包括libaio、ncurses-libs、jemalloc(有时候需要)、openssl等。如果你之前没有在干净系统上跑过一次在线安装,根本不会知道自己缺哪个依赖。我的经验是:到官网下载页面把"Download RPM Packages"里的文件都拿下来,再额外准备libaio这个包,90%的情况就够了。

下载依赖包有个骚操作:找一台能上外网的相同系统虚拟机,先执行yum install mariadb-server,让它自动把依赖装好,然后用rpm -qa | grep mariadb和rpm -qa | grep -E 'libaio|ncurses'把关联包的名字记下来,再到公网源里把对应rpm手动下载。这样得到的一批rpm就是最准确的依赖清单。

2.3 准备离线环境:关闭防火墙与SELinux

这一步很多人会忘,但忘了就会让你怀疑人生。新装的Linux系统默认开着firewalld(CentOS 7)或者ufw(Ubuntu),如果你只是本机测试,专出来3306端口才能用;如果后续要对外提供数据库服务,防火墙策略不对直接连接失败。更隐蔽的是SELinux,它可能会拦截mysqld进程的某些文件读写权限,表现就是服务怎么都起不来,但日志里只有模糊的"Permission denied"。

我在离线安装手册里都会先写上这两条:

systemctl stop firewalld systemctl disable firewalld # 如果不想彻底关,至少放行3306 firewall-cmd --permanent --add-port=3306/tcp firewall-cmd --reload

SELinux的处理不推荐直接关掉,更稳妥的方式是放行数据库端口:

setsebool -P httpd_can_network_connect_db 1 # 如果你有web服务连库 semanage port -a -t mysqld_port_t -p tcp 3306

当然,离线环境里semanage可能没装,那你就临时用setenforce 0放一下,等部署完再认真配置策略。

3. 核心安装全流程:从rpm到数据目录初始化

准备功夫做足之后,真正的安装其实很快。我在脚本化部署的时候,从装rpm包到数据库能连上,全程不超过五分钟。但前提是你理解了每一步在干什么,而不是无脑照抄命令。

3.1 安装rpm包的顺序与依赖校验

先把你准备好的所有rpm包放到同一个目录,比如/home/soft/mariadb/,然后执行:

cd /home/soft/mariadb/ rpm -ivh *.rpm

正常情况下,rpm会自动解析依赖并安装。但离线环境下最恼火的就是它报"依赖缺失"。此时不要慌,看报错里缺失的是什么库,比如libaio.so.1,说明需要libaio包。你就再从你的依赖包目录里把对应的rpm找出来装上。

我习惯用本地目录作为yum源来解决依赖问题,这样多次安装更方便。做法是把rpm包全放在同一个目录,写一个repo文件:

cat > /etc/yum.repos.d/local.repo <<EOF [local] name=local repo baseurl=file:///home/soft/mariadb/ enabled=1 gpgcheck=0 EOF

然后yum clean all && yum install MariaDB-server,yum会自动从本地源里找依赖,省去手动逐个rpm的麻烦。这个方法在红帽系系统上效果极好,Debian系可以照着用dpkg和apt-file的思路做本地源。

3.2 初始化数据目录并启动服务

装完rpm包,默认数据目录是/var/lib/mysql,配置文件在/etc/my.cnf.d/。但是生产环境里数据目录通常要放到单独的数据盘,比如/data/mysql,这时候就要在启动前先改配置,否则后期迁移数据非常痛苦。

先把数据目录创建好并设置属主属组:

mkdir -p /data/mysql chown -R mysql:mysql /data/mysql chmod 750 /data/mysql

然后编辑/etc/my.cnf.d/server.cnf,在[mysqld]段下加一行:

datadir=/data/mysql socket=/var/lib/mysql/mysql.sock

注意socket路径最好保留默认,很多客户端工具默认找/var/lib/mysql/mysql.sock,改了你连的时候还得指定。

接下来初始化数据库。MariaDB 10.4的初始化命令跟MySQL 5.7不一样,不需要mysqld --initialize,直接:

mysql_install_db --user=mysql --datadir=/data/mysql --basedir=/usr

这里--basedir要看你rpm装到哪了,CentOS下一般是/usr。执行完看到"Two all-privilege accounts were created"就是成功了。

然后启动服务:

systemctl start mariadb systemctl enable mariadb systemctl status mariadb

如果状态里有"Active: active (running)",恭喜你,基础安装已经完成。

3.3 使用tar.gz包时的特殊处理

有些系统没有rpm,或者你确实就想用二进制包跑,那就得换一套玩法。tar包解压后目录里有一个bin/mysqld和bin/mysql_install_db,直接用绝对路径来初始化和启动。

比如我把安装包解压到/opt/mariadb-10.4.21-linux-x86_64,然后把数据目录软链到/opt/data:

mkdir -p /opt/data /opt/mariadb-10.4.21-linux-x86_64/scripts/mysql_install_db --user=mysql --basedir=/opt/mariadb-10.4.21-linux-x86_64 --datadir=/opt/data

启动就直接跑:

/opt/mariadb-10.4.21-linux-x86_64/bin/mysqld_safe --user=mysql --datadir=/opt/data &

这种方式的坑在于开机自启和管理脚本都得自己写,比较折腾。但好处是彻底绕开了系统包管理器的版本限制,想换版本直接把目录一换、软链一改就行,对于需要频繁测试不同版本的人来说相当灵活。

4. 安装后的安全设置与常见错误排查

装完能跑只是第一步,离生产可用还差得远。默认安装完,MariaDB的root账号密码是空的,任何人都能本机登录并做任何操作,这在生产环境绝对不行。另外还有一批常见的初始化报错,几乎每个新手都会遇到,我把它们列出来,对应解法也给你。

4.1 初始化安全设置

执行MariaDB自带的自动安全脚本,它会引导你设置root密码、删除匿名账号、禁用root远程登录、删除测试数据库:

mysql_secure_installation

根据自己的需求选择Y或N。我一般是全选Y,生产环境严格一点没坏处。执行完用密码登录测试一下:

mysql -uroot -p

看到MariaDB的提示符就说明安全设置生效了。

这里有个小技巧:很多自动化脚本里没办法交互式执行这个工具,那你就直接用SQL来完成同样的事:

ALTER USER 'root'@'localhost' IDENTIFIED BY '强密码'; DELETE FROM mysql.user WHERE User=''; DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1'); DROP DATABASE IF EXISTS test; FLUSH PRIVILEGES;

两种方式任选一个,效果一致。

4.2 经典错误:mysql_install_db失败

这是我见过最多的报错,形态各异,但根因就那么几个。一种是缺共享库,比如error while loading shared libraries: libaio.so.1,直接装libaio即可。另一种是权限问题,提示"Can't create/write to file",基本就是datadir的属主不对,或者SELinux在作怪。还有一种是mysqld进程残留导致的,比如你之前启动过但没关干净,初始化时端口被占用,杀掉所有mysqld进程再重来。

排查这类问题我推荐三步走:先tail -f /var/log/mariadb/mariadb.log看日志,再ps aux | grep mysqld确认进程状态,最后ls -ld确认目录权限。日志里写的错误信息比任何经验都准确,别瞎猜。

4.3 网络连接问题:远程连不上数据库

初始化完成之后,你从别的机器用客户端工具连这个数据库,很可能报Can't connect to MySQL server on 'xxx' (10061)。排除防火墙问题后,极大概率是root账号的host限制问题。默认root只允许localhost登录,你要远程管理就得另建一个账号:

CREATE USER 'app_user'@'%' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON *.* TO 'app_user'@'%'; FLUSH PRIVILEGES;

这里%代表所有ip,生产环境建议指定网段,比如'192.168.1.%',降低风险因素。

还有一个隐蔽问题:如果配置或系统里开了skip-networking,或者bind-address设置成了127.0.0.1,外网根本连不进来。查看my.cnf里有没有这两行,bind-address一定要改成0.0.0.0或者你的业务网卡ip。

4.4 字符集和环境变量问题

用root连进去执行status,发现字符集是latin1,这是MariaDB默认行为。中文项目必须改utf8mb4,否则存中文会乱码或者报错。修改配置文件:

[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_general_ci [client] default-character-set=utf8mb4

重启mariadb后检查一下,确认Variable_name为character_set_server的值是utf8mb4。这个步骤看似简单,但漏掉的人非常多,很多人开发环境没问题,一到生产就乱码,基本都是没配这个。

5. 离线仓库的本地方案:让依赖管理不再靠猜

前面说了rpm逐个装的笨办法,其实如果每次都带一大批rpm、靠manual判断缺什么,效率太低了。我强烈建议在离线环境里搭建一个本地YUM源或者DPKG源,把MariaDB相关的所有rpm包、依赖包全部扔进去,后续不管是装mysql、php、nginx还是什么别的,依赖问题都统一解决。

5.1 如何构建一个简易本地rpm仓库

在你准备安装包的那台联网机器上,把所有相关rpm包收集到一个目录,比如/opt/repo/Packages,然后用createrepo命令生成元数据:

yum install createrepo cd /opt/repo createrepo .

这样/opt/repo就成了一个本地源。传到内网机器上,写repo文件指向它就行。离线部署的时候,直接yum install mariadb-server,yum会在本地源里自己找依赖,找到就装,找不到就提示缺什么,比手动rpm -ivh一个个试要快得多。

这个方法在装多个服务器的时候优势特别明显,我试过同时部署十台机器,把repo目录挂成NFS共享,每台机器设置指向NFS的本地repo,批量装完MariaDB,全程无人工干预。

5.2 构建本地仓库时的注意事项

  • createrepo工具本身要提前准备好,因为内网机器装不了它。
  • 源里不要只放MariaDB的包,一些基础依赖比如libaio、jemalloc、openssl-devel也放进去,免得装到一半卡壳。
  • 如果目标系统是Ubuntu/Debian,思路类似,用dpkg-scanpackages生成Packages.gz文件,再写apt源。

这种方式还有一个额外的好处:你可以同时维护多个版本的MariaDB在同一个源里,通过enabled开关决定用哪个。做环境兼容性测试时,我经常同一批机器上滚着切换10.3、10.4、10.5,非常方便。

6. 配置示例与性能参数适配

安装搞定之后,紧接着就是参数调优。每个业务场景不同,配置差异很大,但有几个基础参数是必须核对一遍的。以下是我在多个生产环境里总结的MariaDB 10.4版本的基础配置参考,你直接抄来改改数值就能用。

[mysqld] datadir=/data/mysql socket=/var/lib/mysql/mysql.sock log_error=/var/log/mariadb/mariadb.log # 基础存储引擎配置 default_storage_engine=InnoDB innodb_buffer_pool_size=2G innodb_log_file_size=256M innodb_flush_log_at_trx_commit=1 # 连接与并发 max_connections=500 max_connect_errors=1000 thread_cache_size=64 # 排序与临时表 sort_buffer_size=2M join_buffer_size=2M tmp_table_size=64M max_heap_table_size=64M # 慢查询 slow_query_log=1 slow_query_log_file=/var/log/mariadb/slow.log long_query_time=2 # 二进制日志 server-id=1 log_bin=/var/lib/mysql/mysql-bin binlog_format=row expire_logs_days=7 [mysqld_safe] malloc-lib=/usr/lib64/libjemalloc.so.1

这里的核心是innodb_buffer_pool_size,一般建议设置为机器物理内存的50%到70%,比如32G内存的机器,给16G甚至20G的buffer pool都不为过。因为InnoDB数据基本都存在buffer pool里,热数读取全靠它。但如果你机器上还跑着其他应用,比如web服务,那就别贪多,分配太多反而内存不足触发swap,性能急剧下降。

innodb_flush_log_at_trx_commit这个参数,等于1是每次事务提交都刷盘,最安全但性能最差;等于2是每秒刷一次,性能好一些,但崩溃可能丢秒级数据。如果是核心交易系统建议是1,日志分析类的项目可以设成2。

还有一个很容易被忽略的:skip-name-resolve。如果不加这个参数,MariaDB对每个连接都会做反向DNS解析,内网环境DNS一卡,所有新连接全部超时。加上后直接用ip连接不解析域名,对性能提升立竿见影。

7. 我踩过的几个坑和最后的经验提醒

离线安装这东西,说起来简单,但实际操作中总有不按套路出牌的时候。我把这些年自己踩过、也看别人踩过的坑集中在这里,算是给后来者省点时间。

第一个坑就是镜像站下载的rpm包不完整。有时候厂家官网的某一层目录结构会改,你只下载了server包,下载漏了client或shared包,装的时候报一个莫名其妙的依赖错误,又不提示具体缺哪个包。我的建议是下载完之后,在联网机器上先试着装一遍,确认无报错再拷贝到内网。

第二个坑是不同发行版的glibc兼容性。MariaDB二进制包在编译时链接了特定版本的glibc,你把它搬到太老的系统上,比如CentOS 6,可能直接无法执行。排查方法是ldd /usr/libexec/mysqld | grep 'not found',看到找不到的库就说明glibc或者某些lib版本不匹配。遇到这种情况,要么找专门的老系统兼容版本,要么直接在目标系统上编译源码。

第三个坑是客户端工具版本和库版本不一致。比如你用了MySQL 8.0的客户端去连MariaDB 10.4,某些工具在输密码时会闪退或者报认证插件不支持。解决办法很简单,客户端最好也用linux下对应版本的MariaDB client,或者用Navicat旧一点的版本。

最后分享一个实用习惯:每次离线部署完数据库,我都会顺手导出一份完整的部署记录,包括系统版本、内核参数、rpm包列表、配置文件diff、初始化命令等。放到/root/deploy_history目录里,文件名带日期。别小看这个动作,时隔半年你回来排查问题,或者客户要求你提供变更记录,这份清单会让你瞬间恢复记忆。

我这边实践下来,只要前期把系统和依赖梳理清楚,整个离线安装过程其实非常顺滑。如果你在部署中卡在某个具体报错上,欢迎带着错误日志来沟通,我们互相探讨。毕竟现在的生产环境,数据库是核心中的核心,每一步操作都谨慎些不过分。

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

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

立即咨询