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

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

排序 nod order 由於 inno sql_mod html 我想 emp

這個系列的文章主要是為了能夠讓自己了解MySQL5.7的一些系統表,統一做一下備註和使用,也希望分享出來讓大家能夠有一點點的受益。 1:COLUMNS 老規矩。查一下這個表,看一下記錄,由於這個是看表的結構的我們就拿qiandai數據庫的一張表作為例子。 技術分享圖片
root@localhost [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‘@‘%‘;

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

技術分享圖片
root@localhost [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 老規矩看一下數據 技術分享圖片
root@localhost [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層做一些控制。大概就是這個樣子。

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