MariaDB数据库备份与隔离恢复

网站文件备份不包含数据库里的文章、订单和设置。本篇用 mariadb-dump 导出一个业务库,再把副本导入独立测试服务器,检查它是否能恢复。适用于 Linux 上的 MariaDB 10.11、11.4 单机实例;不直接用于 MySQL、复制集切换或时间点恢复。

先分清源服务器和恢复目标

准备两套已经安装 MariaDB 的环境:源服务器保存业务数据,测试服务器使用独立实例,不运行正式网站、队列或定时任务。恢复时保留原库名,因此不能把下方导入命令拿回源服务器执行。示例库名 baole_site 全部换成你的实际业务库。

下方采用已配置好的本机 socket 管理方式:sudo mariadb 能正常登录。使用密码认证或非默认 socket 的实例,沿用现有安全登录配置,不把密码追加在命令里。先在源服务器运行:

hostname
mariadb --version
mariadb-dump --version
sudo mariadb -e "SELECT @@hostname, VERSION();"
sudo mariadb -e "SELECT ENGINE, COUNT(*) AS table_count FROM information_schema.TABLES WHERE TABLE_SCHEMA='baole_site' AND TABLE_TYPE='BASE TABLE' GROUP BY ENGINE;"

--single-transaction 的一致性保障以 InnoDB 表为前提。出现 MyISAM、MEMORY 等表时,先安排停止相关写入并确定备份方式;导出期间也不要升级程序或执行建表、删表、改表。记录源实例、版本、库名和备份开始时间。

导出成功后才生成正式备份文件

以下整段在源服务器的 Bash 中执行,目录位于当前管理员账户下,不放在网站根目录。先确认该磁盘有足够空间。

umask 077
bl_backup_dir="$HOME/baole-mariadb-backup"
mkdir -p "$bl_backup_dir"
chmod 700 "$bl_backup_dir"
bl_dump="$bl_backup_dir/baole_site-$(date +%Y%m%d-%H%M%S).sql"

if sudo mariadb-dump --single-transaction --quick \
  --routines --events --triggers --hex-blob \
  --default-character-set=utf8mb4 --databases baole_site \
  > "$bl_dump.partial" 2> "$bl_dump.err"
then
  if test -s "$bl_dump.partial"
  then
    mv -- "$bl_dump.partial" "$bl_dump"
    sha256sum "$bl_dump"
    printf '备份文件:%s\n' "$bl_dump"
  else
    printf '导出文件为空,请检查错误日志。\n'
    false
  fi
else
  printf '导出失败,保留 partial 文件和 err 日志排查。\n'
  false
fi

看到 SHA256 值后,仍要查看对应 .err 文件。有错误或不明警告时先处理,不能仅凭文件体积认定备份合格。--databases 会把原库名及创建、选择数据库的语句写入文件;这不是可随意改名导入正式实例的脚本。业务库导出也不等于备份了数据库登录账号及授权。

把副本送到独立测试服务器

通过 SFTP 下载或传送这份 SQL 到测试服务器的受控目录,保留源端备份。两端分别运行 sha256sum 文件名,结果必须相同。测试服务器先执行:

hostname
mariadb --version
sudo mariadb -e "SELECT @@hostname, VERSION(), @@global.event_scheduler;"
sudo mariadb -e "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='baole_site';"

确认当前是测试实例、版本兼容,且最后一条没有返回同名数据库。有同名库就停止,另外准备空测试实例,不删除它来腾位置。测试实例的 event_scheduler 保持 OFF 或 DISABLED;若为 ON,在确认专用于恢复演练后,进入该测试实例的MariaDB管理连接执行 SET GLOBAL event_scheduler=OFF;。这样导入的业务事件不会在演练中自动执行。

在测试服务器的 Bash 中,把下面文件路径换成已核对的副本:

umask 077
if sudo mariadb < /home/你的管理员账户/backup/baole_site-实际时间.sql 2> restore-mariadb.err
then
  printf 'SQL导入结束,请继续做数据与应用检查。\n'
else
  printf '导入失败,请先查看 restore-mariadb.err。\n'
  false
fi

导入失败可能已留下部分表。先保存错误和当前测试状态,在新的空测试实例重做;不要添加“忽略错误”参数,也不要反复向半成品库导入。遇到开头 sandbox 指令报错,核对是否用了旧 MariaDB 客户端或 MySQL 的 mysql 客户端,优先换成与备份兼容的 MariaDB 客户端。

恢复结果至少检查这几项

sudo mariadb -e "SHOW FULL TABLES FROM baole_site;"
sudo mariadb -e "SHOW TRIGGERS FROM baole_site;"
sudo mariadb -e "SHOW EVENTS FROM baole_site;"
  • 检查表、视图及业务使用的过程、函数、触发器是否齐全;涉及 DEFINER 的对象,还要核对测试环境中对应账户及权限。
  • 选关键表核对记录、中文字段、附件关联和业务汇总。若源库仍在写入,当前行数与较早备份不同不一定代表恢复错误,应按备份时间和已记录的检查点比较。
  • 需要启动测试网站时,只连接恢复库,并使用测试域名;邮件、支付、短信、队列和计划任务保持隔离,再验证登录、读取与必要的测试写入。

验收通过后,记录本次恢复使用的文件、校验值、版本和检查结果,再把备份保存到服务器之外。网站整体迁移还需要单独处理程序文件和切换后的新增数据,可继续看 网站迁移前的备份与恢复演练。