Mysql--存儲引擎

1、存儲引擎簡介

image

1.文件系統:mysql

1.1 操做系統組織和存取數據的一種機制。
1.2 文件系統是一種軟件。sql

2.文件系統類型:ext2 3 4 ,xfs 數據數據庫

2.1 無論使用什麼文件系統,數據內容不會變化
2.2 不一樣的是,存儲空間、大小、速度。vim

3.MySQL引擎:緩存

能夠理解爲,MySQL的「文件系統」,只不過功能更增強大。 安全

4.MySQL引擎功能:服務器

除了能夠提供基本的存取功能,還有更多功能事務功能、鎖定、備份和恢復、優化以及特殊功能架構

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

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

MySQL 提供如下存儲引擎:app

①InnoDB
②MyISAM
③MEMORY
④ARCHIVE
⑤FEDERATED
⑥EXAMPLE
⑦BLACKHOLE
⑧MERGE
⑨NDBCLUSTER
⑩CSV

還可使用第三方存儲引擎:

①MySQL當中插件式的存儲引擎類型
②MySQL的兩個分支
③perconaDB
④mariaDB

#查看當前MySQL支持的存儲引擎類型
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

#查看innodb的表有哪些
mysql> select table_schema,table_name,engine from information_schema.tables where engine='innodb';
+--------------+----------------------+--------+
| table_schema | table_name           | engine |
+--------------+----------------------+--------+
| mysql        | innodb_index_stats   | InnoDB |
| mysql        | innodb_table_stats   | InnoDB |
| mysql        | slave_master_info    | InnoDB |
| mysql        | slave_relay_log_info | InnoDB |
| mysql        | slave_worker_info    | InnoDB |
+--------------+----------------------+--------+
20 rows in set (0.03 sec)

#查看myisam的表有哪些
mysql> select table_schema,table_name,engine from information_schema.tables where engine='myisam';
+--------------------+---------------------------+--------+
| table_schema       | table_name                | engine |
+--------------------+---------------------------+--------+
| information_schema | COLUMNS                   | MyISAM |
| information_schema | EVENTS                    | MyISAM |
| mysql              | help_category             | MyISAM |
| mysql              | ndb_binlog_index          | MyISAM |
+--------------------+---------------------------+--------+
33 rows in set (0.01 sec)

一、innodb和myisam的區別

物理上的區別:

#進入mysql目錄
[root@db01~l]# cd /application/mysql/data/mysql
#myisam
[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/
#innodb
[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版本以後,默認的存儲引擎,提供高可靠性和高性能。

優勢:

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

image

innodb核心特性

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

3.查看存儲引擎

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

#查詢默認存儲引擎
mysql> SELECT @@default_storage_engine;
+--------------------------+
| @@default_storage_engine |
+--------------------------+
| InnoDB                   |
+--------------------------+
1 row in set (0.00 sec)

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

#查看錶的存儲引擎
mysql> show create table city\G
*************************** 1. row ***************************
...
) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

mysql> show table status like 'city'\G
*************************** 1. row ***************************
           Name: city
         Engine: InnoDB
...

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

#查看錶的存儲引擎
mysql> select table_name,engine from information_schema.tables where table_name='city' and table_schema='world'\G
*************************** 1. row ***************************
table_name: city
    engine: InnoDB
1 row in set (0.00 sec)

4.存儲引擎的設置

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

#在配置文件的[mysqld]標籤下添加/etc/my.cnf
[mysqld]
default-storage-engine=innodb

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

#在MySQL命令行中臨時設置
mysql>  SET @@storage_engine=myisam;
Query OK, 0 rows affected, 1 warning (0.00 sec)
#查看
mysql> select @@default_storage_engine;
+--------------------------+
| @@default_storage_engine |
+--------------------------+
| MyISAM                   |
+--------------------------+
1 row in set (0.00 sec)

(3)在 CREATE TABLE 語句指定

#建表的時候指定存儲引擎
 create table t (i INT) engine = <Storage Engine>;
#如:建test1表,指定存儲引擎爲myisam
mysql> create table test1(id int) engine=myisam;
Query OK, 0 rows affected (0.02 sec)

三.真實企業案例

項目背景:

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

小問題不斷:

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

如何解決:

一、提建議將現有的MYISAM引擎替換爲Innodb,將版本替換爲5.6.38**

  • 若是使用MYISAM會產生」小問題」,性能安全不能獲得保證,使用innodb能夠解決這個問題。
  • 5.1.77版本對於innodb引擎支持不夠完善,5.6.38版本對innodb支持很是完善了。

二、實施過程和注意要素

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

[root@db01 test]# mysql -uroot -p1
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| student4       |
| tlbb2          |
+----------------+
2 rows in set (0.00 sec)
#測試環境(先簡單創幾個存儲引擎爲myisam)
mysql> create table test1(id int) engine=myisam;
Query OK, 0 rows affected (0.02 sec)

mysql> create table test2(id int) engine=myisam;;
Query OK, 0 rows affected (0.00 sec)

mysql> create table test3(id int) engine=myisam;;
Query OK, 0 rows affected (0.01 sec)

2)準備一個5.6.44版本的新數據庫

#先導庫,準備一個環境
[root@db01 test]# mysqldump -uroot -p1 -B test >/tmp/full.sql

3)對備份數據進行處理(將engine字段替換)

#方法一
[root@db01 ~]# sed -i 's#ENGINE=MyISAM#ENGINE=InnoDB#g' /tmp/full.sql
#方法二
[root@db01 ~]# vim  /tmp/full.sql 
:%s#MyISAM#InnoDB#g

4)將修改後的備份恢復到新庫

#方法一
[root@db01 test]# mysql -uroot -p123 -h 10.0.0.52 < /tmp/full.sql

5)應用測試環境鏈接新庫,測試全部功能

#鏈接
[root@db02 ~]# mysql -uroot -p123
#查看存儲引擎
mysql> select @@default_storage_engine;
+--------------------------+
| @@default_storage_engine |
+--------------------------+
| InnoDB                   |
+--------------------------+
1 row in set (0.00 sec)

6)停應用,將備份以後的生產庫發生的新變化,補償到新庫
7)應用割接到新數據庫

項目結果:

*解決了」小問題」 *

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

image

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%';
+-----------------------+------------------------------------+
| Variable_name         | Value                              |
+-----------------------+------------------------------------+
| innodb_data_file_path | ibdata1:76M;ibdata2:50M:autoextend |
| ssl_capath            |                                    |
| ssl_crlpath           |                                    |
+-----------------------+------------------------------------+
3 rows in set (0.00 sec)


#查看大小
[root@db01 data]# du -sh ibdata1 
76M ibdata1

5.6版本中默認存儲:
①系統數據
②undo
③臨時表

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

2)設置方法

#編輯配置文件
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend

二、獨立表空間

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

查看獨立表空間

#物理查看
[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%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.01 sec)

企業案例

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

1)拷貝庫目錄到新庫中(先準備一個和原表結構同樣的環境)

[root@db01 data]# tar zcf world1.tgz world/
#傳到測試環境
[root@db01 data]# scp world1.tgz  172.16.1.52:/application/mysql/data/
#解壓
[root@db02 data]# tar xf world1.tgz

2)啓動新數據庫

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

3)登錄數據庫查看r

#查看
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| world              |
+--------------------+
5 rows in set (0.00 sec)

4)查詢表中數據

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

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

mysql> show create table world.city;
#刪掉外鍵建立語句
 CREATE TABLE `city1` (
  `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`)
  #CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`Code`)
) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=latin1;

6)刪除表空間文件

#刪除表空間文件
mysql> alter table city1 discard tablespace;
#在表的物理結構查看
[root@db02 world]# ll
total 1000
-rw-rw---- 1 mysql mysql   8710 Nov  4 10:26 city1.frm
-rw-rw---- 1 mysql mysql   8710 Nov  4 10:26 city.frm
-rw-rw---- 1 mysql mysql 589824 Nov  4 10:26 city.ibd

7)拷貝舊錶空間文件

[root@db02 world1]# cp city.ibd  city1.ibd

8)受權

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

9)導入表空間

#查看,會報錯
mysql> select * from city1;
#導入表空間
mysql> alter table city_new import tablespace;
#再次查看
mysql> select * from city1;

改表名

#改表名
mysql> alter table city1 rename city;
#再次查看
mysql> show tables;
+------------------+
| Tables_in_world1 |
+------------------+
| city             |
| country          |
| countrylanguage  |
+------------------+
3 rows in set (0.00 sec)

image

相關文章
相關標籤/搜索