information_schema庫中的表,保存的是Mysql的元數據。
官網元數據表介紹
InnoDB相關的表介紹
庫中有表:html
+---------------------------------------+ | Tables_in_information_schema | +---------------------------------------+ | CHARACTER_SETS | | COLLATIONS | | COLLATION_CHARACTER_SET_APPLICABILITY | | COLUMNS | | COLUMN_PRIVILEGES | | ENGINES | | EVENTS | | FILES | | GLOBAL_STATUS | | GLOBAL_VARIABLES | | KEY_COLUMN_USAGE | | PARAMETERS | | PARTITIONS | | PLUGINS | | PROCESSLIST | | PROFILING | | REFERENTIAL_CONSTRAINTS | | ROUTINES | | SCHEMATA | | SCHEMA_PRIVILEGES | | SESSION_STATUS | | SESSION_VARIABLES | | STATISTICS | | TABLES | | TABLESPACES | | TABLE_CONSTRAINTS | | TABLE_PRIVILEGES | | TRIGGERS | | USER_PRIVILEGES | | VIEWS | | INNODB_CMP_RESET | | INNODB_TRX | | INNODB_CMPMEM_RESET | | INNODB_LOCK_WAITS | | INNODB_CMPMEM | | INNODB_CMP | | INNODB_LOCKS | +---------------------------------------+
保存全部Mysql可用的字符集。至關於命令:SHOW CHARACTER SET
python
提供了關於各字符集的對照信息mysql
這個表保存的是全部數據庫的列信息sql
TABLE_CATALOG
TABLE_SCHEMA 庫名
TABLE_NAME 表名
COLUMN_NAME 列名
ORDINAL_POSITION 應該是該列在該表中的順序
COLUMN_DEFAULT 列的默認值
IS_NULLABLE 是否能夠爲NULL
DATA_TYPE 數據類型
CHARACTER_MAXIMUM_LENGTH 數據的長度
CHARACTER_OCTET_LENGTH 數據的存儲長度
NUMERIC_PRECISION
NUMERIC_SCALE
CHARACTER_SET_NAME 列的字符編碼
COLLATION_NAME
COLUMN_TYPE 列的類型,例如varchar(20)
COLUMN_KEY 若是等於PRI,表示是主鍵
EXTRA 定義列的時候的其餘信息,例如自增,主鍵
PRIVILEGES 操做權限有:select,insert,update,references ( 官方說明 )
COLUMN_COMMENT 列的備註數據庫
例子:緩存
***************************[ 1. row ]*************************** TABLE_CATALOG | def TABLE_SCHEMA | test TABLE_NAME | sleep_account COLUMN_NAME | key ORDINAL_POSITION | 1 COLUMN_DEFAULT | None IS_NULLABLE | NO DATA_TYPE | int CHARACTER_MAXIMUM_LENGTH | None CHARACTER_OCTET_LENGTH | None NUMERIC_PRECISION | 10 NUMERIC_SCALE | 0 CHARACTER_SET_NAME | None COLLATION_NAME | None COLUMN_TYPE | int(11) COLUMN_KEY | PRI EXTRA | auto_increment PRIVILEGES | select,insert,update,references COLUMN_COMMENT |
列的特權信息,應該和COLUMN表的PRIVILEGES的功能差很少的。服務器
存儲Mysql支持的數據庫引擎類型,至關於命令SHOW ENGINES
ENGINE 引擎名
SUPPORT 是否支持,Yes,No,Default(默認)
COMMENT 引擎的說明
TRANSACTIONS 是否支持事務
XA
SAVEPOINTSsession
***************************[ 1. row ]*************************** ENGINE | InnoDB SUPPORT | DEFAULT COMMENT | Supports transactions, row-level locking, and foreign keys TRANSACTIONS | YES XA | YES SAVEPOINTS | YES
保存計劃事件(scheduled events)的信息,至關於命令 show events
app
保存數據庫文件的存儲信息,當使用Mysql集羣的時候有用,也就是NDB。python2.7
保存Mysql 的全局狀態。全局是相對於Session而言的,Session是指單個Mysql鏈接,全局能夠理解爲自從Mysql啓動以來,全部的鏈接,產生的狀態。
保存Mysql的全局參數。
狀態(status)是隨着Mysql的運行,會變化的,
參數(variable)只有主動修改,纔會變化的。
可使用show status 語法查看
保存全部約束(CONSTRAINT)
CONSTRAINT_CATALOG
CONSTRAINT_SCHEMA 約束的數據庫
CONSTRAINT_NAME 約束名
TABLE_CATALOG
TABLE_SCHEMA 約束屬於哪一個數據庫
TABLE_NAME 約束屬於哪一個數據表
COLUMN_NAME 約束的列名
ORDINAL_POSITION 排序權重
POSITION_IN_UNIQUE_CONSTRAINT
REFERENCED_TABLE_SCHEMA
REFERENCED_TABLE_NAME
REFERENCED_COLUMN_NAME
例如:
test庫的account表中,主鍵是key,就會有下面一行記錄
CONSTRAINT_CATALOG | def CONSTRAINT_SCHEMA | test CONSTRAINT_NAME | PRIMARY TABLE_CATALOG | def TABLE_SCHEMA | test TABLE_NAME | account COLUMN_NAME | key ORDINAL_POSITION | 1 POSITION_IN_UNIQUE_CONSTRAINT | None REFERENCED_TABLE_SCHEMA | None REFERENCED_TABLE_NAME | None REFERENCED_COLUMN_NAME | None
保存了全部已定義的PARAMETERS 信息
保存全部分區表信息
保存全部Mysql已裝載的插件信息
保存Mysql的鏈接信息,一行記錄表明一個數據庫鏈接,表明一個Mysql服務線程。至關於SHOW PROCESSLIST
查看該表會帶來必定的性能影響,由於須要一個鎖,查看Threads表卻不會。
並且查看Threads表會顯示後臺線程,PROCESSLIST缺不會顯示。
這裏的線程可使用KILL語法來殺掉
ID 鏈接ID,根據這個ID來執行KILL命令
USER 鏈接的用戶名
HOST 鏈接的客戶端的IP,格式是IP:PORT。若是想查看一個鏈接對應的是哪一個客戶端進程,就能夠這樣:假如HOST='192.168.1.1:23501',去到192.168.1.1這臺機,經過命令netstat -apn|grep 23501
,看到這樣的結果:
192.168.1.1:23501 192.168.1.10:3306 ESTABLISHED 14599/python2.7
就能夠知道這個Mysql的鏈接的客戶端是14599/python2.7
這個進程
DB 鏈接的數據庫
COMMAND 線程在執行的命令,全部命令。經常使用的命令有:SLeep(等待客戶端發送SQL),Query(正在執行一個SQL)
TIME 單位是秒,表示這個鏈接處於如今這個命令多久了
STATE 線程執行的命令的細節描述,常見的描述。通常這個狀態持續的時間是很短的,若是持續了好久,就代表有問題了。常見的描述:Updating(正在更新數據),executing(正在執行),Sending data(發送數據給客戶端)。這裏的描述和show profile for query 1;
裏的執行步驟是對應的
INFO 正在執行的SQL語句,若是沒有執行SQL,爲空。
例子:
ID | 51 USER | root HOST | localhost:59487 DB | information_schema COMMAND | Query TIME | 0 STATE | executing INFO | select * from PROCESSLIST limit 1
保存性能分析的數據,至關於 SHOW PROFILES
。只有當session的profiling 參數設置爲1,這個表纔有數據。
保存外鍵的數據。
保存routines 信息,包括procedures 和 functions,可是不包含用戶定於的functions。
保存數據庫的信息,一行記錄是一個數據庫(database),相似命令show databases;
保存數據庫的權限信息。
GRANTEE 權限擁有者,格式是'user_name'@'host_name'
,例如root'@'192.168.137.1
TABLE_CATALOG
TABLE_SCHEMA 權限對應的數據庫
PRIVILEGE_TYPE 權限類型
IS_GRANTABLE 是否能夠分配權限給其餘擁有者,通常爲NO
GRANTEE: 'root'@'192.168.137.1' TABLE_CATALOG: def TABLE_SCHEMA: ggy_wrd PRIVILEGE_TYPE: SELECT IS_GRANTABLE: NO
這個表示擁有者'root'@'192.168.137.1'
有權限對數據庫ggy_wrd執行SELECT的操做
保存SESSION的狀態,相似於GLOBAL_STATUS
保存SESSION的變量,相似於GLOBAL_BARIABLES
保存索引信息。至關於show index from tbl_name
TABLE_CATALOG
TABLE_SCHEMA 數據庫名
TABLE_NAME 表名
NON_UNIQUE 是否惟一
INDEX_SCHEMA
INDEX_NAME
SEQ_IN_INDEX
COLUMN_NAME 列名
COLLATION
CARDINALITY
SUB_PART
PACKED
NULLABLE
INDEX_TYPE 索引類型,通常是BTREE
COMMENT
INDEX_COMMENT
例子:
TABLE_CATALOG: def TABLE_SCHEMA: db_kklauncher TABLE_NAME: sleep_local_account NON_UNIQUE: 0 INDEX_SCHEMA: db_kklauncher INDEX_NAME: PRIMARY SEQ_IN_INDEX: 1 COLUMN_NAME: key COLLATION: A CARDINALITY: 10673 SUB_PART: NULL PACKED: NULL NULLABLE: INDEX_TYPE: BTREE COMMENT: INDEX_COMMENT:
保存數據表信息。相似show tables。
TABLE_CATALOG
TABLE_SCHEMA
TABLE_NAME 表名
TABLE_TYPE 表的類型
ENGINE 表的存儲引擎
VERSION 表的版本
ROW_FORMAT
TABLE_ROWS 表的行數
AVG_ROW_LENGTH 平均一行的長度
DATA_LENGTH 數據長度
MAX_DATA_LENGTH 最大一行的數據長度
INDEX_LENGTH 索引的長度
DATA_FREE
AUTO_INCREMENT 自增到哪一個數
CREATE_TIME 建立時間
UPDATE_TIME 最後修改表結構的時間
CHECK_TIME
TABLE_COLLATION 表的編碼
CHECKSUM
CREATE_OPTIONS
TABLE_COMMENT
TABLE_CATALOG | def TABLE_SCHEMA | db_kklauncher TABLE_NAME | sleep_local_account TABLE_TYPE | BASE TABLE ENGINE | InnoDB VERSION | 10 ROW_FORMAT | Compact TABLE_ROWS | 10095 AVG_ROW_LENGTH | 365 DATA_LENGTH | 3686400 MAX_DATA_LENGTH | 0 INDEX_LENGTH | 327680 DATA_FREE | 415236096 AUTO_INCREMENT | 24342 CREATE_TIME | 2016-12-27 16:31:56 UPDATE_TIME | None CHECK_TIME | None TABLE_COLLATION | utf8_general_ci CHECKSUM | None CREATE_OPTIONS | TABLE_COMMENT |
保存數據表佔用的空間,若是表引擎是InnoDB,須要去查 INNODB_SYS_TABLESPACES 和INNODB_SYS_DATAFILES
保存表的約束信息。
保存表的權限信息。若是賦予擁有者一個表的權限,TABLE_PRIVILEGES表就會有數據。若是是賦予擁有者一個庫的權限,這裏就不會有數據,只會在SCHEMA_PRIVILEGES表裏面有數據。
這裏的數據和SCHEMA_PRIVILEGES的數據意義是同樣的,只不過多了TABLE_SCHEMA這列。
保存觸發器的信息
這裏會存儲用戶的權限。
保存視圖信息
保存被壓縮的InnoDB表的信息
保存InnoDB的事務信息(不會包含只讀的事務)。
官方介紹
trx_id 事務ID,惟一的,只讀事務沒有生成ID
trx_state 當前的狀態,取值:RUNNING(正在執行), LOCK WAIT(等待鎖), ROLLING BACK(回滾), and COMMITTING(提交中)
trx_started 事務啓動的時間
trx_requested_lock_id 若是狀態是LOCK WAIT,這裏顯示的是正在等待的鎖的ID,對應INNODB_LOCKS表的LOCK_ID列
trx_wait_started 若是狀態是LOCK WAIT,這裏顯示的是該事務等待鎖等待了多久
trx_weight 事務的權重,權重越低,Mysql越先執行一個事務,這個主要用於解決死鎖
trx_mysql_thread_id 事務對應的線程ID,和PROCESSLIST表的ID列對應
trx_query 事務正在執行的SQL
trx_operation_state 事務當前的操做狀態,若是沒有,顯示NULL
trx_tables_in_use 事務處理當前的SQL,也就是trx_query裏的SQL,須要打開多少個表
trx_tables_locked 事務處理當前的SQL須要上鎖多少個表的行鎖
trx_lock_structs 有多少個鎖會被該事務保留,也就是執行該事務須要鎖住多少條行記錄
trx_lock_memory_bytes 鎖須要耗用的內存
trx_rows_locked 事務處理當前的SQL須要上鎖多少個行鎖,這只是個近似值
trx_rows_modified 事務須要修改或新增多少行內容
trx_concurrency_tickets 該線程被調度前,須要執行多少工做
trx_isolation_level 事務的隔離級別
trx_unique_checks 是否打開惟一檢查(unique_checks)
trx_foreign_key_checks 是否打開外鍵惟一檢查( foreign key checks)
trx_last_foreign_key_error 上一次外鍵錯誤信息
trx_adaptive_hash_latched
trx_adaptive_hash_timeout
例子:
trx_id | 7B441 trx_state | LOCK WAIT trx_started | 2017-02-06 18:16:26 trx_requested_lock_id | 7B441:0:5172:49 trx_wait_started | 2017-02-06 18:16:26 trx_weight | 2 trx_mysql_thread_id | 60 trx_query | update account set nickname='aaabbb4' where `key`=11165 trx_operation_state | starting index read trx_tables_in_use | 1 trx_tables_locked | 1 trx_lock_structs | 2 trx_lock_memory_bytes | 376 trx_rows_locked | 1 trx_rows_modified | 0 trx_concurrency_tickets | 0 trx_isolation_level | REPEATABLE READ trx_unique_checks | 1 trx_foreign_key_checks | 1 trx_last_foreign_key_error | None trx_adaptive_hash_latched | 0 trx_adaptive_hash_timeout | 10000
保存等待鎖的鏈接的信息
requesting_trx_id 正在請求的事務ID,也就是等待鎖的事務ID
requested_lock_id 請求事務的ID得到鎖成功後,會建立的鎖ID
blocking_trx_id 已經獲取鎖的事務ID
blocking_lock_id 已經獲取的鎖ID
requesting_trx_id | 7B444 requested_lock_id | 7B444:0:5172:49 blocking_trx_id | 7B43F blocking_lock_id | 7B43F:0:5172:49
表示事務7B43F得到了鎖7B43F:0:5172:49
,事務7B444在等待鎖,獲取鎖後,會建立鎖7B444:0:5172:49
保存InnoDB的鎖信息。只有當存在等待鎖的時候,這個表纔會有數據。例如一個線程得到了鎖,可是沒有commit,這個表是沒有數據的,當另外一個線程等待鎖,這個表會有兩條數據,一個是已得到的鎖,一個是等待的鎖。
lock_id 鎖的ID,不要嘗試解析ID的意義
lock_trx_id 已經獲取該鎖的事務ID,和INNODB_TRX 表的trx_id對應
lock_mode 鎖的模式,官方介紹
lock_type 鎖的類型,RECORD (行鎖),TABLE(表鎖)
lock_table 被鎖的表名
lock_index 若是是行鎖,顯示索引名
lock_space 若是是行鎖,顯示錶空間(Tablespace )的ID
lock_page 若是是行鎖,顯示被鎖的行的頁碼
lock_rec 若是是行鎖,顯示被鎖的行的頁碼裏面的堆棧號
lock_data 被鎖的行的主鍵的值,若是沒有主鍵,顯示InnoDB內部的行ID
例子:
lock_id | 7B449:0:5172:49 lock_trx_id | 7B449 lock_mode | X lock_type | RECORD lock_table | `test`.`account` lock_index | `PRIMARY` lock_space | 0 lock_page | 5172 lock_rec | 49 lock_data | 10001
SHOW [GLOBAL | SESSION] STATUS [LIKE 'pattern' | WHERE expr]
表中有Variable_name 和Value兩個列。不區分大小寫
LIKE是WHERE的快捷方式
例如這兩個是等價的
show global status like '%thread%' show global status where Variable_name like '%thread%'
WHERE的功能更強大,例如:
show global status where Value =0
經常使用的:
行鎖相關:
Com開頭的:
表示每一個操做執行的次數,例如Com_select
表示執行select操做的次數。
SHOW [GLOBAL | SESSION] VARIABLES [LIKE 'pattern' | WHERE expr]
跟show status相似
SHOW [FULL] PROCESSLIST
若是沒有FULL,只會顯示SQL語句的前100個字符
SHOW PROCESSLIST 教程
內容同PROCESSLIST表是同樣的
官方說明
這個語法顯示正在緩存中被打開的表。
例子:
Database | db_kklauncher Table | sleep_local_account In_use | 1 Name_locked | 0
Database 數據庫名
Table 數據表名
In_use 使用該表的客戶端數量。通常是表示有多少個客戶端在等待這個表的鎖。
Name_locked 表名是否被鎖,通常只有刪除表或還原表的時候,這個會等於1
查看哪一個事務得到了鎖(只顯示有鏈接在等待的鎖)
select * from INNODB_LOCKS,`INNODB_TRX` where INNODB_TRX.trx_id=INNODB_LOCKS.lock_trx_id and INNODB_TRX.trx_state ='RUNNING'\G;
查看得到鎖的鏈接狀況
select l.lock_id ,l.lock_index,l.lock_data,p.id,p.command,p.time,p.host from information_schema.innodb_trx as t,information_schema.innodb_locks as l ,information_schema.processlist as p where t.trx_id=l.lock_trx_id and p.id=t.trx_mysql_thread_id and l.lock_id in (select distinct blocking_lock_id from information_schema.INNODB_LOCK_WAITS)
鎖相關說明
假若有student表:
+----+------+------+-------+ | id | name | age | class | +----+------+------+-------+ | 1 | 2 | 20 | A | | 2 | 1 | 22 | A | | 3 | 1 | 23 | A | | 4 | NULL | 24 | B | | 5 | NULL | 24 | B | +----+------+------+-------+
鏈接A執行SQLupdate student set name='1' where class='A' ;
,可是沒有commit
這時若是鏈接B執行SQLupdate student set name='2' where id=1;
,而後執行查看鎖命令,結果是:
lock_id: 7B600:0:40373:7 lock_trx_id: 7B600 lock_type: RECORD lock_table: `test`.`student` lock_index: `PRIMARY` lock_data: 0 trx_started: 2017-02-07 17:19:33 trx_mysql_thread_id: 2 trx_lock_structs: 2 trx_rows_locked: 3 trx_rows_modified: 4
A,3
,也就是前面是索引列的值,後面是主鍵。update student set name='1' where class='B' ;
,也就是更新id=4,5兩條記錄,可是沒有commitupdate student set name='2' where age<24;
,也就是更新所有記錄,接着鏈接C執行SQLupdate student set name='1' where id=1;
,更新id=1這條記錄。這樣的結果是:鏈接A獲取了id=4,5的鎖,鏈接B獲取了id=1,2,3的鎖,正在等待id=4的鎖,事務狀態是LOCK_WAIT,鏈接C等待id=1的鎖,事務狀態也是LOCK_WAIT。未經許可,請不要轉載。