備份類型:
完全備份
部分備份:僅備份其中的一張表或多張表
增量備份:僅備份從上次完全備份或增量備份之后變化的數據部分
熱備份:在線備份,讀寫操作不受影響
溫備份:在線備份,讀操作可繼續進行,但寫操作不允許
冷備份:離線備份,數據庫服務器離線,備份期間不能為業務提供讀寫服務
物理備份:直接復制數據文件進行的備份
邏輯備份:從數據庫中“導出”數據另存而進行的備份
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文件中加入一條數
據:(使用less命令查看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
命令關閉二進制日志,登陸mysql,使用source /path/somefile.sql依次還原, 還原后再開啟二進制志SET SESSION
sql_log_bin=1
接下來說說怎么使用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-backuped 表示完全備份,看到最后的completed ok就表示備份成功
了:
現在只需根據以前的數據庫創建一個全新的空數據庫和一個跟原始數據庫相同的配置文件,保證數據目錄為空
還原之前首先得對原來備份的文件進行整理,使用命令:innobackupex --apply-log /root/backup/2016-04-27_05-25-45/,最
后同樣要看到completed ok 才表示整理完畢,再去查看xtrabackup_checkpoints文件:
backup_type = full-prepared,整理完畢
還原前要先停掉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備份時,內存中的事務(包括已經提交的事務和未提交的事務)也會被記
錄下來,當使用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 不只緩存事務,還緩存其他數據