1. set -e
    2. USER="backup"
    3. PASSWORD="backup"
    4. #定义变量=数据库数据目录
    5. DATA_DIR="/data/mysql"
    6. BIN_INDEX=$DATA_DIR"/mysql-bin.index"
    7. #定义备份目录=备份存放路径
    8. BACKUP_DIR="/data/backup/mysql"
    9. BACKUP_LOG="/var/log/mysql/backup.log"
    10. DATE=`date +"%Y%m%d"`
    11. TIME=`date +"%Y%m%d%H"`
    12. LOG_TIME=`date +"%Y-%m-%d %H:%M:%S"`
    13. DELETE_BINLOG_TIME="7 day"
    14. INCREMENT_INTERVAL="3 hour"
    15. note() {
    16. printf "[$LOG_TIME] note: $*\n" >> $BACKUP_LOG;
    17. }
    18. warning() {
    19. printf "[$LOG_TIME] warning: $*\n" >> $BACKUP_LOG;
    20. }
    21. error() {
    22. printf "[$LOG_TIME] error: $*\n" >> $BACKUP_LOG;
    23. exit 1;
    24. }
    25. full_backup() {
    26. local dbs=`ls -l $DATA_DIR | grep "^d" | awk -F " " '{print $9}'`
    27. for db in $dbs
    28. do
    29. local backup_dir=$BACKUP_DIR"/full/"$db
    30. local filename=$db"."$DATE
    31. local backup_file=$backup_dir"/"$filename".sql"
    32. if [ ! -d $backup_dir ]
    33. then
    34. mkdir -p $backup_dir || { error "创建数据库 $db 全量备份目录 $backup_dir 失败"; continue; }
    35. note "数据库 $db 全量备份目录 $backup_dir 不存在,创建完成";
    36. fi
    37. note "full backup $db start ..."
    38. mysqldump --user=${USER} --password=${PASSWORD} --flush-logs --skip-lock-tables --quick $db > $backup_file || { warning "数据库 $db 备份失败"; continue; }
    39. cd $backup_dir
    40. tar -cPzf $filename".tar.gz" $filename".sql"
    41. rm -f $backup_file
    42. chown -fR mysql:mysql $backup_dir
    43. note "数据库 $db 备份成功";
    44. note "full backup $db end."
    45. done
    46. }
    47. increment_backup() {
    48. local StartTime=`date "-d $INCREMENT_INTERVAL ago" +"%Y-%m-%d %H:%M:%S"`
    49. local DELETE_BINLOG_END_TIME=`date "-d $DELETE_BINLOG_TIME ago" +"%Y-%m-%d %H:%M:%S"`
    50. local dbs=`ls -l $DATA_DIR | grep "^d" | awk -F " " '{print $9}'`
    51. mysql -u$USER -p$PASSWORD -e "purge master logs before '$DELETE_BINLOG_END_TIME'" && note "delete $DELETE_BINLOG_TIME days before log";
    52. filename=`cat $BIN_INDEX | awk -F "/" '{print $2}'`
    53. for i in $filename
    54. do
    55. for db in $dbs
    56. do
    57. local backup_dir=$BACKUP_DIR"/increment/"$db
    58. local filename=$db"."$TIME
    59. local backup_file=$backup_dir"/"$filename".sql"
    60. if [ ! -d $backup_dir ]
    61. then
    62. mkdir -p $backup_dir || { error "创建数据库 $db 增量备份目录 $backup_dir 失败"; continue; }
    63. note "数据库 $db 增量备份目录 $backup_dir 不存在,创建完成";
    64. fi
    65. note "increment backup $db form time $StartTime start ..."
    66. mysqlbinlog -d $db --start-datetime="$StartTime" $DATA_DIR/$i >> $backup_file || { warning "数据库 $db 备份失败"; continue; }
    67. note "increment backup $db end."
    68. done
    69. done
    70. for db in $dbs
    71. do
    72. local backup_dir=$BACKUP_DIR"/increment/"$db
    73. local filename=$db"."$TIME
    74. local backup_file=$backup_dir"/"$filename".sql"
    75. cd $backup_dir
    76. tar -cPzf $filename".tar.gz" $filename".sql"
    77. rm -f $backup_file
    78. note "数据库 $db 备份成功";
    79. done
    80. }
    81. case "$1" in
    82. full)
    83. full_backup
    84. ;;
    85. increment)
    86. increment_backup
    87. ;;
    88. *)
    89. exit 2
    90. ;;
    91. esac
    92. exit 1