xtrabackup備份數據庫python
說明:mysql
公司以前備份數據庫用的是mysqldump,備份幾十G的數據,再加上服務器繁忙,備份速度像蝸牛似的。如今選用xtrabackup備份大的數據庫,備份效率高,恢復速度也快sql
參考:shell
http://467754239.blog.51cto.com/4878013/1621711 數據庫
優勢:安全
(1)備份過程快速、可靠;bash
(2)備份過程不會打斷正在執行的事務;服務器
(3)可以基於壓縮等功能節約磁盤空間和流量;app
(4)自動實現備份檢驗;socket
(5)還原速度快
安裝:
這裏採用rpm包方式(推薦)
yum -y install libaio perl-Time-HiRes perl-DBD-MySQL perl-IO-Socket-SSL
cd /usr/local/src/
32位:wget http://www.percona.com/downloads/XtraBackup/XtraBackup-2.2.9/binary/redhat/6/i386/percona-xtrabackup-2.2.9-5067.el6.i686.rpm
64位:wget http://www.percona.com/downloads/XtraBackup/XtraBackup-2.2.9/binary/redhat/6/x86_64/percona-xtrabackup-2.2.9-5067.el6.x86_64.rpm
rpm -ivh percona-xtrabackup-2.2.9-5067.el6.i686.rpm
使用:
全備份:(目前公司只採用了全備份)
innobackupex --user=root --password=123456 --socket=/tmp/mysqld.sock --defaults-file=/usr/local/mysql/my.cnf /data/mysql_bacp/ #備份數據庫
注意:
/data/mysql_bacp/:備份目錄
在/data/mysql_bacp/目錄下面會生成一個以時間命名的目錄
全部的數據庫數據都被備份在這個目錄下,同時又會生成幾個新的文件:
backup-my.cnf: 備份命令用到的配置選項信息
xtrabackup_binlog_info: 備份時所用的二進制日誌信息(記錄了在備份時,正在用的二進制日誌文件及備份完這一刻的pos值,這個在數據恢復時用)
xtrabackup_checkpoints: 備份的信息(備份類型(徹底或增量)、備份狀態(是否已經爲prepared狀態)、LSN(日誌序列號)範圍信息),能夠查看此備份是全備份仍是增量備份
xtrabackup_info: xtrabackup相關的信息
使用全備份恢復到備份時的數據:
/etc/init.d/mysqld stop #在數據恢復時必定要記得把mysql服務停掉
mv /opt/mysql/data/* /tmp/linshi/ #把數據庫數據目錄下的全部數據臨時mv到一個臨時目錄裏
innobackupex --apply-log 2015-06-09_13-02-30/ #找到最後一個全備份目錄(準備(prepared)一個全備份) 意義:將未提交的事務進行回滾,將已經提交但尚未同步的數據進行同步
innobackupex --copy-back --defaults-file=/usr/local/mysql/my.cnf 2015-06-09_13-02-30/ #恢復數據
chown -R mysql.mysql /opt/mysql/data/ #修改數據權限(默認xtrabackup恢復數據後,全部數據的權限都是root)
/etc/init.d/mysqld start #啓動mysql服務
使用二進制日誌文件恢復備份以後的數據:
找到最後一個全備份目錄:
cd /data/mysql_bacp/2015-06-09_13-02-30/
cat xtrabackup_binlog_info mysql-binlog.000052 120
mysql-binlog.000052和120:作全備份時正在使用的二進制日誌文件和備份完那一刻的pos值
從這個二進制日誌文件和pos值開始恢復以後的數據
參考:http://732233048.blog.51cto.com/9323668/1633051
使用腳本和計劃任務實現自動全備份:
vi /data/scripts/mysql/mysqlfullbackup.py
#!/usr/bin/python #encoding:utf-8 #此腳本用來對數據庫作全備份,並定時清理備份文件和二進制日誌文件 import os import sys import commands user='root' password='123456' socket='/tmp/mysqld.sock' defaults_file='/usr/local/mysql/my.cnf' backuptodir='/data/mysql_bacp/' #備份目錄 binlogdir='/opt/mysql/binlog/' #二進制日誌目錄 binlogname='mysql-binlog.0*' #二進制日誌文件名 def fullbackup(): #備份數據 os.system('innobackupex --user='+user+ ' --password='+password+ ' --socket='+socket+ ' --defaults-file='+defaults_file+ ' ' +backuptodir+ ' 2> /dev/null') #刪除兩天前的備份文件,即保留三個備份文件 os.system('find ' +backuptodir+ ' -type f -mtime +2 -exec rm -f {} \;') #找出兩天前的最後一個二進制日誌文件 os.chdir(binlogdir) twodaysago_binlog=commands.getoutput('find . -type f -mtime +2 -name ' '"'+binlogname+'"' " | sort | tail -n1 | awk -F'/' '{print $2}'") # '"'+binlogname+'"' 在shell中是"mysql-binlog.0*" #刪除兩天前的二進制日誌文件,即保留兩天的二進制日誌文件 os.system('mysql -u'+user+ ' -p'+password+ ' -e "PURGE MASTER LOGS TO ' "'"+twodaysago_binlog+"'" '" 2> /dev/null') if __name__=='__main__': fullbackup()
注意:使用此腳本時,腳本def函數裏的語句不用修改,只須要修改函數上面的變量值便可
chmod 600 /data/scripts/mysql/mysqlfullbackup.py #此腳本里麪包含了mysql的root密碼,爲了安全,設置600權限,其餘人都不可訪問
crontab -e #建立計劃任務
#分 時 日 月 周 用戶名 命令 0 1 * * * cd /data/scripts/mysql;python mysqlfullbackup.py
附加:使用xtrabackup進行全備份+增量備份:
增量備份經常使用的幾個參數:
--redo-only:將一個增量備份與全備份進行合併,造成一個新的全備份(以後用這個新的全備份進行數據的恢復)
--incremental:指定進行增量備份
--incremental-basedir:進行增量備份時,用來指定上一次的備份(全備份或上一次的增量備份)
--incremental-dir:數據恢復時,用來指定上一次的備份(全備份或上一次的增量備份)
全備份+增量備份:
全備份:
innobackupex --user=root --password=123456 --socket=/tmp/mysqld.sock --defaults-file=/usr/local/mysql/my.cnf /data/mysql_backup/mysql_full_backup_lszc #全備份數據庫
如圖:生成一個全備份目錄:2015-06-15_07-20-33
增量備份:
innobackupex --user=root --password=123456 --socket=/tmp/mysqld.sock --defaults-file=/usr/local/mysql/my.cnf --incremental /data/mysql_backup/mysql_incremental_backup_lszc/ --incremental-basedir=/data/mysql_backup/mysql_full_backup_lszc/2015-06-15_07-20-33/ #指定上一次的備份(這裏是上一次的全備份)
如圖:生成一個增量備份目錄:2015-06-15_07-26-29
再次增量備份:
innobackupex --user=root --password=123456 --socket=/tmp/mysqld.sock --defaults-file=/usr/local/mysql/my.cnf --incremental /data/mysql_backup/mysql_incremental_backup_lszc/ --incremental-basedir=/data/mysql_backup/mysql_incremental_backup_lszc/2015-06-15_07-26-29 #指定上一次的備份(這裏是上一次的增量備份)
如圖:又生成一個增量備份目錄:2015-06-15_07-43-33
數據恢復:
使用全備份和增量備份將數據恢復到最後一個增量備份時的數據:
/etc/init.d/mysqld stop #在數據恢復時必定要記得把mysql服務停掉
mv /opt/mysql/data/* /tmp/linshi/ #把數據庫數據目錄下的全部數據臨時mv到一個臨時目錄裏
innobackupex --apply-log --redo-only /data/mysql_backup/mysql_full_backup_lszc/2015-06-15_07-20-33/ #找到最後一個全備份目錄(準備(prepared)一個全備份)
innobackupex --apply-log --redo-only /data/mysql_backup/mysql_full_backup_lszc/2015-06-15_07-20-33/ --incremental-dir=/data/mysql_backup/mysql_incremental_backup_lszc/2015-06-15_07-26-29/ #將第一個增量備份合併到全備份
innobackupex --apply-log --redo-only /data/mysql_backup/mysql_full_backup_lszc/2015-06-15_07-20-33/ --incremental-dir=/data/mysql_backup/mysql_incremental_backup_lszc/2015-06-15_07-43-33/ #將第二個增量備份合併到全備份
注意:將增量備份與全備份合併,造成一個新的全備份,以後將用這個新的全備份進行數據恢復(全備份名稱始終不變,即:永遠是最初的名字)
innobackupex --copy-back --defaults-file=/usr/local/mysql/my.cnf /data/mysql_backup/mysql_full_backup_lszc/2015-06-15_07-20-33/ #恢復數據
chown -R mysql.mysql /opt/mysql/data/ #修改數據權限(默認xtrabackup恢復數據後,全部數據的權限都是root)
/etc/init.d/mysqld start #啓動mysql服務
使用二進制日誌文件恢復最後一個增量備份以後的數據:
找到最後一個增量備份:
如圖:獲取執行最後一個增量備份時正在使用的二進制日誌文件和此時的pos值
從這個二進制日誌文件和pos值開始恢復以後的數據
附加:
注意:備份時候MySQL必須是運行狀態,而在作數據恢復時候服務必須是處於停滯狀態。
重要參數:
--defaults-file=/etc/my.cnf:備份時,指定配置文件
--socket=/tmp/mysql.sock:備份時,鏈接到備份的mysql服務器所使用的 套接字文件
--user=root:鏈接備份mysqld所使用的用戶
--password=hello:鏈接備份mysqld所使用的用戶密碼
--no-timestamp:默認狀況下,備份目錄會使用以當前時間爲名稱建立一個備份目錄,加上此參數則不會作這個動做
--apply-log:建立ib_logfile文件,並恢復備份期間產生的redo日誌到ib_logfile和表空間中。注意:若備份期間產生了提交的事務日誌,則apply-log操做會將未提交的事務回滾
--copy-back:執行恢復數據到目標mysqld,可是目標mysqld的數據目錄不 能用—datadir指定,這一點不一樣與meb,而是須要使用—defaults-file指 定一個配置文件,在配置文件中指定恢復的datadir。與meb不一樣,恢復前必 須清空目錄數據目錄
--use-memory=1G:備份時xtrabackup可用的內存大小,取決於操做系統可用的內存量,默認爲100M,使用大的內存可加速備份的速度
--incremental:表示爲增量備份,增量備份只對innodb表有效,對於non-innodb表,例如myisam則無效,由於每次增量備份都會拷貝myisam相關的全部文件,無論上次備份到此次備份有沒有發生更改;而對於innodb表,增量備份則只會備份上次備份到此次備份所更改的表
--incremental-basedir=/lxw/full-back/:基於上一次的備份目錄作增量 備份
--incremental-dir=/lxw/incr-backup/:用於將增量備份恢復到全備時指定增量備份的目錄
--redo-only:增量備份恢復到以前的備份時,除了最後一個增量備份外,其餘的增量備份最好指定該參數
--databases=’dba.t1 mysql performance_schema lxw.t1’:用於部分備份,能夠用空格分開,指定備份哪些庫的全部表,或者哪些庫的某些表
--export:在執行apply-log操做時,將應用信息保存到文件中,在恢復部分備份時有用
--compact:採用壓縮備份
--rebuild-indexes:解壓縮