Linux VPS主机自动备份网站和数据库脚本通用版-自动备份谷歌网盘,阿里云OSS等

数据是无价的。我们使用Linux VPS主机建站的话一定要注意经常备份自己的网站文件和数据库。一般来说,如果你建站环境用的是Oneinstack和LNMP一键包的话,都会自带备份功能。VPS主机面板例如宝塔BT面板等自动备份功能也提供备份功能。

本文以 Linux VPS 上的网站文件和 MySQL 数据库为例,介绍如何归档、加密并上传到 Google Drive 或阿里云 OSS,再从异地备份验证恢复。

Linux VPS主机自动备份网站和数据库脚本通用版-自动备份谷歌网盘,阿里云,Dropbox等

更多的关于网站备份和恢复的文章还有:

  1. 巧用又拍云FTP和坚果云WebDAV-打造个人文件备份和数据云存储
  2. cPanel和DirectAdmin面板备份和恢复方法-cPanel和DirectAdmin搬家
  3. SolusVM KVM VPS主机迁移搬家方法-SolusVM KVM备份恢复教程

PS:2026年11月4日更新,更新了网站和数据库的加密备份方法、Google Drive 和阿里云 OSS 的配置及上传校验步骤,并补充了隔离恢复流程。

PS:2020年3月19日更新,如果你想在本地Windows电脑上挂载各种网盘,当成本地硬盘使用,参考: 本地网络磁盘RaiDrive挂载Dropbox,Google Drive,OneDrive支持WebDAV,FTP,SFTP 。

一、Linux VPS一键备份脚本

1.1 backup.sh下载

下面是原文介绍的 backup.sh 功能,供维护旧备份时参考。具体支持范围与默认配置以所用版本为准。

1、支持 MySQL/MariaDB/Percona 的数据库全量备份或选择备份;
2、支持指定目录或文件的备份;
3、支持加密备份文件(需安装 openssl 命令,可选);
4、支持上传至 Google Drive(需先安装 gdrive 并配置,可选);
5、支持在删除指定天数本地旧的备份文件的同时,也删除 Google Drive 上的同名文件(可选)。

旧版脚本源见 backup.sh 原始链接:https://github.com/teddysun/across/raw/master/backup.sh 和 原文备用链接:https://raw.githubusercontent.com/freehao123/across/master/backup.sh。使用前从维护者处确认固定版本和可信校验值,先检查脚本内容和远端删除策略。下面假定已设置相应的 HTTPS 下载地址和 SHA-256。

# 先设置固定版本的下载地址和可信 SHA-256
: "${BACKUP_SCRIPT_URL:?请设置固定版本的 HTTPS 下载地址}"
: "${BACKUP_SCRIPT_SHA256:?请设置可信的 SHA-256}"
curl --fail --location --proto '=https' --proto-redir '=https' \
  --output backup.sh "$BACKUP_SCRIPT_URL" &&
  printf '%s  %s\n' "$BACKUP_SCRIPT_SHA256" backup.sh | sha256sum --check --strict

1.2 backup.sh配置

以下变量用于识别旧版 backup.sh 配置。新任务使用专用数据库备份账号,通过权限为 0600 的客户端配置文件提供凭据。先核对站点目录、必要的 Nginx 和 PHP-FPM 配置及排除项。含有凭据或个人数据的归档应在上传前加密。

ENCRYPTFLG (加密FLG,true 为加密,false 为不加密,默认是加密)
BACKUPPASS (加密密码,重要,务必要修改)
LOCALDIR (备份目录,可自己指定)
TEMPDIR (备份目录的临时目录,可自己指定)
LOGFILE (脚本运行产生的日志文件路径)
MYSQL_ROOT_PASSWORD (MySQL/MariaDB/Percona 的 root 用户密码)
MYSQL_DATABASE_NAME (指定 MySQL/MariaDB/Percona 的数据库名,留空则是备份所有数据库)
BACKUP (需要备份的指定目录或文件列表,留空就是不备份目录或文件)

LOCALAGEDAILIES (指定多少天之后删除本地旧的备份文件,默认为 7 天)
DELETE_REMOTE_FILE_FLG (删除 Google Drive 或 FTP 上的备份文件 FLG,true 为删除,false 为不删除)

FTP_FLG (上传文件至 FTP 的 FLG,true 为上传,false 为不上传)
FTP_HOST (连接的 FTP 域名或 IP 地址)
FTP_USER (连接的 FTP 的用户名)
FTP_PASS (连接的 FTP 的用户的密码)
FTP_DIR (连接的 FTP 的远程目录,比如: public_html)

※ MYSQL_DATABASE_NAME 是一个数组变量,可以指定多个。举例如下:

MYSQL_DATABASE_NAME[0]=”phpmyadmin”
MYSQL_DATABASE_NAME[1]=”test”

※ BACKUP 是一个数组变量,可以指定多个。举例如下:

BACKUP[0]=”/data/www/default/test.tgz”
BACKUP[1]=”/data/www/default/test/”
BACKUP[2]=”/data/www/default/test2/”

1.3 backup.sh备份

以下是生成网站归档与加密 SQL 的 Bash 示例。先替换站点路径和数据库名,准备仅备份账号可访问、位于网站目录之外的备份目录和配置文件。备份机只需要 age 公钥,私钥在独立环境保管。

set -euo pipefail
umask 077
site=/srv/www/example.com
db=example_wp
recipient=/etc/site-backup/age-recipient.txt
mysql_cnf=/etc/site-backup/mysql.cnf
backup_root=/var/backups/site
run=$(date -u +%Y%m%dT%H%M%SZ)
work="$backup_root/$run"
mkdir -- "$work"
cd -- "$work"

tar -C "$site" -cf - . |
  age -R "$recipient" -o website.tar.age

mysqldump --defaults-extra-file="$mysql_cnf" \
  --default-character-set=utf8mb4 --single-transaction --quick --no-tablespaces "$db" |
  gzip -c |
  age -R "$recipient" -o database.sql.gz.age

sha256sum website.tar.age database.sql.gz.age > SHA256SUMS

示例按数据库名导出。先核实表引擎、导出账号权限以及视图、触发器、存储过程和事件的覆盖范围,并在清单里列出排除项。InnoDB 使用 --single-transaction 时应避免并行 DDL。MyISAM 等非事务表需另行安排锁表或停写窗口。必要的 LNMP 配置可另行归档加密并计入 SHA256SUMS。下图是旧版归档示例。MySQL 导出说明:https://dev.mysql.com/doc/refman/8.4/en/mysqldump.html

Linux VPS主机自动备份查看备份

若需恢复旧版 OpenSSL 归档,在隔离目录中按原归档的加密参数解密,通过交互提示输入口令。下面的摘要参数只适用于按该参数生成的旧归档。

umask 077
openssl enc -aes-256-cbc -d -md sha1 -in legacy-backup.tgz.enc -out recovered.tar.gz

二、Rclone备份同步Google Drive

Rclone:

  1. 官网:https://github.com/ncw/rclone 
  2. 教程:https://wzfou.com/rclone-cos-fuse-ossfs/

rclone 支持多种网盘和对象存储。以下菜单摘录用于辨认旧配置,当前后端选项请查阅 rclone 官方文档:https://rclone.org/。

1 / 1Fichier
   \ “fichier”
2 / Alias for an existing remote
   \ “alias”
3 / Amazon Drive
   \ “amazon cloud drive”
4 / Amazon S3 Compliant Storage Provider (AWS, Alibaba, Ceph, Digital Ocean, Dreamhost, IBM COS, Minio, etc)
   \ “s3”
5 / Backblaze B2
   \ “b2”
6 / Box
   \ “box”
7 / Cache a remote
   \ “cache”
8 / Citrix Sharefile
   \ “sharefile”
9 / Dropbox
   \ “dropbox”
10 / Encrypt/Decrypt a remote
   \ “crypt”
11 / FTP Connection
   \ “ftp”
12 / Google Cloud Storage (this is not Google Drive)
   \ “google cloud storage”
13 / Google Drive
   \ “drive”
14 / Google Photos
   \ “google photos”
15 / Hubic
   \ “hubic”
16 / JottaCloud
   \ “jottacloud”
17 / Koofr
   \ “koofr”
18 / Local Disk
   \ “local”
19 / Mail.ru Cloud
   \ “mailru”
20 / Mega
   \ “mega”
21 / Microsoft Azure Blob Storage
   \ “azureblob”
22 / Microsoft OneDrive
   \ “onedrive”
23 / OpenDrive
   \ “opendrive”
24 / Openstack Swift (Rackspace Cloud Files, Memset Memstore, OVH)
   \ “swift”
25 / Pcloud
   \ “pcloud”
26 / Put.io
   \ “putio”
27 / QingCloud Object Storage
   \ “qingstor”
28 / SSH/SFTP Connection
   \ “sftp”
29 / Transparently chunk/split large files
   \ “chunker”
30 / Union merges the contents of several remotes
   \ “union”
31 / Webdav
   \ “webdav”
32 / Yandex Disk
   \ “yandex”
33 / http Connection
   \ “http”
34 / premiumize.me
   \ “premiumizeme”

2.1 申请Google API

  1. https://console.developers.google.com/

启用 Google Drive API 后,按 Google 桌面应用 OAuth 文档:https://developers.google.com/identity/protocols/oauth2/native-app 创建 Desktop 客户端。长期自动备份需要确认应用发布状态与账号适用范围。以下是 2020 年的说明和界面截图,供查找旧配置时参考。

Log into the Google API Console with your Google account. It doesn’t matter what Google account you use. (It need not be the same account as the Google Drive you want to access)

Select a project or create a new project.

Under “ENABLE APIS AND SERVICES” search for “Drive”, and enable the “Google Drive API”.

Click “Credentials” in the left-side panel (not “Create credentials”, which opens the wizard), then “Create credentials”, then “OAuth client ID”. It will prompt you to set the OAuth consent screen product name, if you haven’t set one already.

Choose an application type of “other”, and click “Create”. (the default name is fine)

It will show you a client ID and client secret. Use these values in rclone config to add a new remote or edit an existing remote.

旧控制台的 Drive API 启用与凭据入口如下。

Linux VPS主机自动备份申请API
Linux VPS主机自动备份凭据

下图是旧版 OAuth 客户端创建入口。

Linux VPS主机自动备份客户端

旧界面把桌面客户端显示为“其它”。按当前控制台的 Desktop 选项操作。

Linux VPS主机自动备份类型为其它

客户端 ID 和密钥用于配置 rclone。请保护密钥和授权令牌。

Linux VPS主机自动备份得到ID和Key

2.2 Rclone配置谷歌网盘

在 rclone config 中创建 Google Drive remote。优先评估 drive.file,用该客户端创建专用目录。已知目录 ID 也可能无权访问其他应用创建的目录。服务器没有浏览器时,按文档在本地浏览器完成远程授权。rclone Google Drive 配置:https://rclone.org/drive/

# 创建名为 drive-backup 的 Google Drive remote
rclone config

# 核对授权后可访问的目录
rclone lsd drive-backup:

下图保留了当年的浏览器授权界面。完成当前授权后,确保 rclone 配置仅供执行备份的账号读写。

Linux VPS主机自动备份浏览器验证

2.3 同步备份Google Drive

把下面的命令接在归档步骤之后。每次使用独立目录,先核对 remote 的根路径。--immutable 拒绝修改内容不同的同名对象。

remote="drive-backup:website-backups/$run"
rclone copy --immutable --exclude '/SUCCESS' "$work" "$remote"
rclone check --download --exclude '/SUCCESS' "$work" "$remote"
printf '%s\n' "$run" > "$work/SUCCESS"
rclone copyto --immutable "$work/SUCCESS" "$remote/SUCCESS"

rclone check --download 下载并比对内容。首次上传应验证读回,后续可结合流量预算定期执行。只有读回检查通过后才写入 SUCCESS。rclone check 官方说明:https://rclone.org/commands/rclone_check/

Linux VPS主机自动备份查看复制过来的文件

三、Rclone备份同步阿里云OSS

3.1 申请阿里云OSS API

在目标地域创建专用 Bucket,关闭公开访问。下图保留旧控制台的身份配置入口。

Linux VPS主机自动备份阿里云OSS

为备份账号授予指定 Bucket 或前缀的上传与核验权限。下图是旧版权限页面,实际授权按最小权限配置。

Linux VPS主机自动备份赋予权限

3.2 Rclone配置阿里云OSS

在 rclone config 中选择 S3 兼容后端和 Alibaba OSS provider。以下为旧版菜单截图,当前选项以文档为准。rclone S3 后端文档:https://rclone.org/s3/

Linux VPS主机自动备份选择类型

填入与 Bucket 地域匹配的 Endpoint 及专用账号凭据。

Linux VPS主机自动备份选择地域

最后确定完成Rclone配置阿里云OSS。

Linux VPS主机自动备份完成配置

3.3 同步备份到阿里云OSS

使用 OSS 时,在前面的上传片段中替换 remote,其余校验流程保持一致。

# 将 example-bucket 替换为实际 Bucket
remote="oss-backup:example-bucket/website-backups/$run"

上传后核对异地目录和归档读回结果。演练恢复时,选择存在成功标记且哈希清单核验通过的版本。

Linux VPS主机自动备份同步的文件

四、Rclone自动备份同步到网盘

Rclone实现在自动备份和同步到谷歌网盘,阿里云,Dropbox等就需要用到Linux定时任务了,有关于定时任务的用法,请参考:Linux Crontab命令定时任务基本语法与操作教程-VPS/服务器自动化。

把归档、上传和验收放进同一个 Bash 脚本。下面以 Linux cron 为例,使用同一个锁文件避免并行写入。按服务器的调度时区解释 01:10,并预先创建仅备份账号可写的状态与日志目录。Google Drive 示例:

10 1 * * * /usr/bin/flock -n /var/lib/site-backup/backup.lock /bin/bash /usr/local/lib/site-backup/backup-drive.sh >> /var/log/site-backup/drive.log 2>&1

使用阿里云 OSS 时,可将上一条替换为以下任务。脚本出错时保留非零退出码和错误日志。

10 1 * * * /usr/bin/flock -n /var/lib/site-backup/backup.lock /bin/bash /usr/local/lib/site-backup/backup-oss.sh >> /var/log/site-backup/oss.log 2>&1

也可用 systemd timer 调用同一个备份脚本。保留失败日志,并对任务失败或长期未成功设置告警。

五、总结

一般来说我们用的建站脚本或者是VPS主机面板都会自带了自动备份功能,不过backup.sh具有普遍适用性,它可以自定义备份路径、数据库等等,可以设置保存的时长,适用于各种建站环境。

rclone sync 会让目标匹配源目录,可能删除目标中多出的文件。日常异地备份采用按次归档和 rclone copy --immutable,历史清理由独立策略管理。--ignore-existing 会跳过同名对象,包括内容已改变的对象。rclone copy 官方说明:https://rclone.org/commands/rclone_copy/

隔离恢复演练

  1. 从同一个日期目录下载归档、SHA256SUMS 和 SUCCESS,运行 sha256sum --check --strict SHA256SUMS。
  2. 在隔离机器使用私钥解密网站归档。检查 tar 成员路径和链接后,以非 root 账号解包到空目录,再恢复单独保存的配置。
  3. 将数据库归档解密并经 gzip -dc 解压,导入隔离的 MySQL 实例。检查各阶段退出码并核对清单中的数据库覆盖和遗漏。
  4. 抽查文章、评论、图片、主题和插件,验证登录和固定链接。隔离外部回调和邮件发送,记录恢复耗时及问题。

文章出自:挖站否 https://wzfou.com/linux-vps-beifen/,版权所有。本站文章除注明出处外,皆为作者原创文章,可自由引用,但请注明来源。

VPS主机一键备份脚本backup.sh-自动备份到OneDrive/Dropbox等各大网盘 Linux VPS挂载Google Drive和Dropbox-实现VPS主机数据同步备份

分享到:
Avatar for Qi
关于站长(Qi),2008年开始混迹于免费资源圈中,有幸结识了不少的草根站长。之后自己摸爬滚打潜心学习Web服务器、VPS、域名等,兴趣广泛,杂而不精,但愿将自己经验与心得分享出来与大家共勉。
已有 13 条评论
  1. 本地备份曾遇到过丢失的情况,现在用rclone每天同步到onedrive就放心了。

    2020年12月15日 17:14顶 踩 回复
    • Avatar for Qi Qi

      我现在用Nextcloud

      2020年12月17日 15:07顶 踩 回复
  2. Avatar for 哒哒哒 哒哒哒

    May 15 01:56:01 active-bump-1 CRON[7920]: (root) CMD (/bin/bash /home/backups/backups.sh > /tmp/out.log5 2>&1)

    Debian的定时请教为啥不执行啊 [泪]

    2020年5月15日 02:05顶 踩 回复
    • Avatar for Qi Qi

      应该是没有设置环境变量,这个脚本要根据Linux的变量来调整。

      2020年9月24日 12:54顶 踩 回复
  3. 我通常用tar和mysqldump打包然后下到本地来的,或者放阿里云OSS的低频访问

    2020年4月2日 17:21顶 踩 回复
  4. Avatar for newone newone

    备份,备份,备份,重要的要说3遍

    2020年3月7日 20:13顶 踩 回复
  5. Avatar for Rhilip Rhilip

    teddysun的备份脚本在2020 年 2 月 8 日的更新中就把gdrive改成了rclone,你这3月份的文章咋还需要额外配置rclone的crontab?

    2020年3月7日 10:42顶 踩 回复
    • Avatar for Qi Qi

      定时发布的。

      2020年9月24日 12:55顶 踩 回复
  6. 一直没咋备份网站。

    2020年3月6日 20:31顶 踩 回复
  7. Avatar for saber saber

    备份要勤快。

    2020年3月5日 15:20顶 踩 回复
  8. 可惜我国内的主机只能放oss

    2020年3月5日 10:30顶 踩 回复
    • Avatar for Qi Qi

      阿里云的存储也可以,我也在用。

      2020年3月6日 13:28顶 踩 回复

Login

Welcome! Login in to your account

Remember me Lost your password?

Don't have account. Register

Lost Password

Register