Mysql的日誌種類
查詢日誌:general_log
慢查詢日誌:log_slow_querles
錯誤日誌:log_error,log_warnings
二進制日誌:binlog
中繼日誌:relay_log
事務日誌:innodb_log
查詢日誌
記錄查詢語句,日誌存儲位置:
文件:file
表:table(mysql.general_log)
general_log={ON|OFF}general_log_file=HOSTNAME.loglog_output={FILE|TABLE|NONE}
慢查詢日誌
慢查詢:運行時間超出指定時長的查詢;long_query_time
存儲文件位置:
文件:file 表: table,mysql.slow_log
log_slow_queries={ON|OFF} slow_query_log={ON|OFF} 是否開啓慢查詢 slow_query_log_file=log_output={FILE|TABLE|NONE}log_slow_filter=admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk 日誌過濾器log_slow_rate_limitlog_slow_verbosity
錯誤日誌
記錄信息:
mysqld啓動和關閉過程輸出信息; mysqld運行中產生的錯誤信息; event scheduler運行時產生的信息; 主從複製構架中,從服務器複製線程啓動時產生的日誌;
log_error=log_warnings={ON|OFF}
二進制日誌
用於記錄引起數據改變或存在引起數據改變的潛在可能性的語句(STATEMENT)或改變後結果(ROW),也可能是二者混合; 功能:“重放”
二進制日誌查看命令:
mysqlbinlog
--start-datetime=
--stop-datetime=
-j,--start-position=#
--stop-position=#
--user,--host,--password服務器變量:
log_bin=/PATH/TO/BIN_LOG_FILE 開啓二進制日誌,二進制日誌存放位置,此配置卸載server.conf文件中的mysql模塊
sql_log_bin={ON|OFF} 二進制日誌是否開啓
max_binlog_size=1073741824 日誌文件大小
sync_binlog={1|0} 由事務提交時進行由內存到磁盤的同步,
binlog_format={STATEMENT|ROW|MIXED} STATEMENT:語句 ROW:行 MIXED:混編查看二進制日誌文件列表: SHOW MASTER|BINARY LOGS; 查看當前正在使用的二進制日誌文件: SHOW MASTER STATUS; 查看二進制日誌文件中的事件: SHOW BINLOG EVENTS [IN 'log_name'][FROM pos][LIMIT][offset,][row_count] 二進制日誌時間格式: # at 553 #160831 9:56:08 server id 1 end_log_pos 624 Query thread_id=2 exec_time=0 error_code=0 SET TIMESTAMP=1472608568/*!*/; BEGIN /*!*/; 事件發生的日期時間:#160831 9:56:08 事件發生的服務器id:server id 1 事件的結束位置:end_log_pos 624 事件的類型:Query 事件發生時所在服務器執行此事件的線程的ID: thread_id=2 語句的時間戳與將其寫入二進制日誌文件中的時間差:exec_time=0 錯誤代碼:error_code=0 事件內容:SET TIMESTAMP=1472608568/*!*/;
中繼日誌
從服務器上記錄下來從中服務器的二進制日誌文件同步過來的事件;
事務日誌
事務型存儲引擎innodb用於保證事務特性的日誌文件;
備份和恢復(數據):
備份:存儲的數據副本;
原始數據:持續改變;
備份一般不止一份,並且在備份後要經常性恢復演練;恢復:把副本應用到線上系統;
僅能恢復至備份操作時刻的數據狀態;
備份類型
備份數據集的範圍
完全備份:整個數據集
部分備份:數據集的一部分,例如備份部分表;
完全備份、增量備份、差異備份
增量備份:僅備份自上一次完全備份 或者備份以來再次改變的那部分數據;
差異備份:僅備份自上一次完全備份以來變量的那部分數據。
物理備份、邏輯備份:
物理備份:複製數據文件進行備份;
邏輯備份:從數據庫導出數據另存在一個或多個文件中;
根據數據是否在線:
熱備:讀寫操作均可進行的狀態下所做的備份;
溫備:可讀但不可寫狀態下進行的備份;
冷備:讀寫均不可進行狀態下所做的備份;
需要備份哪些
數據
二進制日誌、InnoDB事務日誌;
代碼(存儲過程、存儲函數、觸發器、時間調度器)# 服務器的配置文件
備份工具
mysqldump :mysql服務自帶的備份工具;邏輯備份工具;
cp/tar
lvm2:快照(請求一個全局鎖),之後立即釋放鎖,達到幾乎熱備的效果;物理備份;
注意:不能僅備份數據文件,要同時備份事務日誌;要求數據文件和事務日誌位於同一個邏輯卷
xtrabackup: 由percona提供,開源工具,支持對InnoDB做熱備,物理備份工具;
完全備份、部分備份;
完全備份、增量備份;
完全備份、差異備份;
備份策略
完全+差異+binlog
完全+增量+binlog
mysqldump:
邏輯備份、完全備份、部分備份;
二次封裝工具:mydumper、phpMyAdmin
用法:
mysqldump [options] [db_name [tbl_name ...]] 備份表
mysqldump [options] --databases [options] DB1 [DB22 DB3...]備份庫及表
mysqldump [options] --all-databases [options]
MyISAM存儲引擎:支持溫備,備份時需要鎖定所有表;
-x,--lock-all-tables:鎖定所有庫的所有表;
-l,--lock-tables:鎖定指定庫的所有表; *InnoDB存儲引擎:支持溫備和熱備 --single-transaction:創建一個事務,基於此快照執行備份
其他選項:
-R,--routines:存儲過程和存儲函數;
--triggers :觸發器
-E,--events:事件調度器 --flush-logs:鎖定表完成後,即進行日誌刷新操作;
--master-date[=#]
1:記錄爲CHANGE MASTER TO語句,此語句不被註釋;2:記錄爲CHANGE MASTER TO語句,此語句被註釋;
mysqldump備份還原數據庫操作
備份數據庫InnoDB
將備份的數據保存至文件內,備份實際上創建新的數據庫,刪除所有表,創建表在插入數據;
有databases時對數據庫及表進行備份;
無databases時僅對錶進行備份
[root@localhost ~]# mysqldump --databases hellodb --single-transaction -R --triggers -E --master-data=2 --flush-logs > /tmp/hellodb-$(date +%F)
刪除數據庫
MariaDB [(none)]> drop database hellodb;
需要備份二進制日誌:
mysqlbinlog --stop-position=xxx /var/lib/mysql/master-log.00000x > /tmp/bin.log
恢復數據庫
關閉二進制日誌 set @@session.sql_log_bin=OFF
source /tmp/hello-date
source /tmp/bin.log
開啓二進制日誌 set @@session.sql_log_bin=ON
注意: 1、腳本化、週期性進行 2、備份結果要另存,建議爲異地存儲;對備份結果做測試; 3、配置mysqldump使用binlog做增量備份
基於lvm2的備份
物理備份工具,幾乎熱備,取決於快照命令執行的時長
前提:數據目錄位於邏輯卷,包含了數據文件和事務日誌;
(1)請求鎖定所有表;
mysql>FLUSH TABLES WITH READ LOCK;
(2)記錄二進制文件事件位置;
mysql>FLUSH LOGS;
mysql>SHOW MASTER STATUS;
#msyql -e 'show master status;' >> /path/to/some_posfile
(3)創建快照卷
lvcreate -L # -s -p r - SNAM-NAME /dev/VG-NAME/LV-NAME
(4)釋放鎖
mysql> UNLOCK TABLES;
(5)掛載快照卷,並執行備份,備份完成後刪除快照卷;
(6)週期性備份二進制日誌
基於Xtrabackup的備份
Xtrabackup是由percona提供的mysql數據庫備份工具,據官方介紹,這也是世界上惟一一款開源的能夠對innodb和xtradb數據庫進行熱備的工具。特點:
(1)備份過程快速、可靠;
(2)備份過程不會打斷正在執行的事務;
(3)能夠基於壓縮等功能節約磁盤空間和流量;
(4)自動實現備份檢驗;
(5)還原速度快;
支持InnoDB,XtraDB(mariadb);
還原之前合併備份文件至一個完全備份文件;
MyISAM:溫備,不支持增量備份;
InnoDB:熱備,增量備份,物理備份;
物理備份:速率快、可靠;備份完成後自動效驗備份結果集是否可用;還原速度快;
完全備份數據庫
[root@localhost ~]# innobackupex --user=root --host=localhost /data/backup
主要生成以下文件
使用innobakupex備份時,其會調用xtrabackup備份所有的InnoDB表,複製所有關於表結構定義的相關文件(.frm)、以及MyISAM、MERGE、
CSV和ARCHIVE表的相關文件,同時還會備份觸發器和數據庫配置信息相關的文件。這些文件會被保存至一個以時間命名的目錄中。
*在備份的同時,innobackupex還會在備份目錄中創建如下文件:
(1)xtrabackup_checkpoints —— 備份類型(如完全或增量)、備份狀態(如是否已經爲prepared狀態)和LSN(日誌序列號)範圍信息; 每個InnoDB頁(通常爲16k大小)都會包含一個日誌序列號,即LSN。LSN是整個數據庫系統的系統版本號,每個頁面相關的LSN能夠表明此頁面最近是如何發生改變的。 (2)xtrabackup_binlog_info —— mysql服務器當前正在使用的二進制日誌文件及至備份這一刻爲止二進制日誌事件的位置。 (3)xtrabackup_binlog_pos_innodb —— 二進制日誌文件及用於InnoDB或XtraDB表的二進制日誌文件的當前position。 (4)xtrabackup_binary —— 備份中用到的xtrabackup的可執行文件; (5)backup-my.cnf —— 備份命令用到的配置選項信息 在使用innobackupex進行備份時,還可以使用--no-timestamp選項來阻止命令自動創建一個以時間命名的目錄;如此一來,innobackupex命令將會創建一個BACKUP-DIR目錄來存儲備份數據 [root@localhost ~]# cd /data/backup/2017-02-21_12-26-09/[root@localhost 2017-02-21_12-26-09]# lltotal 18460-rw-r----- 1 root root 385 Feb 21 12:26 backup-my.cnf drwx------ 2 root root 138 Feb 21 12:26 hellodb -rw-r----- 1 root root 18874368 Feb 21 12:26 ibdata1 drwx------ 2 root root 4096 Feb 21 12:26 mysql drwx------ 2 root root 4096 Feb 21 12:26 performance_schema drwx------ 2 root root 19 Feb 21 12:26 test -rw-r----- 1 root root 23 Feb 21 12:26 xtrabackup_binlog_info 二進制備份日誌 -rw-r----- 1 root root 113 Feb 21 12:26 xtrabackup_checkpoints 檢查點文件 -rw-r----- 1 root root 480 Feb 21 12:26 xtrabackup_info -rw-r----- 1 root root 2560 Feb 21 12:26 xtrabackup_logfile 事務日誌信息 [root@localhost 2017-02-21_12-26-09]#
基於xtrabackup恢復數據
注意innodb_log_file_size = 50331648
準備恢復
一般情況下,在備份完成後,數據尚且不能用於恢復操作,因爲備份的數據中可能會包含尚未提交的事務或已經提交但尚未同步至數據文件中的事務。
因此,此時數據文件仍處理不一致狀態。“準備”的主要作用正是通過回滾未提交的事務及同步已經提交的事務至數據文件也使得數據文件處於一致性狀態。
[root@localhost mysql]# innobackupex --apply-log /data/backup/2017-01-19_10-40-32/
在實現“準備”的過程中,innobackupex通常還可以使用--use-memory選項來指定其可以使用的內存的大小,默認通常爲100M。如果有足夠的內存可用,可以多劃分一些內存給prepare的過程,以提高其完成速度。
恢復數據
innobackupex命令的--copy-back選項用於執行恢復操作,其通過複製所有數據相關的文件至mysql服務器DATADIR目錄中來執行恢復過程。
innobackupex通過backup-my.cnf來獲取DATADIR目錄的相關信息。
[root@localhost mysql]# innobackupex --copy-back /data/backup/2017-01-19_10-40-32/
將mysql的文件屬主和屬組均改成mysql
當數據恢復至DATADIR目錄以後,還需要確保所有數據文件的屬主和屬組均爲正確的用戶,如mysql,否則,在啓動mysqld之前還需要事先修改數據文件的屬主和屬組。如:
[root@localhost mysql]# chown -R mysql.mysql ./*
啓動mariadb服務
[root@localhost mysql]# systemctl start mariadb
注意:恢復數據時需清空/var/lib/mysql/並需要關閉mariadb服務
基於xtrabackup的增量備份
每個InnoDB的頁面都會包含一個LSN信息,每當相關的數據發生改變,相關的頁面的LSN就會自動增長。這正是InnoDB表可以進行增量備份的基礎,即innobackupex通過備份上次完全備份之後發生改變的頁面來實現。
其中,BASEDIR指的是完全備份所在的目錄,此命令執行結束後,innobackupex命令會在/backup目錄中創建一個新的以時間命名的目錄以存放所有的增量備份數據。另外,在執行過增量備份之後再一次進行增量備份時,其--incremental-basedir應該指向上一次的增量備份所在的目錄。
#innobackupex --incremental /backup --incremental-basedir=BASEDIR
其中,BASEDIR指的是完全備份所在的目錄,此命令執行結束後,innobackupex命令會在/backup目錄中創建一個新的以時間命名的目錄以存放所有的增量備份數據。
另外,在執行過增量備份之後再一次進行增量備份時,其--incremental-basedir應該指向上一次的增量備份所在的目錄。
注意:增量備份僅能應用於InnoDB或XtraDB表,對於MyISAM表而言,執行增量備份時其實進行的是完全備份。
“準備”(prepare)增量備份與整理完全備份有着一些不同,尤其要注意的是:
(1)需要在每個備份(包括完全和各個增量備份)上,將已經提交的事務進行“重放”。“重放”之後,所有的備份數據將合併到完全備份上。 (2)基於所有的備份將未提交的事務進行“回滾”。
於是,操作就變成了:
# innobackupex --apply-log --redo-only BASE-DIR
接着執行:
# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1
而後是第二個增量:
# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2
其中BASE-DIR指的是完全備份所在的目錄,而INCREMENTAL-DIR-1指的是第一次增量備份的目錄,INCREMENTAL-DIR-2指的是第二次增量備份的目錄,其它依次類推,即如果有多次增量備份,每一次都要執行如上操作;