基於mysqldump實現數據庫的邏輯備份

 基於mysqldump實現數據庫的邏輯備份

【備份類型】

根據備份時,數據庫服務器是否在線:

冷備份:cold backup,服務器要離線,意味着我們的讀寫操作都不可以進行了,但是服務器離線比較困難。

溫備份:warm backup,全局施加共享鎖,只可讀,不可寫的備份叫溫備份

熱備份:hot backup,數據庫不離線,讀寫操作都可以進行,通常是基於事務的存儲引擎才能夠完成的

根據備份時的數據集進行分類:

完全備份:full backup:指備份整個庫,當下數據集的整個庫的數據

部分備份:partial backup:只備份某張表或某張表的一部份數據,有時備份單張表是有必要的。

根據備份時的接口(直接備份數據文件還是通過mysql服務器導出數據)

物理備份:直接複製(歸檔)數據文件的備份方式;跨平臺能力沒有邏輯備份好,physucal backup。大數據集用這個比較好。

邏輯備份:把數據庫中提出來保存爲文本文件;通常使用的工具是mysqldump,logical backup,對於大容量數據不適用。恢復速度很慢,佔據空間很大

【Mysqldump的工作原理】

Mysqldump 令的工作原理很簡單,它先查出需要備份的表的結構,再在文本文件中生成一個CREATE語句。然後,將表中的所有記錄轉換爲一條INSTERT語句。這些 CREATE語句和INSTERT語句都是還原時使用的。還原數據時就可以使用其中的CREATE語句來創建表。使用其中的INSERT語句來還原數據。 它可以實現整個服務器備份,也可以實現單個或部分數據庫、單個或部分表、表中的某些行、存儲過程、存儲函數、觸發器的備份;並且能自動記錄備份時刻的二進 制日誌文件及相應的位置。對於InnoDB存儲引擎來講支持基於單事務模式實現熱備,對於MyISAM則最多支持溫備。


【mysqldump的使用選項】

-A   --all-database 備份所有的數據,溫備使用的選項:

-l   --lock-tables;鎖定備份的表

-x   --lock-all-tables :備份單個表使用,這是導致多個時間不一致,

InnoDB專用的選項:

這個選項是是專用在InnoDB的,對於我們的數據是混合的,是沒辦使用的。

--single-transaction:    單獨備份InnoDB方式

-B ,--database db_name1 db_name2 備份指定的數據庫

如果不加-B,那麼數據恢復時,我們需要自己手動的創建庫,但是如果加了-B,就會自動幫助我們創建庫。

-C ,--compress:壓縮傳輸

【代碼備份的相關選項】

-E ,--events 備份事件調度器:

-R, --routines: 備份存儲過程和存儲函數

--triggers :備份觸發器

--flush-logs ,-F 滾丁日誌

--master-data[=#] :這裏面的#可以取值爲0,1,2

0:表示備份的時候不記錄。

1,表示備份的時候,記錄當時的二進制日誌的文件位置,但是這個語句是啓用的。

2:表示備份的時候,記錄當時的二進制日誌的位置,但是語句設備註釋的,(這是我們的需要的)。

###這個完全備份的時候吧,會把二進制的日誌進行到那記下來。

實驗環境:Centos6.6

【完全備份】

[root@director2 tmp]# mysqldump -uroot -p --lock-all-table --flush-logs --all-database
--master-data=2 > /tmp/all.1.sql
Enter password:  
###########################查看備份數據滾動的位置#############################
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=245;
##這裏面顯示是備份到了mysql-bin.000006 ,位置是245.
###################刪除這個之前的滾動日誌:###################################
mysql> show binary logs; #######先查看一下這個是,在複製比較好。
+------------------+--------------------+
|Log_name          | File_size          |
+------------------+-------------- -----+
| mysql-bin.000001 |        1492        |
| mysql-bin.000002 |        7968        |
| mysql-bin.000003 |         288        |
| mysql-bin.000004 |         288        |
| mysql-bin.000005 |      7785          |
| mysql-bin.000006 |       245          | 
mysql> purge binary logs to 'mysql-bin.000006';
Query OK, 0 rows
affected (0.07 sec)
###########################刪除完再次查看,只剩下最新得了#############################
mysql> show binary logs;
+------------------+-----------------+
| Log_name         | File_size       |
+------------------+-----------------+
| mysql-bin.000006 |       245       |
+------------------+-----------------+

#########################################查看庫中的一個表數據######################################

mysql> use hellodb;                        ####使用這個庫
Database changed
mysql> select * from teachers;    ####查找這個表
+-----+---------------+-----+----------------+
| TID | Name          | Age | Gender         |
+-----+---------------+-----+----------------+
|   1 | Song Jiang    |  45 | M              |
|   2 | Zhang Sanfeng |  94 | M              |
|   3 | Miejue Shitai |  77 | F              |
|   4 | Lin Chaoying  |  93 | F              |
+-----+---------------+-----+----------------+
4 rows in set (0.00 sec)
mysql> delete from teachers;      #####刪除這個表
Query OK, 4 rows affected (0.06 sec)
mysql> select * from teachers;    ####再次查看爲空
Empty set (0.00 sec)

#############################################假設一天過去了########################################

##############################################我們要做增量備份了###################################

################################################滾動日誌###########################################

mysql> flush logs;
Query OK, 0 rows
affected (0.06 sec)
mysql> show binary logs;     #####此時已經是差生了新的日誌
+------------------+-------------------+
| Log_name         | File_size         |
+------------------+-------------------+
| mysql-bin.000006 |       472         |
| mysql-bin.000007 |       245         |
+------------------+-------------------+

################################################備份日誌文件############################################

[root@director2 tmp ]# cd /mydata/  #####這是我二進制文件的初始化文位置
[root@director2 mydata ]# cp mysql-bin.000006 /tmp

########################################假設第二天,我又創建一個表######################################

mysql> create table if not exists teatch(id tinyint unsigned auto_increment unique key,name
varchar(20) not null primary key);
Query OK, 0 rows affected (0.07 sec)

注意:此時我沒有備份

[root@director2 mydata ]# cp mysql-bin.000007 /tmp/  ###
把這個二進制拷貝出去,然後銷燬二級制文件,因爲我們是假設

二進制文件和數據庫不是放在同一個地方的。

[root@director2 mydata ]# rm -rf *        ####刪除整個數據庫
[root@director2 ~ ]# service mysqld stop    
#####停掉服務顯然已經沒辦法停掉了。

wKioL1TFDmrwDFUuAAB1VlSNlFc674.jpg

[root@director2 ~ ]# killall mysqld     ####kill掉mysqld服務
###########################再次初始化####################################
[root@director2mysql ]# scripts/mysql_install_db --user=mysql --datadir=/mydata/

wKiom1TFDb3gUC7mAACUDT6EFdY394.jpg

[root@director2 bin ]# ./mysql_secure_installation #####再進行一次安全初始化,把密碼改成我們原來的。
# service mysqld start

#############################現在我們來還原我們的狀態############################

首先,我們要恢復的是我們的最初備份完全備份


mysql> use hellodb;                               
Database changed
mysql> select * from teachers;       ######之前刪除的表現在,也恢復了,但是我創建的表teatch表,卻沒有恢復。下面就需要我們的二進制日誌了。
+-----+---------------+-----+----------------+
| TID | Name          | Age | Gender         |
+-----+---------------+-----+----------------+
|   1 | Song Jiang    |  45 | M              |
|   2 | Zhang Sanfeng |  94 | M              |
|   3 | Miejue Shitai |  77 | F              |
|   4 | Lin Chaoying  |  93 |  F             |
+-----+---------------+-----+----------------+
4 rows in set (0.01
sec)

############################恢復第一和第二次日誌增量備份##########################

mysql> set sql_log_bin=0;     ######關閉這次二進制日誌記錄,這次記錄沒有意義。
Query OK, 0 rows affected (0.00 sec)
[root@director2 tmp ]# mysqlbinlog mysql-bin.000006 > one.sql  ####把二進制文件轉化成我們的二進制文件
[root@director2 tmp ]# mysqlbinlog mysql-bin.000007 > two.sql ####把二進制文件轉化成我們的二進制文件
[root@director2 tmp ]# mysql -uroot -p < one.sql       ####導入我們的二進制文件
Enter password:
[root@director2 tmp ]# mysql -uroot -p < two.sql       ####導入我們的二進制文件
Enter
password:

##############################3再次查看我們的表teatch已經存在了##########

而且我們的那個teachers已經被刪除了

注意:在恢復文件時,是沒必要記錄二進制日誌的。

mysql> set sql_log_bin=0;     ######關閉這次二進制日誌記錄,這次記錄沒有意義。

mysql> set sql_log_bin=1;                                    ######重新啓用二進制日誌。  

Query OK, 0 rows affected (0.00 sec)

 

至此mysqldump的全備份和增量備份全部實驗完畢!!!!!!!!





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章