第七章· MySQL的存儲引擎

第七章· MySQL的存儲引擎

 

一.存儲引擎簡介

javascript

  • 一、文件系統:
    • 1.1 操做系統組織和存取數據的一種機制。
    • 1.2 文件系統是一種軟件。
  • 二、文件系統類型:ext2 3 4 ,xfs 數據
    • 2.1 無論使用什麼文件系統,數據內容不會變化
    • 2.2 不一樣的是,存儲空間、大小、速度。
  • 三、MySQL引擎:
    • 3.1 能夠理解爲,MySQL的「文件系統」,只不過功能更增強大。
  • 四、MySQL引擎功能:
    • 4.1 除了能夠提供基本的存取功能,還有更多功能事務功能、鎖定、備份和恢復、優化以及特殊功能

總之,存儲引擎的各項特性就是爲了保障數據庫的安全和性能設計結構。css

二.MySQL自帶的存儲引擎類型

MySQL 提供如下存儲引擎:
01)InnoDB
02)MyISAM

03)MEMORY
04)ARCHIVE
05)FEDERATED
06)EXAMPLE
07)BLACKHOLE
08)MERGE
09)NDBCLUSTER
10)CSVjava


還可使用第三方存儲引擎:
01)MySQL當中插件式的存儲引擎類型
02)MySQL的兩個分支
03)perconaDB
04)mariaDBpython

#查看當前MySQL支持的存儲引擎類型 mysql> show engines #查看innodb的表有哪些 mysql> select table_schema,table_name,engine from information_schema.tables where engine='innodb'; #查看myisam的表有哪些 mysql> select table_schema,table_name,engine from information_schema.tables where engine='myisam'; 
  • 一、innodb和myisam的區別

物理上的區別:mysql

#進入mysql目錄 [root@db01~l]# cd /application/mysql/data/mysql #查看全部user的文件 [root@db01 mysql]# ll user.* -rw-rw---- 1 mysql mysql 10684 Mar 6 2017 user.frm -rw-rw---- 1 mysql mysql 960 Aug 14 01:15 user.MYD -rw-rw---- 1 mysql mysql 2048 Aug 14 01:15 user.MYI #進入word目錄 [root@db01 world]# cd /application/mysql/data/world/ #查看全部city的文件 [root@db01 world]# ll city.* -rw-rw---- 1 mysql mysql 8710 Aug 14 16:23 city.frm -rw-rw---- 1 mysql mysql 688128 Aug 14 16:23 city.ibd 
  • 2.innodb存儲引擎的簡介

在MySQL5.5版本以後,默認的存儲引擎,提供高可靠性和高性能。nginx

優勢:
01)事務安全(聽從 ACID)
02)MVCC(Multi-Versioning Concurrency Control,多版本併發控制)
03)InnoDB 行級別鎖定
04)Oracle 樣式一致非鎖定讀取
05)表數據進行整理來優化基於主鍵的查詢
06)支持外鍵引用完整性約束
07)大型數據捲上的最大性能
08)將對錶的查詢與不一樣存儲引擎混合
09)出現故障後快速自動恢復
10)用於在內存中緩存數據和索引的緩衝區池sql

數據庫

innodb核心特性vim

重點:
MVCC
事務
行級鎖
熱備份
Crash Safe Recovery(自動故障恢復)緩存

  • 3.查看存儲引擎

1)使用 SELECT 確認會話存儲引擎

#查詢默認存儲引擎 SELECT @@default_storage_engine; 

2)使用 SHOW 確認每一個表的存儲引擎

#查看錶的存儲引擎
SHOW CREATE TABLE City\G SHOW TABLE STATUS LIKE 'CountryLanguage'\G 

3)使用 INFORMATION_SCHEMA 確認每一個表的存儲引擎

#查看錶的存儲引擎
SELECT TABLE_NAME, ENGINE FROM 
INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'City'
AND TABLE_SCHEMA = 'world'\G 
  • 4.存儲引擎的設置

1)在啓動配置文件中設置服務器存儲引擎

#在配置文件的[mysqld]標籤下添加 [mysqld] default-storage-engine=<Storage Engine> 

2)使用 SET 命令爲當前客戶機會話設置

#在MySQL命令行中臨時設置 SET @@storage_engine=<Storage Engine> 

(3)在 CREATE TABLE 語句指定

#建表的時候指定存儲引擎
CREATE TABLE t (i INT) ENGINE = <Storage Engine>; 

 

 

三.真實企業案例

項目背景:

公司原有的架構:一個展現型的網站,LAMT,MySQL5.1.77版本(MYISAM),50M數據量。

小問題不斷:

  • 一、表級鎖:對錶中任意一行數據修改類操做時,整個表都會鎖定,對其餘行的操做都不能同時進行。
  • 二、不支持故障自動恢復(CSR):當斷電時有可能會出現數據損壞或丟失的問題。

如何解決:

  • 一、提建議將現有的MYISAM引擎替換爲Innodb,將版本替換爲5.6.38
    • 1)若是使用MYISAM會產生」小問題」,性能安全不能獲得保證,使用innodb能夠解決這個問題。
    • 2)5.1.77版本對於innodb引擎支持不夠完善,5.6.38版本對innodb支持很是完善了。
  • 二、實施過程和注意要素

1)備份生產庫數據(mysqldump)

[root@db01 ~]# mysqldump -uroot -p123 -A --triggers -R --master-data=2 >/tmp/full.sql 

2)準備一個5.6.38版本的新數據庫
3)對備份數據進行處理(將engine字段替換)

[root@db01 ~]# sed -i 's#ENGINE=MYISAM#ENGINE=INNODB#g' /tmp/full.sql 

4)將修改後的備份恢復到新庫
5)應用測試環境鏈接新庫,測試全部功能
6)停應用,將備份以後的生產庫發生的新變化,補償到新庫
7)應用割接到新數據庫

項目結果:

*解決了」小問題」 *

四.Innodb存儲引擎——表空間介紹

5.5版本之後出現共享表空間概念

表空間的管理模式的出現是爲了數據庫的存儲更容易擴展

5.6版本中默認的是獨立表空間

  • 一、共享表空間

1)查看共享表空間

#物理查看 [root@db01 ~]# ll /application/mysql/data/ -rw-rw---- 1 mysql mysql 79691776 Aug 14 16:23 ibdata1 #命令行查看 mysql> show variables like '%path%'; innodb_data_file_path =bdata1:12M:autoextend 

5.6版本中默認存儲:
1.系統數據
2.undo
3.臨時表

5.7版本中默認會將undo和臨時表獨立出來,5.6版本也能夠獨立,只不過須要在初始化的時候進行配置

2)設置方法

#編輯配置文件 [root@db01 ~]# vim /etc/my.cnf [mysqld] innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend 
  • 二、獨立表空間

對於用戶自主建立的表,會採用此種模式,每一個表由一個獨立的表空間進行管理

1)查看獨立表空間

#物理查看 [root@db01 ~]# ll /application/mysql/data/world/ -rw-rw---- 1 mysql mysql 688128 Aug 14 16:23 city.ibd #命令行查看 mysql> show variables like '%per_table%'; innodb_file_per_table=ON 

企業案例

在沒有備份數據的狀況下,忽然斷電致使表損壞,打不開數據庫。

1)拷貝庫目錄到新庫中

[root@db01 ~]# cp -r /application/mysql/data/world/ /data/3307/data/ 

2)啓動新數據庫

[root@db01 ~]# mysqld_safe --defaults-file=/data/3307/my.cnf & 

3)登錄數據庫查看

mysql> show databases;

4)查詢表中數據

mysql> select * from city; ERROR 1146 (42S02): Table 'world.city' doesn't exist 

5)找到之前的表結構在新庫中建立表

mysql> show create table world.city;
#刪掉外鍵建立語句 CREATE TABLE `city` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `Name` char(35) NOT NULL DEFAULT '', `CountryCode` char(3) NOT NULL DEFAULT '', `District` char(20) NOT NULL DEFAULT '', `Population` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`ID`), KEY `CountryCode` (`CountryCode`), KEY `idx_city` (`Population`,`CountryCode`), CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`Code`) ) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=latin1; 

6)刪除表空間文件

mysql> alter table city_new discard tablespaces;

7)拷貝舊錶空間文件

[root@db01 world]# cp /data/3307/data/world/city.ibd /data/3307/data/world/city_new.ibd 

8)受權

[root@db01 world]# chown -R mysql.mysql * 

9)導入表空間

mysql> alter table city_new import tablespace; 

五.Innodb核心特性——事務

  • 1.什麼是事務

主要針對DML語句(update,delete,insert)

一組數據操做執行步驟,這些步驟被視爲一個工做單元:
1)用於對多個語句進行分組
2)能夠在多個客戶機併發訪問同一個表中的數據時使用


全部步驟都成功或都失敗
1)若是全部步驟正常,則執行
2)若是步驟出現錯誤或不完整,則取消

  • 2.事務的通俗理解

伴隨着「交易」出現的數據庫概念。

咱們理解的「交易」是什麼?
1)物與物的交換(古代)
2)貨幣現金與實物的交換(現代1)
3)虛擬貨幣與實物的交換(現代2)
4)虛擬貨幣與虛擬實物交換(現代3)


數據庫中的「交易」是什麼?
1)事務又是如何保證「交易」的「和諧」?
2)ACID

  • 3.事務ACID特性

Atomic(原子性)
全部語句做爲一個單元所有成功執行或所有取消。

Consistent(一致性)
若是數據庫在事務開始時處於一致狀態,則在執行該。
事務期間將保留一致狀態。

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

Durable(持久性)
事務成功完成後,所作的全部更改都會準確地記錄在
數據庫中。所作的更改不會丟失。


  • 4.事務流程舉例
  • 5.事務的控制語句

以下:
START TRANSACTION(或 BEGIN):顯式開始一個新事務
SAVEPOINT:分配事務過程當中的一個位置,以供未來引用
COMMIT:永久記錄當前事務所作的更改
ROLLBACK:取消當前事務所作的更改
ROLLBACK TO SAVEPOINT:取消在 savepoint 以後執行的更改
RELEASE SAVEPOINT:刪除 savepoint 標識符
SET AUTOCOMMIT:爲當前鏈接禁用或啓用默認 autocommit 模式

一個成功事務的生命週期
begin;
sql1
sql2
sql3
...
commit;

一個失敗事務的生命週期
begin;
sql1
sql2
sql3
...
rollback;

  • 3.自動提交
#查看自動提交 mysql> show variables like 'autocommit'; #臨時關閉 mysql> set autocommit=0; #永久關閉 [root@db01 world]# vim /etc/my.cnf [mysqld] autocommit=0 
  • 4.事務演示

1)成功事務

mysql> create table stu(id int,name varchar(10),sex enum('f','m'),money int); mysql> begin; mysql> insert into stu(id,name,sex,money) values(1,'zhang3','m',100), (2,'zhang4','m',110); mysql> commit; 

2)事務回滾

mysql> begin;
mysql> update stu set name='zhang3'; mysql> delete from stu; mysql> rollback; 
  • 6.事務隱式提交狀況

1)如今版本在開啓事務時,不須要手工begin,只要你輸入的是DML語句,就會自動開啓事務。
2)有些狀況下事務會被隱式提交

例如:
在事務運行期間,手工執行begin的時候會自動提交上個事務
在事務運行期間,加入DDL、DCL操做會自動提交上個事務
在事務運行期間,執行鎖定語句(lock tables、unlock tables)
load data infile
select for update
在autocommit=1的時候

  • 7.事務日誌redo基本功能

1)Redo是什麼?

redo,顧名思義「重作日誌」,是事務日誌的一種。

2)做用是什麼?

在事務ACID過程當中,實現的是「D」持久化的做用。

特性:WAL(Write Ahead Log)日誌優先寫
REDO:記錄的是,內存數據頁的變化過程

3)REDO工做過程

#執行步驟
update t1 set num=2 where num=1; 

1)首先將t1表中num=1的行所在數據頁加載到內存中buffer page
2)MySQL實例在內存中將num=1的數據頁改爲num=2
3)num=1變成num=2的變化過程會記錄到,redo內存區域,也就是redo buffer page中

#提交事務執行步驟
commit; 

1)當敲下commit命令的瞬間,MySQL會將redo buffer page寫入磁盤區域redo log
2)當寫入成功以後,commit返回ok

  • 8.redo數據實例恢復過程

圖解

  • 9.事務日誌undo

1)undo是什麼?

undo,顧名思義「回滾日誌」,是事務日誌的一種。

_2)做用是什麼?

在事務ACID過程當中,實現的是「A」原子性的做用。固然CI的特性也和undo有關

  • 10.redo和undo的存儲位置
#redo位置 [root@db01 data]# ll /application/mysql/data/ -rw-rw---- 1 mysql mysql 50331648 Aug 15 06:34 ib_logfile0 -rw-rw---- 1 mysql mysql 50331648 Mar 6 2017 ib_logfile1 #undo位置 [root@db01 data]# ll /application/mysql/data/ -rw-rw---- 1 mysql mysql 79691776 Aug 15 06:34 ibdata1 -rw-rw---- 1 mysql mysql 79691776 Aug 15 06:34 ibdata2 

在MySQL5.6版本中undo是在ibdata文件中,在MySQL5.7版本會獨立出來。

  • 11.事務中的鎖

1)什麼是「鎖」?

「鎖」顧名思義就是鎖定的意思。

2)「鎖」的做用是什麼?

在事務ACID特性過程當中,「鎖」和「隔離級別」一塊兒來實現「I」隔離性的做用。

排他鎖:保證在多事務操做時,數據的一致性。
共享鎖:保證在多事務工做期間,數據查詢時不會被阻塞。

  • 12.多版本併發控制(MVCC)

1)只阻塞修改類操做,不阻塞查詢類操做
2)樂觀鎖的機制(誰先提交誰爲準)

  • 13.鎖的粒度
    MyIsam:低併發鎖(表級鎖)
    Innodb:高併發鎖(行級鎖)
  • 14.事務的隔離級別

四種隔離級別:

READ UNCOMMITTED(獨立提交)
容許事務查看其餘事務所進行的未提交更改

READ COMMITTED
容許事務查看其餘事務所進行的已提交更改

REPEATABLE READ******
確保每一個事務的 SELECT 輸出一致
InnoDB 的默認級別

SERIALIZABLE
將一個事務的結果與其餘事務徹底隔離

#查看隔離級別 mysql> show variables like '%iso%'; #修改隔離級別爲RU [mysqld] transaction_isolation=read-uncommit mysql> use oldboy mysql> select * from stu; mysql> insert into stu(id,name,sex,money) values(2,'li4','f',123); #修改隔離級別爲RC [mysqld] transaction_isolation=read-commit
相關文章
相關標籤/搜索