一、自动备份脚本:
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
#你要修改的地方从这里开始
MYSQL_USER="mysql_username" #mysql用户名
MYSQL_PASS="mysql_password" #mysql密码
MAIL_TO="your@mail.com" #数据库发送到的邮箱
MAIL_subject="XXX MySQL BackUp" #邮件主题
FTP_HOST="ftp.domain.com" #ftp地址
FTP_USER="ftp_username" #ftp用户名
FTP_PASS="ftp_password" #ftp密码
FTP_backup="/" #ftp上存放备份文件的目录,这个要自己得ftp上面建的
WEB_DATA="/home/wwwroot" #要备份的网站数据
# Set Server-Configure file to back up
CONF_NGINX="/usr/local/nginx/conf" # Nginx配置文件目录,可以为空
CONF_APACHE="" # Apache配置文件目录,可以为空
CONF_PHP="/usr/local/php/etc" # PHP配置文件目录,可以为空
FILE="/root/cut_nginx_logs.sh /root/lnmp /root/vhost.sh" # 自定义备份文件,可以为空
TEMP_PATH="/root/www_backup" # 备份文件存放目录
ServerName="BuyVM" # 备份标识
#你要修改的地方从这里结束
#定义数据库的名字,本地3天前的名字,FTP服务器上5天前的名字
BakName=$(date +%Y%m%d)_${ServerName}_backup.tar.gz
LocalName=$(date -d -3day +"%Y%m%d")_${ServerName}_backup.tar.gz
OldName=$(date -d -5day +"%Y%m%d")_${ServerName}_backup.tar.gz
#删除本地3天前的数据
echo "Delete three days before the backup..."
rm -rf ${TEMP_PATH}/${LocalName}
rm -rf ${TEMP_PATH}/conf ${TEMP_PATH}/mysql ${TEMP_PATH}/wwwroot ${TEMP_PATH}/files
echo "Delete three days before the backup OK!!!"
#备份数据库
if [ -n "$MYSQL_USER" ] && [ -n "$MYSQL_PASS" ] && [ -n "$MAIL_TO" ]; then
echo "Backup Mysql DB..."
mkdir -p ${TEMP_PATH}/mysql
cd ${TEMP_PATH}/mysql
#导出数据库,一个数据库一个压缩文件
for db in `mysql -u$MYSQL_USER -p$MYSQL_PASS -B -N -e 'SHOW DATABASES' | xargs`; do
(mysqldump -u$MYSQL_USER -p$MYSQL_PASS ${db} --skip-lock-tables | gzip -9 - > ${db}.sql.gz)
done
#压缩数据库文件为一个文件
cd ${TEMP_PATH}/mysql
echo "Compress Mysql DB..." && tar zcf $(date +"%Y%m%d")_${ServerName}_db.tar.gz *.sql.gz
rm -rf ${TEMP_PATH}/mysql/*.sql.gz
#发送数据库到Email,如果数据库压缩后太大,请注释这行
#echo "主题:数据库备份" | mutt -a ${TEMP_PATH}/$DataBakName -s "内容:数据库备份" $MAIL_TO
echo "Send Mysql DB to Mail..."
echo "" | mail -s "${MAIL_subject}" -a ${TEMP_PATH}/mysql/$(date +"%Y%m%d")_${ServerName}_db.tar.gz $MAIL_TO
echo "Backup Mysql DB OK!!!"
fi
#备份网站数据
if [ -n "$WEB_DATA" ]; then
echo "Copy wwwroot..."
mkdir -p ${TEMP_PATH}/wwwroot
cp -rf ${WEB_DATA}/* ${TEMP_PATH}/wwwroot
echo "Copy wwwroot OK!!!"
fi
#备份服务器配置
if [ -n "$CONF_NGINX" ]; then
echo "Copy nginx-conf files..."
mkdir -p ${TEMP_PATH}/conf/nginx
cp -rf ${CONF_NGINX}/* ${TEMP_PATH}/conf/nginx
echo "Copy nginx-conf files OK!!!"
fi
if [ -n "$CONF_APACHE" ]; then
echo "Copy apache-conf files..."
mkdir -p ${TEMP_PATH}/conf/apache
cp -rf ${CONF_APACHE}/* ${TEMP_PATH}/conf/apache
echo "Copy apache-conf files OK!!!"
fi
if [ -n "$CONF_PHP" ]; then
echo "Copy php-conf files..."
mkdir -p ${TEMP_PATH}/conf/php
cp -rf ${CONF_PHP}/* ${TEMP_PATH}/conf/php
echo "Copy php-conf files OK!!!"
fi
#压缩自定义文件
if [ -n "$FILE" ]; then
echo "Copy custom files..."
mkdir -p ${TEMP_PATH}/files
cp -rf ${FILE} ${TEMP_PATH}/files
echo "Copy custom files OK!!!"
fi
#压缩备份文件
cd ${TEMP_PATH}
echo "Compress backup files..." && tar -zcPf ${TEMP_PATH}/${BakName} conf mysql wwwroot files
if [ -e "$TEMP_PATH/$BakName" ]; then
rm -rf ${TEMP_PATH}/conf ${TEMP_PATH}/mysql ${TEMP_PATH}/wwwroot ${TEMP_PATH}/files
echo "Compress backup files OK!!!"
fi
#上传到FTP空间,删除FTP空间5天前的数据
if [ -n "$FTP_HOST" ] && [ -n "$FTP_USER" ] && [ -n "$FTP_PASS" ] && [ -n "$FTP_backup" ]; then
echo "Upload Backup..."
cd ${TEMP_PATH}
ftp -v -n $FTP_HOST << END
user $FTP_USER $FTP_PASS
type binary
passive
cd $FTP_backup
delete $OldName
put $BakName
bye
END
echo "Upload Backup OK!!!"
fi
echo "----------------------------------------"
echo "All Backup OK!!!"
exit 0
保存脚本上传至服务器(如:/root/backup.sh)并给脚本加上可执行属性:
chmod 755 /root/backup.sh
使用命令:
/root/backup.sh
测试执行备份脚本,如果一切正常的话,接着进行下面的步骤,将脚本加入crontab定时任务计划。
二、将脚本加入crontab定时任务计划
1、安装crontab
CentOS下面安装Crontab
#安装Crontab yum install vixie-cron crontabs #设为开机自启动 chkconfig crond on #启动 service crond start
说明:vixie-cron软件包是cron的主程序;crontabs软件包是用来安装、卸装、 或列举用来驱动 cron 守护进程的表格的程序。
Debian下面安装Crontab
#大部分情况下Debian都已安装。 apt-get install cron #重启Crontab /etc/init.d/cron restart
2、查看crontab定时执行任务列表
crontab -l
3、添加crontab定时执行任务
crontab -e
如每周一凌晨2点自动执行:
0 2 * * 1 /root/backup.sh
保存退出,也可直接编辑“/var/spool/cron/用户名”文件。
4、crontab 任务命令书写格式
| 格式: | minute | hour | dayofmonth | month | dayofweek | command |
| 解释: | 分钟 | 小时 | 日期 | 月付 | 周 | 命令 |
| 范围: | 0-59 | 0~23 | 1~31 | 1~12 | 0~7,0和7都代表周日 |
在crontab中我们会经常用到* , - /n 这4个符号,好吧还是再画个表格,更清楚些:
| 符号 | 解释 |
| *(星号) | 代表所有有效的值。 如:0 23 * * * backup 不论几月几日周几的23点整都执行backup命令。 |
| ,(逗号) | 代表分割开多个值。如:30 9 1,16,20 * * command 每月的1、16、20号9点30分执行command命令。 |
| -(减号) | 代表一段时间范围。如0 9-17 * * * checkmail 每天9点到17点的整点执行checkmail命令 |
| /n | 代表每隔n长时间。如*/5 * * * * check 每隔5分钟执行一次check命令,与0-59/5一样。 |
下面举一些例子来加深理解:
每天凌晨3:00执行备份程序:0 3 * * * /root/backup.sh
每周日8点30分执行日志清理程序:30 8 * * 7 /root/clear.sh
每周1周5 0点整执行test程序:0 0 * * 1,5 test
每年的5月12日14点执行wenchuan程序:0 14 12 5 * /root/wenchuan
每晚18点到23点每15分钟重启一次php-fpm:*/15 18-23 * * * /etc/init.d/php-fpm
注:在Debian系统中cron会读/etc/timezone来做为时区,我们需要编辑/etc/timezone,把里面全部删除,然后添加Asia/Harbin,最后重启一下cron即可。
可以直接使用下面命令来执行:
#添加时区 echo 'Asia/Harbin' > /etc/timezone #重启服务 /etc/init.d/cron restart
三、导入数据库
常用source命令
进入mysql数据库控制台,
如mysql -u root -p
然后使用source命令,后面参数为脚本文件(如这里用到的.sql)
mysql>source /root/dballback.sql
╃苍狼山庄╃