構成表|全方位認識sysシステムライブラリ

11600 ワード

前回の「初対面|全方位認識sysシステムライブラリ」では、sysシステムライブラリに対して痛くもかゆくもないスタートを切ったのですが、簡単すぎると思いますか?急いではいけません.今期はシリーズ第2編「構成表|全方位認識sysシステムライブラリ」を持ってきて、一度に学習performanceを取り戻します.schemaの時の感覚は、sysシステムライブラリのシステム学習の旅を一緒に始めましょう.
 
|sysシステムライブラリ構成
1. sys_configテーブル
この表にはsysシステムライブラリの構成オプションが含まれており、各構成オプションに1行ずつ記録されています.このテーブルはinnodbテーブルで、クライアントがこのテーブルを更新することで構成を永続化でき、serverの再起動が失われません.
 
sys_configテーブルフィールドの意味は次のとおりです.
  • variable:構成オプション名
  • value:構成オプション値
  • set_time:ロー構成の最近の変更時間
  • set_by:改行構成を最近変更した勘定科目名.サーバがsysシステムライブラリをインストールしてからロー構成が変更されていない場合、カラム値はNULL
  • です.
     
    sys_を減らすためにconfigテーブルの直接読み取り回数、sysシステムライブラリのビュー、ストレージ・プロシージャがこれらの構成オプションを使用する必要がある場合、これらのコンフィギュレーション・オプションに対応するユーザー定義コンフィギュレーション・オプション変数が優先的にチェックされます(ユーザー定義コンフィギュレーション・オプション変数は、テーブルのdiagnostics.include_rawオプションと同じ名前で、対応するカスタム設定オプション変数は@sys.diagnostics.include_raw).ユーザー定義の構成オプション変数が現在のセッション役割ドメインに存在し、空ではない場合、sysシステムライブラリの関数、ストレージ・プロシージャは、この構成オプション変数値を優先的に使用します.そうでない場合、sysシステムライブラリ関数とストレージ・プロシージャはsys_を使用します.configテーブルのコンフィギュレーション・オプション値(コンフィギュレーション・オプション値がテーブルから読み込まれると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,              
    admin@localhost : sys 11:47:37> select @sys.statement_truncate_len;
    +-----------------------------+
    | @sys.statement_truncate_len |
    +-----------------------------+
    | NULL                        |
    +-----------------------------+
    1 row in set (0.00 sec)
    admin@localhost : sys 11:51:53> SET @stmt = 'SELECT variable, value, set_time, set_by FROM sys_config';
    Query OK, 0 rows affected (0.00 sec)
    admin@localhost : 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()    ,                      
    admin@localhost : sys 11:52:12> select @sys.statement_truncate_len;
    +-----------------------------+
    | @sys.statement_truncate_len |
    +-----------------------------+
    | 64                          |
    +-----------------------------+
    1 row in set (0.00 sec)
    #          32
    admin@localhost : sys 11:52:20> set @sys.statement_truncate_len = 32;
    Query OK, 0 rows affected (0.00 sec)
    admin@localhost : 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
    admin@localhost : 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_95 th_percentileビューには、実行時間の合計分布に占める95パーセントの平均実行時間の文のみが返されるという制限が組み込まれています).このオプションはMySQL 5.7.9に
  • を追加します.
  • statement_performance_analyzer.view,@sys.statement_performance_analyzer.view:statement_へperformance_analyzer()ストレージ・プロシージャは、diagnostics()ストレージ・プロシージャによって内部的に呼び出されるカスタム・クエリーまたはビュー名として使用されます.このオプションの値にスペースが含まれている場合は、その値をクエリー文として解釈します.それ以外の場合はビュー名として解釈され、performance_をクエリーするために事前に作成されている必要があります.schema.events_statements_summary_by_digestテーブルのビュー.statement_performance_analyzer.Limit構成オプション値が0より大きい場合statement_performance_analyzer.view構成オプションで指定されたクエリー文またはビューには、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テーブルにあります.たとえば、null値でなくdebug構成オプションがある場合、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;

    記録内容の例
    admin@localhost : 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は、この2つのトリガ定義時にDEFINER=mysql.sys@localhostを指定する(このトリガはmysql.sysユーザーでしか呼び出せないことを示す)、so.このユーザーは存在しなければなりません(MySQLをセキュリティ強化する子供は注意してください.mysql.userテーブルに対してtruncateなどの操作を直接しないでください.まず、テーブルにどのユーザーが存在するかを見てください).そうしないとsys_configテーブルの操作時にスーパー管理者ユーザーでも修正できない(エラー:ERROR 1449(HY 000):The user specified as a definer('mysql.sys'@'localhost')does not exist)mysqlを誤って削除した場合.Sysユーザーは、次の文を使用して再作成することができます(注意:create文を使用してユーザーを作成すると失敗します.エラー:ERROR 1396(HY 000):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の3つの条件がある.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のストレージエンジン、専らオープンソース技術を研究することが好きで、完璧を追求します.