说明
使用shell实现mysql全量,增量备份。增量备份脚本在周一-周六凌晨3点执行,会复制mater_bin.00000*到指定目录;全量备份脚本则使用mysqldump将所有的数据库导出,每周日凌晨3点执行,并删除上周留下的master_bin.00000*。然后对mysql的备份操作会保留在bak.log文件中
1、编写mysql数据库全备份脚本
shell>vim dbfullbak.sh
#!/bin/bash
#Program
#    use mysqldump to Fully backup mysql dataper week!
#History
#    2014-06-26 dinglei     first
# Path
#    ....
bakdir=/mysqldb_bak
logfile=/mysqldb_bak/backup.log
username=root
pass=111111
date=`date+%Y-%m-%d`
start=`date"+%Y-%m-%d %H:%M:%S"`
cd$bakdir
filename=full_bak
/usr/local/mysql/bin/mysqldump--default-character-set=utf8 --opt --extended-insert=false --triggers -R--hex-blob --single-transaction --quick --all-databases -u$username -p$pass | gzip > $filename-$date.sql.gz
end=`date"+%Y-%m-%d %H:%M:%S"`
startutc=`date+%s -d "$start"`
endutc=`date+%s -d "$end"`
interval=$(($endutc-$startutc))
echo"Start:$start End:$end $filename-$date.sql.gz is backupsucc,Interval:$interval;" >> $logfile
cd$bakdir/daily
rm -f *
 
mysqldump使用参数说明:
--default-character-set=utf8:指定导出数据时采用何种字符集,如果数据表不是采用默认的latin1 字符集的话,那么导出时必须指定该选项,否则再次导入数据后将产生乱码问题。
--opt :这只是一个快捷选项,等同于同时添加--add-drop-tables --add-locking --create-option --disable-keys--extended-insert --lock-tables --quick --set-charset 选项。本选项能让 mysqldump 很快的导出数据,并且导出的数据能很快导回。该选项默认开启,但可以用--skip-opt 禁用。注意,如果运行 mysqldump 没有指定 --quick 或 --opt 选项,则会将整个结果集放在内存中。如果导出大数据库的话可能会出现问题。
--extended-insert=false:默认情况下,mysqldump 开启 --complete-insert 模式,因此不想用它的的话,就使用本选项,设定它的值为 false 即可。 
--triggers:同时导出触发器。该选项默认启用,用--skip-triggers 禁用它。
-R :导出存储过程以及自定义函数。
--hex-blob:使用十六进制格式导出二进制字符串字段。如果有二进制数据就必须使用本选项。影响到的字段类型有 BINARY、VARBINARY、BLOB。
--single-transaction:该选项在导出数据之前提交一个 BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于事务表,例如InnoDB 和 BDB。本选项和 --lock-tables选项是互斥的,因为 LOCK TABLES 会使任何挂起的事务隐含提交。要想导出大表的话,应结合使用 --quick 选项。
--quick  :该选项在导出大表时很有用,它强制 mysqldump 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中。
--all-databases  :导出所有库。
 
2、编写增量备份脚本
shell>vim dbdailybak.sh
#!/bin/bash
# Program
#    use cp tobackup mysql data everyday!
# History
#    2014-06-26dinglei     first
# Path
#    ....
bakdir=/mysqldb_bak/daily
bindir=/data/mysqlbinlog
logfile=/mysqldb_bak/backup.log
binfile=/data/mysqlbinlog/master_bin.index
username=root
pass=111111
/usr/local/mysql/bin/mysqladmin -u$username -p$passflush-logs
 
counter=`wc -l $binfile |awk '{print $1}'`
nextnum=0
 
for file in `cat $binfile`
do
       base=`basename $file`
 
       nextnum=`expr $nextnum + 1`
        if [$nextnum -eq $counter ]
        then
               echo $base skip!  >>$logfile
        else
               dest=$bakdir/$base
               if(test -e $dest)
 
               then
                       echo  $base exist! >>$logfile
               else
                       cp $bindir/$base $bakdir
                       echo $base copying >> $logfile
               fi
        fi
done
echo `date "+%Y-%m-%d %H:%M:%S"` there are`expr $nextnum - 1`\'s bin-file backup is succ! >> $logfile
 
 
3、设置crontab,每天执行备份脚本
shell>crontab –e
MAILTO=””
#每个星期日凌晨3:00执行完全备份脚本
0 3 * * 0 /root/dbfullbak.sh >/dev/null2>&1
#周一到周六凌晨3:00做增量备份
0 3* * 1-6 /root/dbdailybak.sh >/dev/null 2>&1