在数据库的日常维护工作中,除了保证业务的正常运行以外,就是要对数据库进行备份,以免造成数据库的丢失,从而给企业带来重大经济损失。通常备份可以按照备份时数据库状态分为热备和冷备,按照备份数据库文件的大小分为增量备份、差异备份和全量备份。其中热备可以通过mysql replication主从复制进行实时备份,percona的xtrabackup以及mysql自带的mysqldump等,可以根据不同需求使用不同的备份方案。虽然在生产环境已经使用mysql replication主从复制,但是还需要在计划任务中添加运行shell脚本在夜间业务不繁忙时进行数据库的全量备份,以便在发生主从复制失败时,主从数据库大量数据不一致后的主从复制的重做,同时进行完全备份可以更加保证数据库的安全性。

以下是我在生产环境中使用的一个全备脚本,它的基本功能:

1.自动压缩备份mysql数据库.

2.自动删除近10天前的备份文件

3.删除时显示删除进度(可选).

#!/bin/bash
#Author [email protected]
MAXIMUM_BACKUP_FILES=10              #最大备份文件数
BACKUP_FOLDERNAME="database_backup"  #数据库备份文件的主目录
DB_HOSTNAME="localhost"              #mysql所在主机的主机名
DB_USERNAME="root"                   #mysql登录用户名
DB_PASSWORD="123456"                 #mysql登录密码
DATABASES=(
            "openfire"
            "csp"                    #备份的数据库名
)
#=========
echo "Bash Database Backup Tool"
#CURRENT_DATE=$(date +%F)
CURRENT_DATE=$(date +%F)              #定义当前日期为变量
BACKUP_FOLDER="${BACKUP_FOLDERNAME}_${CURRENT_DATE}" #存放数据库备份文件的目录
mkdir $BACKUP_FOLDER #创建数据库备份文件目录
#统计需要被备份的数据库
count=0
while [ "x${DATABASES[count]}" != "x" ];do
    count=$(( count + 1 ))
done
echo "[+] ${count} databases will be backuped..."
#循环这个数据库名称列表然后逐个备份这些数据库
for DATABASE in ${DATABASES[@]};do
    echo "[+] Mysql-Dumping: ${DATABASE}"
    echo -n "   Began:  ";echo $(date)
    if $(mysqldump -h ${DB_HOSTNAME} -u${DB_USERNAME} -p${DB_PASSWORD} ${DATABASE} > "${BACKUP_FOLDER}/${DATABASE}.sql");then
        echo "  Dumped successfully!"
    else
        echo "  Failed dumping this database!"
    fi
        echo -n "   Finished: ";echo $(date)
done
echo
echo "[+] Packaging and compressing the backup folder..."
tar -cv ${BACKUP_FOLDER} | bzip2 > ${BACKUP_FOLDER}.tar.bz2 && rm -rf $BACKUP_FOLDER
BACKUP_FILES_MADE=$(ls -l ${BACKUP_FOLDERNAME}*.tar.bz2 | wc -l)
BACKUP_FILES_MADE=$(( $BACKUP_FILES_MADE - 0 )) 
#把已经完成的备份文件数的结果转换成整数数字
 
echo
echo "[+] There are ${BACKUP_FILES_MADE} backup files actually."
#判断如果已经完成的备份文件数比最大备份文件数要大,那么用已经备份的文件数减去最大备份文件数,打印要删除旧的备份文件
if [ $BACKUP_FILES_MADE -gt $MAXIMUM_BACKUP_FILES ];then
    REMOVE_FILES=$(( $BACKUP_FILES_MADE - $MAXIMUM_BACKUP_FILES ))
echo "[+] Remove ${REMOVE_FILES} old backup files."
#统计所有备份文件,把最新备份的文件存放在一个临时文件里,然后删除旧的文件,循环出临时文件的备份文件从临时目录里移到当前目录
    ALL_BACKUP_FILES=($(ls -t ${BACKUP_FOLDERNAME}*.tar.bz2))
    SAFE_BACKUP_FILES=("${ALL_BACKUP_FILES[@]:0:${MAXIMUM_BACKUP_FILES}}")
echo "[+] Safeting the newest backup files and removing old files..."
    FOLDER_SAFETY="_safety"
if [ ! -d $FOLDER_SAFETY ]
then mkdir $FOLDER_SAFETY
                                                                                                                    
fi
for FILE in ${SAFE_BACKUP_FILES[@]};do
                                                                                                                      
    mv -i  ${FILE}  ${FOLDER_SAFETY}
done
    rm -rf ${BACKUP_FOLDERNAME}*.tar.bz2
    mv  -i ${FOLDER_SAFETY}/* ./
    rm -rf ${FOLDER_SAFETY}
#以下显示备份的数据文件删除进度,一般脚本都是放在crontab里,所以我这里只是为了显示效果,可以不选择这个效果。
     
CHAR=''
for ((i=0;$i<=100;i+=2))
do  printf "Removing:[%-50s]%d%%\r" $CHAR $i
        sleep 0.1
CHAR=#$CHAR
done
    echo
fi

第1天备份数据库功能测试如下

生产环境Mysql数据库备份脚本,Linux下网站数据定期自动备份与删除脚本,Windows下备份网站目录和数据库..._第1张图片


10天以后,会自动保留最近10天的备份,10天以上会自动删除

模拟测试脚本功能,创建31天的备份文件如下

生产环境Mysql数据库备份脚本,Linux下网站数据定期自动备份与删除脚本,Windows下备份网站目录和数据库..._第2张图片

每天计划任务定时执行脚本保留最近10天的备份

生产环境Mysql数据库备份脚本,Linux下网站数据定期自动备份与删除脚本,Windows下备份网站目录和数据库..._第3张图片

本文转载http://laoxu.blog.51cto.com/4120547/1353542

http://my.oschina.net/u/231017/blog/186447

http://bbs.linuxtone.org/thread-5813-1-1.html    




MySQL分库备份shell脚本

#!/bin/bash
MYUSER=root
MYPASS=password
SOCKET="/var/lib/mysql/mysql.sock"
MYCMD="mysql -u $MYUSER -p$MYPASS"
MYDUMP="mysqldump -u $MYUSER -p$MYPASS"
BACKUP_DIR="/work/backup/mysql"
 
for database in `$MYCMD -e "show databases;"|sed '1,2d' |egrep -v "mysql|schema"`
do
    if [ ! -f $BACKUP_DIR/${database} ]; then 
        mkdir -p  $BACKUP_DIR/${database}
    fi
    $MYDUMP ${database} |gzip > $BACKUP_DIR/${database}/${database}_`date +%F`.tar.gz
done

http://jin771998569.blog.51cto.com/2147853/1639712 





记录保存mysql历史操作命令记录

  1. 在mysql配置文件中开启日志记录

# vim /etc/my.cnf

[mysqld]

log = /data/mysqldata/data/history_log

# service mysqld restart


2.查看mysql变量

mysql> show variables like '%log%';

+-----------------------------------------+------------------------------------+

| Variable_name                           | Value                              |

+-----------------------------------------+------------------------------------+

| back_log                                | 50                                 |

| binlog_cache_size                       | 32768                              |

| binlog_direct_non_transactional_updates | OFF                                |

| binlog_format                           | STATEMENT                          |

| binlog_stmt_cache_size                  | 32768                              |

| expire_logs_days                        | 0                                  |

| general_log                             | ON                                 |

| general_log_file                        | /data/mysqldata/data/history_log   |


3.编写切割脚本内容如下:

# cat cut_mysql_history.sh 
#!/bin/bash
#此脚本用于分割mysql历史操作记录。每隔4小时分割一次,防止文件过大.

#访问日志存放目录
logs_path="/data/logs_mysql/"
MAXDAYS=30    ###定义日志保存时间,这里定义保存5天时间,即30小时.

find ${logs_path} -maxdepth 1 -type f -mtime +$(expr ${MAXDAYS} - 1) -exec echo "Delete {}" \; -exec rm "{}" \;

#将访问日志进行迁移到指定目录
mv /data/mysqldata/data/history_log ${logs_path}/history_$(date -d "yesterday" +"%Y-%m-%d-%H").log

#重新生成mysql记录的历史操作命令文件
/etc/init.d/mysqld reload >/dev/null 2>&1

4.编写计划任务

# crontab -l

* */4 * * * /bin/bash /data/scripts/cut_mysql_history.sh >/dev/null 2>&1




Linux下网站数据定期自动备份与删除脚本

vps是redhat,里面默认没有装crond的服务,网站文件和数据库需要每天自动备份,然后备份目录超过一定时间的删除,比如保留最近14天地备份”。


因为没有安装crond的服务,首先输入以下命令安装yum install cronie


创建备份脚本


vi /root/bakweb.sh


编辑并输入以下内容

#!/bin/bash
#禅道及bbs论坛网页目录自动备份脚本
#禅道及bbs论坛数据库自动备份
#自动删除备份目录下面超过10天的文件
#脚本每天早上5点自动执行备份工作
BAKDIR=/home/bak
MAXDAYS=10

mkdir -pv /home/bak
find ${BAKDIR} -maxdepth 1 -type f -mtime +$(expr ${MAXDAYS} - 1) -exec echo "Delete {}" \; -exec rm "{}" \;
tar zcvf /home/bak/www.penglei.name_$(date +%F).tar.gz /var/www/html
mysqldump -uroot --password=123456 -B test > /home/bak/test_$(date +%F).sql
mysqldump -uroot --password=123456 -B mysql --events > /home/bak/mysql_$(date +%F).sql
mysqldump -uroot -p123456 -B shop|gzip > $BAKDIR/shop_$(date +%F).sql.gz
exit 0

输入:wq保存退出。 

该脚本的意思是首先选择/home/bak作为网站备份目录。


第一步,先删除/home/bak下超过10天的文件;


第二步,按www.dbfen.name_+日期为文件名备份网站目录/var/www/html;


第三步,按penglei.name_+日期为文件名导出数据库,PASSWORD和DBNAME替换为你自己的root密码和数据库名。


最后创建crond脚本,每天早上5点自动运行该脚本即可 创建crond文件


vi /etc/cron.d/bakweb 编辑并输入以下内容


0 5 * * * root /root/bakweb.sh


完成,这样Linux系统就可以对网站数据定期自动备份与删除了.



归档压缩文件(可排除)

web_backup.sh
 
#!/bin/bash
#Backup the web file and del old backup file
GFINAME=`date +%F-%H`
GFIFILE=/usr/local/data/www                #需要备份的目录
GFIBACKUP=/usr/local/src/web_backup        #备份保存的目录
tar -zPcf $GFIBACKUP/$GFINAME.tar.gz --exclude=$GFIFILE/logs --exclude=$GFIFILE/p_w_picpaths $GFIFILE/* #--exclude=排除的文件或目录
#del old web_backup                        #删除10天之前的文件
find /usr/local/src/web_backup -atime +10 -exec rm -rf {} \;


 

 

 

Windows下备份网站目录和数据库

@echo off
set date=%date:~0,4%-%date:~5,2%-%date:~8,2%
mysqldump -uroot -poldboy -A -B > D:\bak\"%date%".sql
rar.exe a -k -r -s -ml D:\bak\"%date".sql.rar D:\bak\"%date%.sql"
del D:\bak\*.sql
rar.exe a -k -r -s -ml D:\bak\"%date%"htdocs.rar D:\work\PHPnow\htdocs

 http://blog.csdn.net/dw14132124/article/details/8849075 




一个备份上传到FTP服务器脚本

#!/bin/bash
# http://www.vpser.net/security/linux-autobackup-ftp.html
# date: 2015-10-05

# function
MYSQL_USER="root"   ###mysql用户
MYSQL_PASS="123456" ###mysql密码
BACK_DIR="/data/backup"

# Create backup directory
if [ -d $BACK_DIR ] ;
then
rm -rf ~/$BACK_DIR/*
else
mkdir -p "$BACK_DIR"
fi

# Enter the backup directory
cd $BACK_DIR

# Backup all database tables
for db in $(mysql -u$MYSQL_USER -p$MYSQL_PASS -B -N -e 'SHOW DATABASES' | sed -e '/schema/d' -e '/mysql/d' -e '/test/d')
do
mysqldump -u$MYSQL_USER -p$MYSQL_PASS ${db} | gzip -9 > ${db}.sql.gz
done

# Pack all database tables
tar -zcf mysql_$(date +%Y%m%d).tar.gz *.sql.gz --remove-files

# Packing site data
for web in $(ls -1 /home/wwwroot | sed -e '/php/d')
do
tar -zcPf ${web}_$(date +%Y%m%d).tar.gz /home/wwwroot/$web/
done

# Package the Nginx configuration file
tar -zcPf nginx_$(date +%Y%m%d).tar.gz /usr/local/nginx/conf/vhost

##方法一:
######~Set FTP Information~######设置用来存放备份数据的FTP信息
FTP_HostName=184.168.192.43      //FTP服务器的IP或者域名
FTP_UserName=vpsernet            //FTP服务器用户名
FTP_PassWord=yourftppassword     //FTP服务器用户对应的密码
FTP_BackupDir=/data/backup/web   //备份到FTP上的目录,需要提前创建好。


###下面为自动上传部分####
lftp $FTP_HostName -u $FTP_UserName,$FTP_PassWord << EOF
cd $FTP_BackupDir
mput $TodayWWWBackup
mput $TodayDBBackup
bye
EOF

##方法二:
# Upload data
for file in $(find *.tar.gz | grep $)
do
#	scp -P 22 ${file} 123.456.789.012:/root/backup/${file}
sh ~/dropbox_uploader.sh upload ${file} $(date +%Y%m%d)/${file}
done

exit 0