MariaDB數據庫併發控制和日誌管理

                              MariaDB數據庫併發控制和日誌管理

---------------------------------------------------------------------------------------------------------------------------------------------

1、併發控制

    (1)鎖粒度:表級鎖、行級鎖

    (2)讀鎖:共享鎖,只讀不可寫,多個讀取互不阻塞,意思是多臺主機可以同時查看一張上了讀鎖的表

        寫鎖:獨佔鎖、排它鎖,一個寫鎖會阻塞其它讀和寫鎖,當A用戶對錶上寫鎖,其他用戶對該表不能讀,更不能寫

    (3)使用鎖

        LOCK TABLES tblname {READ | WRITE}:加鎖

  UNLOCK TABLES:解鎖

  FLUSH TABLES TBNAME:關閉正在打開的表,在備份前加全局讀鎖,如果不指定表明,全部數據庫全部表格都將加入讀鎖,適用於溫備分

  SELECT...WHERE從句 FOR UPDATE:加寫鎖

  SELECT...WHERE從句  LOCK IN SHARE MODE:加讀鎖

讀鎖示例

image.png

寫鎖示例

image.png

    (4)實現

存儲引擎:自行實現其鎖策略和鎖粒度

服務器級:實現了鎖,表級鎖;用戶可顯示請求

    (5)分類

隱式鎖:由存儲引擎自動施加鎖

顯示鎖:用戶手動請求

    (6)鎖策略:在鎖粒度及數據安全性尋求的平衡機制

2、事務

    (1)事務Transactions:一組原子性的SQL語句,或一個獨立動作單元

    (2)事務日誌:記錄事務信息,實現undo,redo等故障恢復功能

    (3)事務的ACID特性:

A:atomicity,原子性,整個事務中的所有操作要麼全部成功執行,要麼全部失敗後回滾

C:consistency一致性,數據庫總是從一個一致性狀態轉換爲另一個一致性狀態

I:isolation隔離性,一個事務所做出的操作在提交之前,不能被其它事務所見,隔離有多種隔離級別,實現併發

D:durability持久性,一旦事務提交,其所做的修改會永久保存於數據庫中

3、事務生命週期

image.png

4、事務流程

(1)啓動事務

BEGIN、BEGIN WORK\START TRANSACTION

(2)結束事務

COMMIT:提交,ROLLBACK:回滾

注:只有事務型存儲引擎中的DML語句方能支持此類操作,即增刪改操作

(3)自動提交:set autocommit={1|0},默認爲1,爲0時設爲手動提交

建議:顯式請求和提交事務,而不要使用“自動提交”功能

mysql和sql server默認設置是自動提交,oracle默認手動提交

網站查詢結果是--autocommitautocommit表明選項和變量都有

(4)事務支持保存點:savepoint

SAVEPOINT identifier

ROLLBACK [WORK] TO [SAVEPOINT] identifier

RELEASE SAVEPOINT identifier

注意:savepoint保存點名稱必須字母開頭,不可以是純數字

示例

image.png

提交後

image.png

事務保存點示例:先有以下結果產生image.png

此時後悔了,想把數據表恢復到savepoint sp2處,也就是sp2點完菜,但未做sp3點,結果如圖image.png

5、事務隔離級別

(1)事務隔離級別:從上到下越來越嚴格

<1>READ UNCOMMITTED 可讀取到未提交數據,產生髒讀

<2>READ COMMITTED 可讀取到提交數據,但未提交數據不可讀,產生不可重複讀,即可讀取到多個提交數據,導致每次讀取數據不一致

<3>REPEATABLE READ 可重複讀,多次讀取數據都一致,產生幻讀,即讀取過程中,即使有其它提交的事務修改數據,仍只能讀取到未修改前的舊數據。此爲MySQL默認設置,意思是修改記錄過程中表格對其他用戶產生行鎖,事務完成提交後纔對其他用戶顯示修改後的數據

<4>SERIALIZABILE 可串行化,未提交的讀事務阻塞修改事務,或者未提交的修改事務阻塞讀事務。導致併發性能差

(2)MVCC: 多版本併發控制,和事務級別相關

事務隔離級別

髒讀可能性

不可重複讀

可能性

幻讀可能性

加鎖讀

讀未提交(read-uncommitted)

Y

Y

Y

N

不可重複讀(read-committed)

N

Y

Y

N

可重複讀(repeatable-read)

N

N

Y

N

串行化(serializable)

N

N

N

Y

(3)指定事務隔離級別

SET tx_isolation=''

READ-UNCOMMITTED

READ-COMMITTED

REPEATABLE-READ

SERIALIZABLE

服務器選項中指定

vim /etc/my.cnf

[mysqld]

transaction-isolation=SERIALIZABLEimage.png

6、併發控制

    (1)死鎖:兩個或多個事務在同一資源相互佔用,並請求鎖定對方佔用的資源的狀態

    (2)事務日誌的寫入類型爲“追加”,因此其操作爲“順序IO”;通常也被稱爲:預寫式日誌 write ahead logging,條件允許可以將事務日誌獨立放入一個硬盤分區中,使得事務日誌的寫入不用隨便插入地方進行寫入而是追加

    日誌文件: ib_logfile0, ib_logfile1,位於數據庫存放目錄下,可以更

7、解決阻塞(工作中慎用)

    (1)show processlist \G

    (2)看到數據庫進程後確定結束阻塞的id號,比如5號,輸入kill 5image.png

8、日誌

    (1)當對一個表格刪除大量數據後,它的日誌文件不會縮小,此時需要優化表格,執行命令:optimize table TBLNAME,使得該表的日誌文件容量縮小

    (2)日誌類型

        <1>日誌

image.png

image.png

 附:慢查詢profiling工具用法image.pngimage.png

        <2>二進制日誌,因爲非常重要,內容又多,所以單獨放一分類image.pngimage.png

        <3>二進制日誌的客戶端命令工具

mysqlbinlog [OPTIONS] log_file...

--start-position= 指定開始位置的POS點

--stop-position= 指定結束位置的POS點

--start-datetime=

--stop-datetime=

時間格式,YYYY-MM-DD hh:mm:ss

--base64-output[=name]

image.png

示例:mysqlbinlog --start-position=1465 --stop-position=2123 mysql-bin.000001image.pngimage.png

        <4>清除指定二進制日誌

            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';

        <5>刪除所有二進制日誌,index文件重新記數

RESET MASTER [TO #]; 日誌文件從#開始記數,默認從1開始,一般是master第一次啓動時執行,MariaDB10.1.6開始支持TO #

        <6>切換日誌文件:

FLUSH LOGS;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章