基于innobackupex的mysql备份脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 |
#! /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安装路径配置
发表评论
要发表评论,您必须先登录。