MySQL備份與恢復 備份 備份方式 是否停業務 冷備:停掉業務或DB進行備份(copy、rsync) 熱備:不停業務的狀況下進行備份 邏輯備份:導出SQL腳本進行備份 mysqldump:只支持單線程工做 mysqlpump:並行的最小粒度是單個數據庫對象,對於每張表的導出只能是單個線程的 mydumper:支持對單表多個線程備份,參數-r select into outfile 物理備份:經過拷貝文件進行備份 xtrabackup+binlog 是否拷貝全部數據 全量備份:某一時刻整個數據庫快照 增量備份:首次增量基於全量,後續增量可選擇基於全量/增量 保存位置 本地備份 遠程備份 備份原理 mysqldump、mysqlpump、mydumper、xtrabackup備份原理 InnoDB Crash Recovery MySQLD Crash Recovery和InnoDB Crash Recovery的區別 redo大小調整:5.6以上直接修改my.cnf;5.6如下在apply-log前修改backup-my.cnf中的innodb_log_file% DML、DDL操做對備份的影響 DML操做可能致使mysqldump、mysqlpump備份的non-InnoDB表不一致 DDL操做可能致使InnoDB表開啓一致性快照事務以後,若是表結構定義發生改變,事務將沒法對該表執行查詢 備份方案選擇 數據量小:邏輯備份 數據量大:xtrabackup+binlog,平常備份使用方案 恢復 備份時刻恢復 物理備份->copy-back;邏輯備份->mysql、myloader、source 任意時間點恢復 binlog2sql實現對誤操做的閃回 全備+mysqlbinlog 高級技術 原始節點作master,恢復節點作slave copy binlog 2 relay-log利用sql_thread應用日誌 binlog假裝成master,利用io_thread讀取日誌恢復
對於數據量超大的狀況,建議結合Delayed Replication。其實最好是作分庫分表,控制單實例的大小●-●html
2.一、source dump.sql的數據不能複製到從庫
GTID環境,使用mysqldump --single-transaction --master-data=2 -B dbname >xxx.sql,而後source xxx.sql到另外一組主從複製環境的主庫,發現主庫有數據,從庫卻沒有數據
緣由:備份選項沒有指定--set-gtid-purged=off,該選項影響是否在輸出文件添加 set @@global.gtid_purged、set @@session.sql_log_bin=0語句
若是備份用於還原數據/搭建從庫,--set-gtid-purged=on(輸出帶set gtid_purged,sql_log_bin=0),還原過程不產生binlog
若是備份用於新主,--set-gtid-purged=off(輸出不帶set gtid_purged,sql_log_bin=0),還原過程產生binlog
GTID環境,沒有指定--set-gtid-purged參數時(默認爲AUTO),備份輸出文件會加上set語句,load備份不會記錄binlog,所以從庫就獲取不到數據啦●-●
2.二、mysqldump對MyISAM表沒作一致性備份
mysqldump --single-transaction --master-data=2 -B dbname >xxx.sql
UNLOCK TABLE~SELECT * FROM 之間若是對MyISAM表進行DML操做,會致使備份出來的數據與show master status不一致
START TRANSACTION WITH CONSISTENT SNAPSHOT子句開啓一個一致性快照事務以後,若是表結構發生改變,事務將沒法對該表執行查詢
2.三、XtraBackup只備份InnoDB表也要加FTWRL
XtraBackup藉助InnoDB Crash Recovery機制來備份InnoDB表,對於MyISAM的備份,還得施加FTWRL以保證一致性備份。同時,XtraBackup是在施加FTWRL期間備份InnoDB表對應的.frm文件。能夠經過innobackupex --include=databasename.tablename/xtrabackup --tables=databasename.tablename >back.log 2>&1查看日誌輸出
擴展閱讀:MySQL備份可能遇到的坑 mysql