手抖、寫錯條件、寫錯表名、錯連生產庫形成的誤刪庫表和數據總有據說,那麼刪庫以後除了跑路,還能作什麼呢,固然是想辦法恢復,恢復數據的基礎就在於完善的備份策略。html
備份和恢復是同一個話題,篇幅有限,就分開兩章寫mysql
DELETE
語句忘加條件、ALTER TABLE
執行錯表、DROP TABLE
執行錯表、黑客攻擊,即便這些問題你都還沒遇到,可是根據墨菲定律,總會有趕上的時候。邏輯備份是最多見的方式,在數據量比較少的時候很經常使用。sql
邏輯備份的優點:數據庫
mysqldump
就是 MySQL 自帶的備份工做,無需額外安裝。恢復的時候能夠直接使用 mysql
命令進行恢復。sed
grep
等工具進行數據提取或者修改。MyISAM
引擎改到 InnoDB
引擎。邏輯備份缺點:segmentfault
邏輯備份經常使用方法:緩存
mysqldump
是 MySQL
自帶的備份工具,通用性強,很是常見。使用的使用一般要加上一些參數,後面繼續介紹。select into outfile
,以符號分割數據建立邏輯備份,對於要導入到 CSV
等表格會比較實用。mydumper
,容許使用多線程進行備份,備份文件會進行表結構和數據分離,在恢復某些表或數據的時候會很是有效。物理備份在數據量較大的時候很是常見。安全
物理備份的優點:服務器
物理備份缺點:多線程
物理備份經常使用方法:app
xtrabackup
是最經常使用的物理備份工具,由 percona
開源,可以實現對 InnoDB 存儲引擎和 XtraDB 存儲引擎非阻塞地備份(對於 MyISAM 仍是要加鎖),獲得一份一致性備份。直接複製文件/文件系統快照
,這種方式對於 MySIAM
引擎是很是高效的,只須要執行 FLUSH TABLE WITH READ LOCK
就能夠複製獲得一份備份文件。可是對於 InnoDB
引擎就比較困難,由於 InnoDB
引擎使用了大量的異步技術,即便執行了 FLUSH TABLE WITH READ LOCK
,它仍是會繼續合併日誌、緩存數據。因此要用這種方法備份 InnoDB
,須要確保 checkpoint
已經最新。若是有 DBA 告訴你,這個數據庫可以恢復到兩個個月內任何狀態,這說明了,這個數據庫的 binlog 日誌至少保留了兩個月。備份 binlog 的好處:
當你要進行數據恢復的時候,就會很是慶幸有作 binlog
備份。固然,使用 binlog
恢復數據的前提是 binlog
格式要設爲 row
,不要擔憂空間問題,當前最不缺的資源就是硬盤空間。對於 binlog
,咱們推薦的配置是
# 記錄每一行數據的變化 binlog_format = row # 備庫在重作數據的時候,記錄一條 binlog log_slave_updates = 1
主從複製等於多了一個數據副本,可是複製並不等於備份,也不能代替備份。假設在主庫執行了 drop table
操做,會馬上同步到備庫,並執行相同的操做,沒有辦法在出現意外的時候使用備庫進行數據恢復。
延遲複製也不能代替備份,可是能加快恢復的速度,是一種很是有用的策略。
在實際使用中,爲了避免影響主庫的使用,咱們每每會在備庫進行備份,同時記錄同步點,以方便進行新備庫搭建。在備庫備份須要注意的是,主從複製並不能保證主備間數據是一致的。實際上,基於複製的 MySQL
集羣並不能保證集羣內部一致性,當前也沒有很是好的辦法,經常使用的是使用 pt-table-checksum
進行一致性檢查。
全量備份介紹最經常使用的邏輯備份工具 mysqldump
和物理備份工具 xtrabackup
。若是對 mysqldump
不太滿意 可使用 mydumper
來替代 mysqldump
。
mysqldump
是用得最多的工具,可是要用好的話,須要增長一些額外的參數。mysqldump
有不少可用參數,這裏不展開,建議直接訪問官網 mysqldump。使用 mysqldump
某些參數須要 select,reload,lock tables
權限。
mysqldump --opt --single-transaction --master-data=2 --default-character-set=utf8 -h<host> -u<user> -p<password> -A > backup.sql
--opt
若是有這個參數表示同時激活了mysqldump命令的quick,add-drop-table,add-locks,extended-insert,lock-tables參數,它能夠給出很快的轉儲操做併產生一個能夠很快裝入MySQL服務器的轉儲文件。當備份大表時,這個參數能夠防止佔用過多內存--single-transaction
設置事務的隔離級別爲可重複讀,而後備份的時候開啓事務,這樣能保證在一個事務中全部相同的查詢讀取到一樣的數據。注意,這個參數只對支持事務的引擎有效,若是有 MyISAM
的數據表,並不能保證數據一致性-A
導出所有數據庫–-default-character-set=charset
指定導出數據時採用何種字符集--master-data=2
表示在備份過程當中記錄主庫的 binlog
和 pos
點,並在dump文件中註釋掉這一行,在使用備份文件作新備庫時會用到mysqldump --opt --lock-all-tables --master-data=2 --default-character-set=utf8 -h<host> -u<user> -p<password> -A > backup.sql
--lock-all-tables
鎖表備份。因爲 MyISAM
不能提供一致性讀,若是要獲得一份一致性備份,只能進行全表鎖定。mysqldump -h<host> -u<user> -p<password> -A | gzip >> backup.sql.gz
mysqldump -h<host> -u<user> -p<password> --databases <dbname1> <dbname2> > backup.sql
恢復方式比較簡單,直接執行 sql 語句就能夠了
mysql -h<host> -u<user> -p<password> < backup.sql
打開 general_log
能夠查看 mysqldump
的執行流程,這裏以 --single-transaction --opt -A
參數爲例
FLUSH /*!40101 LOCAL */ TABLES FLUSH TABLES WITH READ LOCK SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ START TRANSACTION SHOW VARIABLES LIKE 'gtid\_mode' SHOW MASTER STATUS UNLOCK TABLES ... SHOW CREATE DATABASE IF NOT EXISTS `employees` SAVEPOINT sp ... SELECT /*!40001 SQL_NO_CACHE */ * FROM `departments` ....
更多安裝方式參考官網 xtrabackup
這裏咱們使用 rpm
安裝的方式
yum install http://www.percona.com/downloads/percona-release/redhat/0.1-6/percona-release-0.1-6.noarch.rpm yum update percona-release # qpress 用做壓縮解壓 yum install percona-xtrabackup-24 qpress
CREATE USER 'backup'@'localhost' IDENTIFIED BY 'backup'; GRANT PROCESS,RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'backup'@'localhost'; FLUSH PRIVILEGES;
innobackupex --defaults-file=/etc/my.cnf --user=<user> --password=<pwd> <要備份到哪一個目錄> --no-timestamp --compress --compress-threads=4 --parallel=4
--no-timestamp
不使用當前時間創建文件夾。默認狀況下會在備份目錄以當前時間建立文件夾--compress
壓縮--compress-threads=N
壓縮線程--parallel=N
備份線程# 步驟一:解壓 innobackupex --decompress <備份文件所在目錄> --parallel=4 # 步驟二:應用日誌 innobackupex --apply-log <備份文件所在目錄> --parallel=4 # 步驟三:複製備份文件到數據目錄 innobackupex --datadir=<MySQL數據目錄> --copy-back <備份文件所在目錄> --parallel=4
當數據了變得龐大時,一個常見策略就是作按期的增量備份。例如:週一作了一次全量備份,而後週二到日作增量備份。
增量備份只包含變化的數據集,通常狀況不會比原始數據量大,因此能夠減小服務器的開銷、備份時間、備份空間。
固然,使用增量備份也會有風險,增量備份每一次迭代都是基於上一次的備份實現,意味着只要其中一份備份出現問題,那麼就有可能致使全部備份不可用。
下面介紹一些增量備份方法:
xtrabackup 容許進行增量備份,命令以下:
innobackupex --defaults-file=/etc/my.cnf --user=<user> --password=<pwd> --no-timestamp --compress --incremental --incremental-basedir=<全量備份的目錄> <要增量備份到什麼目錄>
恢復:
# 步驟一:對全備解壓 innobackupex --decompress <全量備份文件所在目錄> # 步驟二:對全備應用日誌 innobackupex --apply-log --redo-only <全量備份文件所在目錄> # 步驟三:對增量備份進行解壓 innobackupex --decompress <增量文件所在目錄> # 步驟四:合併增量數據 innobackupex --apply-log --redo-only --incremental <全量備份文件所在目錄> --incremental-dir=<增量文件所在目錄> # 步驟五:對合並後的數據應用日誌 innobackupex --apply-log <全量備份文件所在目錄> # 步驟六:複製備份文件到數據目錄 innobackupex --datadir=<MySQL數據目錄> --copy-back <全量備份文件所在目錄>
使用 binlog
作增量備份比較簡單,備份的時候執行 FLUSH LOGS
輪轉日誌,而後把舊的 binlog
複製到備份目錄就能夠了。
恢復的時候使用 mysqlbinlog --start-position=<備份集的pos點> binlog日誌 | mysql -u<user> -p
就能夠了
延遲同步是常見的使用主從複製使用模式,在遇到誤操做的時候,不管是用於恢復數據,仍是使用跳過的方式跳過錯誤都是很是有用。
例如在主庫作了 drop
的誤操做,在主庫找到命令所在 binlog 日誌和 pos 位置,Delay庫中止同步,而後使用 start slave until master_log_file='<對應file>',master_log_pos=<誤操做命令前一個SQL的pos>;
等待同步到這個位置,執行跳過一條 SQL 的命令再開啓同步。
常見的延遲同步複製模式有:
一主帶三從
有時候爲了減小主庫壓力,會把延遲庫放在備節點以後
延遲同步開啓方式以下:
stop slave; CHANGE MASTER TO MASTER_DELAY = N秒; start slave;
除了備份,很是重要的一件事情就是驗證備份數據的可用性。想象一下,當你須要進行數據恢復的時候,突然發現過去的備份數據都是無效的,那得有多難受。不少朋友在寫好備份腳本加到定時任務後,只要檢查到定時任務有執行,備份目錄有文件就再也不關注了,每每到了須要使用備份文件的時候才發現備份數據有問題。
目前對於備份文件的數據校驗沒有很是方便的辦法,用的比較多的仍是定時把備份文件拉出來作備份恢復演練,例如一個月作一次備份恢復演練就能夠有效提升備份文件可用性,內心也踏實。
數據校驗部分,若是是邏輯備份,每每會抽查某個表的數據,檢查是否符合預期。若是是物理備份,首先要使用 mysqlcheck
等命令檢查是否有表損壞,沒有損壞再抽查表數據。
row
模式,設置 log_slave_updates = 1
,且最好定時備份 binlog參考資料:
- 高性能MySQL(第3版)