MySQL的備份和還原
備份:副本
RAID1,RAID10:保證硬件損壞而不會業務停止;
DROP TABLE mydb.tb1;
備份類型:
熱備份、溫備份和冷備份(根據服務器是否在線)
熱備份:讀、寫不受影響;
溫備份:僅能夠執行讀操做;
冷備份:離線備份;讀、寫操做均停止;
物理備份和邏輯備份(根據直接cp或者把文件導出)
物理備份:複製數據文件;
邏輯備份:將數據導出至文本文件中;
徹底備份、增量備份和差別備份;
徹底備份:備份所有數據;
增量備份:僅備份上次徹底備份或增量備份之後變化的數據;
差別備份:僅備份上次徹底備份以來變化的數據;
在線:物理徹底備份
還原:
備份什麼:
數據、配置文件、二進制日誌、事務日誌
熱備份:
MyISAM: 溫備份
InnoDB: xtrabackup, mysqldump
MySQL --> 從:
物理備份:速度快
邏輯備份:速度慢、丟失浮點數精度;方便使用文本處理工具直接對其處理、可移植能力強;
備份策略:徹底+增量;徹底+差別
MySQL備份工具:
mysqldump: 邏輯備份工具、MyISAM(溫)、InnoDB(熱備份)
mysqlhotcopy:物理備份工具、溫備份
文件系統工具:
cp:冷備
lv: 邏輯卷的快照功能,幾乎熱備;
mysql> FLUSH TABLES;
mysql> LOCK TABLES
建立快照:釋放鎖,然後複製數據
InnoDB:
第三組工具:
ibbackup: 商業工具
xtrabackup: 開源工具
mysqldump: 邏輯備份
mysqldump(徹底備份)+ 二進制日誌 鎖表:flush tables with read lock 滾動二進制日誌:flush logs
徹底+增量:
備份單個數據庫,或庫中特定表
mysqldump DB_NAME [tb1] [tb2] 不包含建立數據庫的命令,還原時候必須指定數據庫,也能夠只備份單張表
--master-data={0|1|2}
0: 不記錄二進制日誌文件及路位置;
1:以CHNAGE MASTER TO的方式記錄位置,可用於恢復後直接啓動從服務器;
2:以CHANGE MASTER TO的方式記錄位置,但默認爲被註釋;
--lock-all-tables:鎖定全部表
--flush-logs: 執行日誌flush;
若是指定庫中的表類型均爲InnoDB,可以使用--single-transaction啓動熱備,不用再使用lock和flush;
備份多個庫:
--all-databases: 備份全部庫,保存建立庫的命令
--databases DB_NAME,DB_NAME,...: 備份指定庫,保存建立庫的命令
--events:備份事件調度器
--routines:備份存儲過程和函數的
--triggers:備份觸發器
如下備份保留建立數據庫:
mysqldump -uroot -p --lock-all-tables --flush-logs --all-databases --master-data=2 > /root/all.sql
備份策略:每週徹底+每日增量
徹底備份:mysqldump
增量備份:備份二進制日誌文件(flush logs)
手動模擬:
mysqldump -uroot -p --master-data=2 --flush-logs --all-databases --lock-all-tables > /root/alldatabases.sql
第一天全量備份以後,添加刪除數據,
次日作增量備份:flush logs
mysqlbinlog mysql-bin.000006 > /root/mon-increamental.sql
增長刪除數據,然後數據庫數據全沒了,但二進制文件依然保留
還原數據:
(1)若是data目錄文件都沒了,初始化庫後啓動mysqld [關掉二進制日誌 set sql_log_bin=0]
(2)還原全庫 mysql -uroot -p < alldatabases.sql
(3)還原第一天增量備份 mysql -uroot -p < mon-increamental.sql
(4)還原當天的數據 mysqlbinlog mysql-bin.000007 | mysql -uroot -p [set sql_log_bin=1]
作成腳本,一個是全量,一個是增量mysql
邏輯備份:
一、浮點數據丟失精度;
二、備份出的數據更佔用存儲空間;壓縮後可大大節省空間;
三、不適合對大數據庫作徹底備份;
對InnoDB:
mysql> FLUSH TABLES WITH READ LOCK;
MVCC, REPEATABLE-READ
--single-transaction
備份:
SELECT * INTO OUTFILE '/path/to/somefile.txt' FROM tb_name [WHERE clause];
還原:
LOAD DATA INFILE '/path/to/somefile.txt' INTO TABLE tb_name;
幾乎熱備:LVM
snapshot:
前提:
一、數據文件要在邏輯捲上;
二、此邏輯卷所在卷組必須有足夠空間使用快照卷;
三、數據文件和事務日誌要在同一個邏輯捲上;
步驟:
一、打開會話,施加讀鎖,鎖定全部表;
mysql> FLUSH TABLES WITH READ LOCK;
mysql> FLUSH LOGS;
二、經過另外一個終端,保存二進制日誌文件及相關位置信息;
$ mysql -uroot -p -e 'SHOW MASTER STATUS\G' > /path/to/master.info
三、建立快照卷
# lvcreate -L # -s -p r -n LV_NAME /path/to/source_lv
四、釋放鎖
mysql> UNLOCK TABLES;
五、掛載快照卷,備份
mount
cp
六、刪除快照卷;
七、增量備份二進制日誌;
二進制日誌相關的幾個選項:
innodb_support_xa={TRUE|FLASE}
存儲引擎事務在存儲引擎內部被賦予了ACID屬性,分佈式(XA)事務是一種高層次的事務,它利用「準備」而後「提交」(prepare-then-commit)兩段式的方式將ACID屬性擴展到存儲引擎外部,甚至是數據庫外部。然而,「準備」階段會致使額外的磁盤刷寫操做。XA須要事務協調員,它會通知全部的參與者準備提交事務(階段1)。當協調員從全部參與者那裏收到「就緒」信息時,它會指示全部參與者進行真正的「提交」操做。
此變量正是用於定義InnoDB是否支持兩段式提交的分佈式事務,默認爲啓用。事實上,全部啓用了二進制日誌的並支持多個線程同時向二進制日誌寫入數據的MySQL服務器都須要啓用分佈式事務,不然,多個線程對二進制日誌的寫入操做可能會以與原始次序不一樣的方式完成,這將會在基於二進制日誌的恢復操做中或者是從服務器上建立出不一樣原始數據的結果。所以,除了僅有一個線程能夠改變數據之外的其它應用場景都不該該禁用此功能。而在僅有一個線程能夠修改數據的應用中,禁用此功能是安全的並能夠提高InnoDB表的性能。做用範圍爲全局和會話級別,可用於選項文件,屬動態變量。
sync_binlog = 1
mysql> LOCK TABLES mydb.tb1 READ, mydb.tb2 READ, ...
mysql> FLUSH TABLES mydb.tb1, mydb.tb2, ...
mysq> SET SQL_LOG_BIN=0;
mysql> SOURCE somefile.sql;
mysql> SET SQL_LOG_BIN=1;
percona:
ibbackup: InnoDB online physical backup
full
incremental
MyISAM: warm backup, full
$5000
mysqldump
LVM --> mylvmbackup(perl scripts)
percona:
xtrabackup
xtradb: innodb的加強版
innodb
xtrabackup+二進制日誌;
mysql:
二進制日誌
事務日誌
錯誤日誌
通常查詢日誌
中繼日誌
慢查詢日誌
二進制日誌:
數據目錄
mysql-bin.XXXXXX
滾動:達到最大上限,flush logs,服務器重啓
mysql> PURGE
二進制日誌的格式:
statement
row
mixed
mysql-bin.index: 二進制日誌文件索引文件
mysql> SHOW MASTER STATUS;
mysql> SHOW BINARY LOGS;
mysql> SHOW BINLOG EVENTS IN "file";
event:
timestamp
position, offset,OPERATION, server-id
即時點還原:
MySQL: tx1
MySQL隔離級別:
READ-UNCOMMITTED
READ-COMMITTED
REPEATABLE-READ
SERIALIZABLE
sql
expire_logs_days={0..99}
設定二進制日誌的過時天數,超出此天數的二進制日誌文件將被自動刪除。默認爲0,表示不啓用過時自動刪除功能。若是啓用此功能,自動刪除工做一般發生在MySQL啓動時或FLUSH日誌時。做用範圍爲全局,可用於配置文件,屬動態變量。
general_log={ON|OFF}
設定是否啓用查詢日誌,默認值爲取決於在啓動mysqld時是否使用了--general_log選項。如若啓用此項,其輸出位置則由--log_output選項進行定義,若是log_output的值設定爲NONE,即便用啓用查詢日誌,其也不會記錄任何日誌信息。做用範圍爲全局,可用於配置文件,屬動態變量。
general_log_file=FILE_NAME
查詢日誌的日誌文件名稱,默認爲「hostname.log"。做用範圍爲全局,可用於配置文件,屬動態變量。
binlog-format={ROW|STATEMENT|MIXED}
指定二進制日誌的類型,默認爲STATEMENT。若是設定了二進制日誌的格式,卻沒有啓用二進制日誌,則MySQL啓動時會產生警告日誌信息並記錄於錯誤日誌中。做用範圍爲全局或會話,可用於配置文件,且屬於動態變量。
log={YES|NO}
是否啓用記錄全部語句的日誌信息於通常查詢日誌(general query log)中,默認一般爲OFF。MySQL 5.6已經棄用此選項。
log-bin={YES|NO}
是否啓用二進制日誌,若是爲mysqld設定了--log-bin選項,則其值爲ON,不然則爲OFF。其僅用於顯示是否啓用了二進制日誌,並不反應log-bin的設定值。做用範圍爲全局級別,屬非動態變量。
log_bin_trust_function_creators={TRUE|FALSE}
此參數僅在啓用二進制日誌時有效,用於控制建立存儲函數時若是會致使不安全的事件記錄二進制日誌條件下是否禁止建立存儲函數。默認值爲0,表示除非用戶除了CREATE ROUTING或ALTER ROUTINE權限外還有SUPER權限,不然將禁止建立或修改存儲函數,同時,還要求在建立函數時必需爲之使用DETERMINISTIC屬性,再否則就是附帶READS SQL DATA或NO SQL屬性。設置其值爲1時則不啓用這些限制。做用範圍爲全局級別,可用於配置文件,屬動態變量。
log_error=/PATH/TO/ERROR_LOG_FILENAME
定義錯誤日誌文件。做用範圍爲全局或會話級別,可用於配置文件,屬非動態變量。
log_output={TABLE|FILE|NONE}
定義通常查詢日誌和慢查詢日誌的保存方式,能夠是TABLE、FILE、NONE,也能夠是TABLE及FILE的組合(用逗號隔開),默認爲TABLE。若是組合中出現了NONE,那麼其它設定都將失效,同時,不管是否啓用日誌功能,也不會記錄任何相關的日誌信息。做用範圍爲全局級別,可用於配置文件,屬動態變量。
log_query_not_using_indexes={ON|OFF}
設定是否將沒有使用索引的查詢操做記錄到慢查詢日誌。做用範圍爲全局級別,可用於配置文件,屬動態變量。
log_slave_updates
用於設定複製場景中的從服務器是否將從主服務器收到的更新操做記錄進本機的二進制日誌中。本參數設定的生效須要在從服務器上啓用二進制日誌功能。
log_slow_queries={YES|NO}
是否記錄慢查詢日誌。慢查詢是指查詢的執行時間超出long_query_time參數所設定時長的事件。MySQL 5.6將此參數修改成了slow_query_log。做用範圍爲全局級別,可用於配置文件,屬動態變量。
log_warnings=#
設定是否將警告信息記錄進錯誤日誌。默認設定爲1,表示啓用;能夠將其設置爲0以禁用;而其值爲大於1的數值時表示將新發起鏈接時產生的「失敗的鏈接」和「拒絕訪問」類的錯誤信息也記錄進錯誤日誌。
long_query_time=#
設定區別慢查詢與通常查詢的語句執行時間長度。這裏的語句執行時長爲實際的執行時間,而非在CPU上的執行時長,所以,負載較重的服務器上更容易產生慢查詢。其最小值爲0,默認值爲10,單位是秒鐘。它也支持毫秒級的解析度。做用範圍爲全局或會話級別,可用於配置文件,屬動態變量。
max_binlog_cache_size{4096 .. 18446744073709547520}
二進定日誌緩存空間大小,5.5.9及之後的版本僅應用於事務緩存,其上限由max_binlog_stmt_cache_size決定。做用範圍爲全局級別,可用於配置文件,屬動態變量。
max_binlog_size={4096 .. 1073741824}
設定二進制日誌文件上限,單位爲字節,最小值爲4K,最大值爲1G,默認爲1G。某事務所產生的日誌信息只能寫入一個二進制日誌文件,所以,實際上的二進制日誌文件可能大於這個指定的上限。做用範圍爲全局級別,可用於配置文件,屬動態變量。
max_relay_log_size={4096..1073741824}
設定從服務器上中繼日誌的體積上限,到達此限度時其會自動進行中繼日誌滾動。此參數值爲0時,mysqld將使用max_binlog_size參數同時爲二進制日誌和中繼日誌設定日誌文件體積上限。做用範圍爲全局級別,可用於配置文件,屬動態變量。
innodb_log_buffer_size={262144 .. 4294967295}
設定InnoDB用於輔助完成日誌文件寫操做的日誌緩衝區大小,單位是字節,默認爲8MB。較大的事務能夠藉助於更大的日誌緩衝區來避免在事務完成以前將日誌緩衝區的數據寫入日誌文件,以減小I/O操做進而提高系統性能。所以,在有着較大事務的應用場景中,建議爲此變量設定一個更大的值。做用範圍爲全局級別,可用於選項文件,屬非動態變量。
innodb_log_file_size={108576 .. 4294967295}
設定日誌組中每一個日誌文件的大小,單位是字節,默認值是5MB。較爲明智的取值範圍是從1MB到緩存池體積的1/n,其中n表示日誌組中日誌文件的個數。日誌文件越大,在緩存池中須要執行的檢查點刷寫操做就越少,這意味着所需的I/O操做也就越少,然而這也會致使較慢的故障恢復速度。做用範圍爲全局級別,可用於選項文件,屬非動態變量。
innodb_log_files_in_group={2 .. 100}
設定日誌組中日誌文件的個數。InnoDB以循環的方式使用這些日誌文件。默認值爲2。做用範圍爲全局級別,可用於選項文件,屬非動態變量。
innodb_log_group_home_dir=/PATH/TO/DIR
設定InnoDB重作日誌文件的存儲目錄。在缺省使用InnoDB日誌相關的全部變量時,其默認會在數據目錄中建立兩個大小爲5MB的名爲ib_logfile0和ib_logfile1的日誌文件。做用範圍爲全局級別,可用於選項文件,屬非動態變量。
relay_log=file_name
設定中繼日誌的文件名稱,默認爲host_name-relay-bin。也可使用絕對路徑,以指定非數據目錄來存儲中繼日誌。做用範圍爲全局級別,可用於選項文件,屬非動態變量。
relay_log_index=file_name
設定中繼日誌的索引文件名,默認爲爲數據目錄中的host_name-relay-bin.index。做用範圍爲全局級別,可用於選項文件,屬非動態變量。
relay-log-info-file=file_name
設定中繼服務用於記錄中繼信息的文件,默認爲數據目錄中的relay-log.info。做用範圍爲全局級別,可用於選項文件,屬非動態變量。
relay_log_purge={ON|OFF}
設定對再也不須要的中繼日誌是否自動進行清理。默認值爲ON。做用範圍爲全局級別,可用於選項文件,屬動態變量。
relay_log_space_limit=#
設定用於存儲全部中繼日誌文件的可用空間大小。默認爲0,表示不限定。最大值取決於系統平臺位數。做用範圍爲全局級別,可用於選項文件,屬非動態變量。
slow_query_log={ON|OFF}
設定是否啓用慢查詢日誌。0或OFF表示禁用,1或ON表示啓用。日誌信息的輸出位置取決於log_output變量的定義,若是其值爲NONE,則即使slow_query_log爲ON,也不會記錄任何慢查詢信息。做用範圍爲全局級別,可用於選項文件,屬動態變量。
slow_query_log_file=/PATH/TO/SOMEFILE
設定慢查詢日誌文件的名稱。默認爲hostname-slow.log,但能夠經過--slow_query_log_file選項修改。做用範圍爲全局級別,可用於選項文件,屬動態變量。
sql_log_bin={ON|OFF}
用於控制二進制日誌信息是否記錄進日誌文件。默認爲ON,表示啓用記錄功能。用戶能夠在會話級別修改此變量的值,但其必須具備SUPER權限。做用範圍爲全局和會話級別,屬動態變量。
sql_log_off={ON|OFF}
用於控制是否禁止將通常查詢日誌類信息記錄進查詢日誌文件。默認爲OFF,表示不由止記錄功能。用戶能夠在會話級別修改此變量的值,但其必須具備SUPER權限。做用範圍爲全局和會話級別,屬動態變量。
sync_binlog=#
設定多久同步一次二進制日誌至磁盤文件中,0表示不一樣步,任何正數值都表示對二進制每多少次寫操做以後同步一次。當autocommit的值爲1時,每條語句的執行都會引發二進制日誌同步,不然,每一個事務的提交會引發二進制日誌同步。數據庫