基於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 #####停掉服務顯然已經沒辦法停掉了。
[root@director2 ~ ]# killall mysqld ####kill掉mysqld服務 ###########################再次初始化#################################### [root@director2mysql ]# scripts/mysql_install_db --user=mysql --datadir=/mydata/
[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的全備份和增量備份全部實驗完畢!!!!!!!!