用户登录
个人主页 用户中心 我的订单 添加授权 管理授权
退出登录
用户登录 用户注册
欢迎来到 UC建站系统

数十个网站数据库批量备份从想起来才手跑mysqldump到自动多目的地双备份方案:19个网站每个独立数据库3台服务器上想恢复才发现上次备份在43天前而且只导出过两个库其他六个库从来没备份过也没有校验过

手里十几个网站几十个数据库,备份还要一个一个登服务器手动跑?4个批量备份工具从20个库到200个库都有人用

去年年底帮一个做站群的朋友排查数据丢失问题。他在3台服务器上跑了19个网站,每个站一个独立数据库。备份策略是"想起来就登服务器手动mysqldump一下"。结果有次服务器被挂马,6个站的数据全被清空,想恢复才发现——最近一次备份是43天前的,而且只备份了其中2个库,其他4个库从来没导出过。那次之后他开始找批量备份的方案,我跟着他一起踩了一圈坑。

多服务器多数据库批量备份,四种主流方案速览

方案类型适合规模核心工具上手难度月成本(估)
方案一 Shell脚本 + Cron5~50个库,1~5台服务器bash + mysqldump/mydumper⭐⭐ 中等0元
方案二 开源管理平台10~200个库,任意服务器数Databasus / DBackup⭐ 简单服务器费用
方案三 桌面客户端批量任务5~30个库,单机或多机Navicat / DBeaver / HeidiSQL⭐⭐ 中等0~5000元/年
方案四 自建中控 + Agent50+个库,多机房Ansible + 脚本 / 自研系统⭐⭐⭐ 较难开发+维护成本

上面四种方案在真实场景里都有人在用,差别在于你手里到底有多少个库、多少台服务器、有没有人盯着看。下面逐个拆开说。

一、Shell脚本 + Cron:20行代码覆盖十几台服务器的几十个库,但三个地方最容易翻车

这是最常见也最灵活的方案。核心思路很简单:写一个bash脚本,循环遍历所有数据库名,逐个mysqldump导出,压缩,按日期命名,删除过期备份。

1 - 数十个网站数据库批量备份从想起来才手跑mysqldump到自动多目的地双备份方案:19个网站每个独立数据库3台服务器上想恢复才发现上次备份在43天前而且只导出过两个库其他六个库从来没备份过也没有校验过 - UC建站系统

一台服务器上如果有多个数据库,用一个循环就搞定了:

#!/bin/bash
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年活跃更新的项目,部署一把就能在浏览器里管理所有数据库的备份任务。

对比维度DatabasusDBackup
定位专注数据库备份管理的Web平台通用数据库备份自动化工具
支持数据库PostgreSQL、MySQL、MongoDBMySQL、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,定义好所有数据库服务器和要备份的库列表,一条命令就能在所有服务器上并行执行备份:

2 - 数十个网站数据库批量备份从想起来才手跑mysqldump到自动多目的地双备份方案:19个网站每个独立数据库3台服务器上想恢复才发现上次备份在43天前而且只导出过两个库其他六个库从来没备份过也没有校验过 - UC建站系统

# ansible playbook: backup_all_mysql.yml
- 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 / MariaDBmydumper(多线程)
mysqldump(兼容性最好)
-t 4(4线程并行)
--rows=500000(按行分片)
mysqldump单线程,大库慢
PostgreSQLpg_dump(自带)
pg_dumpall(全实例)
-Fc(自定义压缩格式)
-j 4(并行备份)
pg_dumpall一键备份所有库
MongoDBmongodump
mongodb-atlas-backup
--gzip --archive
oplog增量备份
不是SQL数据库,工具完全不同
SQLitesqlite3 .backup命令
直接cp .db文件
单文件数据库,cp就够了不需要dump,文件级拷贝即可
RedisBGSAVE触发RDB
定时cp dump.rdb
AOF + RDB双保险不是关系型,用快照机制
SQL Serversqlcmd + 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存储费
· 维护量:极低
· 关键点:提前测试每种数据库的恢复流程

3 - 数十个网站数据库批量备份从想起来才手跑mysqldump到自动多目的地双备份方案:19个网站每个独立数据库3台服务器上想恢复才发现上次备份在43天前而且只导出过两个库其他六个库从来没备份过也没有校验过 - UC建站系统

八、批量备份上线前必须做的一步:恢复演练,90%的人跳过了

备份的意义不在于"备份了",而在于"能恢复"。批量备份尤其容易出这个问题——你看到50个库的备份文件都在目录里,大小也正常,就以为万事大吉。但其中可能有几个库的备份是损坏的、不完整的、或者缺少关键表结构。

批量备份的恢复演练不需要逐个库完整恢复,太费时间。一个折中方案是:随机抽检。每次备份完成后,从所有备份文件中随机抽3~5个,恢复到临时数据库,检查表数量和行数是否与源库一致。

批量备份恢复演练检查清单(每周抽检一次)

· 随机选3~5个库的备份文件解压
· 恢复到临时数据库实例(Docker跑一个临时MySQL/PostgreSQL,用完删掉)
· 对比源库和恢复库的表数量(SELECT COUNT(*) FROM information_schema.tables)
· 抽查关键表的行数(用户表、订单表、内容表至少各查一个)
· 检查存储过程和触发器是否完整(经常被忽略的部分)
· 如果抽检的库全部通过,记录日志;任何一个失败,排查整个备份流程

这套恢复演练流程可以写成脚本自动执行。如果用的是Databasus或DBackup,它们自带备份校验功能,可以设置自动验证。

九、五个容易被忽略的批量备份细节,每一个都可能让你白干

批量备份涉及的服务器和数据库多了以后,很多单库备份不是问题的地方,批量场景下会放大成严重问题。

1

备份文件命名要有服务器标识

单台服务器上备份,文件名用"库名_日期"就够了。多台服务器统一拉到一个目录后,不同服务器的同名数据库备份会互相覆盖。命名规则必须是:服务器名_库名_日期.sql.gz。中控机拉取时也要按服务器名建子目录分开存放。

2

大库和小库的备份时间窗口要错开

批量备份20个库,如果有一个库100GB,其他都是几百MB,所有库同时开始备份的话,大库会跑2小时,小库5分钟就完了。但大库备份期间的IO和锁会影响所有库的性能。大库应该单独设一个时间窗口(比如凌晨2点),小库放在另一个时间(凌晨4点),避免互相拖累。

3

备份过程中的磁盘空间要留够余量

批量备份时,所有库的临时文件同时写入磁盘。假设每个库dump过程中产生未压缩的临时文件(实际压缩前的数据),磁盘瞬间写入量可能非常大。磁盘剩余空间至少要是最大单个库体积的2倍以上,否则写到一半磁盘满了,不仅备份失败,数据库本身也可能因为磁盘满而停止服务。

4

SSH连接超时和断连重试机制

跨服务器批量备份靠SSH连接,但SSH默认有超时时间。备份大库时如果SSH连接断了,备份进程也被杀掉。在脚本里要设置ServerAliveInterval=60保持心跳,或者在远程服务器上用nohup + &后台运行的方式,不依赖SSH会话存活。

5

备份成功率和耗时要监控,不能"设了就忘"

批量备份最容易出现的情况是:一开始设好了,跑了两周没问题,然后就不管了。三个月后某个库突然变大、备份超时失败,或者某台服务器磁盘满了导致备份不完整——但没有人知道。必须有一个监控指标:每天备份的成功率(成功库数/总库数)每个库的备份耗时趋势,异常时自动告警。

十、费用估算:四种方案花多少钱,从零元到月投入几百块

方案初期投入月均成本年均成本适合规模
Shell脚本+Cron0元0元0元<20个库
Databasus/DBackupDocker部署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)或另一台异机房的服务器存一份。如果所有备份都在同一台服务器上,这台服务器坏了就是全部数据都没了,备份等于白做。

相关推荐
在线客服
👇找客服拿折扣
QQ咨询&售后
在线时间
11:00 ~ 5:30
QQ:3155555535
👇联系QQ
👇联系WX
首页 程序 帮助 登录