InnoDB存儲引擎核心特性說明
事務
行鎖
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也有一定作用
記錄了什么片部?
記錄了內存數據頁的變化
感謝老男孩郭老師
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:
o_direct: 建議使用
o_dsync
最安全的模式
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