mysql数据库完整备份与增量备份shell脚本
时间:2014-11-05 11:37 来源:linux.it.net.cn 作者:IT
采用mysqldump对数据库进行备份,mysqldump是采用SQL级别的备份机制,它将数据表导成 SQL脚本文件,在不同的 MySQL 版本之间升级时相对比较合适,这也是最常用的备份方法,mysqldump比直接拷贝要慢些。
Mysql数据库的自动备份,包括完全备份和增量备份。
其中,完全备份每周执行一次,增量备份每天都会执行。备份成功后会自动上传到FTP服务器。mysql需要开启二进制日志。
备份策略布置
把脚本放到/usr/bin 目录下面
1)、启用二进制日志
采用binlog的方法相对来说更灵活,省心省力,而且还可以支持增量备份。
启用binlog时必须要重启mysqld。首先,关闭mysqld,打开/etc/my.cnf,加入以下几行:
[mysqld]
log-bin
然后启动mysqld就可以了。运行过程中会产生HOSTNAME-bin.000001以及HOSTNAME-bin.index,前面的文件是mysqld记录所有对数据的更新操作,后面的文件则是所有binlog的索引,都不能轻易删除。关于binlog的更详细信息请查看手册。
2)、设置crontab任务,每天执行备份脚本
shell> vi /etc/crontab
添加以下:
0 00 * * * root /usr/bin/backap_mysql.sh
脚本如下:
复制代码代码示例:
#!/bin/bash
#set -x
#此脚本的主要用途是备份mysql服务器上的数据库。并且自动通过FTP上传到服务器。备份完后都会发送一封邮件。
#变量说明 pass mysql账户口令,name mysql账户名称,DATA_DIR mysql存储路径,DATE 时间,MYSQL_BIN 是mysql命令路径, WAN_DIR 完全备份目录,ZENG_BACK 增量备份的目录。Host FTP服务器的IP,Username FTP账户口令,Passwd FTP账户名称, db_name 备份的数据库名, error_log 当天备份错误日志, backup_log 保存当天的备份日志,db 保存要备份的数据库名文件
echo -e "此脚本的主要用途是备份mysql服务器上的数据库.并且自动通过FTP上传到服务器。"
Host=www.jbxue.com
pass=chenqibin
name=root
DATE=`date +"%Y%m%d"`
WAN_DIR="/wan_dir"
ZENG_BACK="/backup"
DATA_DIR="/usr/local/mysql/data"
MYSQL_BIN="/usr/local/mysql/bin"
error_log="$WAN_DIR/backup_error_$DATE.log"
backup_log="$ZENG_DIR/backup_$DATE.log"
gzdumpfile="$DATE.sql.tar.gz"
db="/var/log/backup_$DATE.txt"
cd $DATA_DIR
ls -l $DATA_DIR | grep "^d" | awk -F " "'{print $9}' >>$db
function wan() {
#检测完全备份目录是否存在,如果不存在就创建。
if [ -d $WAN_DIR ]
then
echo "完全备份目录存在" >>$backup_log
else
echo "完全备份目录不存在,开始创建......."
/bin/mkdir $WAN_DIR
fi
eMailFile="$WAN_DIR/mail.log"
email=kelly@r2games.net
echo " " > $eMailFile
echo "-----------------------" >> $eMailFile
echo "`date +"%y-%m-%d %H:%M:%S"`" >> $eMailFile
echo "-------------------------" >> $eMailFile
cd $WAN_DIR
for dbname in $(cat $db)
do
mysqldump --flush-logs -u$name -p$pass --skip-lock-tables --quick $dbname > $dbname.sql
if [ $? = 0 ]
then
find $ZENG_BACK -name"*.log" -mtime +32 -exec rm -f {} \; >/dev/null 2>&1
cd $WAN_DIR
tar -zcvf $dbname.$gzdumpfile $dbname.sql
echo "Backup MySQL succeed" >>$eMailFile
mail -s "MySQL Backup" $email < $eMailFile
else
echo "Backup MySQL fail" >>$eMailFile
mail -s "MySQL Backup fail" $email < $eMailFile
fi
done
#完全备份后删除本地增量备份文件,只保留最近一个星期的增量备份文件
find $ZENG_BACK -name"*.sql.tar.gz"--mtime +7 -exec rm -f {} \; >>$backup_log
#将备份好的上传到FTP服务器
cd $WAN_DIR
for db_back in $(cat $db)
do
ftp -nv $Host <<EOF
user wolf "chenqibin"
put $db_back.$gzdumpfile
quit
EOF
done
}
function zeng() {
/bin/mkdir /zeng_dir
eMailFile="$ZENG_DIR/mail.log"
email=kelly@r2games.net
echo " " > $eMailFile
echo "-----------------------" >> $eMailFile
echo "`date +"%y-%m-%d %H:%M:%S"`" >> $eMailFile
echo "-------------------------" >> $eMailFile
TIME=$(date"-d 10 day ago" +%Y-%m-%d %H:%M:%S)
StartTime=$(date"-d 1 day ago" +"%Y-%m-%d %H:%M:%S")
Start="--start-datetime"
#删除10天前的二进制文件
mysql -u$name -p$pass -e "purge master logs before ${TIME}" && echo "delete 10 days before log" | tee -a $eMailFile
filename=`cat $DATA_DIR/chlinux-bin.index | awk -F "/"'{print $2}'`
cd /zeng_dir
for i in $filename
do
echo "$StartTime start backup binlog" >> $eMailFile
for db_name in $(cat $db)
do
mysqlbinlog -u$name -pchenqibin -d $db_name $Start="$StartTime" $DATA_DIR/$i >>$db_name.$DATE.sql
if [ $? = 0 ]
then
cd /zeng_dir
tar -zcvf $db_name.$gzdumpfile $db_name.$DATE.sql
echo "Backup MySQL succeed" >>$eMailFile
mail -s "MySQL Backup" $email < $eMailFile
else
echo "Backup MySQL fail" >>$eMailFile
mail -s "MySQL Backup fail" $email < $eMailFile
fi
done
done
find $ZENG_BACK -name "*.log" -name +32 -exec rm -f {} \; >/dev/null 2>&1
cd /zeng_dir
#删除上次备份的完整备份的文件
find $WAN_DIR -name"*.tar.gz"--mtime +7 -exec rm -f {} \;
#将备份好的上传到FTP服务器
for db_back in $(cat $db)
do
ftp -nv $Host <<EOF
user wolf "chenqibin"
put $db_back.$gzdumpfile
quit
EOF
done
}
backfile=`ls -l /wan_dir | wc -l`
if [ $backfile != 0 ]
then
echo "完整备份已经存在,现在进行增量备份"
sleep 10
zeng
else
echo "还没进行完整备份,现在进行完整备份"
sleep 30
wan
fi
主要变量说明:
Host #FTP的IP
pass #FTP的密码
name #FTP和mysql的用户名
DATE #时间
WAN_DIR #完整备份的目录
ZENG_BACK #增量备份的目录
DATA_DIR #mysql数据目录
error_log #错误日志
gzdumpfile #压缩后的后缀名
db #mysql数据库名
附,完整shell脚本代码。
复制代码代码示例:
#!/bin/bash
#set -x
#此脚本的主要用途是备份mysql服务器上的数据库。并且自动通过FTP上传到服务器。备份完后都会发送一封邮件。
#变量说明 pass mysql账户口令,name mysql账户名称,DATA_DIR mysql存储路径,DATE 时间,MYSQL_BIN 是mysql命令路径, WAN_DIR 完全备份目录,ZENG_BACK 增量备份的目录。Host FTP服务器的IP,Username FTP账户口令,Passwd FTP账户名称, db_name 备份的数据库名, error_log 当天备份错误日志, backup_log 保存当天的备份日志,db 保存要备份的数据库名文件
echo -e "此脚本的主要用途是备份mysql服务器上的数据库.并且自动通过FTP上传到服务器。"
Host=www.it.net.cn
pass=chenqibin
name=root
DATE=`date +"%Y%m%d"`
WAN_DIR="/wan_dir"
ZENG_BACK="/backup"
DATA_DIR="/usr/local/mysql/data"
MYSQL_BIN="/usr/local/mysql/bin"
error_log="$WAN_DIR/backup_error_$DATE.log"
backup_log="$ZENG_DIR/backup_$DATE.log"
gzdumpfile="$DATE.sql.tar.gz"
db="/var/log/backup_$DATE.txt"
cd $DATA_DIR
ls -l $DATA_DIR | grep "^d" | awk -F " " '{print $9}' >>$db
function wan() {
#检测完全备份目录是否存在,如果不存在就创建。
if [ -d $WAN_DIR ]
then
echo "完全备份目录存在" >>$backup_log
else
echo "完全备份目录不存在,开始创建......."
/bin/mkdir $WAN_DIR
fi
eMailFile="$WAN_DIR/mail.log"
email=web@it.net.cn
echo " " > $eMailFile
echo "-----------------------" >> $eMailFile
echo "`date +"%y-%m-%d %H:%M:%S"`" >> $eMailFile
echo "-------------------------" >> $eMailFile
cd $WAN_DIR
for dbname in $(cat $db)
do
mysqldump --flush-logs -u$name -p$pass --skip-lock-tables --quick $dbname > $dbname.sql
if [ $? = 0 ]
then
find $ZENG_BACK -name "*.log" -mtime +32 -exec rm {} \; >/dev/null 2>&1
cd $WAN_DIR
tar -zcvf $dbname.$gzdumpfile $dbname.sql
echo "Backup MySQL succeed" >>$eMailFile
mail -s "MySQL Backup" $email < $eMailFile
else
echo "Backup MySQL fail" >>$eMailFile
mail -s "MySQL Backup fail" $email < $eMailFile
fi
done
#完全备份后删除本地增量备份文件,只保留最近一个星期的增量备份文件
find $ZENG_BACK -name "*.sql.tar.gz" --mtime +7 -exec rm -rf {} \; >>$backup_log
#将备份好的上传到FTP服务器
cd $WAN_DIR
for db_back in $(cat $db)
do
ftp -nv $Host <<EOF
user wolf "chenqibin"
put $db_back.$gzdumpfile
quit
EOF
done
}
function zeng() {
/bin/mkdir /zeng_dir
eMailFile="$ZENG_DIR/mail.log"
email=web@it.net.cn
echo " " > $eMailFile
echo "-----------------------" >> $eMailFile
echo "`date +"%y-%m-%d %H:%M:%S"`" >> $eMailFile
echo "-------------------------" >> $eMailFile
TIME=$(date "-d 10 day ago" +%Y-%m-%d %H:%M:%S)
StartTime=$(date "-d 1 day ago" +"%Y-%m-%d %H:%M:%S")
Start="--start-datetime"
#删除10天前的二进制文件
mysql -u$name -p$pass -e "purge master logs before ${TIME}" && echo "delete 10 days before log" | tee -a $eMailFile
filename=`cat $DATA_DIR/chlinux-bin.index | awk -F "/" '{print $2}'`
cd /zeng_dir
for i in $filename
do
echo "$StartTime start backup binlog" >> $eMailFile
for db_name in $(cat $db)
do
mysqlbinlog -u$name -pchenqibin -d $db_name $Start="$StartTime" $DATA_DIR/$i >>$db_name.$DATE.sql
if [ $? = 0 ]
then
cd /zeng_dir
tar -zcvf $db_name.$gzdumpfile $db_name.$DATE.sql
echo "Backup MySQL succeed" >>$eMailFile
mail -s "MySQL Backup" $email < $eMailFile
else
echo "Backup MySQL fail" >>$eMailFile
mail -s "MySQL Backup fail" $email < $eMailFile
fi
done
done
find $ZENG_BACK -name "*.log" -name +32 -exec rm {} \; >/dev/null 2>&1
cd /zeng_dir
#删除上次备份的完整备份的文件
find $WAN_DIR -name "*.tar.gz" --mtime +7 -exec rm -rf {} \;
#将备份好的上传到FTP服务器
for db_back in $(cat $db)
do
ftp -nv $Host <<EOF
user wolf "chenqibin"
put $db_back.$gzdumpfile
quit
EOF
done
}
backfile=`ls -l /wan_dir | wc -l`
if [ $backfile != 0 ]
then
echo "完整备份已经存在,现在进行增量备份"
sleep 10
zeng
else
echo "还没进行完整备份,现在进行完整备份"
sleep 30
wan
fi
(责任编辑:IT)
采用mysqldump对数据库进行备份,mysqldump是采用SQL级别的备份机制,它将数据表导成 SQL脚本文件,在不同的 MySQL 版本之间升级时相对比较合适,这也是最常用的备份方法,mysqldump比直接拷贝要慢些。
Mysql数据库的自动备份,包括完全备份和增量备份。
备份策略布置
1)、启用二进制日志
[mysqld]
log-bin 然后启动mysqld就可以了。运行过程中会产生HOSTNAME-bin.000001以及HOSTNAME-bin.index,前面的文件是mysqld记录所有对数据的更新操作,后面的文件则是所有binlog的索引,都不能轻易删除。关于binlog的更详细信息请查看手册。
2)、设置crontab任务,每天执行备份脚本
0 00 * * * root /usr/bin/backap_mysql.sh
脚本如下:
复制代码代码示例:
#!/bin/bash
#set -x #此脚本的主要用途是备份mysql服务器上的数据库。并且自动通过FTP上传到服务器。备份完后都会发送一封邮件。 #变量说明 pass mysql账户口令,name mysql账户名称,DATA_DIR mysql存储路径,DATE 时间,MYSQL_BIN 是mysql命令路径, WAN_DIR 完全备份目录,ZENG_BACK 增量备份的目录。Host FTP服务器的IP,Username FTP账户口令,Passwd FTP账户名称, db_name 备份的数据库名, error_log 当天备份错误日志, backup_log 保存当天的备份日志,db 保存要备份的数据库名文件 echo -e "此脚本的主要用途是备份mysql服务器上的数据库.并且自动通过FTP上传到服务器。" Host=www.jbxue.com pass=chenqibin name=root DATE=`date +"%Y%m%d"` WAN_DIR="/wan_dir" ZENG_BACK="/backup" DATA_DIR="/usr/local/mysql/data" MYSQL_BIN="/usr/local/mysql/bin" error_log="$WAN_DIR/backup_error_$DATE.log" backup_log="$ZENG_DIR/backup_$DATE.log" gzdumpfile="$DATE.sql.tar.gz" db="/var/log/backup_$DATE.txt" cd $DATA_DIR ls -l $DATA_DIR | grep "^d" | awk -F " "'{print $9}' >>$db function wan() { #检测完全备份目录是否存在,如果不存在就创建。 if [ -d $WAN_DIR ] then echo "完全备份目录存在" >>$backup_log else echo "完全备份目录不存在,开始创建......." /bin/mkdir $WAN_DIR fi eMailFile="$WAN_DIR/mail.log" email=kelly@r2games.net echo " " > $eMailFile echo "-----------------------" >> $eMailFile echo "`date +"%y-%m-%d %H:%M:%S"`" >> $eMailFile echo "-------------------------" >> $eMailFile cd $WAN_DIR for dbname in $(cat $db) do mysqldump --flush-logs -u$name -p$pass --skip-lock-tables --quick $dbname > $dbname.sql if [ $? = 0 ] then find $ZENG_BACK -name"*.log" -mtime +32 -exec rm -f {} \; >/dev/null 2>&1 cd $WAN_DIR tar -zcvf $dbname.$gzdumpfile $dbname.sql echo "Backup MySQL succeed" >>$eMailFile mail -s "MySQL Backup" $email < $eMailFile else echo "Backup MySQL fail" >>$eMailFile mail -s "MySQL Backup fail" $email < $eMailFile fi done #完全备份后删除本地增量备份文件,只保留最近一个星期的增量备份文件 find $ZENG_BACK -name"*.sql.tar.gz"--mtime +7 -exec rm -f {} \; >>$backup_log #将备份好的上传到FTP服务器 cd $WAN_DIR for db_back in $(cat $db) do ftp -nv $Host <<EOF user wolf "chenqibin" put $db_back.$gzdumpfile quit EOF done } function zeng() { /bin/mkdir /zeng_dir eMailFile="$ZENG_DIR/mail.log" email=kelly@r2games.net echo " " > $eMailFile echo "-----------------------" >> $eMailFile echo "`date +"%y-%m-%d %H:%M:%S"`" >> $eMailFile echo "-------------------------" >> $eMailFile TIME=$(date"-d 10 day ago" +%Y-%m-%d %H:%M:%S) StartTime=$(date"-d 1 day ago" +"%Y-%m-%d %H:%M:%S") Start="--start-datetime" #删除10天前的二进制文件 mysql -u$name -p$pass -e "purge master logs before ${TIME}" && echo "delete 10 days before log" | tee -a $eMailFile filename=`cat $DATA_DIR/chlinux-bin.index | awk -F "/"'{print $2}'` cd /zeng_dir for i in $filename do echo "$StartTime start backup binlog" >> $eMailFile for db_name in $(cat $db) do mysqlbinlog -u$name -pchenqibin -d $db_name $Start="$StartTime" $DATA_DIR/$i >>$db_name.$DATE.sql if [ $? = 0 ] then cd /zeng_dir tar -zcvf $db_name.$gzdumpfile $db_name.$DATE.sql echo "Backup MySQL succeed" >>$eMailFile mail -s "MySQL Backup" $email < $eMailFile else echo "Backup MySQL fail" >>$eMailFile mail -s "MySQL Backup fail" $email < $eMailFile fi done done find $ZENG_BACK -name "*.log" -name +32 -exec rm -f {} \; >/dev/null 2>&1 cd /zeng_dir #删除上次备份的完整备份的文件 find $WAN_DIR -name"*.tar.gz"--mtime +7 -exec rm -f {} \; #将备份好的上传到FTP服务器 for db_back in $(cat $db) do ftp -nv $Host <<EOF user wolf "chenqibin" put $db_back.$gzdumpfile quit EOF done } backfile=`ls -l /wan_dir | wc -l` if [ $backfile != 0 ] then echo "完整备份已经存在,现在进行增量备份" sleep 10 zeng else echo "还没进行完整备份,现在进行完整备份" sleep 30 wan fi
主要变量说明:
Host #FTP的IP
pass #FTP的密码 name #FTP和mysql的用户名 DATE #时间 WAN_DIR #完整备份的目录 ZENG_BACK #增量备份的目录 DATA_DIR #mysql数据目录 error_log #错误日志 gzdumpfile #压缩后的后缀名 db #mysql数据库名
附,完整shell脚本代码。
复制代码代码示例:
#!/bin/bash cd $DATA_DIR ls -l $DATA_DIR | grep "^d" | awk -F " " '{print $9}' >>$db
function wan() {
eMailFile="$WAN_DIR/mail.log"
#将备份好的上传到FTP服务器
eMailFile="$ZENG_DIR/mail.log"
echo " " > $eMailFile
TIME=$(date "-d 10 day ago" +%Y-%m-%d %H:%M:%S)
for i in $filename
for db_name in $(cat $db)
#将备份好的上传到FTP服务器 (责任编辑:IT) |