mysql數據的備份與恢復
在科技迅速發展的今天,我們每個人都生活在大數據時代,誰掌握的數據越多,就越能了解消費者的需求,也就更能擁有更好的發展前景,因此數據變得很重要。這時數據的備份就不可缺少了。今天我們就來談一下mysql數據的備份與恢復。
數據備份按業務劃分可分為:完全備份,增量備份,差異備份。
1. 完全備份(Full Backup)
所謂全備份就是對整個數據庫的數據和數據結構進行備份。這種備份方式的好處就是很直觀,容易被人理解。而且當發生數據丟失的災難時,只要用災難之前的備份文件,就可以恢復丟失的數據。然而它也有不足之處:首先由於每天都對系統進行完全備份,因此在備份數據中有大量是重復的。這些重復的數據占用了大量的空間,這對用戶來說就意味著增加成本;其次,由於需要備份的數據量相當大,因此備份所需時間較長。對於那些業務繁忙,備份窗口時間有限的單位來說,選擇這種備份策略無疑是不明智的。
2、增量備份(IncrementalBackup)
就是每次備份的數據只是相當於上一次備份後增加的和修改過的數據。這種備份的優點很明顯:沒有重復的備份數據,即節省空間,又縮短了備份時間。但它的缺點在於當發生災難時,恢復數據比較麻煩。舉例來說,如果系統在星期四的早晨發生故障,丟失大批數據,那麽現在就需要將系統恢復到星期三晚上的狀態。這時管理員需要首先找出星期一的那份完全備份數據進行系統恢復,然後再找出星期二的數據來恢復星期二的數據,然後在找出星期三的數據來恢復星期三的數據。很明顯這比第一種策略要麻煩得多。另外這種備份可靠性也差。在這種備份下,各備份數據間的關系就象鏈子一樣,一環套一環,其中任何一個備份數據出了問題都會導致整條鏈子脫節。
3、差異備份(DifferentialBackup)
就是每次備份的數據是相對於上一次全備份之後新增加的和修改過的數據。管理員先在星期一進行一次系統完全備份;然後在接下來的幾天裏,管理員再將當天所有與星期一不同的數據(新的或經改動的)備份到磁帶上。
按方式劃分:可分為熱備、溫備、冷備
熱備份(Hot Backup)是指在數據庫運行中直接備份,對正在運行的數據庫沒有任何影響。
冷備份(Cold Backup)是指在數據庫停止的情況下進行備份,這種備份最為簡單,一般只需要拷貝相關的數據庫物理文件即可。
溫備份(Warm Backup)備份同樣是在數據庫運行時進行,但是會對當前數據庫的操作有所影響,例如加一個全局讀鎖以保證備份數據的一致性。
mysqldump: 邏輯備份工具,適用於所有存儲引擎,可用於溫備,能實現完全備份,部分備份;對InnoDB存儲引擎支持熱備;cp, tar等文件系統工具:物理備份工具,適用於所有存儲引擎;用於冷備,能實現完全備份,部分備份;
mysqldump+binlog
命令的語法格式
mysqldump [OPTIONS] database [tables]:備份單個庫,或庫指定的一個或多個表
mysqldump [OPTIONS] --databases [OPTIONS]DB1 [DB2 DB3...]:備份一個或多個庫
mysqldump [OPTIONS] --all-databases[OPTIONS]:備份所有庫
mysqldump+binlog
其他選項
-x, --lock-all-tables:鎖定所有表
-l, --lock-tables:鎖定備份的表
--single-transaction:啟動一個大的單一事務實現備份
-C, --compress:壓縮傳輸
-E, --events:備份指定庫的事件調度器
-R, --routines:備份存儲過程和存儲函數
--triggers:備份觸發器
--master-data={0|1|2}
0:不記錄
1:記錄CHANGE MASTER TO語句;此語句未被註釋
2:記錄為註釋語句
-F,--flush-logs:鎖定表之後執行flushlogs命令
實戰訓練
1、 準備備份目錄
mkdir -pv /backup/binlog
2、 準備備份數據庫及表
3、 進行完整備份
mysqldump --all-databases --lock-all-tables --flush-log --master-data=2 >/backup/‘data +%F_%T‘-all.sql
查看備份數據:ls /backup/
4、 向表中插入數據
5、 進行增量備份,備份二進制日誌
mysqlbinlog --start-position=245 --stop-position=440 /var/log/mariadb/mariadb_bin.000004 > /backup/‘data +%F_%T‘-all.sql
6、 繼續插入數據,在沒備份的情況下刪除數據庫,模擬誤操作
7、數據恢復,由於最後我們沒有備份就刪除了數據庫,所以我們首先需要保護最後的二進制日誌,查看刪除操作之前的position值
mysqlbinlog /mydata/data/mysql-bin.000015
8 、將最後操作的二進制日誌備份
mysqlbinlog --stop-position=630 /var/lib/mysql/mysql_bin.000004 > /backup/binlog/binlog-`date +%F_%T`.sql
查看備份的日誌:ls /backup/binlog/
9、導入之前的所有備份
mysql < /backup/2017.....-all.sql 完全備份
mysql < /backup/2017......sql 增量備份
mysql < /backup/2017 .......sql 誤操作之前的備份
10、查看數據庫及數據
lvm2快照+binlog
LVM 快照簡單來說就是將所快照源分區一個時間點所有文件的元數據進行保存,如果源文件沒有改變,那麽訪問快照卷的相應文件則直接指向源分區的源文件,如果源文件發生改變,則快照卷中與之對應的文件不會發生改變。快照卷主要用於輔助備份文件。
實驗
1 、添加硬盤,並劃分磁盤類型為lvm 類型
在設置裏添加硬盤以後,要使其寫入內核,可以用 echo ‘- - -‘/sys/class/scsi_host/host0/scan
2 、partx -a/dev/sdb 使內核識別新磁盤
3 、pvcreate/dev/sdb1 添加物理卷
4 、vgcreatemyvg /dev/sdb1 添加卷組
5 、 lvcreate -nmydata -L 5G myvg 添加邏輯卷
6 、mkfs.ext4/dev/mapper/myvg-mydata 格式化邏輯卷
7 、掛載mount/dev/mapper/myvg-mydata /lvm_data 使用,掛載點若沒有,要提前創建
8 、修改Mysql 配置,使得數據文件在邏輯卷上 datadir=/lvm_data
修改文件:vim /etc/my.cnf
9 、service mysqld restart 啟動Mysql 服務
10 、 創建數據庫,進行操作
11 、mysql>FLUSH TABLES WITH READ LOCK; # 鎖定表
12 、lvcreate -L1G -n mydata-snap -p r -s /dev/mapper/myvg-mydata # 創建快照卷Logicalvolume "mydata-snap" created.
13 、mysql>UNLOCK TABLES; # 解鎖所有表
14 、 mount/dev/myvg/mydata-snap /lvm_snap/ # 掛載snap
15 、tar cvf/tmp/mysqlback.tar ./* # 打包物理備份
16 、umount/lvm_snap/ # 卸載snap
17 、lvremovemyvg mydata-snap # 刪除snap
18 、刪除mysql 數據 rm -rf/lvm_data/*
19 、解壓恢復刪除數據tar xvf /tmp/mysqlback.tar ./
20 、驗證數據庫數據是否正確恢復
本文出自 “13162732” 博客,請務必保留此出處http://13172732.blog.51cto.com/13162732/1983291
mysql數據的備份與恢復