news 2026/6/23 17:56:56

Ubuntu 18.04 部署 MariaDB 10.3 生产实践指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Ubuntu 18.04 部署 MariaDB 10.3 生产实践指南

1. 项目概述:在 Ubuntu 18.04 上部署 MariaDB 的真实场景与核心价值

“Installieren von MariaDB unter Ubuntu 18.04”——这句德语标题直译是“在 Ubuntu 18.04 上安装 MariaDB”,但它背后承载的远不止一条命令那么简单。我从 2013 年开始在中小型企业做后端运维和数据库支撑,亲手在 Ubuntu、CentOS、Debian 等系统上部署过超过 270 套 MariaDB 实例,其中 Ubuntu 18.04 是我用得最多、也最“有故事”的一个版本。它不是最新版,但却是 LTS(长期支持)生命周期中承上启下的关键节点:内核 4.15、systemd 237、默认 Python 3.6、APT 仓库结构稳定,同时又避开了 Ubuntu 20.04 初期 systemd-journald 内存泄漏等坑。很多老系统至今仍在跑 Ubuntu 18.04,尤其在政务、教育、制造业的边缘计算节点和本地化部署环境中,它不是“过时”,而是“稳得住”。

MariaDB 不是 MySQL 的简单复刻,它是 MySQL 创始人 Monty Widenius 团队为应对 Oracle 收购后开源可控性风险而重构的完全兼容替代品。它的核心优势在于:协议级兼容 MySQL 5.5–5.7 客户端与应用层,但底层存储引擎(Aria、ColumnStore)、线程池调度、查询优化器(尤其是窗口函数和 CTE 的早期支持)和权限模型都做了深度增强。我在某省级教务平台迁移中实测:同样 12 核 64G 服务器,将原 MySQL 5.7 迁至 MariaDB 10.3 后,高并发选课时段的慢查询率下降 63%,连接池超时错误归零——这不是玄学,是 MariaDB 的thread_pool_sizearia_pagecache_buffer_size针对 OLTP 场景的硬核调优结果。

你看到的热搜词里,“mariadb 和 mysql 冲突吗”问得特别实在——答案是:只要不共用同一套数据目录、不监听同一端口、不同时启用 mysqld 和 mariadb 服务,它们完全可以和平共处。我曾在一个开发测试机上并行运行 MySQL 8.0(用于兼容新特性验证)和 MariaDB 10.3(用于生产环境模拟),靠的是彻底隔离:MySQL 用/var/lib/mysql8+3307端口 +mysql8.service,MariaDB 用/var/lib/mysql+3306+mariadb.service,systemd 互不干扰。而“ragflow 使用 mariadb”这个热词,则指向一个更前沿的落地场景:RAGFlow 是一款开源 RAG(检索增强生成)工作流引擎,它默认使用 SQLite 存储元数据,但在生产级文档解析集群中,必须切换为 MariaDB——因为 SQLite 不支持多进程并发写入,而 RAGFlow 的 worker 节点会高频更新 chunk embedding 状态、任务队列和向量索引元信息。这时 MariaDB 的行级锁、事务隔离级别(READ-COMMITTED)和innodb_flush_log_at_trx_commit=2的平衡策略,就成了整个 RAG 流水线稳定性的基石。

所以,这篇内容不是教你怎么敲sudo apt install mariadb-server,而是带你回到 Ubuntu 18.04 的真实土壤里,拆解每一个被忽略的细节:为什么官方源默认装的是 MariaDB 10.1 而不是 10.3?为什么mysql_secure_installation在 18.04 上会卡在unix_socket插件认证环节?如何让 MariaDB 在 systemd 下真正实现优雅重启而不丢连接?以及最关键的——当你要把它用在 RAGFlow 或类似生产级中间件时,哪些配置项是必须改、必须验、必须写进 Ansible Playbook 的?接下来,我会像带新人一样,把每一步背后的原理、踩过的坑、验证的方法,掰开揉碎讲清楚。

2. 整体设计思路与方案选型逻辑:为什么不是“一键安装”,而是“分层构建”

2.1 Ubuntu 18.04 的生态定位决定了安装策略必须分层

Ubuntu 18.04 的 APT 仓库中,MariaDB 的版本是10.1.48(2021 年 9 月发布的最终维护版)。这个版本虽然稳定,但缺失了大量生产必需特性:比如JSON_CONTAINS()函数在 10.2 才引入,SYSTEM_VERSIONING(系统版本控制)在 10.3 加入,而 RAGFlow 的元数据表设计恰恰依赖JSON类型字段的嵌套查询能力。如果只走apt install mariadb-server,你会得到一个“能连上、能建库、但一跑复杂 SQL 就报错”的半成品环境。这不是 Ubuntu 的问题,而是 LTS 版本的哲学:稳定性优先于新特性,安全补丁优先于功能迭代

因此,我的方案从来不是“非此即彼”,而是分层构建:

  • 基础层(OS 原生):用apt安装mariadb-server,获取经过 Ubuntu QA 团队严格测试的二进制包、systemd 单元文件、日志轮转配置(/etc/logrotate.d/mariadb)和基础依赖(如libmariadb3,mariadb-client-core-10.1)。这一层解决的是“能不能启动”和“会不会崩系统”的问题。
  • 增强层(官方仓库升级):添加 MariaDB 官方 APT 仓库(http://archive.mariadb.org/),安装mariadb-server-10.3。官方仓库的包经过 MariaDB 团队全链路测试,且与 Ubuntu 18.04 的 glibc 2.27、openssl 1.1.1 兼容性已验证。这是最安全、最省心的升级路径,比手动编译或混用 deb 包风险低得多。
  • 定制层(生产就绪配置):在my.cnf中注入针对 Ubuntu 18.04 内核特性的调优参数,比如vm.swappiness=1(降低交换分区使用,避免内存压力下触发 OOM Killer 杀掉 mysqld)、net.core.somaxconn=65535(提升 TCP 连接队列长度,应对突发连接请求),这些不是 MariaDB 自身的参数,而是操作系统与数据库协同工作的“接口”。

提示:绝对不要用snap install mariadb。Snap 包在 Ubuntu 18.04 上对 systemd 的集成存在已知缺陷,会导致systemctl restart mariadb失败,并且其沙箱机制会阻止 MariaDB 访问/var/lib/mysql外的挂载点(比如你用 LVM 逻辑卷扩展数据目录时会直接报错)。

2.2 为什么放弃 MySQL,坚定选择 MariaDB 的三个硬核理由

很多人问“mariadb 和 mysql 冲突吗”,其实更该问“为什么现在还要选 MariaDB”。我的答案基于三年来 12 个生产项目的实测对比:

  1. 权限模型更贴近 DevOps 实践
    MySQL 8.0 引入了角色(ROLE)机制,但它的CREATE ROLEGRANT ... TO role_name在跨实例同步时极易出错;而 MariaDB 的PROXY用户机制(GRANT PROXY ON 'app_user'@'%' TO 'proxy_admin'@'localhost')天然支持“代理登录”,RAGFlow 的 Web 服务只需用固定 proxy 用户连接,后端根据 JWT Token 动态切换到对应租户用户,权限边界清晰,审计日志可追溯。Ubuntu 18.04 的mysql_secure_installation脚本对 MariaDB 的unix_socket插件支持更好,首次初始化时就能禁用 root 密码登录,强制走系统用户认证,安全性起点更高。

  2. 备份恢复链路更健壮
    MySQL 的mysqldump在大表导出时会锁表(即使加--single-transaction,InnoDB 表仍可能因长事务阻塞),而 MariaDB 的mariabackup(XtraBackup 的官方分支)是真正的热备工具:它通过拷贝 InnoDB redo log 和数据页,能在业务不中断的情况下完成 TB 级备份。我在某医疗影像平台用mariabackup --backup --target-dir=/backup/$(date +%F)每日凌晨执行,备份耗时比mysqldump快 4.2 倍,且恢复时mariabackup --prepare --target-dir=/backup/2024-06-01后直接cp -r替换数据目录即可,无需导入 SQL,RTO(恢复时间目标)从小时级降到分钟级。

  3. 监控集成更原生
    MariaDB 自带information_schema.PROCESSLISTperformance_schema表,但它的杀手锏是METADATA_LOCK_INFO插件(10.3+ 默认启用)。当你在 RAGFlow 中遇到“文档解析卡住”,只需SELECT * FROM information_schema.METADATA_LOCK_INFO WHERE LOCK_MODE='EXCLUSIVE',立刻定位到是哪个ALTER TABLE语句锁住了chunk_metadata表,而不是像 MySQL 那样要翻SHOW ENGINE INNODB STATUS的晦涩日志。Ubuntu 18.04 的mariadb-client工具链对这些插件的支持度,远超同版本 MySQL 客户端。

2.3 方案取舍:为什么不用 Docker,而坚持裸机部署

网络热词里没提 Docker,但这恰恰是我要重点解释的。很多教程推荐docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=xxx mariadb:10.3,看似便捷,但在 Ubuntu 18.04 生产环境中,这是个危险的捷径。原因有三:

  • 资源可见性丢失:Docker 容器的内存限制(-m 2g)在 Ubuntu 18.04 的 cgroups v1 下,与 MariaDB 的innodb_buffer_pool_size参数存在隐式冲突。MariaDB 会按free -m报告的总内存计算 buffer pool,默认设为 75%,但容器内free显示的是宿主机总内存,而非容器限制值。结果就是:你设了-m 2g,MariaDB 却分配了 12G buffer pool,宿主机 OOM Killer 直接干掉 mysqld 进程。
  • 持久化路径陷阱-v /host/data:/var/lib/mysql看似合理,但 Ubuntu 18.04 的 ext4 文件系统对 Docker overlay2 驱动的 inode 处理有 Bug,当 RAGFlow 高频创建/删除临时 chunk 表时,df -i显示 inode 用尽,touch test.txt都失败,而df -h却显示磁盘空间充足。裸机部署直接用 LVM 逻辑卷,lvcreate -L 50G -n mysql-data vg0,再mkfs.ext4 /dev/vg0/mysql-data,彻底规避此问题。
  • systemd 集成断层:Ubuntu 18.04 的systemctl status mariadb能精确显示Active: active (running)Main PIDMemory: 1.2GCGroup路径,而docker ps只显示容器状态,无法与系统级监控(如 Prometheus + node_exporter)无缝对接。当你要做等保测评时,“数据库服务是否由 systemd 统一管理”是明确要求项,Docker 部署在此项上直接失分。

所以,我的结论很明确:在 Ubuntu 18.04 上,MariaDB 的唯一生产级部署方式,就是裸机 + systemd + 官方 APT 仓库。Docker 仅用于开发环境快速验证 SQL 语法,绝不踏入生产红线。

3. 核心细节解析与实操要点:从安装到首次安全加固的完整链路

3.1 安装前的系统预检:三个必须验证的底层条件

在敲下任何apt命令前,先执行这三步检查。跳过它们,90% 的后续问题都源于此处。

第一步:确认内核版本与 swap 策略
Ubuntu 18.04 默认内核是 4.15,但某些云厂商镜像(如阿里云 ECS)会预装 5.x 内核。运行uname -r,如果输出5.4.0-xx-generic,需额外验证:grep -i "CONFIG_MEMCG" /boot/config-$(uname -r)应返回CONFIG_MEMCG=y。MariaDB 10.3 的thread_pool模块严重依赖 cgroup memory controller,若未启用,服务启动时会静默失败,journalctl -u mariadb里只有一行Failed to start MariaDB database server.,毫无线索。同时,执行sudo sysctl vm.swappiness=1并写入/etc/sysctl.conf,因为 MariaDB 是内存敏感型服务,swappiness=60(Ubuntu 默认)会导致频繁 swap,I/O 延迟飙升。

第二步:检查 DNS 解析与主机名解析
运行hostname -f,确保返回一个完整的 FQDN(如db-prod-01.internal),而不是localhost。MariaDB 启动时会尝试反向解析bind-address对应的 IP,如果/etc/hosts里没有127.0.1.1 db-prod-01.internal db-prod-01这样的映射,mysqld进程会卡在Resolving hostname...步骤长达 30 秒,然后超时退出。这不是 bug,是 MariaDB 为防止 DNS 劫持做的主动验证。修复方法:echo "127.0.1.1 $(hostname -f) $(hostname)" | sudo tee -a /etc/hosts

第三步:验证 SELinux/AppArmor 状态
Ubuntu 18.04 默认启用 AppArmor。运行sudo aa-status | grep mariadb,如果返回空,说明 MariaDB 的 profile 未加载。此时sudo systemctl start mariadb会失败,报错Permission denied。正确做法是:sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/usr.sbin.mysqld && sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld,然后sudo systemctl daemon-reload。注意:不是禁用 AppArmor,而是重新加载 MariaDB 专用 profile,它比全局禁用安全得多。

注意:mysql_secure_installation在 Ubuntu 18.04 上有一个隐藏陷阱——它默认使用auth_socket插件认证 root 用户,这意味着你不能用密码登录,只能用sudo mysql -u root(即系统 root 用户身份)。如果你后续要用mysql -u root -p,必须在mysql_secure_installation最后一步选择 “Change the password for root ? [Y/n]” 并输入新密码,它会自动执行ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('xxx');。否则,所有远程连接、PHP 应用、RAGFlow 配置都会失败。

3.2 官方仓库安装:精准控制版本与依赖的黄金步骤

Ubuntu 18.04 的apt源里只有 MariaDB 10.1,而我们需要 10.3。官方仓库是唯一安全的选择,步骤如下:

# 1. 安装 HTTPS 传输支持(Ubuntu 18.04 默认不装) sudo apt update && sudo apt install -y apt-transport-https curl # 2. 添加 MariaDB 官方 GPG 密钥(关键!避免 apt 报 "NO_PUBKEY" 错误) curl -LsS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash -s -- --mariadb-server-version="mariadb-10.3" # 3. 更新源列表(此时 /etc/apt/sources.list.d/mariadb.list 已自动生成) sudo apt update # 4. 查看可用版本(确认 10.3 是否在列表中) apt list -a mariadb-server # 5. 安装指定版本(必须显式指定,否则 apt 会装 10.1) sudo apt install -y mariadb-server=1:10.3.38+maria~bionic

这里的关键细节是--mariadb-server-version="mariadb-10.3"参数。MariaDB 官方脚本会根据你的 Ubuntu 版本(bionic)自动匹配仓库 URL,但如果不指定版本,它会默认装最新稳定版(可能是 10.5),而 10.5 要求 glibc 2.28,Ubuntu 18.04 只有 2.27,安装会失败并报libc6 >= 2.28依赖错误。1:10.3.38+maria~bionic这个包名中的1:是 Debian 版本纪元(epoch),~bionic表示专为 Ubuntu 18.04 编译,这是版本锁定的铁律。

安装完成后,立即验证:

# 检查服务状态(应为 active (running)) sudo systemctl status mariadb # 检查进程绑定(确认监听 127.0.0.1:3306,而非 0.0.0.0) sudo ss -tlnp | grep :3306 # 检查实际版本(注意输出中 "10.3.38-MariaDB-0ubuntu0.18.04.1") mysql --version

实操心得:sudo apt install -y mariadb-server=1:10.3.38+maria~bionic这条命令必须一次性成功。如果中途断网或 apt 报错,不要用apt --fix-broken install,而应sudo apt remove --purge mariadb-server* && sudo apt autoremove彻底清理,再重试。因为 MariaDB 10.1 和 10.3 的数据字典格式不同,残留的 10.1 配置文件(如/etc/mysql/mariadb.cnf)会干扰 10.3 初始化,导致mysqld --initialize失败。

3.3 首次安全加固:超越mysql_secure_installation的五项必做操作

mysql_secure_installation是个好工具,但它只做了基础工作。在 Ubuntu 18.04 上,我额外执行以下五项操作,缺一不可:

1. 禁用匿名用户与测试库
mysql_secure_installation会删掉test库,但不会处理''@'localhost'这种匿名用户。运行:

DELETE FROM mysql.user WHERE User=''; DROP DATABASE IF EXISTS test; DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'; FLUSH PRIVILEGES;

否则,任何能登录系统的用户(如www-data)都能用mysql -u ''连入,这是严重的权限越界。

2. 创建专用管理用户,禁用 root 远程登录

-- 创建 admin 用户,密码强度必须含大小写字母+数字+符号(等保要求) CREATE USER 'admin'@'localhost' IDENTIFIED BY 'Adm!n2024#Ub18'; GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION; -- 禁用 root 的远程访问(只保留 localhost) DELETE FROM mysql.user WHERE User='root' AND Host!='localhost'; FLUSH PRIVILEGES;

这样,mysql -u root -p只能在本机执行,而远程管理必须用admin用户,符合最小权限原则。

3. 启用 SSL 强制加密(即使内网也建议)
Ubuntu 18.04 的 MariaDB 10.3 默认不生成 SSL 证书。手动创建:

sudo mkdir -p /etc/mysql/ssl sudo openssl req -newkey rsa:2048 -nodes -keyout /etc/mysql/ssl/server-key.pem -x509 -days 3650 -out /etc/mysql/ssl/server-cert.pem -subj "/C=CN/ST=Beijing/L=Beijing/O=MyOrg/CN=$(hostname -f)"

然后在/etc/mysql/mariadb.conf.d/50-server.cnf[mysqld]段添加:

ssl-ca=/etc/mysql/ssl/server-cert.pem ssl-cert=/etc/mysql/ssl/server-cert.pem ssl-key=/etc/mysql/ssl/server-key.pem require_secure_transport=ON

重启服务后,mysql -u admin -p --ssl-mode=REQUIRED才能连入,SHOW VARIABLES LIKE 'have_ssl';应返回YES

4. 配置连接超时与最大连接数
50-server.cnf中添加:

wait_timeout=300 interactive_timeout=300 max_connections=200

wait_timeout=300表示空闲连接 5 分钟后自动断开,防止 RAGFlow 的 worker 进程异常退出后连接堆积。max_connections=200是经过压测的合理值:Ubuntu 18.04 的ulimit -n默认 1024,每个连接约消耗 2MB 内存,200 连接占用 400MB,留足余量给系统和其他进程。

5. 开启通用查询日志(仅调试期,生产关闭)
为排查 RAGFlow 的 SQL 性能问题,临时开启:

general_log=ON general_log_file=/var/log/mysql/general.log log_output=FILE

但必须设置 logrotate:sudo tee /etc/logrotate.d/mariadb-general <<'EOF' /var/log/mysql/general.log { daily missingok rotate 7 compress delaycompress notifempty create 640 mysql mysql sharedscripts postrotate if systemctl is-active --quiet mariadb; then mysql -uadmin -p'Adm!n2024#Ub18' -e "FLUSH LOGS;" fi endscript } EOF

否则日志会无限增长,填满 `/var` 分区。 ## 4. 实操过程与核心环节实现:从配置调优到 RAGFlow 集成的全流程 ### 4.1 生产级 `my.cnf` 配置详解:每一行参数的实战意义 Ubuntu 18.04 的 MariaDB 配置文件分散在 `/etc/mysql/` 下,最佳实践是:**所有自定义配置写入 `/etc/mysql/mariadb.conf.d/99-production.cnf`**,避免修改 `50-server.cnf`(系统更新时可能被覆盖)。以下是我在 12 个生产环境验证过的完整配置,逐行解释: ```ini [mysqld] # 1. 基础标识与路径 server_id = 1 pid_file = /run/mysqld/mysqld.pid socket = /run/mysqld/mysqld.sock datadir = /var/lib/mysql tmpdir = /tmp # 2. 网络与连接 bind-address = 127.0.0.1 port = 3306 skip-networking = OFF max_connect_errors = 10 connect_timeout = 10 # 3. 内存与缓存(核心调优区) innodb_buffer_pool_size = 2G innodb_buffer_pool_instances = 8 innodb_log_file_size = 256M innodb_log_buffer_size = 8M innodb_flush_log_at_trx_commit = 2 innodb_flush_method = O_DIRECT query_cache_type = 0 query_cache_size = 0 # 4. 日志与安全 log_error = /var/log/mysql/error.log slow_query_log = ON slow_query_log_file = /var/log/mysql/slow.log long_query_time = 1 log_queries_not_using_indexes = OFF require_secure_transport = ON # 5. RAGFlow 专用优化 innodb_file_per_table = ON innodb_large_prefix = ON innodb_file_format = Barracuda innodb_default_row_format = DYNAMIC

参数详解与计算依据:

  • innodb_buffer_pool_size = 2G:这是最关键的参数。计算公式是总内存 × 0.7,但 Ubuntu 18.04 的 4GB 内存服务器,必须预留 1GB 给系统(free -m显示available值),所以2G是安全上限。实测:低于 1.5G 时,RAGFlow 的SELECT * FROM chunks WHERE doc_id = ?查询会频繁触发磁盘 I/O,P95 延迟从 12ms 升至 210ms。

  • innodb_log_file_size = 256M:InnoDB redo log 总大小应为buffer_pool_size × 0.252G × 0.25 = 512M,但 Ubuntu 18.04 的 ext4 默认inode_size=256,单个文件最大 2TB,256M 是兼顾性能与兼容性的经验值。修改此值需停库、删除旧 log 文件、重启,务必提前备份。

  • innodb_flush_log_at_trx_commit = 2:这是 RAGFlow 场景的黄金设置。=1(默认)保证每次事务都刷盘,安全性最高但性能差;=2表示写入 OS cache 即返回,每秒 flush 一次,RAGFlow 的 chunk 元数据更新是高频小事务,=2可将 TPS(每秒事务数)从 1200 提升到 3800,且sync_binlog=1000配合下,数据丢失风险极低(最多 1 秒事务)。

  • innodb_file_per_table = ON:RAGFlow 会为每个客户创建独立数据库,file_per_table让每个 DB 的.ibd文件独立,便于ALTER TABLE ... DISCARD TABLESPACE快速释放空间,避免ibdata1文件无限膨胀。

  • innodb_default_row_format = DYNAMIC:RAGFlow 的chunks表包含TEXTJSON字段,DYNAMIC行格式将大字段溢出到单独页,主记录页更紧凑,B+树层级更低,SELECT COUNT(*) FROM chunks速度提升 3.2 倍。

提示:修改my.cnf后,不要直接systemctl restart mariadb。先sudo systemctl stop mariadb,再sudo mysqld --defaults-file=/etc/mysql/my.cnf --validate-config验证配置语法,无报错再sudo systemctl start mariadb。否则配置错误会导致服务无法启动,journalctl -u mariadb里只有Failed to start MariaDB database server.,毫无调试线索。

4.2 RAGFlow 集成实操:从数据库创建到连接验证的完整闭环

RAGFlow 默认用 SQLite,切换到 MariaDB 需四步操作,每一步都有坑:

第一步:创建专用数据库与用户

-- 创建数据库,字符集必须为 utf8mb4(支持 emoji 和中文四字节) CREATE DATABASE ragflow CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; -- 创建 RAGFlow 应用用户,密码必须满足 Ubuntu 18.04 的 pam_pwquality 策略 CREATE USER 'ragflow_app'@'localhost' IDENTIFIED BY 'R4gFl0w!2024#Ub18'; GRANT SELECT, INSERT, UPDATE, DELETE ON ragflow.* TO 'ragflow_app'@'localhost'; FLUSH PRIVILEGES;

注意:utf8mb4是必须的。RAGFlow 解析 PDF 时会提取作者名、标题等元数据,某些 PDF 内嵌 Unicode 字符(如数学符号),utf8(实际是 utf8mb3)会截断,导致INSERT报错Incorrect string value

第二步:修改 RAGFlow 配置文件
编辑 RAGFlow 的config.py(通常在/opt/ragflow/config.py):

# 注释掉 SQLite 行 # SQLALCHEMY_DATABASE_URI = "sqlite:///ragflow.db" # 取消注释并修改为 MariaDB SQLALCHEMY_DATABASE_URI = "mysql+pymysql://ragflow_app:R4gFl0w!2024#Ub18@127.0.0.1:3306/ragflow?charset=utf8mb4" SQLALCHEMY_ENGINE_OPTIONS = { "pool_pre_ping": True, "pool_recycle": 3600, "pool_size": 10, "max_overflow": 20 }

关键点:?charset=utf8mb4必须显式添加,否则 PyMySQL 默认用latin1,中文乱码;pool_recycle=3600是为了应对 Ubuntu 18.04 的wait_timeout=300,避免连接池里的空闲连接被 MariaDB 主动断开后,RAGFlow 报Lost connection to MySQL server during query

第三步:初始化数据库表结构

cd /opt/ragflow # 确保 Python 环境已激活 source venv/bin/activate # 执行 Alembic 迁移(RAGFlow 使用 SQLAlchemy Migrate) alembic upgrade head

如果报错ModuleNotFoundError: No module named 'pymysql',则pip install pymysql。注意:不能用mysqlclient,它在 Ubuntu 18.04 的 Python 3.6 下编译失败率极高。

第四步:连接验证与压力测试

# 用 RAGFlow 用户直连验证 mysql -u ragflow_app -p'R4gFl0w!2024#Ub18' -h 127.0.0.1 -P 3306 ragflow -e "SHOW TABLES;" # 模拟 RAGFlow 的高频查询(100 并发,持续 60 秒) sysbench --db-driver=mysql --mysql-host=127.0.0.1 --mysql-port=3306 \ --mysql-user=ragflow_app --mysql-password='R4gFl0w!2024#Ub18' \ --mysql-db=ragflow --tables=1 --table-size=10000 \ oltp_read_write --threads=100 --time=60 run

预期结果:transactions:输出应稳定在15000+ per secondfailed0。如果failed > 0,说明max_connectionsinnodb_buffer_pool_size不足,需回退调优。

4.3 等保测评关键命令与自查清单:让 MariaDB 符合三级等保要求

“mariadb等保测评命令”是刚需。等保 2.0 三级要求中,数据库部分核心条款是:身份鉴别、访问控制、安全审计、剩余信息保护。以下是 Ubuntu 18.04 + MariaDB 10.3 的自查命令与修复方案:

等保条款检查命令合格标准不合格修复
身份鉴别SELECT User,Host,plugin FROM mysql.user;plugin列无auth_socket(除 root@localhost),密码字段非空ALTER USER 'user'@'host' IDENTIFIED VIA mysql_native_password USING PASSWORD('xxx');
访问控制SELECT * FROM mysql.db WHERE Db='ragflow';Select_priv,Insert_priv等权限列应为Y/N,无Y以外值REVOKE ALL PRIVILEGES ON *.* FROM 'user'@'host'; GRANT SELECT ON ragflow.* TO 'user'@'host';
安全审计SHOW VARIABLES LIKE 'general_log';
ls -l /var/log/mysql/
general_log应为OFF(生产),error.logslow.log存在且可读SET GLOBAL general_log=OFF;,确保/var/log/mysql/下日志文件属主为mysql:mysql
剩余信息保护sudo ls -l /var/lib/mysql/ragflow/.ibd文件权限应为660,属主mysql:mysqlsudo chown -R mysql:mysql /var/lib/mysql/ragflow; sudo chmod 660 /var/lib/mysql/ragflow/*.ibd

特别提醒:“龙溪的mariadb”这个热词,指的是一种国产化适配方案(龙芯 CPU + 溪洛渡数据库中间件),它要求 MariaDB 开启audit_log插件。Ubuntu 18.04 的 MariaDB 10.3 默认不编译此插件,需手动安装:

sudo apt install -y libmariadb-dev sudo mysql -uadmin -p'Adm!n2024#Ub18' -e "INSTALL SONAME 'server_audit';"

然后在99-production.cnf中添加:

[mysqld] server_audit_logging=ON server_audit_log_file=/var/log/mysql/audit.log server_audit_log_format=NEW

最后sudo touch /var/log/mysql/audit.log && sudo chown mysql:mysql /var/log/mysql/audit.log

5. 常见问题与排查技巧实录:来自 270+ 实例的血泪经验

5.1

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 17:51:35

TRAE SOLO模式:终端原生的轻量级AI编码协作范式

1. 项目概述&#xff1a;TRAE SOLO 模式到底是什么&#xff0c;为什么它值得你花5分钟认真读完 “TRAE SOLO 模式”不是某个新出的编程语言&#xff0c;也不是又一个需要下载安装包、填邮箱注册、等审核才能用的SaaS工具。它本质上是一套 面向终端原生工作流的轻量级智能编码协…

作者头像 李华
网站建设 2026/6/23 17:46:55

OrientDB plocal备份原理与backup.sh实战指南

1. 为什么 OrientDB 的备份不能只靠 cp 或 rsync&#xff1f; 在 Ubuntu 14.04 上给 OrientDB 做备份&#xff0c;很多人第一反应是&#xff1a;数据库文件不就存放在 orientdb/databases/ 目录下吗&#xff1f;直接用 cp -r 或 rsync 拷一份不就完了&#xff1f;我当年也…

作者头像 李华
网站建设 2026/6/23 17:38:08

动态二维码钓鱼攻击:从重定向到像素追踪的完整攻防解析

1. 项目概述&#xff1a;当二维码不再是“静态”的信任锚点 最近在分析一些新型的网络安全事件时&#xff0c;一个反复出现的攻击手法引起了我的注意。它不再是那种一眼就能识破的、指向某个可疑域名的静态二维码&#xff0c;而是变得更加“聪明”和隐蔽。攻击者开始利用一种结…

作者头像 李华
网站建设 2026/6/23 17:37:28

Gemini 3.5 Flash流式性能解析:1141 token/s背后的原理与工程实践

1. 项目概述&#xff1a;一场关于“速度”的硬核实测与深度解构 “Gemini 3.5 Flash 泄露&#xff1a;每秒 1141 token&#xff0c;Google 这次想打穿‘速度’&#xff1f;”——这个标题一出来&#xff0c;整个开发者社区的呼吸都顿了一下。不是因为又出了什么安全漏洞&#x…

作者头像 李华
网站建设 2026/6/23 17:34:02

Shellshock漏洞原理与Apache服务器防护实战指南

1. 这不是一次普通升级&#xff1a;Shellshock&#xff08;CVE-2014-6271&#xff09;到底在撕开服务器的哪道口子&#xff1f;你可能在2014年9月听过这个名字——Shellshock&#xff0c;一个听起来像黑客电影台词、实则让全球数百万服务器在凌晨三点集体心跳骤停的Bash漏洞。它…

作者头像 李华
网站建设 2026/6/23 17:30:01

Go应用在DigitalOcean Kubernetes上的韧性实践指南

1. 为什么“Resilient”不是一句空话&#xff0c;而是Go应用上K8s必须直面的生存问题在DigitalOcean上点几下鼠标就能拉起一个K8s集群&#xff0c;这事儿现在连刚学完Docker基础的实习生都能干。但真正把一个用Go写的业务服务——比如一个处理支付回调的HTTP微服务&#xff0c;…

作者头像 李华