MySQL/mariadb從刪庫到跑路——備份
備份策略
1、備份的類型
類型1:
- 熱備份:讀寫不受影響(MyISAM不支持熱備,InnoDB支持熱備)
- 溫備份:僅可以執行讀操作
- 冷備份:離線備份,讀寫操作均中止
類型2:
- 物理備份:復制數據文件進行備份,占用較多的空間,速度快
- 邏輯備份:將數據導出至文本文件中,占用空間少,速度慢,可能丟失精度
類型3:
- 完全備份:備份全部數據
- 增量備份:僅備份上次完全備份或增量備份以後變化的數據,備份較快,還原復雜
- 差異備份:僅備份上次完全備份以來變化的數據,備份較慢,還原簡單
2、備份需要考慮的因素
- 溫備的持鎖多久,在鎖狀態的情況下無法寫入數據
- 備份產生的負載,要調空閑的時間備份
- 備份過程的時長,數據量大的時候時間會很長,要選擇合適的方案
- 恢復過程的時長,備份數據需要即時測試
3、備份的目標
- 數據庫數據,每個表空間單獨存放
- 二進制日誌,需要和數據分開存儲
- InnoDB的事務日誌
- 存儲過程、存儲函數、觸發器或事件調度器等
- 服務器的配置文件:/etc/my.cnf
4、備份工具
- mysqldump工具:邏輯備份工具,適用所有存儲引擎溫備;支持完全或部分備份;對InnoDB存儲引擎支持熱備;Schema(數據庫的定義)和數據存儲在一起。
用法:
shell> mysqldump [options] db_name [tbl_name ...] shell> mysqldump [options] --databases db_name ... shell> mysqldump [options] --all-databases
選項:
-A:備份所有庫 -B db_name1,[db_name2,...]:備份指定庫 -E:備份相關的所有event scheduler -R:備份所有存儲過程和存儲函數 --triggers:備份表相關觸發器,默認啟用,用--skip-triggers,不備份觸發器 --master-data={1|2}: 1:所備份的數據之前加一條記錄為CHANGE MASTER TO語句,非註釋,不指定默認為1 2:記錄為註釋的CHANGE MASTER TO語句,註意:此選項會自動關閉--lock-tables功能,自動打開--lock-all-tables功能(除非開啟--single-transaction) -F:備份前滾動日誌,鎖定表完成後,執行flush logs命令,生成新的二進制日誌文件,配合-A時,會導致刷新多次數據庫,在同一時刻執行轉儲和日誌刷新,則應同時使用--flush-logs和-x,--master-data或-single-transaction,此時只刷新一次;建議:和-x,--master-data或 --single-transaction一起使用 --compact 去掉註釋,適合調試,生產不使用 -d:只備份表結構 -t:只備份數據,不備份create table -n:不備份create database,可被-A或-B覆蓋 --flush-privileges:備份前刷新授權表,備份mysql庫或相關時需要使用 -f:忽略SQL錯誤,繼續執行 --hex-blob:使用十六進制符號轉儲二進制列(例如,“abc”變為0x616263),受影響的數據類型包括BINARY, VARBINARY,BLOB,BIT -q:不緩存查詢,直接輸出,加快備份速度
MyISAM備份選項:支持溫備;不支持熱備,所以必須先鎖定要備份的庫,而後啟動備份操作
-x,--lock-all-tables:加全局讀鎖,鎖定所有庫的所有表,同時加--single-transaction或--lock-tables選項會關閉此選項功能,註意:數據量大時,可能會導致長時間無法並發訪問數據庫
-l,--lock-tables:對於需要備份的每個數據庫,在啟動備份之前分別鎖定其所有表,默認為on,--skip-lock-tables選項可禁用,對備份MyISAM的多個庫,可能會造成數據不一致
InnoDB備份選項:支持熱備,可用溫備但不建議用
--single-transaction:此選項Innodb中推薦使用,不適用MyISAM,此選項會開始備份前,先執
行START TRANSACTION指令開啟事務此選項通過在單個事務中轉儲所有表來創建一致的快照。僅適用於存儲在支持多版本控制的存儲引擎中的表(目前只有InnoDB可以); 轉儲不保證與其他存儲引擎保持一致。? 在進行單事務轉儲時,要確保有效的轉儲文件(正確的表內容和二進制日誌位置),需要保證沒有其他連接使用以下語句:ALTER TABLE,DROP TABLE,RENAME TABLE,TRUNCATE TABLE
? 此選項和 --lock-tables(此選項隱含提交掛起的事務)選項是相互排斥備份大型表時,建議將--single-transaction選項和--quick結合一起使用
InnoDB建議備份策略:
mysqldump –uroot –A –F –E –R --single-transaction --master-data=1 --flush-privileges --triggers --hex-blob >$BACKUP/fullbak_$BACKUP_TIME.sql
MyISAM建議備份策略:
mysqldump –uroot –A –F –E –R –x --master-data=1 --flush-privileges --triggers --hex-blob >$BACKUP/fullbak_$BACKUP_TIME.sql
- xtrabackup工具:由Percona提供支持對InnoDB做熱備(物理備份)的工具,支持完全備份、增量備份
由Percona公司提供的mysql數據庫備份工具,開源的能夠對innodb和xtradb數據庫進行熱備的工具;
xtrabackup 是用來備份 InnoDB 表的,不能備份非 InnoDB 表;
innobackupex 腳本用來備份非 InnoDB 表,同時會調用 xtrabackup 命令來備份 InnoDB 表,還會和 MySQL Server 發送命令進行交互,如加全局讀鎖(FTWRL)、獲取位點(SHOW SLAVE STATUS)等。即innobackupex是在xtrabackup 之上做了一層封裝實現的;
雖然目前一般不用 MyISAM 表,只是 MySQL 庫下的系統表是 MyISAM 的,因此備份基本都通過 innobackupex 命令進行;
xtrabackup版本升級到2.4後,相比之前的2.1有了比較大的變化:innobackupex 功能全部集成到 xtrabackup 裏面,只有一個 binary程序,另外為了兼容考慮,innobackupex作為 xtrabackup 的軟鏈接,即xtrabackup現在支持非Innodb表備份,並且Innobackupex在下一版本中移除,建議通過xtrabackup替換innobackupex。
參考手冊:https://www.percona.com/doc/percona-xtrabackup/LATEST/index.html
使用innobakupex備份時,其會調用xtrabackup備份所有的InnoDB表,復制所有關於表結構定義的相關文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關文件,同時還會備份觸發器和數據庫配置信息相關的文件。這些文件會被保存至一個以時間命名的目錄中,在備份時,innobackupex還會在備份目錄中創建如下文件:
1)xtrabackup_checkpoints:備份類型(如完全或增量)、備份狀態(如是否已經為prepared狀態)和LSN(日誌序列號)範圍信息,每個InnoDB頁(通常為16k大小)都會包含一個日誌序列號,即LSN。LSN是整個數據庫系統的系統版本號,每個頁面相關的LSN能夠表明此頁面最近是如何發生改變的;
2)xtrabackup_binlog_info:MySQL服務器當前正在使用的二進制日誌文件及至備份這一刻為止二進制日誌事件的位置;
3)xtrabackup_info:innobackupex工具執行時的相關信息;
4)backup-my.cnf:備份命令用到的配置選項信息;
5)xtrabackup_logfile:備份生成的日誌文件。
用法:
innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/
選項:
--user:該選項表示備份賬號 --password:該選項表示備份的密碼 --host:該選項表示備份數據庫的地址 --databases:該選項接受的參數為數據名,如果要指定多個數據庫,彼此間需要以空格隔開;如:"xtra_test dba_test",同時,在指定某數據庫時,也可以只指定其中的某張表。如:"mydatabase.mytable"。該選項對innodb引擎表無效,還是會備份所有innodb表 --defaults-file:該選項指定從哪個文件讀取MySQL配置,必須放在命令行第一個選項位置 --incremental:該選項表示創建一個增量備份,需要指定--incremental-basedir --incremental-basedir:該選項指定為前一次全備份或增量備份的目錄,與--incremental同時使用 --incremental-dir:該選項表示還原時增量備份的目錄 --include=name:指定表名,格式:databasename.tablename --apply-log:一般情況下,在備份完成後,數據尚且不能用於恢復操作,因為備份的數據中可能會包含尚未提交的事務或已經提交但尚未同步至數據文件中的事務。因此,此時數據文件仍處理不一致狀態。此選項作用是通過回滾未提交的事務及同步已經提交的事務至數據文件使數據文件處於一致性狀態 --use-memory:該選項表示和--apply-log選項一起使用,prepare 備份的時候,xtrabackup做crash recovery分配的內存大小,單位字節。也可(1MB,1M,1G,1GB),推薦1G --export:表示開啟可導出單獨的表之後再導入其他Mysql中 --redo-only:此選項在prepare base full backup,往其中merge增量備份時候使用 --copy-back:做數據恢復時將備份數據文件拷貝到MySQL服務器的datadir --move-back:這個選項與--copy-back相似,唯一的區別是它不拷貝文件,而是移動文件到目的地。這個選項移除backup文件,用時候必須小心。使用場景:沒有足夠的磁盤空間同事保留數據文件和Backup副本
註意:
1)datadir目錄必須為空。除非指定innobackupex --force-non-empty-directorires選項指定,否則--copy-backup選項不會覆蓋;
2)在restore之前,必須shutdown MySQL實例,不能將一個運行中的實例restore到datadir目錄中;
3)由於文件屬性會被保留,大部分情況下需要在啟動實例之前將文件的屬主改為mysql,
chown -R mysql:mysql /data/mysqldb
- mysqlbackup工具:熱備份,MySQL Enterprise Edition組件
- mysqlhotcopy工具:幾乎冷備,僅適用於MyISAM存儲引擎
- 基於lvm快照備份:幾乎熱備,需要在拍快照前鎖表
- tar + cp 等歸檔復制工具備份:完全冷備
MySQL/mariadb從刪庫到跑路——備份