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

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

---------------------------------------------------------------------------------------------------------------------------------------------sql

一、併發控制數據庫

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

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

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

    (3)使用鎖併發

        LOCK TABLES tblname {READ | WRITE}:加鎖oracle

  UNLOCK TABLES:解鎖ide

  FLUSH TABLES TBNAME:關閉正在打開的表,在備份前加全局讀鎖,若是不指定代表,所有數據庫所有表格都將加入讀鎖,適用於溫備分工具

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

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

讀鎖示例

image.png

寫鎖示例

image.png

    (4)實現

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

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

    (5)分類

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

顯示鎖:用戶手動請求

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

二、事務

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

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

    (3)事務的ACID特性:

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

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

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

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

三、事務生命週期

image.png

四、事務流程

(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

五、事務隔離級別

(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

六、併發控制

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

    (2)事務日誌的寫入類型爲「追加」,所以其操做爲「順序IO」;一般也被稱爲:預寫式日誌 write ahead logging,條件容許能夠將事務日誌獨立放入一個硬盤分區中,使得事務日誌的寫入不用隨便插入地方進行寫入而是追加

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

七、解決阻塞(工做中慎用)

    (1)show processlist \G

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

八、日誌

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

相關文章
相關標籤/搜索