Linux 第70天 mariadb transaction, log
Linux 第70天 mariadb transaction, log
時間: 20181011
個人新開的小部落格,歡迎大家訪問: www.winthcloud.top
目錄
併發控制
鎖策略:在鎖粒度及資料安全性尋求的平衡機制
事務transaction(ACID)
死鎖
日誌
error-log,binary-log,general-log
transaction-log,slow-query-log,relay-log
mysqlbinlog工具使用
併發控制
為何要做併發控制?
即當多個請求同時到達時,到底是可以同時為其每一個請求做即時反應,還是需要等待
其它請求完成後才可對其響應,如一個請求正在寫某個表的某行資料,另一個請求要讀
此行的內容,後者到底可否讀取,還有如果請求都是讀的話是不是可以讓其所有請求都
可以同時讀,這便需要一個機制去控制。
鎖粒度:
表級鎖
行級鎖
鎖:
讀鎖:共享鎖S,只讀不可寫,多個讀互不阻塞
寫鎖:獨佔鎖,排它鎖X,一個寫鎖會阻塞其它讀和它鎖
實現
儲存引擎:自行實現其鎖策略和鎖粒度
伺服器級:實現了鎖,表級鎖;使用者可顯式請求
分類:
隱式鎖:由儲存引擎自動施加鎖
顯式鎖:使用者手動請求
鎖策略:在鎖粒度及資料安全性尋求的平衡機制
顯式使用鎖
LOCK TABLES 加鎖
tbl_name [[AS] alias] lock_type
[, tbl_name [[AS] alias] lock_type] ...
lock_type: READ , WRITE
UNLOCK TABLES 解鎖
FLUSH TABLES [tb_name[,...]] [WITH READ LOCK]
關閉正在開啟的表(清除查詢快取),通常在備份前加全域性讀鎖
SELECT clause [FOR UPDATE | LOCK IN SHARE MODE]
查詢時加寫或讀鎖
事務
事務Transactions:一組原子性的SQL語句,或一個獨立工作單元
事務日誌:記錄事務資訊,實現undo,redo等故障恢復功能
ACID特性:
A:atomicity原子性;整個事務中的所有操作要麼全部成功執行,要麼全部失敗後回滾
C:consistency一致性;資料庫總是從一個一致性狀態轉換為另一個一致性狀態
I:Isolation隔離性;一個事務所做出的操作在提交之前,是不能為其它事務所見;
隔離有多種隔離級別,實現併發
D:durability永續性;一旦事務提交,其所做的修改會永久保存於資料庫中
啟動事務:
BEGIN
BEGIN WORK
START TRANSACTION
結束事務:
COMMIT:提交
ROLLBACK: 回滾
注意:只有事務型儲存引擎中的DML語句方能支援此類操作
自動提交:set autocommit={1|0} 預設為1,為0時設為非自動提交
建議:顯式請求和提交事務,而不要使用“自動提交”功能
事務支援儲存點:savepoint
SAVEPOINT identifier
ROLLBACK [WORK] TO [SAVEPOINT] identifier
RELEASE SAVEPOINT identifier
事務隔離級別:從上至下更加嚴格
READ UNCOMMITTED 可讀取到未提交資料,產生髒讀
READ COMMITTED 可讀取到提交資料,但未提交資料不可讀,產生不可重複讀,
即可讀取到多個提交資料,導致每次讀取資料不一致
REPEATABLE READ 可重複讀,多次讀取資料都一致,產生幻讀,即讀取過程中,即使有
其它提交的事務修改資料,仍只能讀取到未修改前的舊資料。此為mariadb預設設定
SERIALIZABILE 可序列化,未提交的讀事務阻塞修改事務,或者未提交的修改事務阻塞
讀事務。導致併發效能差
MVCC: 多版本併發控制,和事務級別相關
指定事務隔離級別:
伺服器變數tx_isolation指定,預設為REPEATABLE-READ,
可在GLOBAL和SESSION級進行設定
SET tx_isolation=''
READ-UNCOMMITTED
READ-COMMITTED
REPEATABLE-READ
SERIALIZABLE
伺服器選項中指定
vim /etc/my.cnf
[mysqld]
transaction-isolation=SERIALIZABLE
死鎖:
兩個或多個事務在同一資源相互佔用,並請求鎖定對方佔用的資源的狀態
事務日誌:
事務日誌的寫入型別為"追加",因此其操作為"順序IO";
通常也被稱為:預寫式日誌 write ahead logging
日誌檔案: ib_logfile0 ib_logfile1
出現死鎖時預設資料庫會自行解決,可以人為檢視某些語句執行狀態,使用以下兩條命令
SHOW PROCESSLIST
KILL ID;
日誌
事務日誌 transaction log
中繼日誌 reley log
錯誤日誌 error log
通用日誌 general log
慢查詢日誌 slow query log
二進位制日誌 binary log
事務日誌:transaction log
事務型儲存引擎自行管理和使用,建議和資料檔案分開存放
redo log
undo log
Innodb事務日誌相關配置:
show variables like '%innodb_log%';
innodb_log_file_size 5242880 每個日誌檔案大小
innodb_log_files_in_group 2 日誌組成員個數
innodb_log_group_home_dir ./ 事務檔案路徑
永久儲存在my.cnf
[mysqld]
innodb-log-group-home-dir=/data/mariadblog
中繼日誌:relay log
主從複製架構中,從伺服器用於儲存從主伺服器的二進位制日誌中讀取的事件
錯誤日誌
錯誤日誌所記錄的內容
mysqld啟動和關閉過程中輸出的事件資訊
mysqld執行中產生的錯誤資訊
event scheduler執行一個event時產生的日誌資訊
在主從複製架構中的從伺服器上啟動從伺服器執行緒時產生的資訊
錯誤日誌相關配置
SHOW GLOBAL VARIABLES LIKE 'log_error'
錯誤檔案路徑:
log_error=/PATH/TO/LOG_ERROR_FILE
是否記錄警告資訊至錯誤日誌檔案
log_warnings=1|0 預設值1
永久儲存變數內容
vim my.cnf
[mysqld]
log_error=/data/mariadblog/error.log
通用日誌:記錄對資料庫的通用操作,包括錯誤的SQL語句 (預設off)
通用日誌可以儲存至檔案中也可以儲存至資料庫mysql的表中
檔案:file,預設值
表:table
通用日誌相關設定
general_log=ON|OFF
general_log_file=HOSTNAME.log
log_output=TABLE|FILE|NONE
慢查詢日誌:記錄執行查詢時長超出指定時長的操作
相關變數:
slow_query_log=ON|OFF 開啟或關閉慢查詢
long_query_time=N 慢查詢的閥值,單位秒
slow_query_log_file=HOSTNAME-slow.log 慢查詢日誌檔案
log_slow_filter = admin,filesort,filesort_on_disk,full_join,
full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk
上述查詢型別且查詢時長超過long_query_time,則記錄日誌
log_queries_not_using_indexes=ON 不使用索引或使用全索引掃描,不論是否
達到慢查詢閥值的語句是否記錄日誌,預設OFF,即不記錄
log_slow_rate_limit = 1 多少次查詢才記錄,mariadb特有
log_slow_verbosity= Query_plan,explain 記錄內容
log_slow_queries = OFF 同slow_query_log 新版已廢棄
二進位制日誌(重點)
記錄導致資料改變或潛在導致資料改變的SQL語句
記錄已提交的日誌
不依賴於儲存引擎型別
功能:通過"重放"日誌檔案中的事件來生成資料副本
注意:建議二進位制日誌和資料檔案分開存放
二進位制日誌記錄格式
二進位制日誌記錄三種格式
基於"語句"記錄:statement,記錄語句,預設模式
基於"行"記錄:row,記錄資料,日誌量較大
混合模式:mixed, 讓系統自行判定該基於哪種方式進行
格式配置
show variables like 'binlog_format';
二進位制日誌檔案的構成
有兩類檔案
日誌檔案:mysql|mariadb-bin.檔名字尾,二進位制格式
如: mariadb-bin.000001
索引檔案:mysql|mariadb-bin.index,文字格式
二進位制日誌相關的伺服器變數:
sql_log_bin=ON|OFF:是否記錄二進位制日誌,預設ON
log_bin=/PATH/BIN_LOG_FILE:指定檔案位置;預設ON,表示啟用
二進位制日誌功能,上述兩項都開啟才可實現記錄二進位制日誌
binlog_format=STATEMENT|ROW|MIXED:二進位制日誌記錄的格式,預設MIXED
max_binlog_size=1073741824:單個二進位制日誌檔案的最大體積,
到達最大值會自動滾動,預設為1G
說明:檔案達到上限時的大小未必為指定的精確值
sync_binlog=1|0:設定是否啟動二進位制日誌即時同步磁碟功能,
預設0,由作業系統負責同步日誌到磁碟
expire_logs_days=N:二進位制日誌可以自動刪除的天數。 預設為0,即不自動刪除
log_bin_basename=/path/binary-log 設定二進位制日誌儲存位置和字首名字
log_bin_index=/path/binary-log.index 設定二進位制索引檔案存放位置
二進位制日誌相關配置
檢視mariadb自行管理使用中的二進位制日誌檔案列表,及大小
SHOW {BINARY | MASTER} LOGS
檢視使用中的二進位制日誌檔案
SHOW MASTER STATUS
檢視二進位制檔案中的指定內容
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos]
[LIMIT [offset,] row_count]
show binlog events in 'mysql-bin.000001' from 6516 limit 2,3
mysqlbinlog:二進位制日誌的客戶端命令工具
命令格式:
mysqlbinlog [OPTIONS] log_file…
--start-position=# 指定開始位置
--stop-position=#
--start-datetime=
--stop-datetime=
時間格式:YYYY-MM-DD hh:mm:ss
--base64-output[=name]
示例:mysqlbinlog --start-position=6787 --stop-position=7527
/var/lib/mysql/mariadb-bin.000003
mysqlbinlog --start-datetime="2018-01-30 20:30:10"
--stop-datetime="2018-01-30 20:35:22" mariadb-bin.000003
二進位制日誌事件的格式:
# at 328
#151105 16:31:40 server id 1 end_log_pos 431 Query thread_id=1
exec_time=0 error_code=0
use `mydb`/*!*/;
SET TIMESTAMP=1446712300/*!*/;
CREATE TABLE tb1 (id int, name char(30))
/*!*/;
事件發生的日期和時間:151105 16:31:40
事件發生的伺服器標識:server id 1
事件的結束位置:end_log_pos 431
事件的型別:Query
事件發生時所在伺服器執行此事件的執行緒的ID:thread_id=1
語句的時間戳與將其寫入二進位制檔案中的時間差:exec_time=0
錯誤程式碼:error_code=0
事件內容:
GTID:Global Transaction ID,mysql5.6以mariadb10以上版本專屬屬性:GTID
清除指定二進位制日誌:
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }
示例:
PURGE BINARY LOGS TO 'mariadb-bin.000003'; 刪除3之前的日誌
PURGE BINARY LOGS BEFORE '2017-01-23';
PURGE BINARY LOGS BEFORE '2017-03-22 09:25:30';
刪除所有二進位制日誌,index檔案重新記數
RESET MASTER [TO #]; 日誌檔案從#開始記數,預設從1開始,
一般是master第一次啟動時執行,MariaDB10.1.6開始支援TO #
切換日誌檔案:
FLUSH LOGS;