207_mysql_innodb_5_innodb_redo1
一 事物 ?把保障 ACID 的一個或者多個對數據庫的操作 成為事物
Atomicity(原子性)? 要么全做-成功,要么全部做-回滾的規則
Consistency(一致性) 事務將數據庫從一種狀態轉變為另一種一致的狀態 在事務開始之前和事務結束以后,數據庫的完整性約束沒有被破壞。
Isolation(隔離性) 事務的隔離性要求每個讀寫事務的對象與其他事務的操作對象能相互隔離,即該事務提交前對其他事務都不可見。
Durability(持久性)事務一旦提交,其結果就是永久性的,即使發生宕機等故障,數據庫也能將數據恢復。
事物的幾個狀態
1 活動的(active) 事物執行中
2 部分提交(partially committed) 由于操作在內存, 事物已經在內存中完成, 但并未刷盤的情況
3 失敗(failed)? 事物由于遇到意外情況停止運行的情況
4 終止(aborted)事物執行了一半而變為失敗狀態,發生了回滾,回到了事物初始狀態, 說這個事物處于終止狀態
5 提交的(commited) 事物的修改都落盤后,該事物處于提交狀態
事物語法
Begin/START TRANSACTION START TRANSACTION READ ONLY / READ WRITE, WITH CONSISTENT SNAPSHOT WITH CONSISTENT SNAPSHOT 啟動一致性讀 COMMIT / ROLLBACK
自動提交
show variables like "%autocommit%"
SET autocommit = OFF
隱式提交
1 DDL 會自動提交, CREATE, ALTER, DROP
2 隱式使用或修改數據庫中的表 ALTER USE, CREATE USER, DROP USER, GRANT, RENAME USER,REVOKE, SET PASSWORD 等
3 使用嵌套事物會觸發第一個事物提交
4 LOCK TABLES
5 加載數據語句 LOAD DATA 向數據庫中批量導入數據
6 復制相關 START / STOP / RESET SLAVE? CHANGE MASTER TO
7 其它: ANALYZE TABLE, CACHE INDEX, CHECK TABLE, FLUSH , LOAD INDEX INTO CACHE, OPTIMIZE TABLE, REPAIR TABLE ,RESET 等
保存點
SAVEPOINT 保存點名字
Save point alex
Rollback to alex
二 Redo 概述
DML(8.0+ DDL)操作導致的頁面變化,均需要記錄Redo日志;
聚簇索引/二級索引/Undo頁面修改,均需要記錄Redo日志 WAL(write ahead log),Mysql保證redo優先于數據寫入磁盤
show variables like '%innodb_log_file%';
ib_logfile0 48M ib_logfile1 48M vim /etc/my.cnf # 添加參數: innodb_log_file_size=500M #生產建議大?。?512M-4G 組數: 2-4組 innodb_log_files_in_group=3
LSN(日志序列號)
LSN(log sequence number)日志序列號,5.6.3之后占用8字節,LSN主要用于發生crash時對數據進行recovery,LSN是一個一直遞增的整型數字,表示事務寫入到日志的字節總量。
LSN不僅只存在于重做日志中,在每個數據頁頭部也會有對應的LSN號,該LSN記錄當前頁最后一次修改的LSN號,用于在recovery時對比重做日志LSN號 決定是否對該頁進行恢復數據。
checkpoint也是有LSN號記錄的,LSN號串聯起一個事務開始到恢復的過程
show engine innodb status\G Log sequence number 2687274848548 Log flushed up to 2687274848516 Pages flushed up to 2687273963960 Last checkpoint at 2687273963960 #簡單說明: Log sequence number: 當前系統最大的LSN號 log flushed up to:當前已經寫入redo日志文件的LSN pages flushed up to:已經將更改寫入臟頁的lsn號 Last checkpoint at就是系統最后一次刷新buffer pool臟中頁數據到磁盤的checkpoint_lsn #以上4個LSN是遞減的: LSN1>=LSN2>=LSN3>=LSN4.
checkpoint
sharp checkpoint
完全檢查點,數據庫正常干凈關閉時,會觸發把所有的臟頁都寫入到磁盤上(這時候logfile的日志就沒用了,臟頁已經寫到磁盤上了)
fuzzy checkpoint:模糊檢查點,部分頁寫入磁盤 下面四種情況
1 master thread checkpoint
master thread 差不多以每秒或每十秒的速度從緩沖池的臟頁列表中刷新一定比例的頁回磁盤,這個過程是異步的,不會阻塞用戶查詢。
show variables like '%io_cap%';? ?#PCI-E 2000-3000 4000-6000;? ?flash 5000-8000 10000-16000
2 ?flush_lru_list checkpoint
show variables like '%lru%depth';? #空閑數據頁低于1024個
3 ?async/sync flush checkpoint
log file快滿了,會批量的觸發數據頁回寫,這個事件觸發的時候又分為異步和同步,不可被覆蓋的redolog占log file的比值:75%--->異步、90%--->同步 指的是重做日志文件不可用的情況,這時需要強制將一些頁刷新回磁盤,而此時臟頁是從臟頁列表中選取的。 若將已經寫入到重做日志的LSN記為redo_lsn,將已經刷新回磁盤最新頁的LSN記為checkpoint_lsn,則可定義:checkpoint_age = redo_lsn - checkpoint_lsn (redo日志占用大小) 再定義以下的變量: async_water_mark = 75% * total_redo_log_file_size sync_water_mark = 90% * total_redo_log_file_size 若每個重做日志文件的大小為1GB,并且定義了兩個重做日志文件,則重做日志文件的總大小為2GB。那么async_water_mark=1.5GB,sync_water_mark=1.8GB。 則: 1 checkpoint_age < async_water_mark時,不需要刷新任何臟頁到磁盤; 2 async_water_mark 4 dirty page too much checkpoint 臟頁太多檢查點,為了保證buffer pool的空間可用性的一個檢查點 show global status like 'Innodb_buffer_pool_pages%t%'; show global status like '%wait_free'; 1、Innodb_buffer_pool_pages_dirty/Innodb_buffer_pool_pages_total:表示臟頁在buffer 的占比 2、Innodb_buffer_pool_wait_free:如果>0,說明出現性能負載,buffer pool中沒有干凈可用塊 2、臟頁控制參數 show variables like '%dirty%pct%'; 1、默認是臟頁占比75%的時候,就會觸發刷盤,將臟頁寫入磁盤,騰出內存空間。建議不調,調太低的話,io壓力就會很大,但是崩潰恢復就很快; 2、lwm:low water mark低水位線,刷盤到該低水位線就不寫臟頁了,0也就是不限制。 Mysql 數據庫
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。