好久沒有寫博客,今天更新一個mysql的備份腳本。腳本里面的help信息寫的很全了。
腳本還是有一些不太智能,不過不影響使用。
- #!/bin/bash
- #This is a ShellScript For mysql All DB Backup and Bin-log.
- #version v1
- #2013-04-12
- #此腳本爲一週一個全庫備份,每天一個增量備份。每週一爲全庫備份,其他爲增量備份。
- # Defaults setting
- port=3306
- weekly=1
- #setting
- #設置數據庫名,數據庫登錄,備份路徑,日誌路徑,數據文件位置,以及備份方式
- #默認情況下,用sock登錄mysql數據庫,備份至/data/backup/db_backup/
- BackupPath=/data/backup/db_backup/mysql_$port/
- LogFile=/var/log/innobackupex_mysql_$port.log
- DBdataPath=/data/mysql_$port/data/
- innobackupex=/usr/bin/innobackupex
- allbackup="$BackupPath""$port"_$(date +%Y-%m-%d)_full
- mysqlbackup="$BackupPath"mysql_$(date +%Y-%m-%d)
- frmbackup="$BackupPath"frm
- weekly=1
- next=$(expr $weekly + 1)
- #Setting End
- recovery_single_table(){
- cat << EOF
- 導入或導出單張表:
- 默認情況下,InnoDB表不能通過直接複製表文件的方式在mysql服務器之間進行移植,即便使用了innodb_file_per_table選項。而使用Xtrabackup工具可以實現此種功能,
- 不過,此時需要“導出”表的mysql服務器啓用了innodb_file_per_table選項(嚴格來說,是要“導出”的表在其創建之前,mysql服務器就啓用了innodb_file_per_table選項),
- 並且“導入”表的服務器同時啓用了innodb_file_per_table和innodb_expand_import(innodb_import_table_from_xtrabackup=1)選項。
- (1)“導出”表
- 導出表是在備份的prepare階段進行的,因此,一旦完全備份完成,就可以在prepare過程中通過--export選項將某表導出了:
- /usr/bin/innobackupex --defaults-file=/data/mysql_3312/mysql_3312.cnf --apply-log --use-memory=4G --export /data/backup/db_backup/mysql_3312/3312_2013-04-15_full
- /usr/bin/innobackupex --defaults-file=/data/mysql_3312/mysql_3312.cnf --apply-log --use-memory=4G --export --incremental --incremental-dir=/data/backup/db_backup/mysql_3312/3312_2013-04-16 /data/backup/db_backup/mysql_3312/3312_2013-04-15_full
- 上面是基於增量備份的,所以--export兩次。多次類似。
- (2)“導入”表
- 要在mysql服務器上導入來自於其它服務器的某innodb表,需要先在當前服務器上創建一個跟原表表結構一致的表,而後才能實現將表導入:
- mysql> CREATE TABLE mytable (...) ENGINE=InnoDB;或者如果表結構沒有問題的話,可以mysql> truncate table mytable;
- 然後將此表的表空間刪除:
- mysql> ALTER TABLE mydatabase.mytable DISCARD TABLESPACE;
- 接下來,將來自於“導出”表的服務器的mytable表的mytable.ibd和mytable.exp文件複製到當前服務器的數據目錄,更改爲mysql.mysql的權限,然後使用如下命令將其“導入”:
- mysql> ALTER TABLE mydatabase.mytable IMPORT TABLESPACE;
- EOF
- }
- recovery_all_data(){
- cat << EOF
- 全庫恢復:
- 1.解壓包。
- 2./usr/bin/innobackupex --defaults-file=/data/mysql_3312/mysql_3312.cnf --apply-log /data/backup/db_backup/mysql_3312/3312_2013-04-15_full
- 這裏的--apply-log指明是將日誌應用到數據文件上,完成之後將備份文件中的數據恢復到數據庫中.
- 3./etc/init.d/mysql_3312 stop;cd /data/mysql_3312/;mv data data-bak;mkdir data;chown mysql.root data;
- 要恢復需要停掉mysql,然後把數據文件刪掉,爲了保險把data文件夾改名,新建data文件夾。
- 4./usr/bin/innobackupex --defaults-file=/data/mysql_3312/mysql_3312.cnf --copy-back /data/backup/db_backup/mysql_3312/3312_2013-04-15_full
- 這裏的--copy-back指明是進行數據恢復。數據恢復完成之後,需要修改相關文件的權限mysql數據庫才能正常啓動。
- 5.chown -R mysql.root /data/mysql_3312/data/;/etc/init.d/mysql_3312 start
- 恢復完之後,需要更改數據文件爲mysql的使用用戶,然後啓動mysql。
- 6.從庫的話,需要查看xtrabackup_slave_info信息,看同步的MASTER_LOG_FILE和MASTER_LOG_POS。
- mysql> change master to master_host='172.16.2.25',master_port=3312,master_user='repl',master_password='xxx',master_log_file='mysql-bin.000902',master_log_pos=143068038;
- EOF
- }
- recovery_incremental_data(){
- cat << EOF
- 增量恢復
- 1.解壓包。
- 2./usr/bin/innobackupex --defaults-file=/data/mysql_3312/mysql_3312.cnf --apply-log /data/backup/db_backup/mysql_3312/3312_2013-04-15_full
- 這裏的--apply-log指明是將日誌應用到數據文件上,完成之後將備份文件中的數據恢復到數據庫中.
- 3./usr/bin/innobackupex --defaults-file=/data/mysql_3309/mysql_3309.cnf --apply-log --use-memory=4G --incremental --incremental-dir=/data/backup/db_backup/mysql_3312/3312_2013-04-16 /data/backup/db_backup/mysql_3312/3312_2013-04-15_full
- 這裏的--incremental-dir爲全庫備份的(或者上一次備份的)
- 4./etc/init.d/mysql_3312 stop;cd /data/mysql_3312/;mv data data-bak;mkdir data;chown mysql.root data;
- 要恢復需要停掉mysql,然後把數據文件刪掉,爲了保險把data文件夾改名,新建data文件夾。
- 5./usr/bin/innobackupex --defaults-file=/data/mysql_3312/mysql_3312.cnf --copy-back --use-memory=4G /data/backup/db_backup/mysql_3312/3312_2013-04-15_full
- 這裏的--copy-back指明是進行數據恢復。數據恢復完成之後,需要修改相關文件的權限mysql數據庫才能正常啓動。
- 6.chown -R mysql.root /data/mysql_3312/data/;/etc/init.d/mysql_3312 start
- 恢復完之後,需要更改數據文件爲mysql的使用用戶,然後啓動mysql。
- 7.從庫的話,需要查看xtrabackup_slave_info信息,看同步的MASTER_LOG_FILE和MASTER_LOG_POS。
- mysql> change master to master_host='172.16.2.25',master_port=3312,master_user='repl',master_password='xxx',master_log_file='mysql-bin.000902',master_log_pos=143068038;
- EOF
- }
- usage(){
- cat << EOF
- Usage:
- 這是一個用來備份mysql的shell腳本,主要是用innobackupex來備份數據,用mysqldump來備份表結構,bin-log是每天備份前一天的。
- 備份策略是每週一個全庫備份,其他天是增量備份。
- Options:
- -h|--help
- 顯示幫助信息。
- -p|--port
- 設置mysql端口,默認3306.
- -w|weekly
- 設置一週內哪一天進行全庫備份。默認週一.
- --recovery_single_table
- 顯示恢復單張表方法.
- --recovery_all_data
- 顯示全備份恢復方法.
- --recovery_incremental_data
- 顯示增量備份恢復方法.
- Example:
- $0 -p 3307 -w 1
- EOF
- }
- while test -n "$1"; do
- case "$1" in
- -p|--port)
- port=$2
- shift
- ;;
- -h|--help)
- echo
- usage
- echo
- exit
- ;;
- -w|weekly)
- weekly=$2
- shift
- ;;
- --recovery_single_table)
- echo
- recovery_single_table
- echo
- exit
- ;;
- --recovery_all_data)
- echo
- recovery_all_data
- echo
- exit
- ;;
- --recovery_incremental_data)
- echo
- recovery_incremental_data
- echo
- exit
- ;;
- *)
- echo "Unknown argument: $1"
- usage
- echo
- exit
- ;;
- esac
- shift
- done
- #setting
- #設置數據庫名,數據庫登錄,備份路徑,日誌路徑,數據文件位置,以及備份方式
- #默認情況下,用sock登錄mysql數據庫,備份至/data/backup/db_backup/
- BackupPath=/data/backup/db_backup/mysql_$port/
- LogFile=/var/log/innobackupex_mysql_$port.log
- DBdataPath=/data/mysql_$port/data/
- innobackupex=/usr/bin/innobackupex
- allbackup="$BackupPath""$port"_$(date +%Y-%m-%d)_full
- frmbackup="$BackupPath"frm
- next=$(expr $weekly + 1)
- #Setting End
- echo "---------------------------------------------------------------------" >> $LogFile
- echo " $(date +"%y-%m-%d %H:%M:%S") Start " >> $LogFile
- echo "---------------------------------------------------------------------" >> $LogFile
- #check folder
- if ! [ -d $BackupPath ];then
- /bin/mkdir -p $BackupPath
- fi
- if ! [ -d $frmbackup ];then
- /bin/mkdir -p $frmbackup
- fi
- if ! [ -d $BackupPath/mysql-bin ];then
- /bin/mkdir -p $BackupPath/mysql-bin
- fi
- #Backup $port All Database
- if [ -f "$BackupPath""$port"_$(date +%Y-%m-%d).tar.gz ] || [ -f "$BackupPath""$port"_$(date +%Y-%m-%d)_full.tar.gz ];then
- echo "["$BackupPath""$port"_$(date +%Y-%m-%d).tar.gz] || ["$BackupPath""$port"_$(date +%Y-%m-%d)_full.tar.gz]The Backup File is exists,Can't Backup!" >> $LogFile
- else
- #full backup
- if [ $(date +%u) == $weekly ];then
- $innobackupex --defaults-file=/data/mysql_$port/mysql_$port.cnf --sock=/data/mysql_$port/mysql.sock --slave-info --no-timestamp $allbackup >> /dev/null 2>&1
- cd $BackupPath;tar zcf "$port"_$(date +%Y-%m-%d)_full.tar.gz "$port"_$(date +%Y-%m-%d)_full >> /dev/null 2>&1
- echo "["$BackupPath""$port"_$(date +%Y-%m-%d)_full.tar.gz]Backup Success!" >> $LogFile
- if [ -d "$port"_$(date +%Y-%m-%d --date='1 days ago') ];then
- rm -rf "$port"_$(date +%Y-%m-%d --date='1 days ago')
- echo "[/bin/rm -rf "$port"_$(date +%Y-%m-%d --date='1 days ago')_full]Delete Success!" >> $LogFile
- else
- echo "[/bin/rm -rf "$port"_$(date +%Y-%m-%d --date='1 days ago')_full] is not exist" >> $LogFile
- fi
- #incremental backup
- elif [ $(date +%u) == $next ];then
- $innobackupex --defaults-file=/data/mysql_$port/mysql_$port.cnf --sock=/data/mysql_$port/mysql.sock --slave-info --no-timestamp --incremental --incremental-basedir="$BackupPath""$port"_$(date +%Y-%m-%d --date='1 days ago')_full "$BackupPath""$port"_$(date +%Y-%m-%d) >> /dev/null 2>&1
- cd $BackupPath;tar zcf "$port"_$(date +%Y-%m-%d).tar.gz "$port"_$(date +%Y-%m-%d) >> /dev/null 2>&1
- echo "["$BackupPath""$port"_$(date +%Y-%m-%d).tar.gz]Backup Success!" >> $LogFile
- if [ -d "$port"_$(date +%Y-%m-%d --date='1 days ago')_full ];then
- /bin/rm -rf "$port"_$(date +%Y-%m-%d --date='1 days ago')_full
- echo "[/bin/rm -rf "$port"_$(date +%Y-%m-%d --date='1 days ago')_full]Delete Success!" >> $LogFile
- else
- echo "[/bin/rm -rf "$port"_$(date +%Y-%m-%d --date='1 days ago')_full] is not exist" >> $LogFile
- fi
- else
- $innobackupex --defaults-file=/data/mysql_$port/mysql_$port.cnf --sock=/data/mysql_$port/mysql.sock --slave-info --no-timestamp --incremental --incremental-basedir="$BackupPath""$port"_$(date +%Y-%m-%d --date='1 days ago') "$BackupPath""$port"_$(date +%Y-%m-%d) >> /dev/null 2>&1
- cd $BackupPath;tar zcf "$port"_$(date +%Y-%m-%d).tar.gz "$port"_$(date +%Y-%m-%d) >> /dev/null 2>&1
- echo "["$BackupPath""$port"_$(date +%Y-%m-%d).tar.gz]Backup Success!" >> $LogFile
- if [ -d "$port"_$(date +%Y-%m-%d --date='1 days ago') ];then
- /bin/rm -rf "$port"_$(date +%Y-%m-%d --date='1 days ago')
- echo "[/bin/rm -rf "$port"_$(date +%Y-%m-%d --date='1 days ago')]Delete Success!" >> $LogFile
- else
- echo "[/bin/rm -rf "$port"_$(date +%Y-%m-%d --date='1 days ago')] is not exist" >> $LogFile
- fi
- fi
- fi
- ## backup database mysql ##########
- #if [ -f "$BackupPath"mysql_$(date +%Y-%m-%d).tar.gz ];then
- # echo "["$BackupPath"mysql_$(date +%Y-%m-%d).tar.gz]The Backup File is exists,Can't Backup!" >> $LogFile
- #else
- # /usr/bin/mysqlhotcopy --sock=/data/mysql_$port/mysql.sock mysql $mysqlbackup >> /dev/null 2>&1
- # tar -czf $mysqlbackup.tar.gz $mysqlbackup >> /dev/null 2>&1
- # /bin/rm -rf $mysqlbackup
- # echo "["$BackupPath"mysql_$(date +%Y-%m-%d).tar.gz]Backup Success!" >> $LogFile
- #fi
- ## backup database .frm ##########
- if [ -f "$frmbackup"/"$port"_$(date +%Y-%m-%d).sql ];then
- echo "["$frmbackup"/"$port"_$(date +%Y-%m-%d).sql]The Backup File is exists,Can't Backup!" >> $LogFile
- else
- mysqldump --opt -d -A -S /data/mysql_$port/mysql.sock > "$frmbackup"/"$port"_$(date +%Y-%m-%d).sql
- echo "["$frmbackup"/"$port"_$(date +%Y-%m-%d).sql]Backup Success!" >> $LogFile
- fi
- ## backup mysql-bin ##############
- for binlog in $(find /data/mysql_$port/data/ -name "mysql-bin*" -mtime 1);do
- /bin/cp $binlog "$BackupPath"mysql-bin/
- echo "[$binlog]Backup Success! " >> $LogFile
- done
- /usr/bin/mysql -S /data/mysql_$port/mysql.sock -e 'flush logs;'
- echo "-----------------------------------------------------------------------" >> $LogFile
- echo " $(date +"%y-%m-%d %H:%M:%S") Finish " >> $LogFile
- echo "-----------------------------------------------------------------------" >> $LogFile