news 2026/6/23 18:42:33

Debian 9 安装 MariaDB 10.1 实战指南:稳定、安全与等保合规

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Debian 9 安装 MariaDB 10.1 实战指南:稳定、安全与等保合规

1. 项目概述:为什么在 Debian 9 上装 MariaDB 是个“稳中带劲”的选择

如果你正用着 Debian 9(代号 Stretch),手头有个新服务要搭后台数据库,又不想碰 Oracle MySQL 的许可模糊地带、也不想被旧版 MySQL 5.5 的功能短板卡脖子——那 MariaDB 真不是“将就”,而是经过十年生产验证的务实之选。我从 2017 年 Stretch 刚发布时就在三台边缘网关设备上部署 MariaDB 10.1,至今没换过主版本,连备份脚本都还在跑同一套 cron + mysqldump + rsync 组合。这不是怀旧,是它真扛得住:内存占用比 MySQL 同版本低 18%(实测 top -p $(pgrep mysqld) RSS 值),原生支持动态列(Dynamic Columns)、虚拟列(Generated Columns)和更细粒度的线程池控制,对中小规模 Web 应用、IoT 数据聚合、甚至轻量级 RAGFlow 后端存储都够用且省心。

你搜到的热搜词里,“mariadb 和 mysql 冲突吗”问得特别实在——答案是:只要不同时启动 mysqld 和 mariadb-server 进程,冲突根本不存在;但若你之前装过 MySQL,必须彻底 purge(不是 remove)再装 MariaDB,否则 /var/lib/mysql 目录权限、socket 文件路径、甚至 systemd 单元名都会打架。而 “mysql_secure_installation” 这个命令,很多人以为它是 MySQL 专属,其实 MariaDB 完全兼容,且从 10.1.22 起还增加了 --use-defaults 参数,能跳过交互式提问直接走预设安全策略,这对自动化部署太友好了。至于 WSL 相关热词刷屏,恰恰说明:哪怕在 Windows 开发环境里,Debian 9 的 WSL 实例仍是很多老项目兼容测试的“最后一道防线”,而 MariaDB 就是这道防线里最常被拉起来的数据库服务。

这篇内容专为三类人写:

  • 运维同学:需要在物理机/VM 上稳定交付一个可审计、可等保(等保测评常用命令如SELECT USER(), CURRENT_USER();SHOW VARIABLES LIKE 'secure_%';全部原生支持)的数据库;
  • 开发者:正在本地 WSL 或 Docker 中调试基于 Django/Flask/Laravel 的老项目,依赖 Debian 9 的 ABI 兼容性;
  • 嵌入式/边缘场景实践者:比如用树莓派 3B+ 搭监控平台,Debian 9 的内核(4.9)对 BCM2837 的电源管理更成熟,MariaDB 10.1 的静态编译选项还能帮你把二进制压到 12MB 以内。
    下面所有步骤,我都按真实操作顺序重演过 7 次(含 3 次从 apt update 失败开始的完整排错),参数值、报错截图、日志截断位置全部来自实机记录,不是文档搬运。

2. 安装前的核心判断与环境准备

2.1 先确认你真的需要 Debian 9 + MariaDB 这个组合

别急着敲命令——先花 90 秒做三件事:

  1. 查系统版本:运行lsb_release -a,确认输出里有Distributor ID: DebianRelease: 9。如果显示1011,请立刻停手,本文后续所有 apt 源配置、包名、systemd 单元路径都会错位。
  2. 查是否已有 MySQL/MariaDB 进程:执行sudo ss -tlnp | grep ':3306'。如果返回类似u3 /var/run/mysqld/mysqld.sock 12345/mysqld的行,说明服务已运行,需先决定是覆盖安装还是共存(共存需改 port/socket,后文详述)。
  3. 查磁盘空间与内存余量df -h /var/var分区剩余空间(MariaDB 数据目录默认在此,建议预留 ≥2GB);free -h看可用内存(MariaDB 10.1 最小建议 512MB,但若开 query_cache_size=32M,实际需 ≥1GB)。

提示:Debian 9 默认内核为 4.9,而 MariaDB 10.1 编译时针对此内核做了 syscall 优化。如果你用 backports 升级了 4.19+ 内核,反而可能触发pthread_cond_timedwait超时异常(见 MariaDB KB #MDEV-15892),此时应降级内核或换用 MariaDB 10.3+。

2.2 源配置必须精准匹配 Debian 9 的软件仓库结构

Debian 9 的官方源在 2022 年 6 月已归档(archive.debian.org),但 MariaDB 官方仍维护 stretch-backports 源。绝不能直接用deb http://archive.debian.org/debian stretch main,因为 archive.debian.org 不包含 MariaDB 包。正确做法是:

# 备份原 sources.list sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup # 清空并写入精准源(注意:stretch-updates 已停更,只保留 main 和 security) echo "deb http://archive.debian.org/debian stretch main contrib non-free deb http://archive.debian.org/debian-security stretch/updates main contrib non-free deb [arch=amd64] https://mirrors.tuna.tsinghua.edu.cn/mariadb/repo/10.1/debian stretch main" | sudo tee /etc/apt/sources.list # 导入 MariaDB GPG key(关键!否则 apt update 会报 NO_PUBKEY) sudo apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc'

这里有个易错点:清华镜像站的 MariaDB 10.1 repo URL 中stretch后面不能加斜杠,写成https://mirrors.tuna.tsinghua.edu.cn/mariadb/repo/10.1/debian/stretch/ main会导致 apt 解析失败(报错Malformed entry 3 in list file)。我踩过这个坑,在/var/log/apt/term.log里看到E: Type 'https://mirrors.tuna.tsinghua.edu.cn/mariadb/repo/10.1/debian/stretch/' is not known on line 3 in source list /etc/apt/sources.list才定位到。

注意:如果你用的是 ARM 架构(如树莓派),需将arch=amd64改为arch=armhf,且必须确认该架构下 MariaDB 10.1 是否提供二进制包(stretch-armhf 有,但 stretch-arm64 无,需源码编译)。

2.3 预装依赖与系统级调优不可跳过

MariaDB 10.1 在 Debian 9 上依赖libjemalloc1(内存分配器)和libaio1(异步 I/O),但这两个包在 stretch main 中版本较旧(libjemalloc1=3.6.0),而 MariaDB 10.1 编译时链接的是 jemalloc 4.5+。因此必须手动装 backports 版本:

# 启用 stretch-backports 源(单独一行,避免污染主源) echo "deb http://archive.debian.org/debian stretch-backports main" | sudo tee -a /etc/apt/sources.list # 更新并安装关键依赖 sudo apt update sudo apt -t stretch-backports install libjemalloc1 libaio1 -y

同时,调整系统级参数防 OOM:

  • 编辑/etc/sysctl.conf,追加:
    # MariaDB 推荐内核参数 vm.swappiness = 1 vm.vfs_cache_pressure = 50 fs.file-max = 65536
  • 执行sudo sysctl -p生效。

实操心得:vm.swappiness=1是关键。Debian 9 默认为 60,MariaDB 在高并发写入时容易触发 swap,导致查询延迟飙升至秒级。我曾在线上一台 2GB 内存的 Nginx+PHP+MariaDB 三合一服务器上,将 swappiness 从 60 改为 1 后,SELECT COUNT(*) FROM huge_log_table的耗时从 8.2s 降到 1.3s。这不是玄学,是内核回收 page cache 的策略差异。

3. 核心安装流程与安全加固实操

3.1 三步完成安装:apt install → 初始化 → 启动验证

第一步:安装 mariadb-server 包

# 清理可能存在的残留配置 sudo apt autoremove --purge mysql-server* mariadb-server* -y 2>/dev/null || true # 安装 MariaDB 10.1(注意:包名是 mariadb-server,不是 mysql-server) sudo apt install mariadb-server -y # 安装过程会自动创建系统用户 mysql、初始化 /var/lib/mysql 目录、生成 root@localhost 密码(存于 /etc/mysql/debian.cnf)

安装时你会看到终端输出类似:

Setting up mariadb-server-10.1 (10.1.48-0+deb9u2) ... Installing new version of config file /etc/mysql/mariadb.cnf ... Created symlink /etc/systemd/system/multi-user.target.wants/mariadb.service → /lib/systemd/system/mariadb.service.

重点看最后两行:mariadb.service已自动注册为开机自启,且配置文件路径是/etc/mysql/mariadb.cnf(不是 my.cnf!这是 MariaDB 10.1+ 的新规范)。

第二步:验证服务状态与基础连接

# 检查服务是否 active sudo systemctl status mariadb # 正常应显示:Active: active (running) since ...; Process: 1234 ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS $_WSREP_NEW_CLUSTER $_WSREP_START_POSITION (code=exited, status=0/SUCCESS) # 用 debian-sys-maint 用户登录(密码在 /etc/mysql/debian.cnf 的 password 字段) sudo mysql -u debian-sys-maint -p$(sudo awk '/password/ {print $3}' /etc/mysql/debian.cnf) # 在 MariaDB shell 中执行: SELECT VERSION(), @@hostname, @@port; -- 应返回:10.1.48-MariaDB-0+deb9u2, your-hostname, 3306

提示:debian-sys-maint是 Debian 包专用维护账户,权限比 root 更受限(只能执行FLUSH PRIVILEGES,SHOW SLAVE STATUS等运维命令),但它能绕过 root 密码重置流程,是故障恢复的关键入口。

第三步:运行 mysql_secure_installation 进行安全加固

sudo mysql_secure_installation

交互式提问中,我的推荐选择是:

  • Enter current password for root (enter for none):直接回车(Debian 包安装后 root 密码为空)
  • Set root password?Y→ 输入强密码(如M@riaDB-9-Stretch-2024!
  • Remove anonymous users?Y(删除空用户名,防未授权访问)
  • Disallow root login remotely?Y(禁止 root 远程登录,生产环境必须)
  • Remove test database and access to it?Y(删 test 库,等保要求)
  • Reload privilege tables now?Y

执行完后,/root/.my.cnf会自动生成,里面存了 root 密码的明文 base64([client] password = bXlzcWw=),务必 chmod 600 /root/.my.cnf,否则ps aux | grep mysql可能泄露密码。

3.2 关键配置文件深度解析与定制化修改

MariaDB 10.1 在 Debian 9 的配置文件层级是:

/etc/mysql/mariadb.cnf ← 主配置(加载所有 *.cnf) ├── /etc/mysql/conf.d/ ← 用户自定义配置(推荐放这里) └── /etc/mysql/mariadb.conf.d/ ← Debian 包自带配置(勿改)

必须修改的三个核心参数(写入/etc/mysql/conf.d/custom.cnf):

[mysqld] # 1. 内存与缓存(按 2GB 内存机器示例) innodb_buffer_pool_size = 512M innodb_log_file_size = 128M query_cache_type = 1 query_cache_size = 32M # 2. 连接与超时 max_connections = 150 wait_timeout = 300 interactive_timeout = 300 # 3. 安全与日志 log_error = /var/log/mysql/error.log slow_query_log = ON slow_query_log_file = /var/log/mysql/slow.log long_query_time = 2

计算依据:

  • innodb_buffer_pool_size:设为物理内存的 25%(2GB × 0.25 = 512MB),这是 InnoDB 缓存数据页和索引页的核心内存,过小会导致频繁磁盘读,过大则挤占系统其他进程内存。
  • innodb_log_file_size:设为 buffer_pool_size 的 25%(512MB × 0.25 ≈ 128MB),这是事务日志大小,直接影响 crash recovery 时间和写入吞吐。修改此值需先停止服务、删除旧日志、再重启
    sudo systemctl stop mariadb sudo rm /var/lib/mysql/ib_logfile* sudo systemctl start mariadb
  • query_cache_size=32M:MariaDB 10.1 仍支持查询缓存,但仅对完全相同的 SELECT 语句生效。若应用大量使用 Prepared Statement 或动态 WHERE,建议设为 0 关闭,避免缓存失效锁竞争。

实操心得:我在一台树莓派 3B+(1GB RAM)上,将innodb_buffer_pool_size从默认 128M 改为 256M 后,wp_options表的SELECT option_value FROM wp_options WHERE option_name='cron'查询耗时从 140ms 降到 22ms。但若设为 512M,系统会因内存不足频繁 OOM kill 进程,所以必须按实际内存比例调整。

3.3 用户权限与远程访问的精细化控制

默认安装只允许root@localhostdebian-sys-maint@localhost访问。若需远程连接(如开发机连服务器),绝不能直接GRANT ALL ON *.* TO 'root'@'%',而应:

-- 创建专用应用用户(以 wordpress 为例) CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'WpPass!2024'; CREATE USER 'wpuser'@'192.168.1.%' IDENTIFIED BY 'WpPass!2024'; -- 仅允 192.168.1.0/24 网段 -- 授予最小必要权限 GRANT SELECT, INSERT, UPDATE, DELETE ON wordpress_db.* TO 'wpuser'@'localhost'; GRANT SELECT, INSERT, UPDATE, DELETE ON wordpress_db.* TO 'wpuser'@'192.168.1.%'; -- 刷新权限 FLUSH PRIVILEGES;

然后修改/etc/mysql/mariadb.conf.d/50-server.cnf

# 注释掉 bind-address 行,或改为 0.0.0.0(不推荐)或具体内网 IP # bind-address = 127.0.0.1 bind-address = 192.168.1.100 # 服务器内网 IP

最后开放防火墙:

sudo ufw allow from 192.168.1.50 to any port 3306 # 仅允开发机 IP sudo ufw reload

注意:bind-address设为0.0.0.0且未配防火墙,等于把数据库裸奔在公网。我见过三次因这个配置被暴力破解 root 密码,导致比特币挖矿木马写入/tmp/.X11-unix/。安全第一,宁可多配一条ufw规则。

4. 常见问题与实战排错指南

4.1 启动失败:journalctl 是你的第一双眼睛

sudo systemctl start mariadb报错或状态为failed不要猜,直接看日志:

# 查看最近 50 行错误日志 sudo journalctl -u mariadb -n 50 -e # 若日志被轮转,查历史日志 sudo journalctl -u mariadb --since "2024-01-01" | grep -i "error\|fail\|cannot"

典型报错及解法:

报错信息(journalctl 输出)根本原因解决方案
Can't start server: Bind on TCP/IP port: Address already in use3306 端口被占用(如旧 MySQL 进程)sudo ss -tlnp | grep :3306找出 PID,sudo kill -9 PID
InnoDB: The Auto-extending log file ./ib_logfile0 is of different size修改innodb_log_file_size后未删旧日志sudo systemctl stop mariadb && sudo rm /var/lib/mysql/ib_logfile* && sudo systemctl start mariadb
Plugin 'unix_socket' is not loadedDebian 9 的 mariadb-server 包默认启用 unix_socket 插件,但某些自定义编译版本缺失sudo mysql -u debian-sys-maint -p... -e "INSTALL PLUGIN unix_socket SONAME 'auth_socket';"

实操心得:journalctl -u mariadb日志里,InnoDB initialization阶段的耗时是关键指标。正常应在 2~3 秒内完成,若卡在Starting crash recovery...超过 30 秒,大概率是/var/lib/mysql/ibdata1文件损坏,需用innodb_force_recovery=1启动后导出数据重建。

4.2 连接被拒:从网络层到应用层的逐层排查

mysql -h 192.168.1.100 -u wpuser -pERROR 1045 (28000): Access denied for user,按此顺序检查:

  1. 网络层ping 192.168.1.100通?telnet 192.168.1.100 3306是否连接成功?不通则查防火墙(sudo ufw status verbose)或路由器 ACL。
  2. MariaDB 层:登录本地mysql -u debian-sys-maint -p...,执行:
    SELECT User, Host FROM mysql.user WHERE User='wpuser'; -- 必须看到 'wpuser' | '192.168.1.%' 这一行 SHOW GRANTS FOR 'wpuser'@'192.168.1.%'; -- 必须包含 ON wordpress_db.* 的权限
  3. 配置层:确认/etc/mysql/mariadb.conf.d/50-server.cnfbind-address未设为127.0.0.1,且skip-networking未启用。

提示:SELECT User, Host FROM mysql.user结果中,Host列的%是通配符,但127.0.0.1localhost是两个不同 host(前者走 TCP,后者走 socket),所以GRANT ... TO 'user'@'%'无法登录mysql -u user -h 127.0.0.1,必须显式GRANT ... TO 'user'@'127.0.0.1'

4.3 性能瓶颈:用内置工具定位慢查询与锁等待

MariaDB 10.1 自带pt-query-digest替代品mysqldumpslow,但更推荐直接查 performance_schema:

-- 查当前最耗时的 5 个查询 SELECT DIGEST_TEXT, COUNT_STAR, SUM_TIMER_WAIT/1000000000000 AS time_sec FROM performance_schema.events_statements_summary_by_digest WHERE DIGEST_TEXT IS NOT NULL ORDER BY SUM_TIMER_WAIT DESC LIMIT 5; -- 查锁等待(需先开启 performance_schema) UPDATE performance_schema.setup_consumers SET ENABLED='YES' WHERE NAME='events_waits_current'; SELECT * FROM performance_schema.events_waits_current WHERE EVENT_NAME LIKE 'wait/synch/mutex/%' AND STATE='WAITING'\G

若发现wait/synch/mutex/sql/LOCK_thread_count等待,说明连接数超限,需调大max_connections;若wait/io/file/innodb/innodb_data_file高,则是磁盘 I/O 瓶颈,应检查iostat -x 1%util是否持续 >90%。

实操心得:我在一个日志分析系统中,通过performance_schema.events_statements_summary_by_digest发现SELECT * FROM logs WHERE created_at > ? ORDER BY id DESC LIMIT 100占用 68% 的 CPU 时间。加复合索引ALTER TABLE logs ADD INDEX idx_created_id (created_at, id);后,该查询从 12s 降到 80ms。记住:慢查询优化,永远先看执行计划(EXPLAIN),再看索引,最后才调参数。

4.4 等保合规要点:五个必做命令与配置

等保 2.0 对数据库的要求集中在身份鉴别、访问控制、安全审计、剩余信息保护四方面。MariaDB 10.1 在 Debian 9 上可原生满足:

等保要求MariaDB 实现方式验证命令
身份鉴别强度设置密码复杂度(需插件)sudo mysql -e "INSTALL SONAME 'validate_password'; SET GLOBAL validate_password_policy=STRONG;"
访问控制粒度按用户、表、列授权SHOW GRANTS FOR 'appuser'@'localhost';
安全审计日志启用 general_log 或 error_logsudo mysql -e "SET GLOBAL general_log = ON; SET GLOBAL general_log_file = '/var/log/mysql/general.log';"
敏感数据加密使用 AES_ENCRYPT() 函数SELECT AES_ENCRYPT('secret', 'key');(密钥需应用层管理)
登录失败告警配置 faillog(系统级)sudo faillog -u mysql(查看 mysql 用户失败登录次数)

注意:validate_password插件在 Debian 9 的 mariadb-server 包中默认未安装,需手动INSTALL SONAME。但插件本身不改变现有用户密码,只对新设密码生效,所以必须在mysql_secure_installation后立即启用。

5. 进阶场景:RAGFlow 与 MariaDB 的协同部署

RAGFlow 是一个开源 RAG(检索增强生成)框架,其后端默认用 SQLite,但在生产环境需 MariaDB 支持多用户并发和全文检索。Debian 9 + MariaDB 10.1 是它的轻量级部署黄金组合。

5.1 RAGFlow 数据库初始化与配置

RAGFlow 要求 MariaDB 开启innodb_file_per_table(默认已开)和ft_min_word_len=2(全文检索最小词长):

# 修改 /etc/mysql/conf.d/custom.cnf [mysqld] innodb_file_per_table = ON ft_min_word_len = 2 # 重启生效 sudo systemctl restart mariadb

然后创建 RAGFlow 专用库:

CREATE DATABASE ragflow CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'ragflow'@'localhost' IDENTIFIED BY 'RagPass!2024'; GRANT ALL PRIVILEGES ON ragflow.* TO 'ragflow'@'localhost'; FLUSH PRIVILEGES;

5.2 RAGFlow 连接 MariaDB 的 Python 适配

RAGFlow 的settings.py中数据库配置需改为:

DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'ragflow', 'USER': 'ragflow', 'PASSWORD': 'RagPass!2024', 'HOST': '127.0.0.1', 'PORT': '3306', 'OPTIONS': { 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'", 'charset': 'utf8mb4', } } }

关键点:

  • HOST必须写127.0.0.1(而非localhost),否则 Django 会尝试用 Unix socket 连接,而 RAGFlow 的容器化部署常禁用 socket。
  • init_command强制 SQL 模式,避免 MariaDB 10.1 的宽松模式导致数据截断。
  • charset=utf8mb4是必须的,否则 emoji 和中文分词会乱码。

实操心得:RAGFlow 的document表需建全文索引加速向量检索:

ALTER TABLE ragflow_document ADD FULLTEXT(title, content); -- 后续用 MATCH AGAINST 查询:SELECT * FROM ragflow_document WHERE MATCH(title,content) AGAINST('+AI +tutorial' IN BOOLEAN MODE);

这比 Elasticsearch 轻量,且与 MariaDB 原生集成,适合单机部署。

5.3 WSL 环境下的特殊处理

在 Windows 10/11 的 WSL 1 中运行 Debian 9,mariadb-server会因 WSL 的 init 系统限制而无法用systemctl启动。解决方案是:

# 禁用 systemd,改用传统 init sudo apt install sysvinit-core -y sudo reboot # 启动 MariaDB(WSL 1 不支持 socket 激活,必须手动) sudo service mysql start # 验证 sudo mysql -u debian-sys-maint -p$(sudo cat /etc/mysql/debian.cnf \| awk '/password/ {print $3}')

提示:WSL 2 支持 systemd,但需在/etc/wsl.conf中添加[boot] systemd=true并重启 WSL。若你用的是 WSL 1,坚持用service mysql start即可,性能无差异。

6. 维护与升级:让 MariaDB 在 Debian 9 上长期服役

6.1 日常维护三板斧:备份、监控、清理

备份脚本(/usr/local/bin/backup_mariadb.sh):

#!/bin/bash DATE=$(date +%Y%m%d_%H%M%S) BACKUP_DIR="/backup/mariadb" DB_NAME="wordpress_db" sudo mkdir -p $BACKUP_DIR sudo mysqldump -u debian-sys-maint -p$(sudo awk '/password/ {print $3}' /etc/mysql/debian.cnf) \ --single-transaction --routines --triggers $DB_NAME | \ gzip > $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz # 只保留最近 7 天备份 find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete

赋予执行权:sudo chmod +x /usr/local/bin/backup_mariadb.sh,加入 crontab:

# 每天凌晨 2 点执行 0 2 * * * /usr/local/bin/backup_mariadb.sh

监控脚本(检查服务存活与磁盘):

#!/bin/bash # 检查 MariaDB 进程 if ! pgrep -x "mysqld" > /dev/null; then echo "MariaDB down at $(date)" | mail -s "ALERT: MariaDB Down" admin@example.com sudo systemctl start mariadb fi # 检查 /var 磁盘使用率 if [ $(df /var | awk 'NR==2 {print $5}' | sed 's/%//') -gt 85 ]; then echo "/var full at $(date)" | mail -s "ALERT: /var Full" admin@example.com fi

6.2 升级风险评估:从 10.1 到 10.3 的取舍

MariaDB 官方对 Debian 9 的 10.3+ 版本仅提供源码包,二进制包已停止更新。升级需源码编译,但代价巨大:

  • 编译耗时:在 4 核 CPU 上约 45 分钟,需build-essential,cmake,libssl-dev等 12 个依赖;
  • 兼容性风险:10.3 默认启用innodb_strict_mode=ON,可能使旧应用的INSERT IGNORE语句报错;
  • 无官方支持:Debian 9 的 libc6 版本(2.24)低于 10.3 编译要求(2.27),需降级 glibc(极度危险,可能导致系统崩溃)。

我的建议:

  • 若当前 10.1 运行稳定,不要升级。MariaDB 10.1 的安全补丁(如 CVE-2023-31122)仍通过 Debian Security Team 推送;
  • 若必须用新特性(如窗口函数),改用 Docker 运行 MariaDB 10.6 容器,宿主机仍用 Debian 9,通过--network host共享网络;
  • 若已到生命周期终点(Debian 9 EOL 是 2022-06),请规划迁移到 Debian 11 + MariaDB 10.5,而非硬升 10.3。

最后分享一个小技巧:用mysqladmin命令快速诊断连接数瓶颈:

# 查看当前连接数与状态 sudo mysqladmin -u debian-sys-maint -p$(sudo awk '/password/ {print $3}' /etc/mysql/debian.cnf) extended-status | grep -E "Threads_connected|Threads_running|Aborted_connects"

Threads_connected持续 >max_connections的 80%,就是扩容信号;Aborted_connects每小时增长 >10 次,说明存在弱密码爆破或应用连接池配置错误。

我在 Debian 9 上跑 MariaDB 10.1 已满 6 年,从树莓派到 Dell R720,从 WordPress 到 RAGFlow,它从未让我失望。稳定不是守旧,而是对每个字节的敬畏。当你敲下sudo systemctl start mariadb,听到那声清脆的OK,你就知道,有些东西,时间越久,越值得信赖。

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

DeepSeek-V4-Pro国产AI算力闭环实战解析

1. 这不是又一个“参数堆砌”的发布会,而是国产AI算力闭环的临界点 今天早上刷新DeepSeek官网时,页面右上角那个熟悉的“专家模式”按钮旁,悄然多了一个小小的“V4”角标。没有震耳欲聋的发布会直播,没有PPT里密密麻麻的对比柱状图…

作者头像 李华
网站建设 2026/6/23 18:25:14

从脚本小子到安全猎人:40个核心姿势构建体系化漏洞挖掘思维

1. 从“脚本小子”到“猎人”:我的漏洞挖掘入门心路刚入行那会儿,我总觉得自己像个“脚本小子”,拿着别人写的工具到处乱扫,运气好能撞上一两个弱口令,运气不好就是一顿封IP。直到有一次,在一个内部测试中&…

作者头像 李华
网站建设 2026/6/23 18:23:43

医疗文本检索技术:CARE框架的非对称架构与优化实践

1. 医疗文本检索的现状与挑战 医疗文本检索系统在临床决策支持、医学问答等场景中扮演着关键角色。传统对称架构的嵌入模型(如BERT系列)采用相同结构的编码器处理查询和文档,虽然推理速度快,但在处理专业医学术语时存在明显的语义…

作者头像 李华
网站建设 2026/6/23 18:07:18

Ubuntu 16.04下SimpleSAMLphp SAML认证深度部署指南

1. 这不是装个PHP扩展那么简单:SAML认证在Ubuntu 16.04上的真实落地逻辑 SimpleSAMLphp不是一句“安装PHP包就能用”的工具,它是一套完整的身份联合协议栈实现。我在2017年给某省级政务云平台做单点登录(SSO)集成时,第…

作者头像 李华
网站建设 2026/6/23 18:06:12

CSS content属性实现多行文本的正确方法

1. 项目概述:CSS content属性里的换行,到底能不能用? 你有没有试过在 ::before 或 ::after 伪元素里写一段带换行符的字符串,比如 content: "第一行\n第二行"; ,结果发现浏览器压根不认这个 \n &…

作者头像 李华
网站建设 2026/6/23 18:05:04

Qwen3.6为何必须用Anthropic协议调用?协议兼容性深度解析

1. 项目概述:为什么在 OpenClaw 中“推荐用 Anthropic 协议调用 Qwen3.6”不是一句空话,而是实操中踩坑后得出的硬结论 OpenClaw 是一个面向开发者、强调“可编程性”与“工具链闭环”的开源 AI 编程代理框架——它不追求通用对话能力,而是专…

作者头像 李华