ext2 ext3 ext4 xfs 數據mysql
無論使用什麼文件系統,數據內容不會變化sql
不一樣的是,存儲空間、大小、速度數據庫
能夠將MySQL引擎理解爲:MySQL的「文件系統」,只不過功能更增強大。api
除了能夠提供基本的存取功能,還有更多功能事務功能、鎖定、備份和恢復、優化以及特殊功能。緩存
MySQL 提供如下存儲引擎:安全
– InnoDB
– MyISAM
– MEMORY
– ARCHIVE
– FEDERATED
– EXAMPLE
– BLACKHOLE
– MERGE
– NDBCLUSTER
– CSV
注:只有innodb與myisam最經常使用服務器
在MySQL5.5版本以後,默認的存儲引擎,提供高可靠性和高性能。微信
SELECT @@default_storage_engine; show variables like '%engine%';
SHOW CREATE TABLE City\G SHOW TABLE STATUS LIKE 'CountryLanguage'\G
SELECT TABLE_NAME, ENGINE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'City' AND TABLE_SCHEMA = 'world'\G
基本不須要修改設置存儲引擎併發
[mysqld] default-storage-engine=<Storage Engine>
SET @@storage_engine=<Storage Engine>;
CREATE TABLE t (i INT) ENGINE = <Storage Engine>;
假如5.1全部生產表都是myisam的oracle
使用mysqldump備份後,必定要替換備份的文件中的engine字段從myisam到innodb
不然遷移就沒有意義
物理存儲結構(表空間):
默認狀況下,InnoDB 元數據、撤消日誌和緩衝區存儲在系統「表空間」中
表空間:MySQL數據庫存儲的方式
表空間中包含數據文件
MySQL表空間和數據文件是1:1的關係
共享表空間除外,是能夠1:N關係
一、共享表空間:ibdata1~ibdataN,通常是2-3個
二、獨立表空間:存放在指定庫目錄下
例如data/world/目錄下的city.ibd 表空間位置(datadir):data/目錄下
共享表空間的物理存儲結構(ibdata1~N),也一般被叫作系統表空間,是數據庫初始化生成的。
一、系統元數據,基表數據,除了表內容數據以外的數據
二、undo日誌(回滾日誌)數據
三、tmp表空間(通常不多關注)
ib_logfile0~N(redo日誌)
存放的是innodb表的重作日誌。
註釋:
undo日誌默認是在ibdata中的,在5.6之後是能夠單獨定義的。
tmp表空間在5.7版本之後也被移出了ibdata1,ibtmp1
在5.5版本之前,全部的應用數據也都默認存放到了ibdata中
除了系統表空間以外,InnoDB 還在數據庫目錄中建立另外的表空間,用於每一個 InnoDB 表的 .ibd 文件。
InnoDB 建立的每一個新表在數據庫目錄中設置一個 .ibd 文件來搭配表的 .frm 文件。
在5.6之後,默認的狀況下,會單表單獨存儲到獨立表空間文件中。
獨立表空間設置:
show variables like '%per_table%';
在參數文件/etc/my.cnf能夠控制獨立表空間功能是否開啓,5.6默認開啓的。
innodb_file_per_table=1 ---->開啓獨立表空間,單表單存儲 innodb_file_per_table=0 ---->關閉獨立表空間,全部數據存放到ibdata中
經過添加數據文件增長表空間大小。
在 my.cnf 文件中使用 innodb_data_file_path 選項
[mysqld]
innodb_data_file_path=datafile_spec1[;datafile_spec2]
配置示例:建立一個表空間,其中包含一個名爲 ibdata1 且大小爲 12 MB (固定)的數據文件和一個名爲 ibdata2 且大小爲 100 MB(自動擴展)的數據文件:
通常是在初始搭建環境的時候就定義好,通常2-3個共享表空間文件
預設值1G,最後一個文件自動擴展
vi /etc/my.cnf
innodb_data_file_path=ibdata1:12M;ibdata2:100M:autoextend
默認狀況下將文件放置在 data 目錄中。
若是須要,顯式指定文件位置。
事務生命週期圖
全部語句做爲一個單元所有成功執行或所有取消。
例如:
update t1 set money=10000-17 where id=我的微信號 update t1 set money=1000000+17 where id=二連長的微信號 以上語句都成功了,才能把產品給你
若是數據庫在事務開始時處於一致狀態,則在執行該事務期間將保留一致狀態。
例如:
update t1 set money=10000-17 where id=我的微信號 update t1 set money=1000000+17 where id=二連長的微信號 在以上操做過程沒有徹底成功狀況下,你去查本身的帳戶,應該仍是10000塊
事務之間不相互影響。
例如:
update t1 set money=10000-17 where id=我的微信號 update t1 set money=1000000+17 where id=二連長的微信號 1、在作以上操做的時候,其餘人是不能對這兩個帳戶作任何的取款,存款操做 2、在不一樣的隔離條件下,可能一致性保證又不同。
隔離級別會影響到一致性。
read-uncommit 作了操做就顯示結果了
read-commit 可能會用的一種級別,
repeatable-read 默認級別,和oracle同樣,
serializable 嚴格模式,通常不用
事務成功完成後,所作的全部更改都會準確地記錄在
數據庫中。所作的更改不會丟失。
主要:
begin 事務開始的標記
commit 事務成功提交的標記
rollback 事務回滾的標記
autocommit 設置,控制是否每條DML語句自動提交,生產中要關掉 autocommit=0;也就是設置爲手工提交事務的模式;
設置爲1,開啓自動提交的優勢:數據安全性好,每次修改都會落地。
缺點:
一、不能進行銀行類的交易事務
二、產生大量的小IO
咱們能夠經過如下命令進行修改關閉(0是關閉,1是開啓)
SET GLOBAL AUTOCOMMIT=0; --- 全部新建會話 SET SESSION AUTOCOMMIT=0; --- 當前會話 SELECT @@AUTOCOMMIT; --- 查看設置結果
咱們也能夠修改配置文件讓其永久生效
vi /etc/my.cnf [mysqld] autocommit=0
redo,顧名思義「重作日誌」,是事務日誌的一種。
做用:在事務ACID過程當中,實現的是「D」持久化的做用。
先將數據提取到內存中進行操做,在修改完成後,redo記錄數據變化的過程,就算事務的完成,而後就算是斷電事務沒來的及寫入磁盤,下次開啓數據庫redo也會先執行修改數據。
innodb_flush_log_at_trx_commit ---- 此參數控制着事務提交的時候刷新redo日誌
mysql> show variables like '%commit%'; +--------------------------------+-------+ | Variable_name | Value | +--------------------------------+-------+ | autocommit | ON | | binlog_order_commits | ON | | innodb_api_bk_commit_interval | 5 | | innodb_commit_concurrency | 0 | | innodb_flush_log_at_trx_commit | 1 | +--------------------------------+-------+ 5 rows in set (0.00 sec)
undo,顧名思義「回滾日誌」,是事務日誌的一種。
做用:在事務ACID過程當中,實現的是「A、C」原子性和一致性的做用。
在將數據提取到內存打算修改數據的時候,undo會將數據沒改的時候作一個快照,而後若是有一方失敗,事務就會返回致原樣。
在事務ACID過程當中,「鎖」和「隔離級別」一塊兒來實現「I」隔離性的做用。
四種隔離級別:建議使用REPEATABLE READ
READ UNCOMMITTED 容許事務查看其餘事務所進行的未提交更改
READ COMMITTED 容許事務查看其餘事務所進行的已提交更改
REPEATABLE READ 確保每一個事務的 SELECT 輸出一致(InnoDB 的默認級別)
SERIALIZABLE 將一個事務的結果與其餘事務徹底隔離