一、自动备份脚本:
#!/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