- #!/bin/bash
- #THIS SCRIPTS FOR MYSQL FULL BACKUP
- #LAST DATE MODIFIED:2011/1/6
- #MYSQL INSTALL DIRCTORY
- MYSQL="/usr/local/mysql"
- #MYSQL DATA DIRCTORY
- MYSQL_DATA="${MYSQL}/data"
- #BACKUP DATABASE NAME LIST
- LIST="${MYSQL}/database_list.txt"
- #BACKUP ROOT DIRCTORY
- ROOT="/mysql_backup"
- #BACKUP DATE
- DATE=$(date +%Y-%m-%d)
- #BACKUP DIRCTORY
- BKDI="${ROOT}/full_${DATE}"
- #BACKUP LOG FILE
- LOG="${MYSQL}/mysql_backup.log"
- #EMAIL ADDRESS
- #ON CONDITION THAT OPEN PORT 25
- MAIL=l23@163.com
- CC_MAIL=456@163.com
- #MYSQL DUMP PROGRRAM
- DUMP="${MYSQL}/bin/mysqldump -u root"
- OPT="--default-character-set=utf8 \
- --skip-opt \
- --add-drop-table \
- --set-charset \
- --extended-insert=false \
- --create-option \
- --disable-keys \
- --quick \
- --trigger \
- --routines \
- --hex-blob \
- --single-transaction \
- --master-data=2"
- # --default-character-set=utf8
- #指定导出数据时采用何种字符集,如果数据表不是采用默认的 latin1 字符集的话,
- #那么导出时必须指定该选项,否则再次导入数据后将产生乱码问题。
- #--opt
- #该选项是速记;等同于指定 --add-drop-tables --add-locking --create-option --disable-keys --extended-insert
- #--lock-tables --quick --set-charset。它可以给出很快的转储操作并# 产生一个可以很快装入MySQL服务器的转储文件。
- #该选项默认开启,但可以用--skip-opt禁用。要想只禁用确信用-opt启用的选项,使用--skip形式;
- #例如,--skip-add-drop-tables或--skip-quick。
- #--set-charset
- #将SET NAMES default_character_set加到输出中。该选项默认启用。要想禁用SET NAMES语句,使用--skip-set-charset
- #--extended-insert=false
- #使用包括几个VALUES列表的多行INSERT语法。这样使转储文件更小,重载文件时可以加速插入。
- #--create-option
- #在CREATE TABLE语句中包括所有MySQL表选项。
- #--disable-keys
- #对于每个表,用/*!40000 ALTER TABLE tbl_name DISABLE KEYS */;和/*!40000 ALTER TABLE tbl_name ENABLE KEYS */;
- #语句引用INSERT语句。这样可以更快地装载转储文件,因为在插入所有行后创建索引。该选项只适合MyISAM表。
- #--quick
- #选项用于转储大的表。它强制mysqldump从服务器一次一行地检索表中的行而不是检索所有行并在输出前将它缓存到内存中。
- #--trigger
- #为每个转储的表转储触发器。该选项默认启用;用--skip-triggers禁用它。
- #--routines
- #在转储的数据库中转储存储程序(函数和程序)。使用---routines产生的输出包含CREATE PROCEDURE和CREATE FUNCTION语句以重新创建子程序。但是,这些语句不包括属性,例如子程序定义者或创建和修改时间戳。这说明当重载子程序时,对它们进行创建时定义者应设置为重载用户,时间戳等于重载时间。
- #--hex-blob
- #使用十六进制符号转储二进制字符串列(例如,'abc' 变为0x616263)。影响到的列有BINARY、VARBINARY、BLOB。
- #--single-transaction
- #该选项从服务器转储数据之前发出一个BEGIN SQL语句。它只适用于事务表,例如InnoDB和BDB,因为然后它将在发出BEGIN而没有阻塞任何应用程序时转储一致的数据库状态。
- #当使用该选项时,应记住只有InnoDB表能以一致的状态被转储。例如,使用该选项时任何转储的MyISAM或HEAP表仍然可以更改状态。
- #--single-transaction选项和--lock-tables选项是互斥的,因为LOCK TABLES会使任何挂起的事务隐含提交。
- #要想转储大的表,应结合--quick使用该选项。
- #--master-data=2
- #该选项将二进制日志的位置和文件名写入到输出中。该选项要求有RELOAD权限,并且必须启用二进制日志。如果该选项值等于1,位置和文件名被写入CHANGE MASTER语句形式的转储输出,如果你使用该SQL转储主服务器以设置从服务器,从服务器从主服务器二进制日志的正确位置开始。如果选项值等于2,CHANGE MASTER语句被写成SQL注释。如果value被省略,这是默认动作。
- #--master-data选项启用--lock-all-tables,除非还指定--single-transaction(在这种情况下,只在刚开始转储时短时间获得全局读锁定。又见--single-transaction。在任何一种情况下,日志相关动作发生在转储时。该选项自动关闭--lock-tables。
- #DEFINE WHEN FULL BACKUP ,BINARY LOGS FILE NAME LIST
- FB_BLFNL="${MYSQL}"/"fullbackup_binary_logs_list.txt"
- #OUTPUT THE DATE TO LOGFILE
- echo "=======================$DATE: MYSQL Full Backup Log======================" >>$LOG
- #CHECK MYSQL SEVICE STATUS,NOT RUNNING THEN EXIST!
- PID=$(ps -ef | grep "mysqld_safe" | grep -v 'grep')
- NOTRUN="Mysql Service is not Running!"
- if [ "${PID}X" == "X" ];then
- echo " @$(date +%T)==>$NOTRUN" >>$LOG
- echo "" >>$LOG
- #echo "$NOTRUN" | mail -s "$(date +%Y-%m-%d_%T) $NOTRUN" $MAIL
- echo "$NOTRUN" | mail -s "$(date +%Y-%m-%d_%T) $NOTRUN" -c ${CC_MAIL} $MAIL
- echo "" >>$LOG
- exit 1
- fi
- #CHECK BACKUP ROOT DIRCTORY
- if [ ! -e ${ROOT} ];then
- mkdir $ROOT
- fi
- #CHECK FILE "database_list", IF NOT EXIST THEN EXIT!
- NOTEXIST="File $LIST not exist !!"
- if [ ! -e ${LIST} ];then
- echo "@$(date +%T)==>$NOTEXIST" >>$LOG
- echo "" >>$LOG
- echo "$NOTEXIST" | mail -s "$(date +%Y-%m-%d_%T) Mysql backup error: $NOTEXIST" -c ${CC_MAIL} $MAIL
- echo "" >>$LOG
- exit 1
- fi
- #CHECK BACKUP DIRCTORY
- if [ ! -e ${BKDI} ];then
- mkdir $BKDI
- fi
- #GET DATABASE NAME
- NAME=$(cat ${LIST})
- #CD BAKCUP DIRCTORY
- cd ${BKDI}
- #DEFINE BACKUP FUNCTION
- function full_backup ( ) {
- echo "< Start Time:$(date +%T) >" >>$LOG
- for name in $NAME
- do
- ls ${MYSQL_DATA} | grep $name &>/dev/null
- if [ $? == 0 ];then
- $DUMP $OPT $name > ${name}.sql
- if [ $? == 0 ];then
- COMP=$(tail ${name}.sql | awk 'NR==10 {print $2,$3}')
- if [ "$COMP" = "Dump completed" ];then
- tar -jc --remove-files -f ${name}.sql.tar.bz2 ${name}.sql
- SIZE=$(ls -lh ${name}.sql.tar.bz2 | awk '{print $5}')
- echo " @$(date +%T)==>Database [$name]:${SIZE} Full Backup Sucessful !!" >>$LOG
- else
- echo " @$(date +%T)==>Database [$name] Backup NOT Success!!" >>$LOG
- fi
- else
- echo " @$(date +%T)==>Database [$name]:Command Execute Not Success!!" >>$LOG
- fi
- else
- echo " @$(date +%T)==>DataBase [$name] is not exist!!" >>$LOG
- fi
- done
- echo "< End Time:$(date +%T) >" >>$LOG
- }
- #CHECK MYSQL SEVICE STATUS IF EXIST THEN START BACKUP
- PID1=$(ps -ef | grep "mysqld_safe" | grep -v 'grep')
- SUCCESS="Mysql Full Backup Successfully Complete!!"
- if [ "${PID1}X" != "X" ];then
- full_backup
- #echo "$SUCCESS" | mail -s "$(date +%Y-%m-%d_%T) $SUCCESS" $MAIL
- echo "$SUCCESS" | mail -s "$(date +%Y-%m-%d_%T) $SUCCESS" -c ${CC_MAIL} $MAIL
- fi
- #OUTPUT A BlANK LINE TO LOGFILE
- echo "" >>$LOG
- #GET BINARY LOG FILES NAME EXCEPT THE NEW BINARY LOG
- cd ${MYSQL_DATA}
- LINES=$(expr $(ls mysql-bin.0* | wc -l) - 1)
- #EMPTY FULL_BINARY_LOGS_LIST.TXT
- : >${FB_BLFNL}
- #WRITE BINARY LOG NAME TO FULL_BINARY_LOGS_LIST.TXT
- i=1
- for binname in $(ls mysql-bin.0*)
- do
- if [ $i -gt $LINES ];then
- exit
- fi
- echo $binname >>${FB_BLFNL}
- i=$(( $i + 1 ))
- done
- ~
转载于:https://blog.51cto.com/linux5588/752027