写在前面

就在前两天,因为我自己的操作不当,导致我的两台服务器进了脏东西,因为重装的时候忘记了备份部分数据库数据,导致两台服务器相继重装了两次并且丢失了部分数据库数据。

是何原因

两天前,我在使用C语言复写我的那个Linux运维工具箱,不知道的可以找找我之前的那篇文章,因为我是直接服务器上面用GCC编译的C程序,所以我的全部编写过程都是在服务器上面进行的。

中途因为指针的一些原因把系统底层的部分文件删掉了,而且我还不知道它执行了,并且还用的高级管理员ROOT权限,当时就因为这个,写了一个上午的东西全部白干。

重装过程

在阿里云那边重装完服务器过后,我果断地使用SSH工具连接我的服务器,这里推荐一个SSH连接工具:FinalShell,真的非常好用。

连接过后,我使用一键安装命令先把宝塔面板给安装上了,然后用工具箱安装各种软件和依赖包,就因为这个,我恢复运营的速度加倍再加倍,最后,从重装服务器到正式恢复运营只用了俩个小时(打破记录!!!)

反思总结

经历了这次事件过后,我作出了如下反思:首先就是我给C程序的文件全部都赋予的超级管理员ROOT权限,并且忘记了先检查代码之后确保无误再运行,这个是最主要的。

其次就是没有经常给服务器备份数据,导致这次事件过后仍有一些数据库的数据没有完全恢复。

编写程序

为防止事件的再一次发生,我编写了一个程序,他可以每天晚上或者凌晨自动将你的主力服务器上的文件打包并同步到你的备用服务器上面,效果如下图:

原理解析

在需要备份的服务器上面,我们先压缩需要备份的文件夹并设置为无返回结果模式。

zip -r -x="/www/backup/site/*" -x="/www/backup/file_history/*" /www/backup.zip /www/backup/ > /dev/null

然后将压缩后的备份文件移动到网站目录,这里的网站目录需要自己手动创建,以便同步的服务器能够正常访问并拉取备份文件。

mv -f /www/backup.zip /www/BackupFiles/你的服务器IP/

然后我们再备份网站数据,这里因为node和npm生成的文件太多了,我对 node_modules这个目录做了屏蔽。

zip -r -x="/www/wwwroot/你的网站目录/node_modules/*" -x="/www/wwwroot/你的网站目录/node_modules/*" /www/wwwroot.zip /www/wwwroot/ > /dev/null

然后将压缩后的备份文件移动到网站目录,这里的网站目录同样也需要需要自己手动创建,以便同步的服务器能够正常访问并拉取备份文件。

mv -f /www/wwwroot.zip /www/BackupFiles/你的服务器IP/

在需要同步的服务器上面,我们先检查一下备份目录是否存在,如果不存在就自动创建一个备份目录。

if [ ! -d "/www/yichen9247/BackupFiles" ]; then
    mkdir /www/yichen9247/BackupFiles
fi

其次,我们再切换到任一目录,主要是怕从主力服务器那边拉取过来的备份文件找不到路径。

cd /www/yichen9247/

然后我们再从备份服务器上面拉取最新的备份文件,并将他移动到备份目录中。

wget -c http://你的备份服务器域名/你的服务器IP/backup.zip > /dev/null 2>&1

mv -f /www/yichen9247/backup.zip /www/yichen9247/BackupFiles

然后我们再从备份服务器上面拉取最新的网站备份文件,并将他移动到备份目录中。

wget -c http://你的备份服务器域名/你的服务器IP/wwwroot.zip > /dev/null 2>&1

mv -f /www/yichen9247/wwwroot.zip /www/yichen9247/BackupFiles

完整代码

将以下代码复制粘贴到各服务器上并用宝塔面板的计划任何功能执行即可。

echo "===============即时文件备份助手=================="

printf "\n"

echo " —正在开始压缩文件—"

zip -r -x="/www/backup/site/*" -x="/www/backup/file_history/*" /www/backup.zip /www/backup/ > /dev/null

printf "\n"
echo " —正在开始移动文件—"

mv -f /www/backup.zip /www/BackupFiles/你的服务器IP/

printf "\n"
echo " —正在开始压缩文件—"

zip -r -x="/www/wwwroot/你的网站目录/node_modules/*" -x="/www/wwwroot/你的网站目录/node_modules/*" /www/wwwroot.zip /www/wwwroot/ > /dev/null

printf "\n"
echo " —正在开始移动文件—"

mv -f /www/wwwroot.zip /www/BackupFiles/你的服务器IP/

printf "\n"
echo " —文件已经备份成功—"

printf "\n"

echo "==============================================="
echo "===============即时文件同步助手=================="

if [ ! -d "/www/yichen9247/BackupFiles" ]; then
    mkdir /www/yichen9247/BackupFiles
fi

cd /www/yichen9247/

printf "\n"
echo " —正在下载备份文件—"

wget -c http://你的备份服务器域名/你的服务器IP/backup.zip > /dev/null 2>&1

printf "\n"
echo " —正在移动备份文件—"

mv -f /www/yichen9247/backup.zip /www/yichen9247/BackupFiles

sleep 10

printf "\n"
echo " —正在下载备份文件—"

wget -c http://你的备份服务器域名/你的服务器IP/wwwroot.zip > /dev/null 2>&1

printf "\n"
echo " —正在移动备份文件—"

mv -f /www/yichen9247/wwwroot.zip /www/yichen9247/BackupFiles

printf "\n"
echo " —文件已经同步成功—"

curl -s http://你的邮件服务器域名/sendmail.php?token=你的自定义key > /dev/null 2>&1

printf "\n"
echo " —通知邮件发送成功—"

printf "\n"

echo "==============================================="

最后想说

数据无价,请保存好您的数据文件以防丢失,数据不备份,最后两行泪。