1. 程式人生 > >配置表 | 全方位認識 sys 系統庫

配置表 | 全方位認識 sys 系統庫

在上一篇《初相識 | 全方位認識 sys 系統庫》中,我們針對sys 系統庫做了一個不痛不癢的開端,是不是覺得太簡單了?別急,本期我們將為大家帶來系列第二篇《配置表|全方位認識 sys 系統庫》,讓你一次性重新找回學習performance_schema時的感覺,下面請跟隨我們一起開始 sys 系統庫的系統學習之旅吧。

| sys 系統庫配置

1. sys_config表

該表包含sys系統庫的配置選項,每個配置選項一行記錄。該表是innodb表,可以通過客戶端更新此表來持久化配置,server重啟不會丟失。

sys_config表字段含義如下:

  • variable:配置選項名稱

  • value:配置選項值

  • set_time:該行配置最近修改時間

  • set_by:最近一次對改行配置進行修改的帳戶名。如果自server安裝sys 系統庫以來,該行配置從未被更改過,則該列值為NULL

為了減少對sys_config表直接讀取的次數,sys 系統庫中的檢視、儲存過程在需要使用到這些配置選項時,會優先檢查這些配置選項對應的使用者自定義配置選項變數(使用者自定義配置選項變數與該表中的配置選項都具有相同的名稱,例如:表中的diagnostics.include_raw選項,對應的自定義配置選項變數是@sys.diagnostics.include_raw)。如果使用者定義的配置選項變數存在於當前會話作用域中並且是非空的,那麼sys 系統庫中的函式、儲存過程將優先使用該配置選項變數值。否則,該sys 系統庫函式和儲存過程將使用sys_config表中的配置選項值(從表中讀取配置選項值之後,會將sys_config表中的配置選項時同時更新到使用者自定義配置選項變數中,以便在同一會話後續對該值的引用時使用變數值,而不必再次從sys_config表中讀取),示例:statement_truncate_len配置選項控制format_statement()函式返回的語句的最大長度。預設值為64.如果要臨時將當前會話的值更改為32,可以設定對應的@sys.statement_truncate_len使用者定義的配置選項變數:

# statement_truncate_len配置選項預設是64,直接呼叫format_statement()函式返回是64位元組長度,在未呼叫任何涉及到該配置選項的函式之前,該自定義變數值為NULL,此時函式需要從表中查詢預設值
[email protected] : sys 11:47:37> select @sys.statement_truncate_len;
+-----------------------------+
| @sys.statement_truncate_len |
+-----------------------------+
| NULL                        |
+-----------------------------+
1 row in set (0.00 sec)
[email protected]
: sys 11:51:53> SET @stmt = 'SELECT variable, value, set_time, set_by FROM sys_config'; Query OK, 0 rows affected (0.00 sec) [email protected] : sys 11:52:04> SELECT format_statement(@stmt); +----------------------------------------------------------+ | format_statement(@stmt) | +----------------------------------------------------------+ | SELECT variable, value, set_time, set_by FROM sys_config | +----------------------------------------------------------+ 1 row in set (0.01 sec) # 呼叫過一次format_statement()函式之後,表中的預設值會被更新到該自定義配置選項變數中 [email protected] : sys 11:52:12> select @sys.statement_truncate_len; +-----------------------------+ | @sys.statement_truncate_len | +-----------------------------+ | 64 | +-----------------------------+ 1 row in set (0.00 sec) # 在會話級別中修改為32 [email protected] : sys 11:52:20> set @sys.statement_truncate_len = 32; Query OK, 0 rows affected (0.00 sec) [email protected] : sys 11:52:34> select @sys.statement_truncate_len; +-----------------------------+ | @sys.statement_truncate_len | +-----------------------------+ | 32 | +-----------------------------+ 1 row in set (0.00 sec) # 再次呼叫format_statement()函式值,可以發現返回結果中的長度縮短了,說明使用了session級別修改的值32 [email protected] : sys 11:52:41> SELECT format_statement(@stmt); +-----------------------------------+ | format_statement(@stmt) | +-----------------------------------+ | SELECT variabl ... ROM sys_config | +-----------------------------------+ 1 row in set (0.00 sec)

要停止使用使用者定義的配置選項變數並恢復使用sys_config表中的值,可以將會話中的配置選項變數設定為NULL,或者結束當前會話(結束會話會使得使用者定義的變數被銷燬)重新開啟一個新的會話:

mysql> SET @sys.statement_truncate_len = NULL;
mysql> SELECT format_statement(@stmt);
+----------------------------------------------------------+
| format_statement(@stmt)                                  |
+----------------------------------------------------------+
| SELECT variable, value, set_time, set_by FROM sys_config |
+----------------------------------------------------------+

注意:如果使用者在會話中設定了自定義配置選項變數值,然後再更新了sys_config表中相同名稱的配置選項,則對於當前會話,sys_config表中的配置選項值不生效(除非設定自定義配置選項變數值為NULL),只對於新的會話且不存在自定義配置選項變數或者自定義配置選項值為NULL生效(因為此時會從sys_config表中讀取)

sys_config表中的選項和相應的使用者定義的配置選項變數相關描述如下:

  • diagnostics.allow_i_s_tables,@sys.diagnostics.allow_i_s_tables:如果此選項為ON,則diagnostics()儲存過程在呼叫時會掃描INFORMATION_SCHEMA.TABLES表找到所有的基表與STATISTICS表執行聯結查詢,掃描每個表的統計資訊。如果基表非常多,該操作可能比較昂貴。預設為OFF。此選項在MySQL 5.7.9中新增

  • diagnostics.include_raw,@sys.diagnostics.include_raw:如果此選項為ON,則diagnostics()儲存過程的輸出資訊中會包括metrics檢視中的原始輸出資訊(該儲存過程中會呼叫metrics檢視)。預設為OFF。此選項在MySQL 5.7.9中新增

  • ps_thread_trx_info.max_length,@sys.ps_thread_trx_info.max_length:由ps_thread_trx_info()函式生成的JSON輸出結果的最大長度。預設值為65535位元組。此選項在MySQL 5.7.9中新增

  • statement_performance_analyzer.limit,@sys.statement_performance_analyzer.limit:不具有內建限制的檢視返回的最大行數。預設值為100(例如,statements_with_runtimes_in_95th_percentile檢視具有內建限制,即只返回平均執行時間為佔總執行時間分佈的95百分位數的語句)。此選項在MySQL 5.7.9中新增

  • statement_performance_analyzer.view,@sys.statement_performance_analyzer.view:給statement_performance_analyzer()儲存過程當作入參使用的自定義查詢或檢視名稱(statement_performance_analyzer()儲存過程由diagnostics()儲存過程內部呼叫)。如果該選項值包含空格,則將其值解釋為查詢語句。否則解釋為檢視名稱,且這個檢視必須是提前建立好的用於查詢performance_schema.events_statements_summary_by_digest表的檢視。如果statement_performance_analyzer.limit配置選項值大於0,則statement_performance_analyzer.view配置選項指定的查詢語句或檢視中不能有任何LIMIT子句(因為statement_performance_analyzer.limit選項在statement_performance_analyzer()儲存過程中是作為一個條件判斷值決定是否要新增一個LIMIT子句,如果你再自行新增一個LIMIT會導致語法錯誤)。statement_performance_analyzer.view配置選項預設值為NULL。此選項在MySQL 5.7.9中新增

  • statement_truncate_len,@sys.statement_truncate_len:控制format_statement()函式返回的語句文字的最大長度。超過該長度的語句文字會被截斷,只保留該配置選項定義的長度文字。預設值為64位元組

其他選項可以被新增到sys_config表中。例如:如果存在debug配置選項且不為null值,則diagnostics()和execute_prepared_stmt()儲存過程呼叫時會執行檢查並做相應的判斷,但預設情況下,此選項在sys_config表中不存在,因為debug輸出通常只能臨時啟用,通過會話級別設定自定義配置選項變數實現,如:set @sys.debug='ON';

# 如果所有會話都需要使用,則可以將debug選項insert到sys_config表中
mysql> INSERT INTO sys_config (variable, value) VALUES('debug', 'ON');
# 要更改表中的除錯配置選項值,可以使用update語句更新該配置選項值
## 首先,修改表中的值:
mysql> UPDATE sys_config SET value = 'OFF' WHERE variable = 'debug';
## 然後,為了確保當前會話中的儲存過程呼叫時使用表中的更改後的值,需要將相應的使用者定義的變數設定為NULL
mysql> SET @sys.debug = NULL;

記錄內容示例

[email protected] : sys 09:48:46> select * from sys_config;
+--------------------------------------+-------+---------------------+--------+
| variable                            | value | set_time            | set_by |
+--------------------------------------+-------+---------------------+--------+
| diagnostics.allow_i_s_tables        | OFF  | 2017-07-06 12:43:53 | NULL  |
| diagnostics.include_raw              | OFF  | 2017-07-06 12:43:53 | NULL  |
| ps_thread_trx_info.max_length        | 65535 | 2017-07-06 12:43:53 | NULL  |
| statement_performance_analyzer.limit | 100  | 2017-07-06 12:43:53 | NULL  |
| statement_performance_analyzer.view  | NULL  | 2017-07-06 12:43:53 | NULL  |
| statement_truncate_len              | 64    | 2017-07-06 12:43:53 | NULL  |
+--------------------------------------+-------+---------------------+--------+
6 rows in set (0.00 sec)

PS:對sys_config表的insert和update操作會觸發sys_config_insert_set_user和sys_config_update_set_user觸發器,而該觸發器在5.7.x版本中新增了一個使用者mysql.sys,且這倆觸發器定義時指定了DEFINER=mysql.sys@localhost(表示該觸發器只能用mysql.sys使用者呼叫),so..該使用者必須存在(對MySQL 做安全加固的小朋友要注意了,別直接對mysql.user表做truncate之類的操作,先看一眼表中存在著哪些使用者),否則對sys_config表操作時就算是超級管理員使用者也無法修改(報錯:ERROR 1449 (HY000): The user specified as a definer ('mysql.sys'@'localhost') does not exist),如果不小心刪除了mysql.sys使用者 ,可以使用如下語句重新建立(注意:使用create語句建立使用者會失敗,報錯:ERROR 1396 (HY000): Operation CREATE USER failed for 'mysql.sys'@'localhost',所以,強烈不建議刪除mysql.sys使用者,因為grant建立使用者的語法即將廢棄,當然,如果在不支援grant語句建立使用者的MySQL版本中刪了mysql.sys使用者,也有辦法補救,比如:直接insert使用者許可權表或者drop掉觸發器再指定INVOKER=mysql.sys@localhost)

grant TRIGGER on sys.* to 'mysql.sys'@'localhost' identified by 'letsg0';
# 注意:mysql.sys使用者初始化預設對錶sys.sys_config表只有select許可權,無法呼叫sys_config_insert_set_user和sys_config_update_set_user觸發器完成更新set_by欄位為當前操作使用者名稱,會報錯
# ERROR 1143 (42000): UPDATE command denied to user 'mysql.sys'@'localhost' for column 'set_by' in table 'sys_config',所以要實現這個功能,針對sys.sys_config表還需要新增insert和update許可權給mysql.sys使用者
grant select,insert,update on sys.sys_config to 'mysql.sys'@'localhost' identified by 'letsg0';

2. sys_config_insert_set_user觸發器

當對sys_config表執行INSERT語句新增配置選項行時,sys_config_insert_set_user觸發器會將sys_config表的set_by列設定為當前使用者名稱。

* mysql.sys使用者初始化預設對sys.sys_config表只有select許可權,無法呼叫sys_config_insert_set_user和sys_config_update_set_user觸發器完成更新set_by欄位為當前操作使用者名稱,會報錯ERROR 1143 (42000): UPDATE command denied to user 'mysql.sys'@'localhost' for column 'set_by' in table 'sys_config',所以要實現這個功能,針對sys.sys_config表還需要新增insert和update許可權給mysql.sys使用者 

@sys.ignore_sys_config_triggers自定義變數必須為0值,任何非0值將導致該觸發器不執行更新set_by欄位操作

  • 注意事項:要使得該觸發器生效,有如下三個條件: 

    mysql.sys使用者必須存在,因為定義語句中DEFINER='mysql.sys'@'localhost' 表示只有該使用者才能夠呼叫該觸發器,當然,為了方便,你可以刪掉這個觸發器,然後使用INVOKER='mysql.sys'@'localhost'子句建立 

sys_config_insert_set_user觸發器定義語句如下:

DROP TRIGGER IF EXISTS sys_config_insert_set_user;
DELIMITER $$
CREATE DEFINER='mysql.sys'@'localhost' TRIGGER sys_config_insert_set_user BEFORE INSERT on sys_config
FOR EACH ROW
BEGIN
IF @sys.ignore_sys_config_triggers != true AND NEW.set_by IS NULL THEN
    SET NEW.set_by = USER();
END IF;
END$$
DELIMITER ;

3. sys_config_update_set_user觸發器

當對sys_config表執行UPDATE語句新增配置選項行時,sys_config_update_set_user觸發器會將sys_config表的set_by列設定為當前使用者名稱

  • 注意事項:同sys_config_insert_set_user觸發器注意事項

sys_config_update_set_user觸發器定義語句如下:

DROP TRIGGER IF EXISTS sys_config_update_set_user;
DELIMITER $$
CREATE DEFINER='mysql.sys'@'localhost' TRIGGER sys_config_update_set_user BEFORE UPDATE on sys_config
FOR EACH ROW
BEGIN
IF @sys.ignore_sys_config_triggers != true AND NEW.set_by IS NULL THEN
    SET NEW.set_by = USER();
END IF;
END$$
DELIMITER ;

本期內容就介紹到這裡,本期內容參考連結如下:

  • https://dev.mysql.com/doc/refman/5.7/en/sys-sys-config-update-set-user.html

  • https://dev.mysql.com/doc/refman/5.7/en/sys-schema-tables.html

  • https://dev.mysql.com/doc/refman/5.7/en/sys-sys-config-insert-set-user.html

  • https://dev.mysql.com/doc/refman/5.7/en/sys-sys-config.html

| 作者簡介

羅小波·沃趣科技高階資料庫技術專家

IT從業多年,歷任運維工程師,高階運維工程師,運維經理,資料庫工程師,曾參與版本釋出系統,輕量級監控系統,運維管理平臺,資料庫管理平臺的設計與編寫,熟悉MySQL的體系結構時,InnoDB儲存引擎,喜好專研開源技術,追求完美。

相關推薦

配置 | 全方位認識 sys 系統

在上一篇《初相識 | 全方位認識 sys 系統庫》中,我們針對sys 系統庫做了一個不痛不癢的開端,是不是覺得太簡單了?別急,本期我們將為大家帶來系列第二篇《配置表|全方位認識 sys 系統庫》,讓你一次性重新找回學習performance_schema時的感覺,下面請跟隨我

配置查詢與執行緒追蹤函式|全方位認識 sys 系統

不知不覺中,我們的"全方位認識 sys 系統庫" 系列文章已經接近尾聲了,在上一篇《字串與數字轉換函式|全方位認識 sys 系統庫》中,我們介紹了sys 系統庫中用於字串和數字格式化轉換的函式,本期的內容給大家介紹 sys 系統庫中的剩餘函式,這也是本系列文章的最後一篇。 PS:下文中如果函式定

用於檢視配置的儲存過程 | 全方位認識 sys 系統

在上一篇《用於修改配置的儲存過程 | 全方位認識 sys 系統庫》中,我們介紹了sys 系統庫中用於修改配置的儲存過程,利用這些儲存過程可以代替修改performance_schema配置表的DML語句等操作,本期的內容講介紹用於檢視performance_schema配置資訊的儲存過程。 PS

記憶體分配統計檢視 | 全方位認識 sys 系統

在上一篇《按 file 分組統計檢視 | 全方位認識 sys 系統庫》中,我們介紹了sys 系統庫中按 file 分組統計的檢視,本期的內容將為大家介紹記憶體事件和innodb buffer pool記憶體分配的統計檢視。下面請跟隨我們一起開始 sys 系統庫的系統學習之旅吧。 PS:

語句效率統計檢視 | 全方位認識 sys 系統

在上一篇《統計資訊查詢檢視|全方位認識 sys 系統庫》中,我們介紹了利用sys 系統庫的查詢統計資訊的快捷檢視,本期將為大家介紹語句查詢效率語句統計資訊相關的檢視,這些檢視可以快速找出資料庫中哪些語句使用了全表掃描、哪些語句使用了檔案排序、哪些語句使用了臨時表。 PS:由於本文中所提及的檢視功

統計資訊查詢檢視 | 全方位認識 sys 系統

在上一篇《會話和鎖資訊查詢檢視|全方位認識 sys 系統庫》中,我們介紹瞭如何使用 sys 系統庫總的檢視來查詢會話狀態資訊以及鎖等待資訊,本期的內容先給大家介紹查詢表和索引相關的統計資訊快捷檢視。下面請跟隨我們一起開始 sys 系統庫的系統學習之旅吧。 PS:由於本文中所提及的檢視功能的特殊性

字串與數字轉換函式 | 全方位認識 sys 系統

本系列在之前的文章中我們為大家介紹了sys 系統庫的快捷檢視、函式,本期開始我們將為大家介紹 sys 系統庫的函式。 PS:下文中如果函式定義文字較短的會列出部分函式的定義文字,以便大家更直觀地學習它們。過長的函式定義文字請自行按照《初相識|全方位認識 sys 系統庫》一文

按 host 分組統計檢視 | 全方位認識 sys 系統

在上一篇《配置表|全方位認識 sys 系統庫》中,我們介紹了sys 系統庫的配置表,但實際上我們大部分人大多數時候並不需要去修改配置表,直接使用sys 系統庫下的檢視來獲取所需的資料即可,sys 系統庫下一共有100多檢視,這些檢視都能夠給我們提供一些什麼樣的資訊呢?本期的內

會話和鎖資訊查詢檢視 | 全方位認識 sys 系統

在上一篇《等待事件統計檢視 | 全方位認識 sys 系統庫》中,我們介紹了sys 系統庫中的等待事件統計檢視,本期的內容先給大家介紹會話資訊和鎖等待資訊查詢檢視,通過這些檢視我們可以清晰地知道每個會話正在做什麼事情,是否存在鎖等待。下面請跟隨我們一起開始 sys 系統庫的系統

單元一:認識數據系統

之間 建立 相關 控制 使用 數據庫系統 關系模型 類型 style 1、 ACCESS 2010是Microsoft office 2010 辦公軟件的組件之一,也是新一代的桌面數據庫管理系統。 2、 數據:存儲於某種媒體的物理符號序列,是一種未經加工的原始資料

java實現標準化考試系統詳解(二)-----資料庫、資料的規劃和題增刪改查

(一)、資料庫、資料表的規劃 首先我們需要考慮一下作為考試系統我們需要哪些資料,這些資料將以後作為欄位值出現。 我們先來看看這張圖: 圖中框起來的部分基本上就是我們需要的資料,細數數就是: 1.試題序號,它作為主鍵出現不可以重複(id) 2.適用工程,可以理解為這個題適用

MySQL的 初步認識

一、安裝&完全解除安裝   1、引導式安裝  https://dev.mysql.com/downloads/installer/   2、下載壓縮包,解壓後用控制檯安裝     初始化  mysqld --initialize-insecure     安裝  mysqld --instal

MySQL 5.7中sys是一個MySQL自帶的系統

MySQL 5.7中引入了一個新的sys schema,sys是一個MySQL自帶的系統庫,在安裝MySQL 5.7以後的版本,使用mysqld進行初始化時,會自動建立sys庫, sys庫裡面的表、檢視、函式、儲存過程可以使我們更方便、快捷的瞭解到MySQL的一些資訊,比

沃趣羅小波《全方位認識MySQL sys schema》

特邀嘉賓羅 小 波沃趣科技高階資料庫工程師行走IT大江湖多年曾參與版本釋出系統、輕量級監控系統、

SpringBoot中配置起動時的數據sql文件執行控制臺不報錯卻沒有建

控制臺 scheme eas app ini 控制 執行 不為 release 使用SpringBoot2.0.4Release版本 因為SpringBoot在啟動時,只有檢測到spring.datasource.initialization-mode=ALWAYS配置,

TensorFlow-GPU環境配置之一——安裝Ubuntu雙系統

啟動 windows src 技術 截圖 建立 交換空間 windows系統 空間 本機已經安裝過Windows系統,準備安裝Ubuntu雙系統進行TensorFlow相關工作,需要在windows中將磁盤分出一定空間供Ubuntu使用 1.首先下載Ubuntu17.04版

git config配置,工作區和版本聯系。

linu htm 相關 lfs global intro git bash .text desktop 關於git和github的介紹,我這邊不多說。 使用在windows下使用git,需要配置環境變量,也可以使用git自帶的終端工具。,打開git bash [e

如何在Linux操作系統下搭建配置流媒體服務器系統

Linux 流媒體系統 鑒於服務器端的安全性因素,更多的網絡管理員更願意在Linux操作系統下搭建流媒體服務器系統進行互聯網的實時直播和點播。那麽如何在Linux操作系統下安裝和配置流媒體服務器系統呢?下面是詳細的安裝配置說明。(以八百裏流媒體服務器系統的Linux的安裝和配置為例說明)

oracle11g文件系統遷移到ASM上面

eight 狀態 mage 實例 temp 文件系統 控制文件 更改 over   最近把oracle11g的文件系統庫遷移到了asm庫上面。   遷移過程大致如下:     最少停機方案: 實例joinpay02 | |數

《SQL Server企業級平臺管理實踐》讀書筆記——SQL Server中關於系統Tempdb總結

lis 定義函數 into 不能 get 裏的 where requests tar Tempdb系統數據庫是一個全局資源。可供連接到SQL Server實例的全部用戶使用。 存儲的內容項: 1、用戶對象 用戶對象由用戶顯示創建。這些對象能夠位於用戶會話的作用域