手里十几个网站几十个数据库,备份还要一个一个登服务器手动跑?4个批量备份工具从20个库到200个库都有人用
去年年底帮一个做站群的朋友排查数据丢失问题。他在3台服务器上跑了19个网站,每个站一个独立数据库。备份策略是"想起来就登服务器手动mysqldump一下"。结果有次服务器被挂马,6个站的数据全被清空,想恢复才发现——最近一次备份是43天前的,而且只备份了其中2个库,其他4个库从来没导出过。那次之后他开始找批量备份的方案,我跟着他一起踩了一圈坑。
多服务器多数据库批量备份,四种主流方案速览
| 方案类型 | 适合规模 | 核心工具 | 上手难度 | 月成本(估) |
|---|---|---|---|---|
| 方案一 Shell脚本 + Cron | 5~50个库,1~5台服务器 | bash + mysqldump/mydumper | ⭐⭐ 中等 | 0元 |
| 方案二 开源管理平台 | 10~200个库,任意服务器数 | Databasus / DBackup | ⭐ 简单 | 服务器费用 |
| 方案三 桌面客户端批量任务 | 5~30个库,单机或多机 | Navicat / DBeaver / HeidiSQL | ⭐⭐ 中等 | 0~5000元/年 |
| 方案四 自建中控 + Agent | 50+个库,多机房 | Ansible + 脚本 / 自研系统 | ⭐⭐⭐ 较难 | 开发+维护成本 |
上面四种方案在真实场景里都有人在用,差别在于你手里到底有多少个库、多少台服务器、有没有人盯着看。下面逐个拆开说。
一、Shell脚本 + Cron:20行代码覆盖十几台服务器的几十个库,但三个地方最容易翻车
这是最常见也最灵活的方案。核心思路很简单:写一个bash脚本,循环遍历所有数据库名,逐个mysqldump导出,压缩,按日期命名,删除过期备份。

一台服务器上如果有多个数据库,用一个循环就搞定了:
BACKUP_DIR="/data/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
KEEP_DAYS=30
# 排除系统库,只备份业务库
DATABASES=$(mysql -u root -p'your_password' -e "SHOW DATABASES;" | grep -Ev "Database|information_schema|mysql|performance_schema|sys")
for db in $DATABASES; do
mysqldump -u root -p'your_password' --single-transaction --routines --triggers $db | gzip > $BACKUP_DIR/${db}_${DATE}.sql.gz
done
# 清理30天前的旧备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +$KEEP_DAYS -delete
如果有多台服务器,加一层SSH远程执行就行。核心是在中控机上通过SSH免密登录到每台目标服务器,远程触发本地的备份脚本,然后用scp或rsync把备份文件拉回中控机统一存储。
但Shell脚本方案有三个地方特别容易翻车,基本上每个第一次写的人都踩过:
Shell脚本批量备份最容易翻车的三个坑
1. cron环境变量和交互式shell不一样。cron启动的脚本PATH通常只有/usr/bin:/bin,mysqldump可能不在这个路径里。要么在脚本里写绝对路径(/usr/local/mysql/bin/mysqldump),要么在crontab顶部加PATH变量。
2. 密码明文写在脚本里。上面示例里的-p'your_password'是硬编码密码,脚本文件权限没控好就是安全隐患。更好的做法是用mysql_config_editor创建加密的login-path:mysql_config_editor set --login-path=backup --host=localhost --user=root --password,然后在脚本里用mysqldump --login-path=backup。
3. 备份文件没有校验机制。dump完了不代表文件是完整的。磁盘满了、mysqldump中途被杀、gzip压缩损坏,都会产生无效备份。脚本末尾必须加一步:gzip -t检查压缩文件完整性,再对比文件大小是否合理(至少大于1KB)。
Shell脚本方案的优点是零成本、完全可控、想怎么改怎么改。缺点也很明显:没有可视化管理界面,备份状态要靠日志或者自己写通知脚本,服务器多了以后维护起来越来越费劲。所以手里超过5台服务器、20个库以上的,一般会考虑第二个方案。
二、开源管理平台:Databasus和DBackup,一个Web界面管几百个库的备份,不用再登服务器
如果你已经受不了在多个终端窗口之间切来切去、手动检查每个备份日志的日子,开源备份管理平台就是为你准备的。这两个工具都是2025~2026年活跃更新的项目,部署一把就能在浏览器里管理所有数据库的备份任务。
| 对比维度 | Databasus | DBackup |
|---|---|---|
| 定位 | 专注数据库备份管理的Web平台 | 通用数据库备份自动化工具 |
| 支持数据库 | PostgreSQL、MySQL、MongoDB | MySQL、MariaDB、PostgreSQL、MongoDB、SQLite、Redis、MSSQL(7种) |
| 管理方式 | Web界面,现代UI设计 | Web界面 + YAML配置文件 |
| 存储后端 | S3、Google Drive、FTP、SFTP、本地等 | S3、Cloudflare R2、Google Drive、Dropbox、OneDrive、SFTP、FTP、WebDAV、SMB、Rsync等13+种 |
| 加密 | 支持加密备份 | AES-256-GCM加密,支持密钥轮换 |
| 调度方式 | 灵活的备份计划设置 | 简单模式 + Cron表达式模式,GVS保留策略 |
| 通知渠道 | Slack、Discord等 | Discord、Slack、Teams、Telegram、Gotify、ntfy、Webhook、Twilio等9种 |
| 部署方式 | Docker一键部署,5分钟上手 | Docker部署,支持docker-compose |
| 开源协议 | MIT | 开源(GitHub活跃) |
简单说,如果你主要用PostgreSQL和MySQL,追求界面好看、上手快,Databasus更合适。它一个Docker命令就能跑起来,Web界面做得相当精致,添加数据库连接、配置备份计划都是点几下鼠标的事。如果你数据库类型多、存储需求复杂(比如要备份到OneDrive或者Cloudflare R2),DBackup覆盖面更广。它支持的数据库和存储后端都比Databasus多,而且GVS(祖父-父-子)保留策略是个加分项——能自动按日/周/月分层保留备份,而不是一刀切删旧文件。
这两个平台共同的优点
· 一个页面看全局:所有数据库的备份状态、上次成功时间、下次执行时间,一个Dashboard全部展示。不用再逐台服务器翻cron日志。
· 备份失败自动通知:备份跑挂了,Slack或Telegram立刻推消息,不会出现"备份停了三个月没人知道"的情况。
· Docker部署零依赖:不用装各种数据库客户端,容器里自带。部署完就能连远程数据库备份。
· 多存储目标自动同步:一份备份同时存到本地NAS和云存储,不怕单点故障。
不过要注意,这两个平台都是部署在一台服务器上的Web应用,它们通过远程连接目标数据库来执行备份。如果目标数据库在内网、和平台服务器网络不通,那就需要配合VPN或者SSH隧道来打通连接。
三、桌面客户端批量备份:Navicat的"批处理作业"看着很美,实际用起来发现一个硬伤
很多人习惯用Navicat或DBeaver管理数据库,自然而然想到:能不能用它们做批量备份?答案是能,但有限制,而且Navicat有一个硬伤很多人不知道。
DBeaver的批量备份:免费版就支持。在DBeaver里可以选中多个数据库,右键"工具→转储数据库",一次性导出多个库。它本质上是并行调用mysqldump或pg_dump,比手动一个一个导快不少。但DBeaver的自动定时备份需要企业版,免费版只能手动触发。
Navicat的批量备份:Navicat Premium支持创建"批处理作业"——可以添加多个数据库的备份动作到一个作业里,然后设置定时执行。听起来完美,但实际用起来有一个问题:
Navicat批处理作业的硬伤:它不是真正意义上的"批量备份"。每个备份动作都是独立配置的,硬编码了连接名和数据库名。如果你新增了一个数据库,必须手动去批处理作业里添加一个新的备份步骤。它不是"遍历这台服务器上所有数据库并备份",而是"备份我指定的这几个库"。这和Shell脚本的for循环是两种完全不同的思路。
所以桌面客户端方案更适合数据库数量稳定、不会频繁增减的场景。比如你固定有8个站、8个库,很少变,那Navicat或DBeaver企业版设好定时任务就行。但如果是站群场景、经常新建站点和数据库,桌面客户端每次都要手动更新备份配置,反而比Shell脚本更麻烦。
| 工具 | 批量备份能力 | 自动定时 | 价格 | 适合场景 |
|---|---|---|---|---|
| DBeaver CE | ✅ 多库并行导出 | ❌ 需企业版 | 免费 | 手动批量备份,偶尔用 |
| DBeaver EE | ✅ 多库并行 + 定时 | ✅ 支持 | $199/年 | 固定数量库,要定时自动 |
| Navicat Premium | ⚠️ 批处理作业(需逐个配置) | ✅ 支持 | 约5000元/永久 | 数据库数量稳定不变 |
| HeidiSQL | ✅ 多库批量导出 | ❌ 不支持 | 免费 | Windows环境手动操作 |
四、自建中控+Agent:50个库以上的公司级方案,Ansible一把梭
当你管理的数据库数量超过50个、分布在多个机房或云区域,前面三种方案就开始吃力了。这时候需要一套集中管控的架构:一台中控服务器负责调度,每台数据库服务器上跑一个轻量Agent或直接用Ansible无Agent模式推送备份任务。
Ansible是这个场景下最轻量的选择。不需要在目标服务器上装任何额外软件(只需要SSH和Python),在中控机上写一个playbook,定义好所有数据库服务器和要备份的库列表,一条命令就能在所有服务器上并行执行备份:

- hosts: db_servers
vars:
backup_root: /data/backup
keep_days: 30
tasks:
- name: 获取所有非系统数据库列表
shell: mysql -e "SHOW DATABASES;" | grep -Ev "Database|information_schema|mysql|performance_schema|sys"
register: db_list
- name: 逐个数据库备份并压缩
shell: mysqldump --single-transaction {{ item }} | gzip > {{ backup_root }}/{{ item }}_{{ ansible_date_time.date }}.sql.gz
loop: "{{ db_list.stdout_lines }}"
- name: 清理过期备份
shell: find {{ backup_root }} -name "*.sql.gz" -mtime +{{ keep_days }} -delete
一条ansible-playbook backup_all_mysql.yml命令下去,所有服务器上的所有数据库同时开始备份,执行结果汇总到中控机终端。比逐台SSH登上去跑脚本的效率高了一个数量级。
Ansible方案的升级版是自己写一个备份管理系统:中控机跑一个调度服务(Python/Go),每台数据库服务器上部署一个小Agent接收任务、执行备份、上报状态。这种方案前期开发成本高,但灵活性最强——可以做备份校验、自动恢复演练、异地多活存储等高级功能。一般只有数据库规模超过100个库、对恢复时间有SLA要求的公司才会走这条路。
五、不同数据库类型的批量备份,工具选错了效率差10倍
前面说的主要是MySQL场景。但现实中很多人不只跑MySQL——PostgreSQL、MongoDB、SQLite、Redis各来一点。不同数据库的批量备份最佳工具完全不一样,用错工具效率能差出10倍。
| 数据库类型 | 批量备份推荐工具 | 关键参数/特性 | 为什么不用mysqldump硬套 |
|---|---|---|---|
| MySQL / MariaDB | mydumper(多线程) mysqldump(兼容性最好) | -t 4(4线程并行) --rows=500000(按行分片) | mysqldump单线程,大库慢 |
| PostgreSQL | pg_dump(自带) pg_dumpall(全实例) | -Fc(自定义压缩格式) -j 4(并行备份) | pg_dumpall一键备份所有库 |
| MongoDB | mongodump mongodb-atlas-backup | --gzip --archive oplog增量备份 | 不是SQL数据库,工具完全不同 |
| SQLite | sqlite3 .backup命令 直接cp .db文件 | 单文件数据库,cp就够了 | 不需要dump,文件级拷贝即可 |
| Redis | BGSAVE触发RDB 定时cp dump.rdb | AOF + RDB双保险 | 不是关系型,用快照机制 |
| SQL Server | sqlcmd + BACKUP DATABASE DBackup(自动调度) | WITH COMPRESSION TO DISK路径 | T-SQL备份命令完全不同 |
特别说一下mydumper vs mysqldump的选择。如果你的MySQL数据库单个超过10GB,mysqldump单线程导出的速度会让你等到怀疑人生。mydumper支持多线程并行导出,备份速度比mysqldump快5~10倍,而且可以按表或按行数分片,恢复的时候也能并行导入。批量备份几十个大库的场景,mydumper是刚需。
PostgreSQL这边,pg_dumpall是个被低估的批量备份命令。一条命令就能把整个PostgreSQL实例的所有数据库全部导出到一个文件,不需要写循环脚本。恢复的时候直接psql -f all_databases.sql就全部还原。适合中小型PG实例的快速全量备份。
六、批量备份的存储和保留策略,比备份本身更容易出问题
批量备份几十个库以后,存储和清理变成新问题。一个中型电商站,单库备份压缩后大约200MB,20个库就是4GB/天,一个月120GB,一年1.4TB。如果不做保留策略,硬盘迟早撑爆。
GVS(祖父-父-子)保留策略,最省空间又够用
| 备份层级 | 保留份数 | 覆盖范围 | 作用 |
|---|---|---|---|
| 子(Son) | 最近7天,每天1份 | 过去一周 | 快速回滚昨天的误操作 |
| 父(Father) | 最近4周,每周1份 | 过去一个月 | 应对一周前才发现的数据损坏 |
| 祖父(Grandfather) | 最近12个月,每月1份 | 过去一年 | 年度审计或历史数据恢复 |
按这个策略,20个库一年的备份存储量大约15~20GB,比每天全量保留省了90%以上的空间。
DBackup原生支持GVS策略,在备份任务里直接配置就行。用Shell脚本的话,需要自己写日期判断逻辑,或者用类似find -mtime的分层清理脚本。
七、不同场景的批量备份方案怎么选,四种情况直接抄答案
说了这么多工具和方案,落到具体场景里到底怎么选?下面是四种最常见的批量备份场景,每个场景给一个直接可用的推荐方案。
场景一:个人站长,3台VPS,15个站
推荐方案:Shell脚本 + Cron
一台中控VPS,通过SSH免密连接到另外2台,统一拉取备份。脚本150行以内搞定,加个Telegram通知。
· 成本:0元
· 维护量:初期写好脚本后几乎不用管
· 关键点:备份文件校验不能省
场景二:小型团队,5~10台服务器,30~60个库
推荐方案:Databasus / DBackup
部署一个Docker实例,Web界面统一管理所有数据库的备份计划。备份状态可视化,失败了自动推Slack/钉钉。
· 成本:一台轻量服务器(约50元/月)
· 维护量:极低,Docker自动更新
· 关键点:网络要能通所有目标数据库
场景三:中型公司,20+台服务器,100~200个库
推荐方案:Ansible + 自定义脚本 + 监控
中控机Ansible批量下发备份任务,备份结果汇总到日志系统。搭配Grafana面板展示备份成功率。
· 成本:中控机 + 运维人力
· 维护量:中等,需要懂Ansible
· 关键点:多机房网络延迟要测试
场景四:混合数据库,MySQL + PG + Mongo + Redis
推荐方案:DBackup(7种数据库全覆盖)
一个平台管所有类型数据库的备份,不用给每种数据库写一套脚本。存储统一到S3,加密和保留策略统一配置。
· 成本:Docker部署 + S3存储费
· 维护量:极低
· 关键点:提前测试每种数据库的恢复流程

八、批量备份上线前必须做的一步:恢复演练,90%的人跳过了
备份的意义不在于"备份了",而在于"能恢复"。批量备份尤其容易出这个问题——你看到50个库的备份文件都在目录里,大小也正常,就以为万事大吉。但其中可能有几个库的备份是损坏的、不完整的、或者缺少关键表结构。
批量备份的恢复演练不需要逐个库完整恢复,太费时间。一个折中方案是:随机抽检。每次备份完成后,从所有备份文件中随机抽3~5个,恢复到临时数据库,检查表数量和行数是否与源库一致。
批量备份恢复演练检查清单(每周抽检一次)
· 随机选3~5个库的备份文件解压
· 恢复到临时数据库实例(Docker跑一个临时MySQL/PostgreSQL,用完删掉)
· 对比源库和恢复库的表数量(SELECT COUNT(*) FROM information_schema.tables)
· 抽查关键表的行数(用户表、订单表、内容表至少各查一个)
· 检查存储过程和触发器是否完整(经常被忽略的部分)
· 如果抽检的库全部通过,记录日志;任何一个失败,排查整个备份流程
这套恢复演练流程可以写成脚本自动执行。如果用的是Databasus或DBackup,它们自带备份校验功能,可以设置自动验证。
九、五个容易被忽略的批量备份细节,每一个都可能让你白干
批量备份涉及的服务器和数据库多了以后,很多单库备份不是问题的地方,批量场景下会放大成严重问题。
十、费用估算:四种方案花多少钱,从零元到月投入几百块
| 方案 | 初期投入 | 月均成本 | 年均成本 | 适合规模 |
|---|---|---|---|---|
| Shell脚本+Cron | 0元 | 0元 | 0元 | <20个库 |
| Databasus/DBackup | Docker部署10分钟 | 服务器约50~100元 | 600~1200元 | 20~200个库 |
| Navicat Premium | 约5000元/永久 | 0元 | 5000元(一次性) | <30个库,固定不变 |
| DBeaver企业版 | $199/年 | 约120元 | 约1440元 | <30个库 |
| Ansible+自建 | 运维开发人力 | 中控机约100~200元 | 1200~2400元+人力 | 50+个库 |
| 云RDS自带备份 | 0元 | 备份存储费约0.1~0.3元/GB | 视数据量 | 全在云上 |
大多数中小团队的实际情况是:Shell脚本方案先跑着,等数据库数量超过20个、维护开始吃力了,切到Databasus或DBackup。这是成本最低、风险最小的渐进路线。
批量备份这件事,核心不在于工具多高级,而在于三件事:自动化(不需要人记着去跑)、可验证(备份完知道文件是完整的)、可追溯(三个月前的备份能找到且能恢复)。不管选哪种方案,把这三条做到位了,数据安全这件事就稳了。
另外,备份文件至少存两个不同的物理位置。本地服务器存一份,云存储(S3/OSS/COS)或另一台异机房的服务器存一份。如果所有备份都在同一台服务器上,这台服务器坏了就是全部数据都没了,备份等于白做。
