1. #!/bin/bash  
  2. #THIS SCRIPTS FOR MYSQL FULL BACKUP  
  3. #LAST DATE MODIFIED:2011/1/6  
  4. #MYSQL INSTALL DIRCTORY  
  5. MYSQL="/usr/local/mysql" 
  6. #MYSQL DATA DIRCTORY  
  7. MYSQL_DATA="${MYSQL}/data" 
  8. #BACKUP DATABASE NAME LIST  
  9. LIST="${MYSQL}/database_list.txt" 
  10. #BACKUP ROOT DIRCTORY  
  11. ROOT="/mysql_backup" 
  12. #BACKUP DATE  
  13. DATE=$(date +%Y-%m-%d)  
  14. #BACKUP DIRCTORY  
  15. BKDI="${ROOT}/full_${DATE}" 
  16. #BACKUP LOG FILE  
  17. LOG="${MYSQL}/mysql_backup.log" 
  18. #EMAIL ADDRESS  
  19. #ON CONDITION THAT OPEN PORT 25  
  20. MAIL=l23@163.com  
  21. CC_MAIL=456@163.com  
  22. #MYSQL DUMP PROGRRAM  
  23. DUMP="${MYSQL}/bin/mysqldump -u root" 
  24. OPT="--default-character-set=utf8 \  
  25. --skip-opt \  
  26. --add-drop-table \  
  27. --set-charset \  
  28. --extended-insert=false \  
  29. --create-option \  
  30. --disable-keys \  
  31. --quick \  
  32. --trigger \  
  33. --routines \  
  34. --hex-blob \  
  35. --single-transaction \  
  36. --master-data=2"  
  37. --default-character-set=utf8   
  38. #指定导出数据时采用何种字符集,如果数据表不是采用默认的 latin1 字符集的话,  
  39. #那么导出时必须指定该选项,否则再次导入数据后将产生乱码问题。  
  40. #--opt   
  41. #该选项是速记;等同于指定 --add-drop-tables --add-locking --create-option --disable-keys --extended-insert   
  42. #--lock-tables --quick --set-charset。它可以给出很快的转储操作并# 产生一个可以很快装入MySQL服务器的转储文件。  
  43. #该选项默认开启,但可以用--skip-opt禁用。要想只禁用确信用-opt启用的选项,使用--skip形式;  
  44. #例如,--skip-add-drop-tables或--skip-quick。  
  45.    
  46. #--set-charset  
  47. #将SET NAMES default_character_set加到输出中。该选项默认启用。要想禁用SET NAMES语句,使用--skip-set-charset  
  48. #--extended-insert=false 
  49. #使用包括几个VALUES列表的多行INSERT语法。这样使转储文件更小,重载文件时可以加速插入。  
  50. #--create-option  
  51. #在CREATE TABLE语句中包括所有MySQL表选项。  
  52. #--disable-keys  
  53. #对于每个表,用/*!40000 ALTER TABLE tbl_name DISABLE KEYS */;和/*!40000 ALTER TABLE tbl_name ENABLE KEYS */;  
  54. #语句引用INSERT语句。这样可以更快地装载转储文件,因为在插入所有行后创建索引。该选项只适合MyISAM表。  
  55. #--quick   
  56. #选项用于转储大的表。它强制mysqldump从服务器一次一行地检索表中的行而不是检索所有行并在输出前将它缓存到内存中。  
  57. #--trigger  
  58. #为每个转储的表转储触发器。该选项默认启用;用--skip-triggers禁用它。  
  59. #--routines  
  60. #在转储的数据库中转储存储程序(函数和程序)。使用---routines产生的输出包含CREATE PROCEDURE和CREATE FUNCTION语句以重新创建子程序。但是,这些语句不包括属性,例如子程序定义者或创建和修改时间戳。这说明当重载子程序时,对它们进行创建时定义者应设置为重载用户,时间戳等于重载时间。  
  61. #--hex-blob   
  62. #使用十六进制符号转储二进制字符串列(例如,'abc' 变为0x616263)。影响到的列有BINARY、VARBINARY、BLOB。  
  63. #--single-transaction  
  64. #该选项从服务器转储数据之前发出一个BEGIN SQL语句。它只适用于事务表,例如InnoDB和BDB,因为然后它将在发出BEGIN而没有阻塞任何应用程序时转储一致的数据库状态。  
  65. #当使用该选项时,应记住只有InnoDB表能以一致的状态被转储。例如,使用该选项时任何转储的MyISAM或HEAP表仍然可以更改状态。  
  66. #--single-transaction选项和--lock-tables选项是互斥的,因为LOCK TABLES会使任何挂起的事务隐含提交。  
  67. #要想转储大的表,应结合--quick使用该选项。  
  68. #--master-data=2 
  69. #该选项将二进制日志的位置和文件名写入到输出中。该选项要求有RELOAD权限,并且必须启用二进制日志。如果该选项值等于1,位置和文件名被写入CHANGE MASTER语句形式的转储输出,如果你使用该SQL转储主服务器以设置从服务器,从服务器从主服务器二进制日志的正确位置开始。如果选项值等于2,CHANGE MASTER语句被写成SQL注释。如果value被省略,这是默认动作。  
  70. #--master-data选项启用--lock-all-tables,除非还指定--single-transaction(在这种情况下,只在刚开始转储时短时间获得全局读锁定。又见--single-transaction。在任何一种情况下,日志相关动作发生在转储时。该选项自动关闭--lock-tables。  
  71.  
  72. #DEFINE WHEN FULL BACKUP ,BINARY LOGS FILE NAME LIST  
  73. FB_BLFNL="${MYSQL}"/"fullbackup_binary_logs_list.txt"  
  74. #OUTPUT THE DATE TO LOGFILE  
  75. echo "=======================$DATE: MYSQL Full Backup Log======================" >>$LOG  
  76. #CHECK MYSQL SEVICE STATUS,NOT RUNNING THEN EXIST!  
  77. PID=$(ps -ef | grep "mysqld_safe" | grep -v 'grep')  
  78. NOTRUN="Mysql Service is not Running!" 
  79. if [ "${PID}X" == "X" ];then  
  80.  echo "  @$(date +%T)==>$NOTRUN" >>$LOG  
  81.  echo "" >>$LOG  
  82.  #echo "$NOTRUN" | mail -s "$(date +%Y-%m-%d_%T) $NOTRUN" $MAIL  
  83.  echo "$NOTRUN" | mail -s "$(date +%Y-%m-%d_%T) $NOTRUN" -c ${CC_MAIL} $MAIL  
  84.  echo "" >>$LOG  
  85.  exit 1  
  86. fi  
  87. #CHECK BACKUP ROOT DIRCTORY  
  88. if [ ! -e ${ROOT} ];then  
  89.  mkdir $ROOT  
  90. fi  
  91.  
  92. #CHECK FILE "database_list", IF NOT EXIST THEN EXIT!  
  93. NOTEXIST="File $LIST not exist !!" 
  94. if [  ! -e ${LIST} ];then  
  95.  echo "@$(date +%T)==>$NOTEXIST" >>$LOG  
  96.  echo "" >>$LOG  
  97.  echo "$NOTEXIST" | mail -s "$(date +%Y-%m-%d_%T) Mysql backup error: $NOTEXIST" -c ${CC_MAIL} $MAIL  
  98.  echo "" >>$LOG  
  99.  exit 1  
  100. fi  
  101. #CHECK BACKUP DIRCTORY  
  102. if [ ! -e ${BKDI} ];then  
  103.         mkdir $BKDI  
  104. fi  
  105. #GET DATABASE NAME  
  106. NAME=$(cat ${LIST})  
  107. #CD BAKCUP DIRCTORY  
  108. cd ${BKDI}  
  109. #DEFINE BACKUP FUNCTION  
  110. function full_backup ( ) {  
  111.  echo "< Start Time:$(date +%T) >>>$LOG  
  112.  for name in $NAME  
  113.  do  
  114.   ls ${MYSQL_DATA} | grep $name &>/dev/null  
  115.   if [ $? == 0 ];then   
  116.    $DUMP $OPT $name > ${name}.sql   
  117.    if [ $? == 0 ];then  
  118.     COMP=$(tail ${name}.sql | awk 'NR==10 {print $2,$3}')  
  119.     if [ "$COMP" = "Dump completed" ];then  
  120.      tar -jc --remove-files -f ${name}.sql.tar.bz2 ${name}.sql    
  121.      SIZE=$(ls  -lh ${name}.sql.tar.bz2 | awk '{print $5}')  
  122.      echo "  @$(date +%T)==>Database [$name]:${SIZE} Full Backup Sucessful !!" >>$LOG  
  123.     else  
  124.      echo "  @$(date +%T)==>Database [$name] Backup NOT Success!!" >>$LOG  
  125.     fi  
  126.    else  
  127.     echo "  @$(date +%T)==>Database [$name]:Command Execute Not Success!!" >>$LOG  
  128.    fi  
  129.   else  
  130.    echo "  @$(date +%T)==>DataBase [$name] is not exist!!" >>$LOG  
  131.   fi  
  132.  done  
  133.  echo "< End   Time:$(date +%T) >>>$LOG  
  134. }  
  135. #CHECK MYSQL SEVICE STATUS IF EXIST THEN START BACKUP  
  136. PID1=$(ps -ef | grep "mysqld_safe" | grep -v 'grep')  
  137. SUCCESS="Mysql Full Backup Successfully Complete!!" 
  138. if [ "${PID1}X" != "X" ];then  
  139.  full_backup  
  140.  #echo "$SUCCESS" | mail -s "$(date +%Y-%m-%d_%T) $SUCCESS" $MAIL  
  141.  echo "$SUCCESS" | mail -s "$(date +%Y-%m-%d_%T) $SUCCESS" -c ${CC_MAIL} $MAIL  
  142. fi  
  143. #OUTPUT A BlANK LINE TO LOGFILE  
  144. echo "" >>$LOG  
  145. #GET BINARY LOG FILES NAME EXCEPT THE NEW BINARY LOG  
  146. cd ${MYSQL_DATA}  
  147. LINES=$(expr $(ls mysql-bin.0* | wc -l) - 1)  
  148. #EMPTY FULL_BINARY_LOGS_LIST.TXT  
  149. >${FB_BLFNL}  
  150. #WRITE BINARY LOG NAME TO FULL_BINARY_LOGS_LIST.TXT  
  151. i=1 
  152. for binname in $(ls mysql-bin.0*)  
  153. do  
  154.    if [ $i -gt $LINES ];then  
  155.         exit  
  156.    fi  
  157.    echo $binname >>${FB_BLFNL}  
  158.    i=$(( $i + 1 ))  
  159. done  
  160. ~