Mysql中查詢當前用戶、當前數據庫等基礎信息

前言

生活中有時會出現靈魂三問:我是誰?我在哪?我在做什麼?特別的喝醉酒的第二天,完全不記得昨天發生了什麼。而在數據庫操作中也會出現這種靈魂拷問,我用的是哪個用戶,爲什麼會沒有權限?我操作的是哪個數據庫,剛剛不會把線上正式服務器數據刪了吧?

上面描述的問題常常出現在切換數據庫處理問題的時候,通過一個客戶端連接到Mysql數據庫服務器,操作數據庫1,然後切換再操作數據庫2,這時如果中間有人打擾,很容易忘記剛剛操作的是哪個數據庫,或者中途處理個其他緊急的事情,回來連操作的用戶都忘了,這時就需要一些基礎信息的查詢命令,幫助你來恢復記憶。

數據庫基礎信息查詢

數據庫的基礎信息涉及到方方面面,這裏只列舉幾個常用的查詢命令,用來回答上面的靈魂拷問,其他命令還有很多,用到了再總結吧。

查詢當前操作的用戶

mysql> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.07 sec)

查詢當前操作的數據庫

mysql> select database();
+------------+
| database() |
+------------+
| sqltest2   |
+------------+
1 row in set (0.09 sec)

查詢當前數據庫端口

mysql> show variables like 'port';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| port          | 3306  |
+---------------+-------+
1 row in set (0.07 sec)

查詢當前數據庫版本

mysql> select version();
+------------+
| version()  |
+------------+
| 5.7.21-log |
+------------+
1 row in set (0.06 sec)

數據庫結構信息查詢

這裏的結構我指的是DDL中定義的那些元素,比如表、存儲過程等,有一些常用的查詢命令,要是一段時間不使用還是會忘記,比如查詢一個數據庫中的存儲過程,每次查詢時都要上網搜一下,所以今天總結在一起方便查找。

查詢當前數據庫中的所有表

mysql> show tables;
+--------------------+
| Tables_in_sqltest2 |
+--------------------+
| a                  |
| b                  |
| c                  |
| d                  |
| m                  |
| p                  |
| tb_test            |
| tb_with_index      |
+--------------------+
14 rows in set (0.11 sec)

查詢創建表的sql語句

mysql> show create table a;
+-------+----------------------------------------+
| Table | Create Table                           |
+-------+----------------------------------------+
| a     | CREATE TABLE `a` (
  `id` int(11) DEFAULT NULL,
  `num` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+----------------------------------------+
1 row in set (0.11 sec)

查詢指定表中的所有字段

mysql> desc a;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
| num   | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.12 sec)

查詢當前數據庫中的所有存儲過程

這個命令我得吐槽一下,爲什麼不能像查詢當前數據庫的中所有表一樣,搞個show procedures;命令,非得通過where子句指定數據庫呢,具體的原因還不知道,等我弄明白了再回來補充。

mysql> show procedure status where db='sqltest2';
+----------+-----------------------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| Db       | Name                  | Type      | Definer        | Modified            | Created             | Security_type | Comment | character_set_client | collation_connection | Database Collation |
+----------+-----------------------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
| sqltest2 | fill_slow_query_test  | PROCEDURE | root@localhost | 2019-03-25 11:14:01 | 2019-03-25 11:14:01 | DEFINER       |         | utf8mb4              | utf8mb4_general_ci   | utf8_general_ci    |
| sqltest2 | fill_tb_without_index | PROCEDURE | root@localhost | 2019-03-18 09:53:32 | 2019-03-18 09:53:32 | DEFINER       |         | utf8mb4              | utf8mb4_general_ci   | utf8_general_ci    |
| sqltest2 | fill_tb_with_index    | PROCEDURE | root@localhost | 2019-03-18 09:53:33 | 2019-03-18 09:53:33 | DEFINER       |         | utf8mb4              | utf8mb4_general_ci   | utf8_general_ci    |
+----------+-----------------------+-----------+----------------+---------------------+---------------------+---------------+---------+----------------------+----------------------+--------------------+
3 rows in set (0.17 sec)

查詢創建存儲過程的sql語句

mysql> show create procedure fill_tb_with_index;
+--------------------+----------------------------------------------------------------+-------------------+----------------------+----------------------+--------------------+
| Procedure          | sql_mode                                                       | Create Procedure  | character_set_client | collation_connection | Database Collation |
+--------------------+----------------------------------------------------------------+-------------------+----------------------+----------------------+--------------------+
| fill_tb_with_index | STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
CREATE DEFINER=`root`@`localhost` PROCEDURE `fill_tb_with_index`()
BEGIN
    DECLARE i int default 1;

    WHILE i <= 100000 do
        insert into tb_with_index values(i, i, i);
        set i = i + 1;
    END WHILE;

END | utf8mb4              | utf8mb4_general_ci   | utf8_general_ci    |
+--------------------+----------------------------------------------------------------+-------------------+----------------------+----------------------+--------------------+
1 row in set (0.09 sec)

查詢指定表上的索引

mysql> show index from tb_with_index;
+---------------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table         | Non_unique | Key_name    | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| tb_with_index |          1 | id_index    |            1 | id          | A         |      100035 | NULL     | NULL   | YES  | BTREE      |         |               |
| tb_with_index |          1 | num_index   |            1 | num         | A         |       98715 | NULL     | NULL   | YES  | BTREE      |         |               |
| tb_with_index |          1 | money_index |            1 | money       | A         |      100035 | NULL     | NULL   | YES  | BTREE      |         |               |
+---------------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
3 rows in set (0.03 sec)

查詢當前用戶連接的權限

mysql> show grants;
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        |
+---------------------------------------------------------------------+

查詢指定用戶連接的權限

mysql> show grants for 'guest';
+---------------------------------------------------------------------------------------------------------------+
| Grants for guest@%                                                                                            |
+---------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'guest'@'%' IDENTIFIED BY PASSWORD '*6C8DE74065898C44C21EF74D67A834C5256BFA1C' |
+---------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

總結

  1. 以上總結的查詢語句都是我經常用到,相比Mysql所有查詢語句來說簡直是冰山一角,總結到一起主要是方便日後查找,同時也希望給他人帶來幫助
  2. 查看這些語句會發現,有些是select開頭,有些是show開頭,實際上很多show開頭的都是對information_schema數據庫數據的封裝
  3. information_schema 數據庫是Mysql系統自帶的數據庫,記錄了整個數據庫實例上所有數據結構信息,更像是記錄數據庫的數據庫,包含表結構、字符集,權限等太多的信息,有機會後續找時間聊聊這個數據庫,在此就不展開了
  4. 正因爲很多show開頭的都是對information_schema數據庫數據的封裝,所以這些查詢語句基本都可以通過在information_schema數據庫查詢得到,比如show procedure status where db='sqltest2';就可以改寫成select routine_name from information_schema.routines where routine_schema='sqltest2';
  5. 此時此刻,我正在距離天安門500多米的現場等待閱兵儀式的開始,一邊學習一邊爲祖國慶生的感覺真好!(注:500多米多了5公里,現場是臥室牀前的電視機旁,這麼近的距離不知道一會能不能看見接受檢閱的飛機o(* ̄︶ ̄*)o)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章