在Windows主机上定时备份远程VPS(CentOS)数据的批处理

时间:2022-03-08 02:32:46

不过折腾 VPS 之后,就不只是要备份 MySQL 了,一些独立的站点数据也是需要备份的。 
如果有靠谱的第三方 Linux 主机或类似 Amazon 的云存储,那就简单多了,Linux - Linux 的备份很方便。 
不过我想在自己的 Windows7 下每天/周运行一次备份,就有了这个小工具。 

大概的想法如下: 
使用 Putty 自带的 plink.exe 连接到 VPS 上,运行备份并退出登录; 
接着使用 Putty 自带的 pscp.exe 将备份复制到本机; 
添加一个计划任务,每天/周自动运行一次,实现定时备份。 

复制代码代码如下:


Windows 下负责触发备份的 index.bat 
@echo off & setlocal ENABLEEXTENSIONS 

:: 这里只是 SSH 连接和备份路径配置信息 
:: 请同时修改同目录下 linux 文件中要备份的路径和 MySQL 数据库 

:: SSH 相关信息 
set SERVER=192.168.1.100 
set PORT=22 
set USER=root 
set PASSWORD=password 

:: 和同目录下 linux 文件中配置的路径对应 
set BACKUP_PATH=/root/backup 

:: 备份要下载到的本机位置(会自动创建) 
set SAVE_PATH=D:\Backup\ 

:: ---------- 配置结束,以下请勿修改 ---------- 

:: 运行时变量 
set EXE_SSH=%~dp0\exe\plink.exe 
set EXE_SCP=%~dp0\exe\pscp.exe 
set LINUX=%~dp0\linux 

set YEAR=%date:~0,4% 
set MONTH=%date:~5,2% 
set DAY=%date:~8,2% 
set TRUE_PATH=%SAVE_PATH%%YEAR%-%MONTH%-%DAY%\ 

:: 创建备份路径 
echo Creating Backup Dir... 
if not exist %TRUE_PATH% ( 
mkdir %TRUE_PATH% 2>nul 

if not exist %TRUE_PATH% ( 
echo Backup path: %TRUE_PATH% not exists, create dir failed. 
goto exit 

echo Creating Backup Dir... Done. 

:: 生成备份目录和文件 
echo Connecting to remote server and creating backups... 
%EXE_SSH% -C %USER%@%SERVER% -P %PORT% -pw %PASSWORD% -m %LINUX% 2>nul 
echo Connecting to remote server and creating backups... Done. 

:: 下载备份 
echo Downloading backups... 
%EXE_SCP% -pw %PASSWORD% -P %PORT% %USER%@%SERVER%:%BACKUP_PATH%/*.* %TRUE_PATH% 
echo Downloading backups... Done. 

:exit 
echo Exit 


由 index.bat 调用的 Linux 端命令 

复制代码代码如下:


#!/bin/bash 

PATH=/usr/local/sbin:/usr/bin:/bin 

# ---------- 配置项,不要最后的 / ---------- 

# 备份文件存储的路径,请与 index.bat 中的 BACKUP_PATH 保持一致 
BACKUP_PATH=/root/backup 

# 要备份的文件或目录,多个以空格分隔 
FILES="/www/cmstop /www/dbpma" 

# mysqldump 可执行文件的全路径(如果可以直接执行 mysqldump 可不用全路径) 
MYSQLDUMP=mysqldump 

# 要备份的 MySQL 数据库,多个以空格分隔 
DATABASES="mysql test" 

# MySQL 用户名 
USER=root 

# MySQL 密码 
PASSWD= 

# ---------- 配置项结束,下面的不用修改 ---------- 

# 运行时变量 
DATETIME=$(date -d now +%Y-%m-%d) 
CURPATH=$(cd "$(dirname "$0")"; pwd) 

# 创建备份目录 
if [ ! -d $BACKUP_PATH ]; then 
mkdir -p $BACKUP_PATH 
fi 

rm -fR $BACKUP_PATH/* 

# 备份 MySQL 数据库 
cd $BACKUP_PATH 
for database in $DATABASES 
do 
if [ "$PASSWD" == "" ]; then 
$MYSQLDUMP -u$USER $database > $database.$DATETIME.dump.sql 
else 
$MYSQLDUMP -u$USER -p$PASSWD $database > $database.$DATETIME.dump.sql 
fi 
tar czf $database.$DATETIME.dump.sql.tar.gz $database.$DATETIME.dump.sql 
rm -f $database.$DATETIME.dump.sql 
done 

# 备份文件或目录 
for file in $FILES 
do 
tar czf $file.$DATETIME.tar.gz $file 
mv $file.$DATETIME.tar.gz $BACKUP_PATH 
done 

# 完成 
cd $CURPATH 
exit 


下载完成之后不删除服务器上产生的备份文件,因为下一次备份前会自动清除。 
下载和使用 下载地址
下载文件到你本机,解压到某个地方,然后根据上文的说明修改配置项; 
由于 SSH 第一次登录需要添加 Key 到本机,这一步没法简单忽略,可行的办法是载入 Putty 的 Session,不过挺麻烦的,还是运行一次简单些,我们要执行一次 SSH 登录: 

复制代码代码如下:


:: 切换到你解压到的目录,如 D:\VPS\: 
cd /d D:\VPS\ 

:: 根据情况修改下面的参数 
exe\plink.exe -C root@192.168.1.100 -P 22 -pw password 

:: 等待一下,会提示是否将 Key 加入本机信任主机列表里面,输入 yes 就可以了。 
yes 

:: 这就进去了,输入点常用命令玩玩,输入 exit 退出。 
exit 


根据这一篇文章的介绍,添加一个定时执行的计划任务; 
手动执行一下上面添加的计划任务或观察一个执行周期,看备份是否有效。 
待改进 
同之前的脚本一样,似乎还缺少一个自动删除多少天前备份的功能。