備份類型: 完全備份 部分備份:僅備份其中的一張表或多張表 增量備份:僅備份從上次完全備份或增量備份之後變化的數據部分 熱備份:線上備份,讀寫操作不受影響 溫備份:線上備份,讀操作可繼續進行,但寫操作不允許 冷備份:離線備份,資料庫伺服器離線,備份期間不能為業務提供讀寫服務 物理備份:直接複製數據文 ...
備份類型:
完全備份
部分備份:僅備份其中的一張表或多張表
增量備份:僅備份從上次完全備份或增量備份之後變化的數據部分
熱備份:線上備份,讀寫操作不受影響
溫備份:線上備份,讀操作可繼續進行,但寫操作不允許
冷備份:離線備份,資料庫伺服器離線,備份期間不能為業務提供讀寫服務
物理備份:直接複製數據文件進行的備份
邏輯備份:從資料庫中“導出”數據另存而進行的備份
MyISAM: 支持溫備,不支持
InnoDB: 既能熱備又能溫備
備份什麼:數據、額外的數據(二進位日誌和InnoDB的事務日誌)、代碼(存儲過程和存儲函數、觸發器、事件調度器等),伺服器配置文件
備份時需要考慮的因素:
持鎖的時長
備份過程時長
備份負載
恢復過程時長
備份方案:完全備份+增量備份
備份方案之備份工具的選擇:
mysqldump:完全備份,通過備份二進位日誌實現增量備份(InnoDB熱備和溫備,MyISAM溫備)註意資料庫大於1GB的話不推薦這種備份,因為還原時間會過長
xtrabackup:對InnoDB:熱備,支持完全備份和增量備份,對MyISAM:溫備,只支持完全備份
補充:以下操作都在centos6上進行
Usage: mysqldump [OPTIONS] database [tables]
mysqldump -uroot --database hellodb > /tmp/hellodb.sql(單個資料庫文件備份)
註意這種方式對MyISAM和InnoDB只支持溫備,先要鎖定備份的資料庫,如果不鎖定備份的同時有寫入數據的操作,會導致恢復時數據不一致
在實際生產環境中一定要加一個-l參數,表示對單個資料庫進行備份時,鎖定此資料庫的所有表,-x當對所有資料庫備份時鎖定所有資料庫的所有表
所以使用方式應該是這樣: mysqldump -uroot -l --database hellodb > /tmp/hellodb.sql
對InnoDB要支持熱備的話:mysqldump -uroot --single-transaction --database hellodb > /tmp/hellodb.sql(只有
在開始備份那一刻時已經存在的數據會被備份,備份過程中新加入的數據不會被備份,InnoDB內部有每個數據的時間戳,如果時間戳
大於備份開始時的時間,該數據就會被忽略。如果有數據被刪除且被刪除的時間戳大於備份開始時的時間,該數據就會在備份中被還
原。這樣保證了所有數據的可靠性)
其他選項: -E, --events:備份指定庫的事件調度器
-R, --routines:備份存儲過程和存儲函數
--triggers:備份觸發器
但是這樣備份過後,資料庫進行了讀寫操作,當資料庫奔潰後,只能還原到備份的時間點,後面的對資料庫的操作不能還原,如果在上
面的命令中加入--master-data=2,就可結合二進位日誌還原到奔潰前的時間點了,此參數的作用是會在備份的sql文件中加入一條數據:
MASTER_LOG_FILE備份那一刻二進位文件是哪個,MASTER_LOG_POS備份到了哪個位置
要還原到奔潰前的那一刻:
(1)mysqlbinlog --start-position=20434 (備份那刻起的二進位文件) > 某個目錄下的sql文件
註意如果二進位日誌產生了滾動,這需要多次使用mysqlbinlog將後面滾動的二進位日誌導入到sql文件中
(2)還原前面備份的sql文件
(3)將第(1)步中的sql文件逐個還原,還原命令mysql -u用戶 -p密碼 < sql文件
所以在生產環境中真正要使用的備份命令類似:mysqldump -uroot --all-databases --single-transaction --master-data=2 > /tmp/all.sql
補充:mysqldump做的備份,數據還原時也會產生二進位日誌,這些日誌是不需要的,使用mysql> SET SESSION sql_log_bin=0
命令關閉二進位日誌,還原後再開啟二進位日誌
接下來說說怎麼使用xtrabackup:www.percona.com上有該軟體的下載(此處我下載的是centos6的rpm包)
yum -y install epel-release (xtrabackup有些依賴的包在epel源中)
yum -y install percona-xtrabackup-2.3.4-1.el6.x86_64.rpm
查看生成了哪些包
使用xtrabackup對innodb做熱備,為了使xtrabackup的某些功能能夠實現(即對單張表備份本文不做介紹),得先在mariadb的配置文件中開啟一個參數innodb_file_per_table=ON 在配置文件中定義,這個參數的作用是把innodb的單張表存儲為單個的文件
首先對整個資料庫進行全庫備份: innobackupex --user=root --password='' /root/backup/
在備份的文件中找到xtrabackup_checkpoints這個文件,less xtrabackup_checkpoints
backup_type = 說明此次備份是完全備份還是增量備份 full-prepared 表示完全備份
看到最後的completed ok就表示備份成功了:
在現在只需根據以前的資料庫創建一個全新的資料庫和一個跟原來資料庫相同的配置文件,並且保證放置數據的目錄為空就可將整個資料庫還原了
還原之前首先得對原來備份的文件進行整理,使用命令:innobackupex --apply-log /root/backup/2016-04-27_05-25-45/,最
後同樣要看到completed ok 才表示整理完畢
還原前要先停掉mariadb,使用還原命令: innobackupex --copy-back /root/backup/2016-04-27_05-25-45/,同樣要看到
completed ok才算還原成功,註意我是使用預設的root用戶還原的,因此數據目錄所屬的用戶組和用戶都是root,使用chown -R
mysql.mysql ./* 將屬組和用戶都改為mysql(不然mariadb會啟動不了)
使用xtrabackup做增量備份,同樣跟上面一樣先執行一次完全備份,執行增量備份命令:
innobackupex --incremental /root/backup/ --incremental-basedir=/root/backup/2016-04-27_06-37-51
--incremental 指定增量備份的存儲位置 --incremental-basedir 基於哪個備份文件做增量備份
還原的時候,先去整理完全備份innobackupex --apply-log --redo-only /root/backup/2016-04-27_06-37-51/
補充:當mariadb使用Innodb存儲引擎時會使用記憶體中的一段空間取名叫做buffer pool,是mariadb用來存儲產生的事務(包含已提
交和未提交的事務),所有事務都會被立即記錄到磁碟中的事務日誌文件中 資料庫奔潰或終止時產生一個結果,提交的事務可能只保存
在內存當中,但沒有同步到磁碟文件中去,當mariadb重啟時會自動將已提交的事務同步到磁碟文件中去,未能正常提交的事務做回滾
操作 使用inobackupex備份時,innodb的事務(包括已經提交的事務和未提交的事務)也會被記錄下來,當使用xtrabackup還原時
會將已提交的事務同步到磁碟文件中去,未能正常提交的事務做回滾操作,做增量備份時第一次完全備份未提交的事務不應該回滾,因
為到最後增量備份還原時此前未提交的事務可能已經提交了因此上面--redo-only的作用就是只“重放”已經提交的事務,將已提交的事務同步到磁碟文件
整理第一次增量備份:innobackupex --apply-log /root/backup/2016-04-27_06-37-51/ --incremental-dir=/root/backup/2016-04-27_06-42-59/
每次對增量的整理時前面都得先是完全備份的目錄,然後才是增量備份的目錄
我這裡只做了一次增量備份,如果有多次增量備份只有最後一次整理不用--redo-only,也就是最後一次整理把所有未提交的事務都回滾
最後的還原#innobackupex --copy-back /root/backup/2016-04-27_06-37-51/ (最後指定的目錄是完全備份的目錄)
這就是使用xtrabackup對整個資料庫進行備份
補充:如果要還原到某個時間點(比如奔潰前的時間點)還得藉助二進位日誌
更正:buffer pool 不只緩存事務,還緩存各種數據