MySQL存儲引擎

InnoDB存儲引擎核心特性說明

image.png

事務
行鎖
MVCC
外鍵
ACSR自動故障恢復
熱備
復制(多線程肥哎,GTID,MTS)

查看存儲引擎

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

查看系統(tǒng)默認存儲引擎

mysql> select @@default_storage_engine;
+--------------------------+
| @@default_storage_engine |
+--------------------------+
| InnoDB                   |
+--------------------------+
1 row in set (0.00 sec)

配置文件修改默認存儲引擎

vim /etc/my.cnf
[mysqld]
default_storage_engine=InnoDB

修改存儲引擎

alter table t1 engine=innodb;

整理碎片(只能innodb自動整理级及,但是會短暫鎖表)

alter table t1 engine=innodb; 這個命令依舊可以整理碎片

批量替換zabbix 100多張表,innodb為tokudb

select concat("alter table",table_schema,".",table_name," engine=tokudb;") from information_schema.tables
where table_schema='zabbix';

innodb存儲引擎物理存儲結構

(/data/mysql/data)
ibdata1:系統(tǒng)數據字典信息(統(tǒng)計信息),undo表空間等數據
ib_logfile0~ib_logfie1: REDO日志文件,事務日志文件
ibtmp1: 臨時表空間磁盤位置,存儲臨時表
frm:存儲表的列信息
ibd:表的數據行和索引

共享表空間

5.5 版本默認模式(ibdata1會越來越大)
5.6獨立表空間
查看默認表空間

mysql> select @@innodb_data_file_path;
+-------------------------+
| @@innodb_data_file_path |
+-------------------------+
| ibdata1:12M:autoextend  |
+-------------------------+
1 row in set (0.00 sec)

mysql> show variables like '%extend%';
+-----------------------------+-------+
| Variable_name               | Value |
+-----------------------------+-------+
| innodb_autoextend_increment | 64    |
+-----------------------------+-------+
1 row in set (0.00 sec)

在搭建mysql時烦秩,初始化數據之前設置到參數文件中
innodb_data_file_path=ibdata1:512M:ibdata2:512M:autoextend
innodb_autoextend_increment=64

獨立表空間

從5.6,默認表空間不再使用共享表空間郎仆,替換為獨立表空間只祠。
主要存儲的是用戶數據

存儲特點為:一個表一個ibd文件,存儲數據
一張innodb表 = frm+idb+ibdata1

mysql存儲引擎日志:

redo log:ib_logfile0 ib_logfile1,重做日志
undo log: ibdata1 ibdata2(存儲在共享表空間中)扰肌,回滾日志
臨時表:ibtmp1抛寝,在做join union操作產生臨時數據,用完就自動
select @@innodb_file_per_table;

獨立表空間遷移

1創(chuàng)建和原表結構一致的空表
2.將空表的ibd文件刪除
alter table t100w discard tablespace;
3曙旭,將原表的ibd拷貝過來盗舰,并且修改權限
4.將原表ibd進行導入
alter table t100w import tablespace;

innodb核心特性

事務的ACID特性
Atomic(原子性)
所有語句作為一個單元全部成功執(zhí)行或全部取消,不能出現中間狀態(tài)

Consistent(一致性)
如果數據庫在事務開始時處于一致狀態(tài)桂躏,則在執(zhí)行該事務期間將保留一致狀態(tài)

Isolated(隔離性)
事務之間不互相影響

Durable(持久性)
事務成功完成后钻趋,所做的所有更改都會準確記錄在數據庫中,所做的更改不會丟失

事務的生命周期(事務控制語句)

1開啟事務
begin;
2標準的事務語句(DML:insert update delete)
3事務的結束
提交
commit剂习;
回滾
rollback爷绘;

自動提交機制(autocommit默認是打開的)
select @@autocommit;
在線修改參數:
1會話級別:set autocommit=0;
2全局級別:set global autocommit=0; (斷開窗口重連生效)
3永久修改:[mysqld] autocommit=0 需要重啟

隱式提交的情況
觸發(fā)隱式提交語句:
begin
a
b
[這個地方會自動commit]
begin
set 命令
DDL語句 (alter,create 和drop)
DCL語句 (GRANT,REVOKE和set password)
鎖定語句 (lock tables和unlock tables)

事務的ACID如何保證

一些概念名詞
redo log:
重做日志 ib_logfile0~1 默認50M ,輪詢使用
redo log buffer:
redo內存區(qū)域

ibd:
存儲 數據行和索引

buffer pool:
緩沖區(qū)池进倍,數據和索引的緩沖

LSN:日志序列號
ibd,redolog购对,buffer pool猾昆,redo buffer
MySQL每頁數據庫啟動,都會比較磁盤數據頁和redolog的LSN骡苞,必須要求兩者LSN一致數據庫才能啟動

WAL:(持久化)
write ahead log 日志優(yōu)先寫的方式實現持久化
日志是優(yōu)先與數據寫入磁盤的

臟頁:
內存臟頁垂蜗,內存中發(fā)生了修改,沒寫入到磁盤之前解幽,我們把內存頁稱之為臟頁
內存中修改的數據 沒寫入磁盤的狀態(tài) 稱為臟頁

ckpt:
checkpoint 檢查點贴见,就是將臟頁刷寫到磁盤的動作

TXID:
事務號,innodb會為每一個事務生成一個事務號躲株,伴隨著整個事務

redo 事務日志(重做日志)

作用:主要功能 保證"D",持久性 AC也有一定作用
記錄了什么片部?
記錄了內存數據頁的變化
感謝老男孩郭老師


image.png

1.記錄了內存數據頁的變化
2.提供快速的持久化功能(WAL)
3.CSR過程中實現前滾的操作(磁盤數據頁和redo日志lsn號一致)
redo日志位置
iblogfile0 iblogfile1

redo buffer
redo的buffer:數據頁的變化信息+數據頁當時的LSN號
LSN:日志序列號 磁盤數據頁 內存數據頁 redo buffer redolog

redo的刷寫策略
commit;
刷新當前事務的redo buffer到磁盤
還會順便將一部分redo buffer中沒有提交的事務日志也刷到磁盤

mysql在啟動時霜定,必須保證redo日志文件和數據文件LSN必須一致档悠,如果不一致就會觸發(fā)CSR廊鸥,最終保證一致

總結:
我們做了一個事務,begin;update;commit
1.在begin辖所,會立即分配一個TXID=tx_01
2.update時惰说,會將需要修改的數據頁(dp_01,LSN=101),加載到data buffer中
3.DBWR線程,會進行dp_01數據頁修改更新缘回,并更新LSN=102
4.LOGBWR日志寫線程吆视,會將dp_01數據頁的變化+LSN+TXID存儲到redobuffer
5.執(zhí)行commit時,LGWR日志寫線程會將redobuffer信息寫入redolog日志文件中酥宴,基于WAL原則
6.假如此時宕機啦吧,內存臟頁沒有來得及寫入磁盤,內存數據全部丟失
7.Mysql再次重啟時幅虑,必須要redolog和磁盤數據頁的LSN是一致的丰滑,但是,此時dp_01,TXID=tx_01磁盤是LSN=101,dp_01,TXID=tx_01,redolog中LSN=102
MySQL此時無法正常啟動倒庵,mysql觸發(fā)CSR褒墨,在內存追平LSN號,觸發(fā)CKPT擎宝,將內存數據頁更新到磁盤郁妈,從而保證磁盤數據頁和redologLSN一致,這時mysql正常啟動
以上操作稱為REDO“前滾”

undo

回滾日志
作用:在acid特性中绍申,主要保證A的特性噩咪,同時對CI也有一定功效
1.記錄了數據修改之前的狀態(tài)
2.rollback 將內存的數據修改恢復到修改之前
3.在CSR中實現未提交數據的回滾操作
4.實現一致性快照,配合隔離界別保證MVCC极阅,讀和寫的操作不會互相堵塞

redo
1.記錄內存數據頁變化日志
2.提供快速的事務的提交(commit)
3.CSR redo提供的前滾功能

undo
1.記錄數據修改之前的狀態(tài)
2.提供事務工作工程中回滾操作(rollback)
3.CSR中將未提交的事務進行回滾

實現了事務之間的隔離功能胃碾,innodb中實現的是行級鎖
row-level lock(默認50秒,然后回滾)
gap
next-lock

隔離級別

RU:讀未提交筋搏,可臟讀仆百,幻讀,不可重復讀
RC:讀已提交奔脐,可能出現幻讀俄周,可以防止臟讀
RR:可重復讀,功能是防止"幻讀"現象髓迎,利用的是undo的快照技術+GAP(間隙鎖)+NEXT-LOCK(下鍵鎖)
SR :可串行化峦朗,可以減輕GAP+NEXT-LOCK鎖的問題,但是會出現幻讀現象排龄,一般在為了讀一致性會在正常select后添加for update語句波势,但是,請記住執(zhí)行完一定要commit否則容易出現鎖等待比較嚴重
查看

select @@tx_isolation;

修改

vi /etc/my.cnf
[mysqld]
transaction_isolation=read-uncommitted
transaction_isolation=read-committed
transaction_isolation=repeatable-read

RU 會出現臟讀
RC 會出現不可重復讀,也會出現幻讀
RR 通過MVCC技術解決了不可重復讀艰亮,但是有可能會出現幻讀現象闭翩,可以通過GAP和next-lock進行避免

Innodb核心參數的介紹

存儲引擎默認設置
default_storage_engine=innodb
表空間
設置共享表空間,還是獨立表空間迄埃,默認1 獨立表空間
innodb_file_per_table=1
共享表空間文件個數和大小
innodb_data_file_path=ibdata1:512M:ibddata2:512M:autoextend
雙一標準的其中一個(從內存往磁盤刷寫日志疗韵,redo buffer 寫入到redolog)默認1,還有0,2
innodb_flush_log_at_trx_commit=1

innodb_flush_method=(o_DIRECT,fsync)
默認fsync
作用:控制的是redo buffer和 buffer pool
fsync:


image.png

o_direct: 建議使用


image.png

o_dsync


image.png

最安全的模式
innodb_flush_log_at_trx_commit=1
innodb_flush_method=o_direct

最高性能
innodb_flush_log_at_trx_commit=0
innodb_flush_metho=fsync

redo日志設置有關的
innodb_log_buffer_size=16777216 #redo buffer緩沖區(qū)大小
innodb_log_file_size=50331648 #默認50M 日志文件大小 字節(jié)
innodb_log_files_in_group=3 #redo日志個數

臟頁刷寫策略
innodb_max_dirty_pages_pct=75 #百分之75

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市侄非,隨后出現的幾起案子蕉汪,更是在濱河造成了極大的恐慌,老刑警劉巖逞怨,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件者疤,死亡現場離奇詭異,居然都是意外死亡叠赦,警方通過查閱死者的電腦和手機驹马,發(fā)現死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來除秀,“玉大人糯累,你說我怎么就攤上這事〔岵龋” “怎么了泳姐?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長暂吉。 經常有香客問我胖秒,道長,這世上最難降的妖魔是什么慕的? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任阎肝,我火速辦了婚禮,結果婚禮上肮街,老公的妹妹穿的比我還像新娘风题。我一直安慰自己,他們只是感情好低散,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著骡楼,像睡著了一般熔号。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鸟整,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天引镊,我揣著相機與錄音,去河邊找鬼。 笑死弟头,一個胖子當著我的面吹牛吩抓,可吹牛的內容都是我干的。 我是一名探鬼主播赴恨,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼疹娶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了伦连?” 一聲冷哼從身側響起雨饺,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惑淳,沒想到半個月后额港,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡歧焦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年移斩,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绢馍。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡向瓷,死狀恐怖,靈堂內的尸體忽然破棺而出痕貌,到底是詐尸還是另有隱情风罩,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布舵稠,位于F島的核電站超升,受9級特大地震影響,放射性物質發(fā)生泄漏哺徊。R本人自食惡果不足惜室琢,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望落追。 院中可真熱鬧盈滴,春花似錦、人聲如沸轿钠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疗垛。三九已至症汹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贷腕,已是汗流浹背背镇。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工咬展, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瞒斩。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓破婆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親胸囱。 傳聞我的和親對象是個殘疾皇子祷舀,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內容