1. 程式人生 > >information_schema系列二(列,列許可權,事件,儲存引擎)

information_schema系列二(列,列許可權,事件,儲存引擎)

 

 

information_schema系列二(列,列許可權,事件,儲存引擎)   

  這個系列的文章主要是為了能夠讓自己瞭解MySQL5.7的一些系統表,統一做一下備註和使用,也希望分享出來讓大家能夠有一點點的受益。 1:COLUMNS 老規矩。查一下這個表,看一下記錄,由於這個是看錶的結構的我們就拿qiandai資料庫的一張表作為例子。 複製程式碼
[email protected] [information_schema]>select * from COLUMNS where TABLE_SCHEMA='qiandai' and TABLE_NAME= 'articles'\G;
*************************** 1. row ***************************
TABLE_CATALOG: def
TABLE_SCHEMA: qiandai
TABLE_NAME: articles
COLUMN_NAME: FTS_DOC_ID
ORDINAL_POSITION: 1
COLUMN_DEFAULT: NULL
IS_NULLABLE: NO
DATA_TYPE: bigint
CHARACTER_MAXIMUM_LENGTH: NULL
CHARACTER_OCTET_LENGTH: NULL
NUMERIC_PRECISION: 20
NUMERIC_SCALE: 0
DATETIME_PRECISION: NULL
CHARACTER_SET_NAME: NULL
COLLATION_NAME: NULL
COLUMN_TYPE: bigint(20) unsigned
COLUMN_KEY: PRI
EXTRA: auto_increment
PRIVILEGES: select,insert,update,references
COLUMN_COMMENT:
GENERATION_EXPRESSION:
*************************** 2. row ***************************
複製程式碼

 

我們可以通過TABLE_SCHEMA和TABLE_NAME定位到某一張表進行檢視,這樣還是很方便能看到一張表的記錄的,不過如果要查看錶結構的話我們一板也可以通過以下兩種方式檢視: show create table tablename desc tablename 以上兩種方式都可以滿足基本的查看錶結構的需求,為什麼還要有一張系統表來記錄呢,首先這個表更加的全面,其次MySQL本身內部也是要有一個統計資訊來統計列的。我們看一下這個表記錄的資訊,欄位名,所屬於的型別,屬於哪張表,在表中建立的時候排序是第幾位等資訊。貼一下官網對於這張表的解釋:  
INFORMATION_SCHEMA Name SHOW Name Remarks
TABLE_CATALOG   def
TABLE_SCHEMA    
TABLE_NAME    
COLUMN_NAME Field  
ORDINAL_POSITION   see notes
COLUMN_DEFAULT Default  
IS_NULLABLE Null  
DATA_TYPE Type  
CHARACTER_MAXIMUM_LENGTH Type  
CHARACTER_OCTET_LENGTH    
NUMERIC_PRECISION Type  
NUMERIC_SCALE Type  
DATETIME_PRECISION Type  
CHARACTER_SET_NAME    
COLLATION_NAME Collation  
COLUMN_TYPE Type MySQL extension
COLUMN_KEY Key MySQL extension
EXTRA Extra MySQL extension
PRIVILEGES Privileges MySQL extension
COLUMN_COMMENT Comment MySQL extension
GENERATION_EXPRESSION   MySQL extension
CHARACTER_OCTET_LENGTH 和CHARACTER_MAXIMUM_LENGTH大部分情況是相同的,除非是多位元組字符集,一般情況下,瞭解這些資訊也算足夠一個DBA是用了,不過個人還是比較建議使用desc來查看錶結構。 2:COLUMN_PRIVILEGES 我們看一下授權資訊: 第一步:授權
grant select on qiandai.articles(title) to 'replication'@'%';

授權以後就會有資訊出現了,一般情況這個表是空的。

複製程式碼
[email protected] [information_schema]>select * from COLUMN_PRIVILEGES limit 10;
+------------------------------+---------------+--------------+------------+-------------+----------------+--------------+
| GRANTEE | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | PRIVILEGE_TYPE | IS_GRANTABLE |
+------------------------------+---------------+--------------+------------+-------------+----------------+--------------+
| 'replication'@'172.16.88.42' | def | qiandai | articles | title | SELECT | NO |
+------------------------------+---------------+--------------+------------+-------------+----------------+--------------+
複製程式碼

 

我們這樣看的話很清楚就能看到表授權的使用者的物件,那張表那個庫以及授予的是什麼許可權,如果授權的時候加上with grant option的話,我們可以看得到PRIVILEGE_TYPE這個值必須是YES,篩選的時候可以根據TABLE_NAME 和COLUMN_NAME 進行篩選,比如:
select * from COLUMN_PRIVILEGES where TABLE_NAME =‘’ and COLUMN_NAME=‘’;

 

3:ENGINES 老規矩看一下資料 複製程式碼
[email protected] [information_schema]>select * from ENGINES limit 10;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| ENGINE | SUPPORT | COMMENT | TRANSACTIONS | XA | SAVEPOINTS |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
複製程式碼

引擎型別,是否支援這個引擎,描述,是否支援事物,是否支援分散式事務,是否能夠支援事物的回滾點。這個就比較簡了。不過多的解釋了。

4:EVENTS 看一下記錄吧筒子們,我只查詢一條就可以了,因為這個記錄的是MySQL的事件,一般情況我們是很少使用事件的,中間有一些加*因為是涉及到公司的東西,不過會解釋一下,在後面標註上漢字解釋。 複製程式碼
mysql> select * from EVENTS limit 1\G;
*************************** 1. row ***************************
EVENT_CATALOG: def
EVENT_SCHEMA: ******所在的資料庫
EVENT_NAME: name 事件的名字
DEFINER: root 哪一個使用者定義的這個事件
TIME_ZONE: SYSTEM 該事件的時區,這是用於排程事件的時區,這是有效的事件中,因為它執行。預設值是系統。
EVENT_BODY: SQL MYSQL5.7這個記錄統一為SQL
EVENT_DEFINITION: call day_statistic() 表示事件要做什麼操作,這個很好理解,就是啟動day_statistic這個方法,做一系列的處理
EVENT_TYPE: RECURRING 本次活動的重複型別,是ONE TIME(瞬態)或重複(重複) 。
EXECUTE_AT: NULL 單次的話就是定義的時間或最後一次修改事件,如果事件的時序由一個EVERY子句代替AT子句值就是NULL
INTERVAL_VALUE: 1 對於週期性事件,該列包含事件的EVERY子句的數字部分。
INTERVAL_FIELD: DAY 對於週期性事件,該列包含管理事件的時機了EVERY子句的單位部分。如年月日天等
SQL_MODE: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
STARTS: 2016-08-16 01:00:00 對於重複發生的事件,其定義包括STARTS子句,該列包含相應的DATETIME值。
ENDS: NULL
STATUS: ENABLED 有以下三個值 ENABLED, DISABLED, or SLAVESIDE_DISABLED.
ON_COMPLETION: NOT PRESERVE 是保留還是不保留
CREATED: 2016-08-15 05:11:12
LAST_ALTERED: 2016-08-15 05:11:12
LAST_EXECUTED: 2016-08-28 01:00:00
EVENT_COMMENT: 註釋文字
ORIGINATOR: 1 在其上建立事件的MySQL伺服器的伺服器ID,也就是server ID ;在複製中使用。預設值是0
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
DATABASE_COLLATION: utf8_general_ci
1 row in set (0.00 sec)
複製程式碼

好了,我們已經解釋完了,接下來看一下建立一個事件怎麼建立吧,也就給個例子:

CREATE DEFINER=`root`@`%` EVENT `money_day_statistic` ON SCHEDULE EVERY 1 DAY STARTS '2016-08-16 01:00:00' ON COMPLETION NOT PRESERVE ENABLE DO call day_statistic()

這個語句就是對應上面的查詢語句。

    最後看一下上面的表結構: COLUMNS,EVENTS的儲存引擎是MyISAM,這是為了長久的儲存,不能夠重啟後就沒有啊 COLUMN_PRIVILEGES,ENGINES的儲存引擎是MEMORY,引擎也是一樣的按照版本自動可以生成,至於列為什麼會是MEMORY,我想大概是因為這樣對於許可權的控制都是在MySQL的SQL層。每次重啟應該是會從其他user表讀取到記憶體,所以他只是在SQL層做一些控制。大概就是這個樣子。   這個系列的文章主要是為了能夠讓自己瞭解MySQL5.7的一些系統表,統一做一下備註和使用,也希望分享出來讓大家能夠有一點點的受益。 1:COLUMNS 老規矩。查一下這個表,看一下記錄,由於這個是看錶的結構的我們就拿qiandai資料庫的一張表作為例子。 複製程式碼
[email protected] [information_schema]>select * from COLUMNS where TABLE_SCHEMA='qiandai' and TABLE_NAME= 'articles'\G;
*************************** 1. row ***************************
TABLE_CATALOG: def
TABLE_SCHEMA: qiandai
TABLE_NAME: articles
COLUMN_NAME: FTS_DOC_ID
ORDINAL_POSITION: 1
COLUMN_DEFAULT: NULL
IS_NULLABLE: NO
DATA_TYPE: bigint
CHARACTER_MAXIMUM_LENGTH: NULL
CHARACTER_OCTET_LENGTH: NULL
NUMERIC_PRECISION: 20
NUMERIC_SCALE: 0
DATETIME_PRECISION: NULL
CHARACTER_SET_NAME: NULL
COLLATION_NAME: NULL
COLUMN_TYPE: bigint(20) unsigned
COLUMN_KEY: PRI
EXTRA: auto_increment
PRIVILEGES: select,insert,update,references
COLUMN_COMMENT:
GENERATION_EXPRESSION:
*************************** 2. row ***************************
複製程式碼

 

我們可以通過TABLE_SCHEMA和TABLE_NAME定位到某一張表進行檢視,這樣還是很方便能看到一張表的記錄的,不過如果要查看錶結構的話我們一板也可以通過以下兩種方式檢視: show create table tablename desc tablename 以上兩種方式都可以滿足基本的查看錶結構的需求,為什麼還要有一張系統表來記錄呢,首先這個表更加的全面,其次MySQL本身內部也是要有一個統計資訊來統計列的。我們看一下這個表記錄的資訊,欄位名,所屬於的型別,屬於哪張表,在表中建立的時候排序是第幾位等資訊。貼一下官網對於這張表的解釋:  
INFORMATION_SCHEMA Name SHOW Name Remarks
TABLE_CATALOG   def
TABLE_SCHEMA    
TABLE_NAME    
COLUMN_NAME Field  
ORDINAL_POSITION   see notes
COLUMN_DEFAULT Default  
IS_NULLABLE Null  
DATA_TYPE Type  
CHARACTER_MAXIMUM_LENGTH Type  
CHARACTER_OCTET_LENGTH    
NUMERIC_PRECISION Type  
NUMERIC_SCALE Type  
DATETIME_PRECISION Type  
CHARACTER_SET_NAME    
COLLATION_NAME Collation  
COLUMN_TYPE Type MySQL extension
COLUMN_KEY Key MySQL extension
EXTRA Extra MySQL extension
PRIVILEGES Privileges MySQL extension
COLUMN_COMMENT Comment MySQL extension
GENERATION_EXPRESSION   MySQL extension
CHARACTER_OCTET_LENGTH 和CHARACTER_MAXIMUM_LENGTH大部分情況是相同的,除非是多位元組字符集,一般情況下,瞭解這些資訊也算足夠一個DBA是用了,不過個人還是比較建議使用desc來查看錶結構。 2:COLUMN_PRIVILEGES 我們看一下授權資訊: 第一步:授權
grant select on qiandai.articles(title) to 'replication'@'%';

授權以後就會有資訊出現了,一般情況這個表是空的。

複製程式碼
[email protected] [information_schema]>select * from COLUMN_PRIVILEGES limit 10;
+------------------------------+---------------+--------------+------------+-------------+----------------+--------------+
| GRANTEE | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | PRIVILEGE_TYPE | IS_GRANTABLE |
+------------------------------+---------------+--------------+------------+-------------+----------------+--------------+
| 'replication'@'172.16.88.42' | def | qiandai | articles | title | SELECT | NO |
+------------------------------+---------------+--------------+------------+-------------+----------------+--------------+
複製程式碼

 

我們這樣看的話很清楚就能看到表授權的使用者的物件,那張表那個庫以及授予的是什麼許可權,如果授權的時候加上with grant option的話,我們可以看得到PRIVILEGE_TYPE這個值必須是YES,篩選的時候可以根據TABLE_NAME 和COLUMN_NAME 進行篩選,比如:
select * from COLUMN_PRIVILEGES where TABLE_NAME =‘’ and COLUMN_NAME=‘’;

 

3:ENGINES 老規矩看一下資料 複製程式碼
[email protected] [information_schema]>select * from ENGINES limit 10;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| ENGINE | SUPPORT | COMMENT | TRANSACTIONS | XA | SAVEPOINTS |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
複製程式碼

引擎型別,是否支援這個引擎,描述,是否支援事物,是否支援分散式事務,是否能夠支援事物的回滾點。這個就比較簡了。不過多的解釋了。

4:EVENTS 看一下記錄吧筒子們,我只查詢一條就可以了,因為這個記錄的是MySQL的事件,一般情況我們是很少使用事件的,中間有一些加*因為是涉及到公司的東西,不過會解釋一下,在後面標註上漢字解釋。 複製程式碼
mysql> select * from EVENTS limit 1\G;
*************************** 1. row ***************************
EVENT_CATALOG: def
EVENT_SCHEMA: ******所在的資料庫
EVENT_NAME: name 事件的名字
DEFINER: root 哪一個使用者定義的這個事件
TIME_ZONE: SYSTEM 該事件的時區,這是用於排程事件的時區,這是有效的事件中,因為它執行。預設值是系統。
EVENT_BODY: SQL MYSQL5.7這個記錄統一為SQL
EVENT_DEFINITION: call day_statistic() 表示事件要做什麼操作,這個很好理解,就是啟動day_statistic這個方法,做一系列的處理
EVENT_TYPE: RECURRING 本次活動的重複型別,是ONE TIME(瞬態)或重複(重複) 。
EXECUTE_AT: NULL 單次的話就是定義的時間或最後一次修改事件,如果事件的時序由一個EVERY子句代替AT子句值就是NULL
INTERVAL_VALUE: 1 對於週期性事件,該列包含事件的EVERY子句的數字部分。
INTERVAL_FIELD: DAY 對於週期性事件,該列包含管理事件的時機了EVERY子句的單位部分。如年月日天等
SQL_MODE: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
STARTS: 2016-08-16 01:00:00 對於重複發生的事件,其定義包括STARTS子句,該列包含相應的DATETIME值。
ENDS: NULL
STATUS: ENABLED 有以下三個值 ENABLED, DISABLED, or SLAVESIDE_DISABLED.
ON_COMPLETION: NOT PRESERVE 是保留還是不保留
CREATED: 2016-08-15 05:11:12
LAST_ALTERED: 2016-08-15 05:11:12
LAST_EXECUTED: 2016-08-28 01:00:00
EVENT_COMMENT: 註釋文字
ORIGINATOR: 1 在其上建立事件的MySQL伺服器的伺服器ID,也就是server ID ;在複製中使用。預設值是0
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
DATABASE_COLLATION: utf8_general_ci
1 row in set (0.00 sec)
複製程式碼

好了,我們已經解釋完了,接下來看一下建立一個事件怎麼建立吧,也就給個例子:

CREATE DEFINER=`root`@`%` EVENT `money_day_statistic` ON SCHEDULE EVERY 1 DAY STARTS '2016-08-16 01:00:00' ON COMPLETION NOT PRESERVE ENABLE DO call day_statistic()

這個語句就是對應上面的查詢語句。

    最後看一下上面的表結構: COLUMNS,EVENTS的儲存引擎是MyISAM,這是為了長久的儲存,不能夠重啟後就沒有啊 COLUMN_PRIVILEGES,ENGINES的儲存引擎是MEMORY,引擎也是一樣的按照版本自動可以生成,至於列為什麼會是MEMORY,我想大概是因為這樣對於許可權的控制都是在MySQL的SQL層。每次重啟應該是會從其他user表讀取到記憶體,所以他只是在SQL層做一些控制。大概就是這個樣子。