1. 程式人生 > >Linux 第70天 mariadb transaction, log

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;