从0到1,教你实现备份网站&数据的2个办法!

服务器有价,数据无价。网站的备份是至关重要的,前不久,在一个站长群里听某个人说3年的网站数据丢失了,没有做好备份,很心痛 ,听着好惨。今天就来说一下网站的备份方法。这篇文章我们将从0到1,自己设计一下网站的备份(疯狂的解决问题和学知识点)

一般来说,我们要备份的就是网站目录和数据库文件,对于宝塔用户而言,备份网站和备份数据库很简单。因为在计划任务这里。都有,只需要配置好时间即可。当然了,很关键的一点是,宝塔备份是备份在了服务器本机。然而如果备份在服务器本机,那和不备份实际上区别也不大。

最初我的备份思路是将宝塔备份的文件到服务器本机上的数据,通过定时任务和SCP给发送到另一台服务器。这样的话多一重保障 。 但是考虑到有部分粉丝可能没有这么多服务器,所以我先说一下将备份的文件发送到邮箱。这样也是比较好的方案,各个邮箱接受的附件都有大小限制,如果文件太大就不能用这种办法。 接下来我们就自己实现备份,发送到邮箱

前置条件:如果要用linux服务器发送邮件,可以使用mutt 。只需要 sudo yum install mutt 安装一下即可。 安装完后我们可以输入以下内容来验证是否可以发送成功。 echo "This is the mail body" | mutt -s "Subject" atonXXX@163.com 如下图这样就是代表成功了。

有的同学估计在测试发送时候会遇到诸如: Bad IDN in "from": 'VM-4-7-centos.�’ 这时候只需要 vim /etc/Muttrc 把里面的from 更改设置一下即可。

  1. 我们先建一个自己存放备份的目录。在这个目录里我们执行压缩网站目录的命令。当然切记我们生成压缩文件时候带上日期,免得日后不认识了。 tar -zcvf /你的存放路径/$(date +%Y%m%d-%H%M).tar.gz /www/wwwroot/你的网站目录/ 执行完命令后就可以看到在当前目录生成了 备份压缩文件
  1. 网站目录备份完毕,我们接下来还要备份数据库。输入以下命令即可,依旧在文件名上带上日期。 mysqldump --no-tablespaces -u 用户名 --password=密码 数据库 > $(date +%Y%m%d-%H%M)backup.sql
  1. 至此,我们要备份的东西就准备好了。接下里我们发到邮件。

执行命令 : echo (date +%Y%m%d-%H%M)的数据备份已到达 | mutt atoXX3@163.com -s "网站备份" -a /hu/backup/.gz -a /hu/backup/.sql

`` 可恶,报错了。原因是文件太大了,发送失败。这时候不要慌。

代码语言:javascript
复制
postdrop: warning: uid=0: File too large
sendmail: fatal: root(0): message file too big
Error sending message, child exited 75 (Deferred.).
Could not send the message.

我们执行命令 vim /etc/postfix/main.cf 然后再这个配置文件处新增配置 message_size_limit = 512000000 后:wq保存退出即可。 它的单位是bytes。512000000这个换算下来是488MB左右,如果你有更大的需求,按需更改就行。 还需要新增一个配置mailbox_size_limit=512000001 。 其实只要保证这个配置的值比刚刚的大就行。 保存之后需要重启服务,输入 service postfix restart 即可。

5.然后再次执行发送命令。当终端上输出我有一个邮件到达XX /var/spool/mail/root 时候,我就感觉不妙。果然一看日志发送又失败了。原因是超过了网易接收的最大70MB的限制

  1. 我单独试一下发送sql 的命令。

echo (date +%Y%m%d-%H%M)的数据备份已到达 | mutt XXX@163.com -s "网站备份" -a /hu/backup/*.sql 发现是OK的。我们来邮箱检查一下,很完美。

  1. 所以如果是小的网页压缩的话,且压缩后空间不大,可以使用邮箱进行备份,若备份文件太大无法邮箱,则使用以下的第二种方法。 到这一步,我们使用SCP的方式来吧当前A服务器的备份文件发送到B,不用宝塔的备份文件,我们自己打包

执行命令: scp local_file remote_username@remote_ip:remote_folder 在执行时候会要求你输入B服务器的ssh密码。我们输入后他就会进行传输了。请确保B服务器的保存路径存在。 一把通过,成功了!

主流程已通,下一步我们要通过定时任务+脚本的方式来解决这个问题。在这之前,我们需要配置A服务器SSH访问B不需要输入密码,不然就无法后台定时任务运行了。

  • 在A服务器上输入 ssh-keygen -t rsa 一路回车 检查在/root/.ssh路径下产生了。id_rsa,id_rsa.pub
  • 然后执行 cat id_rsa.pub >> authorized_keys 生成这个authorized_keys 文件
  • 再执行 scp id_rsa.pub authorized_keys root@IP:/root/.ssh/ 把这个文件传输给B
  • 之后的ssh 和scp就无需输入密码就可以连接了。

我这里设置了发送成功后的钉钉通知,以及删掉本地服务器的打包的备份文件(节约点空间),执行脚本后,A服务器没有备份文件,B有备份文件,且钉钉通知正常,最终的脚本如下:

代码语言:javascript
复制
#!/bin/bash

cd /hu/backup
nohup tar -zcvf /hu/backup/$(date +%Y%m%d-%H%M).tar.gz /www/wwwroot/网站目录/
nohup mysqldump --no-tablespaces -u 用户名 --password=你的密码 你的库 > $(date +%Y%m%d-%H%M)backup.sql

scp *.sql *.gz remotUser@remoteIp:/hustudy/backup

rm -rf /hu/backup/.gz
rm -rf /hu/backup/
.sql
curl 'https://oapi.dingtalk.com/robot/send?access_token=daXXXXX4f2d0b7d9dc1fd0393939e656c'
-H 'Content-Type: application/json'
-d '{
"at": {
"atMobiles":[
"你的手机"
],
"atUserIds":[

    ],
    "isAtAll": false
},
"text": {
    "content":"[备忘]大帅比,你的本月备份已完成"
},
"msgtype":"text"

}'

然后我又配置一个定时任务 30 0 8-14,22-28 * 5 配置的是每双周的0:30执行一次。


这样,我们的最终备份方案是:

宝塔每周备份一次网站,存放在服务器本机上


每双周0点30,A服务器进行备份,且打包发送给B服务器

今日的分享就完毕了~

创作不易,如果您觉得这篇文章对你有帮助,不妨给我点个赞,这将是我继续分享优质内容的动力。