对于数据库的备份和恢复是DBA的主要责任,而如何才能有效的备份数据库,并且能在数据库崩溃的时候及时恢复便变的相当重要了,如果在Linux上纯手动的备份数据库,将会带来很大的麻烦,所有我就写了个脚本,把脚本加入到定期任务列表中,定期执行数据备份,这就变得更加容易管理数据库了,我这里是一个简单的小脚本,当然在实际引用中还要修改,比如添加用户和密码,可以根据自己的需要在做修改。
下面简单的介绍一下这个脚本,这个脚本执行的时候有四个参数:
/PATH/mysqlbak.sh -f  //完全备份,这个可以根据自己数据库变动的情况设置多长时间执行一次,加入一个月执行一次吧!
/PATH/mysqlbak.sh -d //这个是从最后一次完全备份到目前的时间的一次差异备份,这样就减少了备份数据库的时间。
/PATH/mysqlbak.sh -i //这个参数可以实现增量备份,也就是上一次备份和这次备份之间数据库的变动,这个时间可以短一点,这样可以在数据库崩溃的时候减少损失,可以一个小时一次。
/PATH/mysqlbak.sh -h //这个是帮助信息
把这些都加入到定期执行计划中,就可以实现自动执行脚本了,不用管理员手动进行备份了。
#!/bin/bash
#
function HELPTXT {
  echo "/PATH/mysqlbak.sh -f: You can backup all databases"
  echo "/PATH/mysqlbak.sh -i: Just backup the exter change from the last backup"
  echo "/PATH/mysqlbak.sh -d: Backup from the last full-backup to the current time"
}
DATE=`date "+%F-%H-%M-%S"`
mysql -e "FLUSH TABLES WITH READ LOCK;"
mysql -e "SHOW MASTER STATUS;">/dev/null
startfile=/tmp/startposition
exterfile=/tmp/exterposition
while getopts "fdih" OPTS;do
  case $OPTS in
    f)
      mysqldump   --all-databases  >/mybackup/db.$DATE
      STARTPOSITION=`mysql -e "SHOW MASTER STATUS;" | tail -1 | awk '{print $2}'>$startfile`
      ESTARTPOSITION=`mysql -e "SHOW MASTER STATUS;" | tail -1 | awk '{print $2}'>$exterfile`
      cd /mybackup
      tar -cjf /root/bakmysql/db.$DATE.tar.gz2 db.$DATE >/dev/null
    ;;
    d)
      mysql -e "FLUSH TABLES WITH READ LOCK;"
      mysql -e "SHOW MASTER STATUS;">/dev/null
      FILE=`mysql -e "SHOW MASTER STATUS;" | tail -1 | awk '{print $1}'`
      STARTPOSITION=`cat $startfile`
      ENDPOSITION=`mysql -e "SHOW MASTER STATUS;" | tail -1 | awk '{print $2}'`
      mysqlbinlog --start-position $STARTPOSITION  --stop-position $ENDPOSITION /mydata/data/$FILE >/mybackup/incre.$DATE
      cd /mybackup
      tar -cjf /root/bakmysql/incre.$DATE.tar.gz2  incre.$DATE >/dev/null
    ;;
    i)
      mysql -e "FLUSH TABLES WITH READ LOCK;"
      mysql -e "SHOW MASTER STATUS;">/dev/null
      FILE=`mysql -e "SHOW MASTER STATUS;" | tail -1 | awk '{print $1}'`
      EENDPOSITION=`mysql -e "SHOW MASTER STATUS;" | tail -1 | awk '{print $2}' >>$exterfile`
      ESTARTPOSITION=`tail -n 2 $exterfile | head -n 1`
      Exendposition=`tail -n 1 $exterfile`
      mysqlbinlog --start-position $ESTARTPOSITION  --stop-position $Exendposition  /mydata/data/$FILE >/mybackup/exter.$DATE
      cd /mybackup
      tar -cjf /root/bakmysql/exter.$DATE.tar.gz2  exter.$DATE >/dev/null
    ;;
    h)
      HELPTXT 
    ;;
  esac
done
 
在crontab -e中添加任务计划,就能实现自动备份数据库了!!
 
希望这个小脚本能够让你更加便捷的管理mysql数据库,如有问题,可以共同探讨!