一、教程内容
Debian下定时自动备份Mysql数据库,把写入的文章等数据备份一份。
二、操作方法
1、在服务器下建立三个文件夹
mkdir /bak
mkdir /bak/bakmysql
mkdir /bak/bakmysqlold
2、建立shell脚本,更改文件权限
touch /bak/bakmysql/backup.sh
chmod 755 /bak/bakmysql/backup.sh
3、编辑/bak/bakmysql/backup.sh,内容如下:
(1)保存旧的备份
(2)备份今天的
(3)如果发现七天前的旧备份存在,则删除它。这样保证了只备份7天的数据库内容。
#!/bin/sh
cd /bak/bakmysql
echo "You are in bakmysql directory"
mv bakmysql* /bak/bakmysqlold
echo "Old databases are moved to bakmysqlold folder"
Now=$(date +"%Y-%m-%d")
File=bakmysql-$Now.sql
/opt/mysql/server-5.6/bin/mysqldump -uroot -p'password' db_bbs > $File
echo "Your database backup successfully completed"
SevenDays=$(date -d -7day +"%Y-%m-%d")
if [ -f /bak/bakmysqlold/bakmysql-$SevenDays.sql ]
then
rm -rf /bak/bakmysqlold/bakmysql-$SevenDays.sql
echo "You have delete 7days ago bak file "
else
echo "7days ago bak file not exist "
fi
橙色部分改成要备份的数据库,注意mysqldump要用绝对路径,否则会备份成空文件,通过which mysqldump
查看绝对路径。
4、设置crontab定时执行脚本
【第一步】编辑crontab
vi /etc/crontab
【第二步】写入设置:分钟,小时,日,月,星期,命令。我最迟凌晨5点左右才睡,最早6点起床,因此设置为每天凌晨5:30最合适了。
30 5 * * * root /bak/bakmysql/backup.sh
【第三步】重启crontab
/etc/init.d/cron restart
提示:[ ok ] Restarting cron (via systemctl): cron.service.
ls /etc/systemd/system/multi-user.target.wants/
提示:atd.service cron.service nginx.service php7.0-fpm.service remote-fs.target rsyslog.service ssh.service
我的已经设置了。
三、出错记录
1、发现直接执行.sh脚本可以备份,而crontab自动执行的脚本却是空文件(文件正确地移动和创建,只是内容为空)。
解决:mysqldump命令一定要是绝对路径!可以通过which mysqldump
来查看绝对路径,2017.12.12日已经更新操作步骤中的相关内容。