#!/bin/bash #数据库相关信息 dbuser=root dbpasswd=password mycnf= /etc/mysql/my .cnf #如果bin-log没有指定路径 dir_bin= /opt/mysql/mysqldata/mysqllog #数据库备份的路径 install_dir= /opt/MySqlBackUp data_dir=$install_dir /data temp_dir=$install_dir /temp log_dir=$install_dir /logs bin_dir=$install_dir /bin #接受邮箱 mail=chengfei@srt.com.cn #备份文件名、日志名、备份日志 sj=` date +\%Y`` date +\%m`` date +\%d`` date +\%H`` date +\%M`` date +\%S` datafile=$sj "_data.tar.gz" log=$sj ".log" binlogfile=$sj "_bin.tar.gz" #使用mysqldump备份 #是否启动dump功能(0表示不启用,1表示启用) dump_flag=1 #需要dump出来的数据库名 dumpdb=srtair #dump文件名 dumpfile=$sj "_" $dumpdb ".sql.gz" #是否备份至远程 #是否启用ftp传输功能 ftp_flag=0 #ftp
IP地址 ftp_ip= #ftp
用户名 ftp_user= #ftp
密码 ftp_passwd= #上传ftp
路径 ftp_dir= #读取my.cnf文件 process_readconfig() { echo "-----------开始读my.cnf文件--`date`-------------" #没有具体路径情况或者有具体路径 bin_log=` cat $mycnf
| grep -i
'^log-bin' |
awk -F
= '{print
$2}' | sed s/\
//g ` #数据文件路径 datadir=` cat $mycnf
| grep -i
'^datadir' |
awk -F
= '{print
$2}' | sed s/\
//g ` #需要判断是否有/,然后决定是否是全路径 #basedir路径 basedir=` cat $mycnf
| grep -i
'^basedir' |
awk -F
= '{print
$2}' | sed s/\
//g ` } #日志处理 process_binlog() { echo "……………………………开始备份日志文件--`date`………………………………" >> "$log_dir/$log" echo "……………………………开始备份日志文件--`date`………………………………" echo "需要备份二进制日志列表……" >> "$log_dir/$log" ls -tl
"$bin_log." [0-9]*
>> "$log_dir/$log" echo "开始备份二进制日志文件……" ` date `>> "$log_dir/$log" tar czvfP
"$data_dir/$binlogfile" "$bin_log" .[0-9]* echo "结束备份二进制日志文件……" ` date `>> "$log_dir/$log" #删除一天以前的日志文件 echo "删除过期二进制日志文件……" ` date `>> "$log_dir/$log" echo "删除过期二进制日志列表……" >> "$log_dir/$log" find $dir_bin
- type f
-mtime +1>> "$log_dir/$log" find $dir_bin
- type f
-mtime +1 - exec rm
-f {} \; echo "删除过期二进制日志文件结束……" ` date `>> "$log_dir/$log" echo "…………………………备份日志文件结束--`date`……………………………………" >> "$log_dir/$log" echo "…………………………备份日志文件结束--`date`……………………………………" } #数据备份 process_backup() { process_readconfig #备份数据库 echo "……………………………开始备份数据文件--`date`………………………………" echo "……………………………开始备份数据文件--`date`………………………………" >> "$log_dir/$log" source /root/ .bash_profile $bin_dir /innobackupex --user= "$dbuser" --password= "$dbpasswd" --defaults- file = "$mycnf" --stream= tar "$temp_dir"
2> "$temp_dir/$sj" _tmp.log
| gzip > "$data_dir/$datafile" echo "……………………………备份数据文件结束--`date`………………………………" >> "$log_dir/$log" echo "……………………………备份数据文件结束--`date`………………………………" cat "$temp_dir/$sj" _tmp.log>> "$log_dir/$log" #删除7天以前备份数据和信息 echo "清理7天前备份数据与相关信息……" ` date `>> "$log_dir/$log" find $data_dir
- type f
-mtime +7>> "$log_dir/$log" find $data_dir
- type f
-mtime +7 - exec rm
-f {} \; #mysqldump操作 if [
"$dump_flag" ==
1 ]; then echo "………………
mysqldump操作开始--`date`……………" echo "………………
mysqldump操作开始--`date`………" >> "$log_dir/$log" exp_sql echo "………………
mysqldump操作结束--`date`…………" >> "$log_dir/$log" echo "………………
mysqldump操作结束--`date`……………………………" fi #登录mysql,切换日志 $basedir /bin/mysql -u$dbuser
-p$dbpasswd<<XFF flush
logs; exit XFF #备份日志文件 process_binlog #ftp(没有写是否上传失败,成功) if [
"$ftp_flag" ==
1 ]; then echo "………………
ftp操作开始--`date`……………" echo "………………
ftp操作开始--`date`…………" >> "$log_dir/$log" exec_ftp echo "………………
ftp操作结束--`date`…………" >> "$log_dir/$log" echo "………………
ftp操作结束--`date`……………………………" fi #发送邮件 process_send } process_send() { #查找错误 grep "Error"
"$temp_dir/$sj" _tmp.log
> "$temp_dir/$sj" .err IP=` /sbin/ifconfig ${eth}
| grep 'inet
addr:' | awk '{print
$2}'
| awk -F
: '{print
$2}' ` IP=` echo $IP| awk '{print
$1}' ` echo ` grep "innobackupex:
completed OK\!"
"$temp_dir/$sj" _tmp.log
| awk -F
: '{print
$4}' | sed s/\
//g `> "$temp_dir/$sj" .good GOOD_COUNT=` cat "$temp_dir/$sj" .good
| wc -l` ERROR_COUNT=` cat "$temp_dir/$sj" .err
| wc -l` if [
"$ERROR_COUNT" ==
0 -a "$GOOD_COUNT" ==
1 ]; then echo "`date`-----MySql备份成功-----" >> "$log_dir" /result .log echo "-----------------------------------" >> "$log_dir" /result .log echo "……………………………开始发送邮件--`date`………………………………" echo "……………………………开始发送邮件--`date`………………………………" >> "$log_dir/$log" echo "MySql_Backup_Succeed"
| mutt -s "$IP" _MySql_Backup_Succeed
-a "$log_dir/$log" ${mail} else echo "`date`-----MySql备份失败,请检查$temp_dir" / "$sj" _tmp.log>> "$log_dir" /result .log echo "-----------------------------------" >> "$log_dir" /result .log echo "……………………………开始发送邮件--`date`………………………………" echo "……………………………开始发送邮件--`date`……………………………" >> "$log_dir/$log" cat "$temp_dir/$sj" .err
| mutt -s "$IP" _MySql_Backup_Fail
-a "$temp_dir/$sj" _tmp.log
${mail} fi #删除7天前的日志文件 find $temp_dir
- type f
-mtime +7 - exec rm
-f {} \; echo "……………………………发送邮件结束--`date`………………………………" >> "$log_dir/$log" echo "……………………………发送邮件结束--`date`………………………………" } #导出sql语句 exp_sql() { mysqldump
-u "$dbuser" -p "$dbpasswd" --single-transaction
--allow-keywords --add-locks --add-drop-table -F -q "$dumpdb" | gzip 1> "$data_dir/$dumpfile" } #ftp操作 exec_ftp() { echo "#!/bin/bash" > "$temp_dir/$sj" _ftp.sh echo "ftp
-n $ftp_ip <<XFF" >> "$temp_dir/$sj" _ftp.sh echo "user
$ftp_user $ftp_passwd" >> "$temp_dir/$sj" _ftp.sh echo "bin" >> "$temp_dir/$sj" _ftp.sh echo "cd
$ftp_dir" >> "$temp_dir/$sj" _ftp.sh echo "lcd
$data_dir" >> "$temp_dir/$sj" _ftp.sh echo "put
$datafile" >> "$temp_dir/$sj" _ftp.sh echo "put
$dumpfile" >> "$temp_dir/$sj" _ftp.sh echo "put
$binlogfile" >> "$temp_dir/$sj" _ftp.sh echo "lcd
$log_dir" >> "$temp_dir/$sj" _ftp.sh echo "put
$log" >> "$temp_dir/$sj" _ftp.sh echo "close" >> "$temp_dir/$sj" _ftp.sh echo "bye"
>> "$temp_dir/$sj" _ftp.sh echo "XFF" >> "$temp_dir/$sj" _ftp.sh chmod 777
"$temp_dir/$sj" _ftp.sh sh "$temp_dir/$sj" _ftp.sh } #执行备份 process_backup |
mysql_backup.sh程序安装说明
1、安装mysqlbackup程序
上传mysqlbackup到服务器/tmp目录
cd /tmp
unzip mysqlbackup.zip
cp /tmp/mysqlbackup/* /opt/mysql/product/5.1/bin
mkdir -p /opt/MySqlBackUp/bin
mkdir -p /opt/MySqlBackUp/data
mkdir -p /opt/MySqlBackUp/logs
mkdir -p /opt/MySqlBackUp/temp
ln -s /opt/mysql/product/5.1/bin/innobackupex /opt/MySqlBackUp/bin/innobackupex
对innobackupex进行授权
cd /opt/mysql/product/5.1/bin/
chmod +x innobackupex*
chmod +x xtrabackup*
chmod +x tar4ibd
cp /tmp/mysqlbackup/mysql_backup.sh /opt/MySqlBackUp/bin/
chmod 775 /opt/MySqlBackUp/bin/mysql_backup.sh
2、修改mysql_backup.sh中的相关数据
dbuser
dbpasswd
mail
dumpdb
3、配置mysql环境变量到root中
export MYSQL_BASE=/opt/mysql
export BASEDIR=$MYSQL_BASE/product/5.1
export DATADIR=$MYSQL_BASE/mysqldata
export LD_LIBRARY_PATH=$BASEDIR/lib:/lib:/usr/lib:/usr/local/lib
export TMPDIR=/tmp
export PATH=${PATH}:/usr/bin:/bin:/usr/bin/X11:/usr/local/bin
export PATH=${PATH}:$BASEDIR/bin:$MYSQL_BASE:$BASEDIR:$LD_LIBRARY_PATH
添加到/root/.bash_profile文件中
4、测试备份
cd /opt/MySqlBackUp/bin
./mysql_backup.sh
5、查看备份是否成功
cat /opt/MySqlBackUp/logs/result.log
如果提示备份成功,则表示程序安装成功,可能不熟到crontab中
6、部署crontab
0 1 * * * (cd /opt/MySqlBackUp/bin;sh ./mysql_backup.sh)
说明:参数配置,均是基于按照mysql安装路径配置
http://www.xifenfei.com/2011/06/%E5%9F%BA%E4%BA%8Einnobackupex%E7%9A%84mysql%E5%A4%87%E4%BB%BD%E8%84%9A%E6%9C%AC.html