7.1備份計劃,MySQLdump以及xtranbackup的實現原理
(1)備份計劃
(2)備份恢復時間
(3)備份恢復失敗如何處理
原理:
mysqldump
mysqldump屬于邏輯備份。加入--single-transaction選項可以進行一致性備份。后臺進程會先設置session的事務隔離級別為RR(SET SESSIONTRANSACTION ISOLATION LEVEL REPEATABLE READ),之后顯式開啟一個事務(STARTTRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */),這樣就保證了該事務里讀到的數據都是事務事務時候的快照。之后再把表的數據讀取出來。如果加上--master-data=1的話,在剛開始的時候還會加一個數據庫的讀鎖(FLUSH TABLES WITH READ LOCK),等開啟事務后,再記錄下數據庫此時binlog的位置(show masterstatus),馬上解鎖,再讀取表的數據。等所有的數據都已經導完,就可以結束事務。
Xtrabackup:
xtrabackup屬于物理備份,直接拷貝表空間文件,同時不斷掃描產生的redo日志并保存下來。最后完成innodb的備份后,會做一個flush engine logs的操作(老版本在有bug,在5.6上不做此操作會丟數據),確保所有的redo log都已經落盤(涉及到事務的兩階段提交概念,因為xtrabackup并不拷貝binlog,所以必須保證所有的redo log都落盤,否則可能會丟最后一組提交事務的數據)。這個時間點就是innodb完成備份的時間點,數據文件雖然不是一致性的,但是有這段時間的redo就可以讓數據文件達到一致性(恢復的時候做的事情)。然后還需要flush tables with read lock,把myisam等其他引擎的表給備份出來,備份完后解鎖。這樣就做到了完美的熱備。
備份計劃:
視庫的大小來定,一般來說100G內的庫,可以考慮使用mysqldump來做,因為mysqldump更加輕巧靈活,備份時間選在業務低峰期,可以每天進行都進行全量備份(mysqldump備份出來的文件比較小,壓縮之后更小)。
100G以上的庫,可以考慮用xtranbackup來做,備份速度明顯要比mysqldump要快。一般是選擇一周一個全備,其余每天進行增量備份,備份時間為業務低峰期。
備份恢復時間:
物理備份恢復快,邏輯備份恢復慢
備份恢復失敗如何處理:
首先在恢復之前就應該做足準備工作,避免恢復的時候出錯。比如說備份之后的有效性檢查、權限檢查、空間檢查等。如果萬一報錯,再根據報錯的提示來進行相應的調整。
7.1 mysqldump中備份出來的sql,如果我想sql文件中,一行只有一個insert .... value()的話,怎么辦?如果備份需要帶上master的復制點信息怎么辦?
1).--skip-extended-insert
2).--master-date=1
7.3 xtrabackup是如何做到帶上master的復制點的信息的?
因為xtrabackup是多線程,一個線程不停地在拷貝新產生的redo文件,另外的線程去備份數據庫,當所有表空間備份完成的時候,它會執行flushtable with read lock操作鎖住所有表,然后執行showmaster status; 接著執行flushengine logs; 最后解鎖表。執行showmaster status; 時就能獲取到mster的復制點信息,執行flush engine logs 強制把redo文件刷新到磁盤。
7.4 MySQL數據庫備份方式有那幾種(只討論InnoDB存儲引擎),至少寫四種。
1、關服務,直接拷貝ibd、frm、redolog、my.cnf
2、select ... into outfile;對應load data infile 恢復
fileds terminated by 'x';每個列的分隔符。默認'/t'
optionally encolsed by 'x';字符串的包含符。默認''
escaped by 'x':轉義符,默認為'//'
starting by 'x';每行的開始符。默認''
terminated by 'x':每行結束符。默認'/n'
3、mysqldump:對應mysql恢復
single-transaction:備份開始先執行start transaction
但不能有DDL操作,否則無法保證一致性讀
master-data:如果沒有指定single-transaction,則用lock-all-tables
1:顯示masterstatus,并且changemaster
2:只顯示change,但不執行
mysqlimport:與load data infile類似,但支持導入多個表,表之間并發導入
4、二進制日志binlog備份
通過mysqlbinlog命令從binlog提取sql
5、xtrabackup
先記錄當前redo位置
然后拷貝共享表空間和獨立表空間數據
最后根據redo日志和開始位置,重做redo
7.5 如何從mysqldump產生的全庫備份中只恢復某一個庫、某一張表?
從全庫中抽取一個庫內容:--one-database簡寫成 –o
mysql -uroot-PRoot databasename --one-database <dump.sql
從全庫中抽取一個表的內容:grep'INSERT INTO `tablename`' dump.sql
新聞熱點
疑難解答