1. 程式人生 > >資料庫儲存引擎的資料檔案

資料庫儲存引擎的資料檔案

檢視mysql的所有儲存引擎:

mysql> show engines;

檢視某個表用了什麼引擎:

mysql> show create table 表名;

建立一個表並指定儲存引擎:

mysql> create table 庫名.表名 engine=innodb;

更改已有表的引擎:

mysql> alter table 庫名.表名 engine=innodb;

資料檔案:每個儲存引擎都有各自的資料檔案,可以使用mysql> show engines;檢視所有儲存引擎。
這裡寫圖片描述

首先不管什麼引擎,每個表都會有一個.frm格式的資料檔案,檔案中包括表結構的定義資訊。

  1. InnoDB支援事務,MyISAM不支援。InnoDB的AUTOCOMMIT預設是開啟的
    這裡寫圖片描述
    即每條SQL語句匯預設被封裝成一個事務,自動提交,這樣會影響速度,所以最好把多條SQL語句顯示放在begin和commit之間,組成一個事務去提交。
    這裡寫圖片描述

2.InnoDB支援資料行鎖定,MyISAM支援整個表鎖定。就是MyISAM在同一個表上的讀鎖和寫鎖是互斥的,MyISAM併發讀寫時如果等待佇列中既有讀請求又有寫請求,預設寫請求的優先級別高,即使讀請求先到,也是寫請求優先。所以MyISAM不適用大量查詢和修改並存的情況,那樣查詢程序會長時間阻塞。因為MyISAM是鎖表
3.InnoDB支援外來鍵,MyISAM不支援
4.InnoDB不支援全文索引,而MyISAM支援

InnoDB儲存引擎的資料檔案方式:

.ibd檔案:獨享表空間儲存方式,就是每個表都會有一個.ibd檔案來儲存資料。
.ibdata檔案:共享表空間儲存方式,所有表共同使用一個(或多個,可自行配置).ibdata檔案

.ibdata檔案可以通過innodb_data_home_dir和innodb_data_file_path兩個引數共同配置組成。
這裡寫圖片描述
innodb_data_file_path:設定共享儲存檔案的數量、大小和是否擴容
innodb_data_home_dir:只能在my.cnf配置檔案中設定共享儲存檔案路徑

設定innodb的儲存方式:
這裡寫圖片描述
當 value值為ON的時候,表示使用獨享表空間儲存方式
當 value值為OFF的時候,反之表示使用共享表空間儲存方式

共享表空間
優點:可以把表空間分成多個檔案存放到各個磁碟上,資料檔案放在一起方便管理
缺點:這樣對於一個表做了大量刪除操作後表空間中將會有大量的空隙,特別是對於統計分析,日誌系統這類應用最不適合用共享表空間

獨立表空間
有自己的獨立表空間,每個表的資料和索引都會存在自己的表空間中,可以實現單表在不同的資料空中移動,空間可以回收

#
       錯誤排查
#########################

當我們修改my.cnf為以下資訊時,發現mysql重啟失敗
這裡寫圖片描述
引數:
innodb_data_home_dir:資料庫檔案路徑
innodb_log_group_home_dir:日誌存放位置
innodb_data_file_path:設定共享表空間儲存大小、數量和自動擴容
innodb_file_per_table=0:設定為共享表空間
這裡寫圖片描述

說明ibdata1當前設定大小為6400pages,太大了。不能超過768pages。
通過換算修改ibdata1的大小:64pages=1M,1pages=16KB。所以ibdata1的大小改為12M。

MyISAM儲存引擎的資料檔案方式:
.MYD檔案:存放MyISAM表的資料 ,每個表都會有一個.MYD檔案(便於牢記,MYD的D是data的意思,所以存放表的資料)
.MYI檔案:存放MyISAM表的索引相關資訊,表中的cache的內容主要來源於這個檔案中。同樣每個表也都會有一個.MYI檔案。(便於牢記,.MYI的I是Index的意思,所以此檔案存放表的索引資訊)

向表中插入若干行資料:
這裡應用到函式的概念,意思大致和shell指令碼差不多

mysql> create database testdb;         ======>建立一個數據庫
mysql> use testdb;                     ======>使用這個資料庫
mysql> creat table tb1 (id int,name varchar(10));     ===>在testdb資料庫中新增tb1的表
mysql> delimiter $$                    =======>定義一個結束符號
mysql> drop procedure if exists test   ===>假如存在test這個定義就刪除
->create procedure test()              =======>建立一個test的定義
->begin                                =======>開始
->declare i int      ===>宣告一個值為什麼型別(這裡宣告一個i,型別為int)
->set i=1                              ======>設定i=1
 ->while i < 10000 do                  ======>如果i<10000就一直迴圈
->insert into testdb.tb1(id) values (i)      ===>向testdb.tb1中的id列插入i這個值
->set i =i+1                           ======>設定每次i的值+1
->end while                            ======>當滿足條件結束迴圈
->end $$                    ======>結束語句(與之前delimiter $$設定有關)

執行test定義:

mysql> call test()$$

查看錶空間的佔用情況:
mysql> show table status like ‘tb1’\G;

Replication相關檔案:
1)master.info 檔案:
master.info 檔案存在於Slave 端的資料目錄下,裡面存放了該Slave 的Master 端的相關資訊,包括Master 的主機地址,連線使用者,連線密碼,連線埠,當前日誌位置,已經讀取到的日誌位置等資訊。

2)relay log 和relay log index
mysql-relay-bin.xxxxxn 檔案用於存放Slave 端的I/O 執行緒從Master 端所讀取到的Binary Log 資訊,然後由Slave 端的SQL 執行緒從該relay log 中讀取並解析相應的日誌資訊,轉化成Master 所執行的SQL 語句,然後在Slave 端應用。
mysql-relay-bin.index 檔案的功能類似於mysql-bin.index ,同樣是記錄日誌的存放位置的絕對路徑,只不過他所記錄的不是Binary Log,而是Relay Log。
3)relay-log.info 檔案:
類似於master.info,它存放通過Slave 的I/O 執行緒寫入到本地的relay log 的相關信
息。供Slave 端的SQL 執行緒以及某些管理操作隨時能夠獲取當前複製的相關資訊。

其他檔案:
1)system config file
MySQL 的系統配置檔案一般都是my.cnf,預設存放在”/etc”目錄下,my.cnf檔案中包含多種引數選項組(group),每一種引數組都通過中括號給定了固定的組名,如“[mysqld]”組中包括了mysqld服務啟動時候的初始化引數,“[client]”組中包含著客戶端工具程式可以讀取的引數。
2)pid file
pid file 是mysqld 應用程式在Unix/Linux 環境下的一個程序檔案,和許多其他
Unix/Linux 服務端程式一樣,存放著自己的程序id。
3)socket file
socket 檔案也是在Unix/Linux 環境下才有的,使用者在Unix/Linux 環境下客戶端連線可以不通過TCP/IP 網路而直接使用Unix Socket 來連線MySQL。
mysql有兩種連線方式,常用的一般是tcp
mysql –h mysql主機ip -uroot -pxxx
mysql -S /path /mysql.sock
這裡寫圖片描述
注:採用unix socket連線方式,比用tcp的方式更快,但只適用於mysql和應用同在一臺PC上。

mysql的連線方式:
1.TCP/IP連線:預設連線方式
2.unix socket連線:比TCP/IP方式快,但只適用於mysql使用者和mysql應用在同一臺PC上的使用者

MySQL自帶工具使用介紹
MySQL在儲存資料的同時,還提供了大量的客戶端工具程式,如mysql,mysqladmin,mysqldump等
1.mysql [OPTIONS] [database]
例如:mysql -e
這裡寫圖片描述
可以不進入mysql使用mysql命令