网站首页 » 网站运营 » Linux » Linux 环境实现自动备份站点文件和数据库
上一篇:
下一篇:

Linux 环境实现自动备份站点文件和数据库

站点备份是每一个站长不得不面对的事,所以自动备份就成了必备技能。这篇文章就是为了解决这个问题的。Linux 环境下网站文件和数据库的自动备份。

配置

在这里以 /home/backup 目录为例子。我们把所有备份文件(站点文件,及数据库文件.sql)都放到这里来。切换到 /home/backup (如目录不存在可新建)

cd /home/backup

.sh 关键代码

在此目录下新建一个文件名为backup.sh(文件名可以自己随便取)

vi backup.sh

执行完上面的命令行后,你进入 backup.sh 文件的编辑界面,输入i进入编辑,把下面这段代码复制上去:

#!/bin/bash
#source /etc/profile
# 进入到备份文件夹
cd /home/backup
# 创建存放备份文件和数据库的文件夹,并修改权限为777
mkdir -m 777 -p /home/backup/backup$(date +"%Y%m%d")
# 将需要备份的文件复制到备份文件夹内
cp -r /home/www/yunkus.com /home/backup/backup$(date +"%Y%m%d")/yunkus
# 导出数据库到备份文件夹内
mysqldump -uroot -p123456 databasename > /home/backup/backup$(date +"%Y%m%d")/yunkus.sql
# 压缩存放备份文件和数据库的文件夹
tar -zcvf ./backup$(date +"%Y%m%d").tar.gz ./backup$(date +"%Y%m%d")
# 以附件形式发送压缩包到指定邮箱
# echo "My-Blog-data"|mutt -s "Backup$(date +%Y-%m-%d)" -a ./backup$(date +"%Y%m%d").tar.gz xx@xx.com
# 删除备份文件夹与压缩包
# rm -rf /home/backup/backup$(date +"%Y%m%d")
# rm /home/backup/backup$(date +"%Y%m%d").tar.gz
# 删除7天前的备份
rm -rf /home/backup/backup$(date -d -7day +"%Y%m%d")
rm -rf /home/backup/backup$(date -d -7day +"%Y%m%d").tar.gz

-u后改成你的数据库的帐号名,-p后面的改成你的数据库密码,后面的 databasename 改成你想要备份的数据库名。如果想备份所有数据库,你可以把 databasename 改成 –all-databases 。#注释了几行代码,如果你有需要也可以自行修改。

:wq保存即出。

前面的cd /home/backup 是为了解决tar 压缩时提示:tar: Removing leading `/’ from member names 的问题。因为切换到当前目录后,tar 要压缩的源文件就可以用相对路径表示了。这样做还有一个好处,解压压缩包时,文件目录不会太深。这是什么意思?比如我们把上面的压缩命令行改成绝对路径:

tar -zcvf ./backup$(date +"%Y%m%d").tar.gz /home/backup/backup$(date +"%Y%m%d")

压缩完后,解压出来会多了两层目录/home/backup/。即你的备份文件所在的目录为\home\backup\backup20170310。而用相对路径则不会出现这种情况, backup20170310 这个目录就是顶级目录了。其实里面的所有在/home/backup/目录下都可以改成相对目录,就看你个人喜欢。但在这里我建议除了tar 命令行中使用相对路径外,其它地方最好使用绝对路径。因为如果前面的cd /home/backup 这行命令由于某些我们不知道的原因出现意外没执行成功,那么后面如果都是写成了相对路径,很可能就会在其它目录下创建一些文件,或者碰巧删除了同名的文件。

还有关于数据备份的这行代码:

mysqldump -uroot -p123456 databasename > /home/backup/backup$(date +"%Y%m%d")/yunkus.sql

我所看到过的网上所有的教程都不是像我这样写的,你按网上的在 mysqldump 前面加一个目录是不正确的,如:

/usr/local/mysql/bin/mysqldump -uroot -p123456 databasename > /home/backup/backup$(date +"%Y%m%d")/yunkus.sql

系统会提示:

报错

/usr/local/mysql/bin/mysqldump: No such file or directory

到此, .sh 文件已经配置完成。下面我们来看看 crontab 文件。

执行如下命令行:

cat /etc/crontab

会输出如下结果:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

从中我们可以看到定时执行文件的基本套路。接着就是配置定时执行这个 .sh 文件的 crontab 文件。你可以执行下面的代码:

crontab -e

执行命令行后会进入编辑界面。复制下面的代码放进去:

0 2 * * * /home/backup/backup.sh

:wq退出保存。

上面的代码的意思就是每天凌晨2点开始备份。更多时间设置可自行到网上查看,这里就不一一展开了。

刚通过crontab -e编辑的这个文件会保存在/var/spool/cron/下。在这个目录下会有一个以当前用户命名的文件。你可以打开看看,跟你刚才编辑的内容是一样的。注意:这个目录只有 root 用户才可以访问。切换到/var/spool/cron/下后你就会看到以对应用户命名的文件,如果你不知道我之前是用哪个用户创建的,那么就可以逐一打开对应用户的文件,如果里面有你编辑的内容,那就你之前就用这个来编辑的。

直接执行 .sh 文件

sh backup.sh

如果 .sh 文件没有按时执行,那么我们可以用排除法找出问题。

可能的原因:1、没有权限执行 .sh 文件;2、cron 服务是否已经开启。

如果不是用 root 的帐号执行 backup.sh ,很有可能会提示你没有权限作相关的操作(比如:删除)。

改成如下命令行:

sudo sh backup.sh

如果有执行,并 backup 目录下有出现了备份文件,那么就说明 .shell 脚本内容写得没有错。

为什么前面加 sudo 就可以?sudo 就是以 root 的来执行命令行,从这里就可以看出问题应该是在权限。那到底是哪里出现了权限问题呢?我们后面接着说。

问题排除

1、是否有执行

判断自动任务有没有执行,可以通过下面这个命令行来查看执行记录:

tail -f /var/log/cron

查看 crond.service 服务状态(下面的命令行二选一)

// 命令一:
service crond status
// 命令二:
/bin/systemctl status  crond.service

看到 Active: active (running) 字样说明 crond.service 服务正在运行。

查看 crond.service 服务运行记录

cat /var/log/cron

相关命令行整理

//编辑 crontab 文件
crontab -e

//查看定时执行日志
cat /var/log/cron

//邮箱查看执行结果(username 改成你要查看邮件的用户名,当定时执行出问题时,可以查看用户邮件)
cat /var/spool/mail/username

// 重载配置
/bin/systemctl reload crond.service

// 重启服务
/bin/systemctl restart crond.service

// 启用服务
/bin/systemctl start crond.service

// 停止服务
/bin/systemctl stop crond.service

crontab 参数

选项 套路 作用
-u crontab -u root -l 设定某个用户的 crond.service 服务,需要 root 权限
-e crontab -e 编辑执行列表信息
-l crontab -l 列出执行列表信息
-r crontab -r 删除执行列表信息
-i crontab -i 删除前弹出提示信息

更新于:15:33 2017/3/10

2、用户权限

可能配置完后,你会遇到各种问题,最多的情况就是 .sh 没效果。这里有几个原因:网上说得比较多的原因有两个:

网友智慧

1.环境变量的问题。

2.权限的问题。

对于第一个问题我估计也不用怎么说了,因为这个问题在默认的情况下是不会出现的(只是我个人见解,因为我的 linux 是没问题的),并且网上关于这个问题的文章也不少。

对于第二个权限问题就需要注意了,还是怪自己对权限的理解不是很到位,导致配置这个定时服务耗费了我差不多两天时间,关于这个问题的具体原因网上也没有细说,所以有必要分享到互联,丰富互联网资源。

如果出现一直定时执行不见效果,你可以反复研读下面的这段话,直到完全明白。

在配置完 crontab 文件以及 .sh 文件后你得保证你对 .sh 文件的执行权限,如果你的 .sh 文件里的命令行有修改文件等操作的,你还得对要修改的文件有操作权限 。除此之外,你还必需保证有权限操作目标目录也就是本例子中用于存放备份文件的目录(backup 目录),这就是我踩的坑,多么简单的问题,却差点就让我有了从入门到放弃的壮举。

比如:你用 yunkus (当然,这个用户需要有sh 执行权限)这个用户创建了crontab 文件,也就是上面的定时执行命令行,那么系统到点时自动执行就会以这个用户的身份去执行命令。所以你得保证这个用户对它所需要操作的目录有相应的权限。这里你要关注三个目录的权限问题,1、目标目录(需要备份的目录);2、备份存放目录; 3、 yunkus 用户创建的 .sh 文件。当这两个目录及一个文件都设置了拥有者有读、写和执行权限后,你就可以真的用命令行:sh backup.sh 来执行备份命令行了。而不需要再在前面加上 sudo 了,因为你刚才已经设置了相关文件及目录拥有者的读写、执行权限了。

总结:

智慧沉淀

1.在 Linux 中绝大多数问题都是权限问题。

2.网上说修改完 crontab 文件后需要重启像前前面介绍的命令行,但在实践使用中是不用重启的 crond.service 服务,修改完 crontab 文件保存退出系统会提示:crontab: installing new crontab,这就说明系统已经更新了crontab 文件。

送给你同时也送给我自己:Linux 权限很重要,Linux 权限很重要,Linux 权限很重要……

  • 微信扫一扫,赏我

  • 支付宝扫一扫,赏我

声明

原创文章,不经本站同意,不得以任何形式转载,如有不便,请多多包涵!

本文永久链接:http://yunkus.com/linux-auto-backup-website-files-and-database/

Leave a Reply

Your email address will not be published. Required fields are marked *

评论 END