暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MYSQL SYS库 03

155

MYSQL SYS库 02

MYSQL的SYS库01

 火龙身形缩小到只有十几丈的长度,在熔岩之海内遨游,在这里,不容易被人发现目标。

    实际上整个天龙火域是没有真正陆地的,那所谓的陆地,不过是漂浮在熔岩之海上的巨大岛屿而已。

    所以在熔岩之海内,基本上可以到达任何一个地方,一路前行,火龙不断壮大,因为它的一道又一道分身都被召唤了回来。

字符串与数字转换函数

 extract_schema_from_file_name()


从给定文件的绝对路径中提取schema名称,该函数在sys.x$ps_schema_table_statistics_io视图中调用,当然你也可以在自定义视图中调用

  • 此函数假定给定的所有数据文件都位于datadir目录下,因此,如果说表是分区表或者使用了单独的表选项定义了自己的DATA_DIRECTORY路径,那么虽然能够正确返回数据库的名称,但是后续使用这个数据库名称与其他视图联结使用时将无法在datadir下找到相应的表数据文件

  • 该函数在拥有一个数据文件的完整路径时用这个路径作为传入参数提取performance_schema中的文件I/O信息非常实用, 它提供了一种便捷的方式来获取schema名,比完整路径名更容易理解,并且该返回的schema名称字符串值后续可以用于联结查询

参数:

  • path VARCHAR(512):一个用于提取schema名称的完整数据文件路径

返回值:是一个VARCHAR(64)字符串,即schema名称字符串

函数定义语句文本

DROP FUNCTION IF EXISTS extract_schema_from_file_name;
DELIMITER $$
CREATE DEFINER='root'@'localhost' FUNCTION extract_schema_from_file_name (
    path VARCHAR(512)
)
RETURNS VARCHAR(64)
COMMENT '
        Description
        -----------

        Takes a raw file path, and attempts to extract the schema name from it.

        Useful for when interacting with Performance Schema data 
        concerning IO statistics, for example.

        Currently relies on the fact that a table data file will be within a 
        specified database directory (will not work with partitions or tables
        that specify an individual DATA_DIRECTORY).

        Parameters
        -----------

        path (VARCHAR(512)):
          The full file path to a data file to extract the schema name from.

        Returns
        -----------

        VARCHAR(64)

        Example
        -----------

        mysql> SELECT sys.extract_schema_from_file_name(\'/var/lib/mysql/employees/employee.ibd\');
        +----------------------------------------------------------------------------+
        | sys.extract_schema_from_file_name(\'/var/lib/mysql/employees/employee.ibd\') |
        +----------------------------------------------------------------------------+
        | employees                                                                  |
        +----------------------------------------------------------------------------+
        1 row in set (0.00 sec)
        '

SQL SECURITY INVOKER
DETERMINISTIC
NO SQL
BEGIN
RETURN LEFT(SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(path'\\''/'), '/'-2), '/'1), 64);
END$$
DELIMITER ;


extract_table_from_file_name()


从给定文件绝对路径名中提取表名,该函数在sys.x$ps_schema_table_statistics_io视图中调用,当然你也可以在自定义视图中调用

  • 该函数在拥有一个数据文件的完整路径时用这个路径作为传入参数提取performance_schema中的文件I/O信息非常实用, 它提供了一种便捷的方式来获取表名,比完整路径名更容易理解,并且该返回的表名称字符串值后续可以用于联结查询

参数:

  • path VARCHAR(512):一个用于提取表名称的完整数据文件路径

返回值:是一个VARCHAR(64)字符串,即表名称字符串

函数定义语句文本

DROP FUNCTION IF EXISTS extract_table_from_file_name;
DELIMITER $$
CREATE DEFINER='root'@'localhost' FUNCTION extract_table_from_file_name (
    path VARCHAR(512)
)
RETURNS VARCHAR(64)
COMMENT '
        Description
        -----------

        Takes a raw file path, and extracts the table name from it.

        Useful for when interacting with Performance Schema data 
        concerning IO statistics, for example.

        Parameters
        -----------

        path (VARCHAR(512)):
          The full file path to a data file to extract the table name from.

        Returns
        -----------

        VARCHAR(64)

        Example
        -----------

        mysql> SELECT sys.extract_table_from_file_name(\'/var/lib/mysql/employees/employee.ibd\');
        +---------------------------------------------------------------------------+
        | sys.extract_table_from_file_name(\'/var/lib/mysql/employees/employee.ibd\') |
        +---------------------------------------------------------------------------+
        | employee                                                                  |
        +---------------------------------------------------------------------------+
        1 row in set (0.02 sec)
        '

SQL SECURITY INVOKER
DETERMINISTIC
NO SQL
BEGIN
RETURN LEFT(SUBSTRING_INDEX(REPLACE(SUBSTRING_INDEX(REPLACE(path'\\''/'), '/'-1), '@0024''$'), '.'1), 64);
END$$
DELIMITER ;


 format_bytes()


将字节值转换为其他单位的值(可读性更好的格式),根据字节数值大小,自动转换为KB、MB、GB、TB、PB这些可读单位(返回值由转换过的值+单位组成),该函数在其他视图中大量使用

参数:

  • bytes TEXT:要格式化的字节文本值

回报值:一个TEXT文本值

函数定义语句文本

 DROP FUNCTION IF EXISTS format_bytes;
 DELIMITER $$
 CREATE DEFINER='root'@'localhost' FUNCTION format_bytes (
    -- We feed in and return TEXT here, as aggregates of
    -- bytes can return numbers larger than BIGINT UNSIGNED
    bytes TEXT
)
RETURNS TEXT
COMMENT '
        Description
        -----------

        Takes a raw bytes value, and converts it to a human readable format.

        Parameters
        -----------

        bytes (TEXT):
          A raw bytes value.

        Returns
        -----------

        TEXT

        Example
        -----------

        mysql> SELECT sys.format_bytes(2348723492723746AS size;
        +----------+
        | size    |
        +----------+
        | 2.09 PiB |
        +----------+
        1 row in set (0.00 sec)

        mysql> SELECT sys.format_bytes(2348723492723AS size;
        +----------+
        | size    |
        +----------+
        | 2.14 TiB |
        +----------+
        1 row in set (0.00 sec)

        mysql> SELECT sys.format_bytes(23487234AS size;
        +-----------+
        | size      |
        +-----------+
        | 22.40 MiB |
        +-----------+
        1 row in set (0.00 sec)
        '
SQL SECURITY INVOKER
DETERMINISTIC
NO SQL
BEGIN
IF bytes IS NULL THEN RETURN NULL;
ELSEIF bytes >= 1125899906842624 THEN RETURN CONCAT(ROUND(bytes / 11258999068426242), ' PiB');
ELSEIF bytes >= 1099511627776 THEN RETURN CONCAT(ROUND(bytes / 10995116277762), ' TiB');
ELSEIF bytes >= 1073741824 THEN RETURN CONCAT(ROUND(bytes / 10737418242), ' GiB');
ELSEIF bytes >= 1048576 THEN RETURN CONCAT(ROUND(bytes / 10485762), ' MiB');
ELSEIF bytes >= 1024 THEN RETURN CONCAT(ROUND(bytes / 10242), ' KiB');
ELSE RETURN CONCAT(ROUND(bytes, 0), ' bytes');
END IF;
END$$
DELIMITER ;


 format_path()


用变量符号值替换路径名中匹配到的datadir、tmpdir、slave_load_tmpdir、innodb_data_home_dir、innodb_log_group_home_dir、basedir、innodb_undo_directory系统变量值,给定null值返回null,给定值不匹配的直接返回原值,该函数在其他视图中大量使用

  • 在MySQL 5.7.14之前,Windows路径名中的反斜杠()将在返回值中转换为正斜杠(/)

参数:

  • path VARCHAR(512):要格式化转换的完整路径名

返回值:一个VARCHAR(512) CHARACTER SET utf8 值

示例

mysql> SELECT format_path('/usr/local/mysql/data/world/City.ibd');
+-----------------------------------------------------+
| format_path('/usr/local/mysql/data/world/City.ibd') |
+-----------------------------------------------------+
| @@datadir/world/City.ibd                            |
+-----------------------------------------------------+


 format_statement()


将长SQL语句文本截断为固定长度,该长度由配置变量@sys.statement_truncate_len控制,默认值在sys_config表中为64字节,如果语句文本少于statement_truncate_len,@sys.statement_truncate_len配置选项的长度则语句不会被截断,如果大于了配置选项指定的长度,则语句会被截断,执行截取操作时,中间部分被省略号替换(截取前30字节+'... '+ 后30字节,然后把这64字节中包含的\n字符替换为空格),该函数在其他视图中大量使用

  • 该函数在其他视图,存储过程中大量使用,用于把performance_schema中的超长语句格式化为固定的长度

参数:

  • statement LONGTEXT:需要执行格式化的SQL语句文本

配置选项:可以使用以下配置选项或其相应的用户定义变量来修改format_statement()函数的截断最大长度

  • statement_truncate_len,@sys.statement_truncate_len:format_statement()函数返回的语句文本的最大长度。超长的语句文本将被截断。默认值为64字节

返回值:一个LONGTEXT长文本值

函数定义语句文本

DROP FUNCTION IF EXISTS format_statement;
DELIMITER $$
CREATE DEFINER='root'@'localhost' FUNCTION format_statement (
    statement LONGTEXT
)
RETURNS LONGTEXT
COMMENT '
        Description
        -----------

        Formats a normalized statement, truncating it if it is > 64 characters long by default.

        To configure the length to truncate the statement to by default, update the `statement_truncate_len`
        variable with `sys_config` table to a different value. Alternatively, to change it just for just 
        your particular session, use `SET @sys.statement_truncate_len := <some new value>`.

        Useful for printing statement related data from Performance Schema from 
        the command line.

        Parameters
        -----------

        statement (LONGTEXT): 
          The statement to format.

        Returns
        -----------

        LONGTEXT

        Example
        -----------

        mysql> SELECT sys.format_statement(digest_text)
            ->  FROM performance_schema.events_statements_summary_by_digest
            ->  ORDER by sum_timer_wait DESC limit 5;
        +-------------------------------------------------------------------+
        | sys.format_statement(digest_text)                                |
        +-------------------------------------------------------------------+
        | CREATE SQL SECURITY INVOKER VI ... KE ? AND `variable_value` > ?  |
        | CREATE SQL SECURITY INVOKER VI ... ait` IS NOT NULL , `esc` . ... |
        | CREATE SQL SECURITY INVOKER VI ... ait` IS NOT NULL , `sys` . ... |
        | CREATE SQL SECURITY INVOKER VI ...  , `compressed_size` ) ) DESC  |
        | CREATE SQL SECURITY INVOKER VI ... LIKE ? ORDER BY `timer_start`  |
        +-------------------------------------------------------------------+
        5 rows in set (0.00 sec)
        '
SQL SECURITY INVOKER
DETERMINISTIC
NO SQL
BEGIN
-- Check if we have the configured length, if not, init it
IF @sys.statement_truncate_len IS NULL THEN
  SET @sys.statement_truncate_len = sys_get_config('statement_truncate_len', 64);
END IF;

IF CHAR_LENGTH(statement) > @sys.statement_truncate_len THEN
  RETURN REPLACE(CONCAT(LEFT(statement, (@sys.statement_truncate_len/2)-2), ' ... ', RIGHT(statement, (@sys.statement_truncate_len/2)-2)), '\n', ' ');
ELSE
  RETURN REPLACE(statement, '\n', ' ');
END IF;
END$$
DELIMITER ;


format_time()


将皮秒值转换为其他可读性更好的单位值,根据皮秒值大小,自动转换为ns、us、ms、s、m、h、d、w这些可读单位(返回值由转换过的值+单位组成),该函数在其他视图中大量使用

参数:

  • picoseconds TEXT:要进行单位转换的皮秒文本值

返回值:一个TEXT文本值

函数定义语句文本

DROP FUNCTION IF EXISTS format_time;
DELIMITER $$
CREATE DEFINER='root'@'localhost' FUNCTION format_time (
    -- We feed in and return TEXT here, as aggregates of
    -- picoseconds can return numbers larger than BIGINT UNSIGNED
    picoseconds TEXT
)
RETURNS TEXT CHARSET UTF8
COMMENT '
        Description
        -----------

        Takes a raw picoseconds value, and converts it to a human readable form.

        Picoseconds are the precision that all latency values are printed in 
        within Performance Schema, however are not user friendly when wanting
        to scan output from the command line.

        Parameters
        -----------

        picoseconds (TEXT): 
          The raw picoseconds value to convert.

        Returns
        -----------

        TEXT

        Example
        -----------

        mysql> select format_time(342342342342345);
        +------------------------------+
        | format_time(342342342342345) |
        +------------------------------+
        | 00:05:42                    |
        +------------------------------+
        1 row in set (0.00 sec)

        mysql> select format_time(342342342);
        +------------------------+
        | format_time(342342342) |
        +------------------------+
        | 342.34 us              |
        +------------------------+
        1 row in set (0.00 sec)

        mysql> select format_time(34234);
          +--------------------+
        | format_time(34234) |
        +--------------------+
        | 34.23 ns          |
        +--------------------+
        1 row in set (0.00 sec)
        '
SQL SECURITY INVOKER
DETERMINISTIC
NO SQL
BEGIN
IF picoseconds IS NULL THEN RETURN NULL;
ELSEIF picoseconds >= 604800000000000000 THEN RETURN CONCAT(ROUND(picoseconds / 6048000000000000002), ' w');
ELSEIF picoseconds >= 86400000000000000 THEN RETURN CONCAT(ROUND(picoseconds / 864000000000000002), ' d');
ELSEIF picoseconds >= 3600000000000000 THEN RETURN CONCAT(ROUND(picoseconds / 36000000000000002), ' h');
ELSEIF picoseconds >= 60000000000000 THEN RETURN CONCAT(ROUND(picoseconds / 600000000000002), ' m');
ELSEIF picoseconds >= 1000000000000 THEN RETURN CONCAT(ROUND(picoseconds / 10000000000002), ' s');
ELSEIF picoseconds >= 1000000000 THEN RETURN CONCAT(ROUND(picoseconds / 10000000002), ' ms');
ELSEIF picoseconds >= 1000000 THEN RETURN CONCAT(ROUND(picoseconds / 10000002), ' us');
ELSEIF picoseconds >= 1000 THEN RETURN CONCAT(ROUND(picoseconds / 10002), ' ns');
ELSE RETURN CONCAT(picoseconds, ' ps');
END IF;
END$$
DELIMITER ;


 list_add()


将指定文本添加到一个指定名称的列表中,由两个传参定义,传入一个列表和一个字符串,返回值为在这个传入列表基础上添加了传入字符串的列表,如添加会话级别的sql_mode:set sql_mode=select sys.list_add(@@sql_mode,'ANSI_QUOTES');利用该函数来操作一些列表型系统变量可以减少人工赋值的失误

  • 此函数和list_drop()函数一起可用于操作具有列表类型值的系统变量值的添加和删除,例如:sql_mode和optimizer_switch系统变量值具有一个逗号分隔的列表值

  • 此函数在MySQL 5.7.9中新增

参数:

  • in_list TEXT:要修改值的列表变量名称,注意:该参数只能传入变量类型值,不能是字符串值,详见函数定义语句注释部分示例

  • in_add_value TEXT:要添加到列表变量中的具体字符串值

返回值:一个TEXT文本值

函数定义语句文本

DROP FUNCTION IF EXISTS list_add;
DELIMITER $$
CREATE DEFINER='root'@'localhost' FUNCTION list_add (
    in_list TEXT,
    in_add_value TEXT
)
RETURNS TEXT
COMMENT '
        Description
        -----------

        Takes a list, and a value to add to the list, and returns the resulting list.

        Useful for altering certain session variables, like sql_mode or optimizer_switch for instance.

        Parameters
        -----------

        in_list (TEXT):
          The comma separated list to add a value to

        in_add_value (TEXT):
          The value to add to the input list

        Returns
        -----------

        TEXT

        Example
        --------

        mysql> select @@sql_mode;
        +-----------------------------------------------------------------------------------+
        | @@sql_mode                                                                        |
        +-----------------------------------------------------------------------------------+
        | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
        +-----------------------------------------------------------------------------------+
        1 row in set (0.00 sec)

        mysql> set sql_mode = sys.list_add(@@sql_mode, ''ANSI_QUOTES'');
        Query OK, 0 rows affected (0.06 sec)

        mysql> select @@sql_mode;
        +-----------------------------------------------------------------------------------------------+
        | @@sql_mode                                                                                    |
        +-----------------------------------------------------------------------------------------------+
        | ANSI_QUOTES,ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
        +-----------------------------------------------------------------------------------------------+
        1 row in set (0.00 sec)

        '
SQL SECURITY INVOKER
DETERMINISTIC
CONTAINS SQL
BEGIN

IF (in_add_value IS NULL) THEN
    SIGNAL SQLSTATE '02200'
      SET MESSAGE_TEXT = 'Function sys.list_add: in_add_value input variable should not be NULL',
          MYSQL_ERRNO = 1138;
END IF;

IF (in_list IS NULL OR LENGTH(in_list) = 0THEN
    -- return the new value as a single value list
    RETURN in_add_value;
END IF;

RETURN (SELECT CONCAT(TRIM(BOTH ',' FROM TRIM(in_list)), ',', in_add_value));
END$$
DELIMITER ;


list_drop()


与list_add()函数类似,只是是从传入列表中删除传入字符串

  • 此函数在MySQL 5.7.9中新增

参数:

  • in_list TEXT:要修改值的列表变量名称,注意:该参数只能传入变量类型值,不能是字符串值,详见函数定义语句注释部分示例

  • in_drop_value TEXT:要从列表变量中删除的文本值

返回值:一个TEXT文本值

函数定义语句文本

DROP FUNCTION IF EXISTS list_drop;
DELIMITER $$
CREATE DEFINER='root'@'localhost' FUNCTION list_drop (
    in_list TEXT,
    in_drop_value TEXT
)
RETURNS TEXT
COMMENT '
        Description
        -----------

        Takes a list, and a value to attempt to remove from the list, and returns the resulting list.

        Useful for altering certain session variables, like sql_mode or optimizer_switch for instance.

        Parameters
        -----------

        in_list (TEXT):
          The comma separated list to drop a value from

        in_drop_value (TEXT):
          The value to drop from the input list

        Returns
        -----------

        TEXT

        Example
        --------

        mysql> select @@sql_mode;
        +-----------------------------------------------------------------------------------------------+
        | @@sql_mode                                                                                    |
        +-----------------------------------------------------------------------------------------------+
        | ANSI_QUOTES,ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
        +-----------------------------------------------------------------------------------------------+
        1 row in set (0.00 sec)

        mysql> set sql_mode = sys.list_drop(@@sql_mode, ''ONLY_FULL_GROUP_BY'');
        Query OK, 0 rows affected (0.03 sec)

        mysql> select @@sql_mode;
        +----------------------------------------------------------------------------+
        | @@sql_mode                                                                |
        +----------------------------------------------------------------------------+
        | ANSI_QUOTES,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
        +----------------------------------------------------------------------------+
        1 row in set (0.00 sec)

        '

SQL SECURITY INVOKER
DETERMINISTIC
CONTAINS SQL
BEGIN

IF (in_drop_value IS NULLTHEN
    SIGNAL SQLSTATE '02200'
      SET MESSAGE_TEXT = 'Function sys.list_drop: in_drop_value input variable should not be NULL',
          MYSQL_ERRNO = 1138;
END IF;

IF (in_list IS NULL OR LENGTH(in_list) = 0) THEN
    -- return the list as it was passed in
    RETURN in_list;
END IF;

-- ensure that leading / trailing commas are remove, support values with either spaces or not between commas
RETURN (SELECT TRIM(BOTH ',' FROM REPLACE(REPLACE(CONCAT(',', in_list), CONCAT(',', in_drop_value), ''), CONCAT(', ', in_drop_value), '')));
END$$
DELIMITER ;

 火龙身形缩小到只有十几丈的长度,在熔岩之海内遨游,在这里,不容易被人发现目标。

    实际上整个天龙火域是没有真正陆地的,那所谓的陆地,不过是漂浮在熔岩之海上的巨大岛屿而已。

    所以在熔岩之海内,基本上可以到达任何一个地方,一路前行,火龙不断壮大,因为它的一道又一道分身都被召唤了回来。

1.ps_is_account_enabled()

检查在performance_schema.setup_actors表中是否启用了对应account的性能事件监控功能,返回YES或者NO

参数:

  • in_host VARCHAR(60):要检查的帐户的主机名

  • in_user VARCHAR(32):要检查的帐户的用户名

返回值:一个枚举类型值,ENUM('YES','NO'),注意:返回值仅仅是依赖于在performance_schema.setup_actors表中找匹配记录而不管该帐号是否在mysql.user表中存在,如果在setup_actors表中开启了任意帐号的监控,那么就算在mysql.user中不存在的用户,也会返回YES

 火龙身形缩小到只有十几丈的长度,在熔岩之海内遨游,在这里,不容易被人发现目标。

    实际上整个天龙火域是没有真正陆地的,那所谓的陆地,不过是漂浮在熔岩之海上的巨大岛屿而已。

    所以在熔岩之海内,基本上可以到达任何一个地方,一路前行,火龙不断壮大,因为它的一道又一道分身都被召唤了回来。

函数定义语句文本

DROP FUNCTION IF EXISTS ps_is_account_enabled;
DELIMITER $$
CREATE DEFINER='root'@'localhost' FUNCTION ps_is_account_enabled (
    in_host VARCHAR(60),
    in_user VARCHAR(32)
)
RETURNS ENUM('YES''NO')
COMMENT '
        Description
        -----------

        Determines whether instrumentation of an account is enabled 
        within Performance Schema.

        Parameters
        -----------

        in_host VARCHAR(60): 
          The hostname of the account to check.
        in_user VARCHAR(32):
          The username of the account to check.

        Returns
        -----------

        ENUM(\'YES\', \'NO\', \'PARTIAL\')

        Example
        -----------

        mysql> SELECT sys.ps_is_account_enabled(\'localhost\', \'root\');
        +------------------------------------------------+
        | sys.ps_is_account_enabled(\'localhost\', \'root\') |
        +------------------------------------------------+
        | YES                                            |
        +------------------------------------------------+
        1 row in set (0.01 sec)
        '

SQL SECURITY INVOKER
DETERMINISTIC
READS SQL DATA
BEGIN
RETURN IF(EXISTS(SELECT 1
                  FROM performance_schema.setup_actors
                  WHERE (`HOST` = '%' OR in_host LIKE `HOST`)
                    AND (`USER` = '%' OR `USER` = in_user)
                    AND (`ENABLED` = 'YES')
                ),
          'YES''NO'
      );
END$$
DELIMITER ;

 火龙身形缩小到只有十几丈的长度,在熔岩之海内遨游,在这里,不容易被人发现目标。

    实际上整个天龙火域是没有真正陆地的,那所谓的陆地,不过是漂浮在熔岩之海上的巨大岛屿而已。

    所以在熔岩之海内,基本上可以到达任何一个地方,一路前行,火龙不断壮大,因为它的一道又一道分身都被召唤了回来。

2.ps_is_consumer_enabled()

检查指定的consumers配置知否真正生效。根据performance_schema.setup_consumers表中所有consumers的enabled字段设置值,按照consumers生效优先级依次检查指定consumers所依赖的consumers配置项是否启用,如果所依赖的consumers都启用时才会返回该consumers为YES,而不仅仅是返回该指定的consumers在performance_schema.setup_consumers表中的enabled字段值设置

  • 如果指定的consumers名称无效,则返回NULL

参数:

  • in_consumer VARCHAR(64):要检查是否启用的consumers名称字符串

返回值:一个ENUM('YES','NO') 值

 火龙身形缩小到只有十几丈的长度,在熔岩之海内遨游,在这里,不容易被人发现目标。

    实际上整个天龙火域是没有真正陆地的,那所谓的陆地,不过是漂浮在熔岩之海上的巨大岛屿而已。

    所以在熔岩之海内,基本上可以到达任何一个地方,一路前行,火龙不断壮大,因为它的一道又一道分身都被召唤了回来。

函数定义语句文本

DROP FUNCTION IF EXISTS ps_is_consumer_enabled;
DELIMITER $$
CREATE DEFINER='root'@'localhost' FUNCTION ps_is_consumer_enabled (
    in_consumer varchar(64)
)
RETURNS enum('YES''NO')
COMMENT '

        Determines whether a consumer is enabled (taking the consumer hierarchy into consideration)
        within the Performance Schema.

        Parameters
        -----------

        in_consumer VARCHAR(64): 
          The name of the consumer to check.

        Returns
        -----------

        ENUM(\'YES\', \'NO\')

        Example
        -----------

        mysql> SELECT sys.ps_is_consumer_enabled(\'events_stages_history\');
        +-----------------------------------------------------+
        | sys.ps_is_consumer_enabled(\'events_stages_history\') |
        +-----------------------------------------------------+
        | NO                                                  |
        +-----------------------------------------------------+
        1 row in set (0.00 sec)
        '

SQL SECURITY INVOKER
DETERMINISTIC
READS SQL DATA
BEGIN
RETURN (
    SELECT (CASE
              WHEN c.NAME = 'global_instrumentation' THEN c.ENABLED
              WHEN c.NAME = 'thread_instrumentation' THEN IF(cg.ENABLED = 'YES' AND c.ENABLED = 'YES''YES''NO')
              WHEN c.NAME LIKE '%\_digest'          THEN IF(cg.ENABLED = 'YES' AND c.ENABLED = 'YES''YES''NO')
              WHEN c.NAME LIKE '%\_current'          THEN IF(cg.ENABLED = 'YES' AND ct.ENABLED = 'YES' AND c.ENABLED = 'YES''YES''NO')
              ELSE IF(cg.ENABLED = 'YES' AND ct.ENABLED = 'YES' AND c.ENABLED = 'YES'
                      AND ( SELECT cc.ENABLED FROM performance_schema.setup_consumers cc WHERE NAME = CONCAT(SUBSTRING_INDEX(c.NAME, '_'2), '_current')
                          ) = 'YES''YES''NO')
            ENDAS IsEnabled
      FROM performance_schema.setup_consumers c
          INNER JOIN performance_schema.setup_consumers cg
          INNER JOIN performance_schema.setup_consumers ct
    WHERE cg.NAME      = 'global_instrumentation'
          AND ct.NAME  = 'thread_instrumentation'
          AND c.NAME    = in_consumer
  );
END$$
DELIMITER ;

 火龙身形缩小到只有十几丈的长度,在熔岩之海内遨游,在这里,不容易被人发现目标。

    实际上整个天龙火域是没有真正陆地的,那所谓的陆地,不过是漂浮在熔岩之海上的巨大岛屿而已。

    所以在熔岩之海内,基本上可以到达任何一个地方,一路前行,火龙不断壮大,因为它的一道又一道分身都被召唤了回来。

3.ps_is_instrument_default_enabled()

在performance_schema.setup_instruments表中检查指定instruments默认是否启用,默认只启用'wait/io/file/%'、'wait/io/table/%'、'statement/%'、'memory/performance_schema/%'、'wait/lock/table/sql/handler'、'idle'、'stage/innodb/%'、'stage/sql/copy to tmp table',传入参数值不匹配这些instruments即表示是默认关闭的instruments(返回NO),如果匹配则表示是默认启用的instruments(返回YES)

参数:

  • in_instrument VARCHAR(128):要检查默认是否启用的instruments的名称字符串

返回值:一个ENUM('YES','NO')值

 火龙身形缩小到只有十几丈的长度,在熔岩之海内遨游,在这里,不容易被人发现目标。

    实际上整个天龙火域是没有真正陆地的,那所谓的陆地,不过是漂浮在熔岩之海上的巨大岛屿而已。

    所以在熔岩之海内,基本上可以到达任何一个地方,一路前行,火龙不断壮大,因为它的一道又一道分身都被召唤了回来。

函数定义语句文本

DROP FUNCTION IF EXISTS ps_is_instrument_default_enabled;
DELIMITER $$
CREATE DEFINER='root'@'localhost' FUNCTION ps_is_instrument_default_enabled (
    in_instrument VARCHAR(128)
)
RETURNS ENUM('YES''NO')
COMMENT '
        Description
        -----------

        Returns whether an instrument is enabled by default in this version of MySQL.

        Parameters
        -----------

        in_instrument VARCHAR(128): 
          The instrument to check.

        Returns
        -----------

        ENUM(\'YES\', \'NO\')

        Example
        -----------

        mysql> SELECT sys.ps_is_instrument_default_enabled(\'statement/sql/select\');
        +--------------------------------------------------------------+
        | sys.ps_is_instrument_default_enabled(\'statement/sql/select\') |
        +--------------------------------------------------------------+
        | YES                                                          |
        +--------------------------------------------------------------+
        1 row in set (0.00 sec)
        '

SQL SECURITY INVOKER
DETERMINISTIC
READS SQL DATA
BEGIN
DECLARE v_enabled ENUM('YES''NO');

-- Currently the same in all versions
SET v_enabled = IF(in_instrument LIKE 'wait/io/file/%'
                    OR in_instrument LIKE 'wait/io/table/%'
                    OR in_instrument LIKE 'statement/%'
                    OR in_instrument LIKE 'memory/performance_schema/%'
                    OR in_instrument IN ('wait/lock/table/sql/handler''idle')
          /*!50707
                    OR in_instrument LIKE 'stage/innodb/%'
                    OR in_instrument = 'stage/sql/copy to tmp table'
          */

                  ,
                  'YES',
                  'NO'
                );

RETURN v_enabled;
END$$
DELIMITER ;

 火龙身形缩小到只有十几丈的长度,在熔岩之海内遨游,在这里,不容易被人发现目标。

    实际上整个天龙火域是没有真正陆地的,那所谓的陆地,不过是漂浮在熔岩之海上的巨大岛屿而已。

    所以在熔岩之海内,基本上可以到达任何一个地方,一路前行,火龙不断壮大,因为它的一道又一道分身都被召唤了回来。

4.ps_is_instrument_default_timed()

在performance_schema.setup_instruments表中检查指定instruments是否启用定时器功能,默认只启用'wait/io/file/%'、'wait/io/table/%'、'statement/%'、'wait/lock/table/sql/handler'、'idle'、'stage/innodb/%'、'stage/sql/copy to tmp table'这些instruments的timed,传入参数值不匹配这些instruments即表示是指定instruments的定时器功能默认是关闭的(返回NO),如果匹配则表示指定的instruments的定时器功能默认是启用的(返回YES)

参数:

  • in_instrument VARCHAR(128):要检查是否默认启用定时器功能的instruments的名称字符串

返回值:一个ENUM('YES','NO')值

 火龙身形缩小到只有十几丈的长度,在熔岩之海内遨游,在这里,不容易被人发现目标。

    实际上整个天龙火域是没有真正陆地的,那所谓的陆地,不过是漂浮在熔岩之海上的巨大岛屿而已。

    所以在熔岩之海内,基本上可以到达任何一个地方,一路前行,火龙不断壮大,因为它的一道又一道分身都被召唤了回来。

函数定义语句文本

DROP FUNCTION IF EXISTS ps_is_instrument_default_timed;
DELIMITER $$
CREATE DEFINER='root'@'localhost' FUNCTION ps_is_instrument_default_timed (
    in_instrument VARCHAR(128)
)
RETURNS ENUM('YES''NO')
COMMENT '
        Description
        -----------

        Returns whether an instrument is timed by default in this version of MySQL.

        Parameters
        -----------

        in_instrument VARCHAR(128): 
          The instrument to check.

        Returns
        -----------

        ENUM(\'YES\', \'NO\')

        Example
        -----------

        mysql> SELECT sys.ps_is_instrument_default_timed(\'statement/sql/select\');
        +------------------------------------------------------------+
        | sys.ps_is_instrument_default_timed(\'statement/sql/select\') |
        +------------------------------------------------------------+
        | YES                                                        |
        +------------------------------------------------------------+
        1 row in set (0.00 sec)
        '

SQL SECURITY INVOKER
DETERMINISTIC
READS SQL DATA
BEGIN
DECLARE v_timed ENUM('YES''NO');

-- Currently the same in all versions
SET v_timed = IF(in_instrument LIKE 'wait/io/file/%'
                    OR in_instrument LIKE 'wait/io/table/%'
                    OR in_instrument LIKE 'statement/%'
                    OR in_instrument IN ('wait/lock/table/sql/handler''idle')
          /*!50707
                    OR in_instrument LIKE 'stage/innodb/%'
                    OR in_instrument = 'stage/sql/copy to tmp table'
          */

                  ,
                  'YES',
                  'NO'
                );

RETURN v_timed;
END$$
DELIMITER ;

 火龙身形缩小到只有十几丈的长度,在熔岩之海内遨游,在这里,不容易被人发现目标。

    实际上整个天龙火域是没有真正陆地的,那所谓的陆地,不过是漂浮在熔岩之海上的巨大岛屿而已。

    所以在熔岩之海内,基本上可以到达任何一个地方,一路前行,火龙不断壮大,因为它的一道又一道分身都被召唤了回来。

5.ps_is_thread_instrumented()

在performance_schema.threads表中检查指定线程是否启用了性能事件监测功能,给定参数值对应performance_schema.threads表中的PROCESSLIST_ID列或SHOW PROCESSLIST输出的Id列值

  • 如果给定连接ID值在performance_schema.threads表中未查询到,则返回UNKNOWN值,如果给定ID值为NULL则返回NULL

参数:

  • in_connection_id BIGINT UNSIGNED:连接ID。对应performance_schema.threads表中的PROCESSLIST_ID列值或SHOW PROCESSLIST输出的Id列值

返回值:一个ENUM('YES','NO','UNKNOWN')值

 火龙身形缩小到只有十几丈的长度,在熔岩之海内遨游,在这里,不容易被人发现目标。

    实际上整个天龙火域是没有真正陆地的,那所谓的陆地,不过是漂浮在熔岩之海上的巨大岛屿而已。

    所以在熔岩之海内,基本上可以到达任何一个地方,一路前行,火龙不断壮大,因为它的一道又一道分身都被召唤了回来。

函数定义语句文本

DROP FUNCTION IF EXISTS ps_is_thread_instrumented;
DELIMITER $$
CREATE DEFINER='root'@'localhost' FUNCTION ps_is_thread_instrumented (
    in_connection_id BIGINT UNSIGNED
RETURNS ENUM('YES''NO''UNKNOWN')
COMMENT '
        Description
        -----------

        Checks whether the provided connection id is instrumented within Performance Schema.

        Parameters
        -----------

        in_connection_id (BIGINT UNSIGNED):
          The id of the connection to check.

        Returns
        -----------

        ENUM(\'YES\', \'NO\', \'UNKNOWN\')

        Example
        -----------

        mysql> SELECT sys.ps_is_thread_instrumented(CONNECTION_ID());
        +------------------------------------------------+
        | sys.ps_is_thread_instrumented(CONNECTION_ID()) |
        +------------------------------------------------+
        | YES                                            |
        +------------------------------------------------+
        '


SQL SECURITY INVOKER
NOT DETERMINISTIC
READS SQL DATA
BEGIN
DECLARE v_enabled ENUM('YES''NO''UNKNOWN');

IF (in_connection_id IS NULL) THEN
    RETURN NULL;
END IF;

SELECT INSTRUMENTED INTO v_enabled
  FROM performance_schema.threads
WHERE PROCESSLIST_ID = in_connection_id;

IF (v_enabled IS NULL) THEN
    RETURN 'UNKNOWN';
ELSE
    RETURN v_enabled;
END IF;
END$$
DELIMITER ;

 火龙身形缩小到只有十几丈的长度,在熔岩之海内遨游,在这里,不容易被人发现目标。

    实际上整个天龙火域是没有真正陆地的,那所谓的陆地,不过是漂浮在熔岩之海上的巨大岛屿而已。

    所以在熔岩之海内,基本上可以到达任何一个地方,一路前行,火龙不断壮大,因为它的一道又一道分身都被召唤了回来。

6.ps_thread_account()

在performance_schema.threads表中查询并返回给定内部线程ID号相关联的account名称

  • 该函数在MySQL 5.7.9中新增

参数:

  • in_thread_id BIGINT UNSIGNED:指定一个内部线程ID,返回该内部线程ID相关联的account名称,该值与performance_schema.threads表中的thread_id列值对应

返回值:一个TEXT文本值

 火龙身形缩小到只有十几丈的长度,在熔岩之海内遨游,在这里,不容易被人发现目标。

    实际上整个天龙火域是没有真正陆地的,那所谓的陆地,不过是漂浮在熔岩之海上的巨大岛屿而已。

    所以在熔岩之海内,基本上可以到达任何一个地方,一路前行,火龙不断壮大,因为它的一道又一道分身都被召唤了回来。

函数定义语句文本

DROP FUNCTION IF EXISTS ps_thread_account;
DELIMITER $$
CREATE DEFINER='root'@'localhost' FUNCTION ps_thread_account (
    in_thread_id BIGINT UNSIGNED
RETURNS TEXT
COMMENT '
        Description
        -----------

        Return the user@host account for the given Performance Schema thread id.

        Parameters
        -----------

        in_thread_id (BIGINT UNSIGNED):
          The id of the thread to return the account for.

        Example
        -----------

        mysql> select thread_id, processlist_user, processlist_host from performance_schema.threads where type = ''foreground'';
          +-----------+------------------+------------------+
          | thread_id | processlist_user | processlist_host |
          +-----------+------------------+------------------+
          |        23 | NULL            | NULL            |
          |        30 | root            | localhost        |
          |        31 | msandbox        | localhost        |
          |        32 | msandbox        | localhost        |
          +-----------+------------------+------------------+
          4 rows in set (0.00 sec)

          mysql> select sys.ps_thread_account(31);
          +---------------------------+
          | sys.ps_thread_account(31) |
          +---------------------------+
          | msandbox@localhost        |
          +---------------------------+
          1 row in set (0.00 sec)
        '


SQL SECURITY INVOKER
NOT DETERMINISTIC
READS SQL DATA
BEGIN
RETURN (SELECT IF(
                  type = 'FOREGROUND',
                  CONCAT(processlist_user, '@', processlist_host),
                  type
                ) AS account
          FROM `performance_schema`.`threads`
        WHERE thread_id = in_thread_id);
END$$
DELIMITER ;

 火龙身形缩小到只有十几丈的长度,在熔岩之海内遨游,在这里,不容易被人发现目标。

    实际上整个天龙火域是没有真正陆地的,那所谓的陆地,不过是漂浮在熔岩之海上的巨大岛屿而已。

    所以在熔岩之海内,基本上可以到达任何一个地方,一路前行,火龙不断壮大,因为它的一道又一道分身都被召唤了回来。

7.ps_thread_id()

在performance_schema.threads表中查询给定连接ID(processlist_id)的内部线程ID,如果给定连接ID为NULL值,则返回当前连接的内部线程ID

参数:

  • in_connection_id BIGINT UNSIGNED:要返回内部线程ID的连接的ID。 对应performance_schema.threads表中的PROCESSLIST_ID列或SHOW PROCESSLIST输出的Id列值

返回值:一个BIGINT UNSIGNED值

函数定义语句文本

DROP FUNCTION IF EXISTS ps_thread_id;
DELIMITER $$
CREATE DEFINER='root'@'localhost' FUNCTION ps_thread_id (
    in_connection_id BIGINT UNSIGNED
RETURNS BIGINT UNSIGNED
COMMENT '
        Description
        -----------

        Return the Performance Schema THREAD_ID for the specified connection ID.

        Parameters
        -----------

        in_connection_id (BIGINT UNSIGNED):
          The id of the connection to return the thread id for. If NULL, the current
          connection thread id is returned.

        Example
        -----------

        mysql> SELECT sys.ps_thread_id(79);
        +----------------------+
        | sys.ps_thread_id(79) |
        +----------------------+
        |                  98 |
        +----------------------+
        1 row in set (0.00 sec)

        mysql> SELECT sys.ps_thread_id(CONNECTION_ID());
        +-----------------------------------+
        | sys.ps_thread_id(CONNECTION_ID()) |
        +-----------------------------------+
        |                                98 |
        +-----------------------------------+
        1 row in set (0.00 sec)
        '


SQL SECURITY INVOKER
NOT DETERMINISTIC
READS SQL DATA
BEGIN
RETURN (SELECT THREAD_ID
          FROM `performance_schema`.`threads`
        WHERE PROCESSLIST_ID = IFNULL(in_connection_id, CONNECTION_ID())
      );
END$$
DELIMITER ;

 火龙身形缩小到只有十几丈的长度,在熔岩之海内遨游,在这里,不容易被人发现目标。

    实际上整个天龙火域是没有真正陆地的,那所谓的陆地,不过是漂浮在熔岩之海上的巨大岛屿而已。

    所以在熔岩之海内,基本上可以到达任何一个地方,一路前行,火龙不断壮大,因为它的一道又一道分身都被召唤了回来。

8.ps_thread_stack()

在performance_schema下的events_statements_history_long、events_waits_history_long、events_stages_history_long表中查询并返回指定内部线程ID的事件信息(json格式返回),可以把这些事件信息看作是该指定内部线程ID堆信息

参数:

  • in_thread_id BIGINT:要跟踪堆信息的内部线程ID。该值对应performance_schema.threads表的THREAD_ID列值

  • in_verbose BOOLEAN:是否在输出的事件堆信息中包含事件的instruments所在的源文件名和代码行号信息

返回值:一个LONGTEXT CHARACTER SET latin1长字符串值

 火龙身形缩小到只有十几丈的长度,在熔岩之海内遨游,在这里,不容易被人发现目标。

    实际上整个天龙火域是没有真正陆地的,那所谓的陆地,不过是漂浮在熔岩之海上的巨大岛屿而已。

    所以在熔岩之海内,基本上可以到达任何一个地方,一路前行,火龙不断壮大,因为它的一道又一道分身都被召唤了回来。

示例

 02:45:39> SELECT sys.ps_thread_stack(50FALSEAS thread_stack\G;
*************************** 1. row ***************************
thread_stack: {"rankdir""LR","nodesep""0.10","stack_created""2017-09-09 14:47:50","mysql_version""5.7.18-log","mysql_user""root@%","events": [{"nesting_event_id""0""event_id""8", \
"timer_wait"57.59"event_info""sql/commit""wait_info""commit\nerrors: 0\nwarnings: 0\nlock time: 0.00us\nrows affected: 0\nrows sent: 0\nrows examined: 0\ntmp tables: 0\ntmp disk tables: \
0\nselect scan: 0\nselect full join: 0\nselect full range join: 0\nselect range: 0\nselect range check: 0\nsort merge passes: 0\nsort rows: 0\nsort range: 0\nsort scan: 0\nno index used: FALSE\nno good index used: \
......
"
event_type": "io/socket"},{"nesting_event_id": "42", "event_id": "87", "timer_wait": 0.81, "event_info": "sql/cleaning up", "wait_info": "", "source": "", "event_type": "stage"},{"nesting_event_id": "87", "event_id": \
"
88", "timer_wait": 0.06, "event_info": "sql/THD::LOCK_thd_query\\n", "wait_info": "sql_class.cc:4320", "source": "sql_class.cc:4320", "event_type": "synch/mutex"}]}
1 row in set (0.00 sec)

 火龙身形缩小到只有十几丈的长度,在熔岩之海内遨游,在这里,不容易被人发现目标。

    实际上整个天龙火域是没有真正陆地的,那所谓的陆地,不过是漂浮在熔岩之海上的巨大岛屿而已。

    所以在熔岩之海内,基本上可以到达任何一个地方,一路前行,火龙不断壮大,因为它的一道又一道分身都被召唤了回来。

9.ps_thread_trx_info()

在performance_schema下的events_transactions_current、events_transactions_history、events_statements_history表中查询并返回指定内部线程ID的事务、语句事件信息(json格式返回),这些事件信息包括当前正在执行的事务以及已经执行完成的语句信息(必须启用events_transactions_current、events_transactions_history、events_statements_history对应的consumers配置才能够获取这些信息)

  • 如果ps_thread_trx_info()函数输出json格式字符串长度超过默认的65535字节长度,则返回json错误对象(如:{ "error": "Trx info truncated: Row 6 was cut by GROUP_CONCAT()" }),然后函数中会对该错误做进一步处理

  • 此函数在MySQL 5.7.9中新增

参数:

  • in_thread_id BIGINT UNSIGNED:用于返回事务、语句事件信息的内部线程ID,该值与performance_schema.threads表中的THREAD_ID列值对应

    火龙身形缩小到只有十几丈的长度,在熔岩之海内遨游,在这里,不容易被人发现目标。

        实际上整个天龙火域是没有真正陆地的,那所谓的陆地,不过是漂浮在熔岩之海上的巨大岛屿而已。

        所以在熔岩之海内,基本上可以到达任何一个地方,一路前行,火龙不断壮大,因为它的一道又一道分身都被召唤了回来。

配置选项:

  • ps_thread_trx_info.max_length,@sys.ps_thread_trx_info.max_length:控制ps_thread_trx_info()函数输出的最大字节长度,默认为65535字节

返回值:一个LONGTEXT长文本值

示例

02:47:50> select sys.ps_thread_trx_info(50)\G
*************************** 1. row ***************************
sys.ps_thread_trx_info(50): [
{
"time""10.99 m",
"state""ACTIVE",
"mode""READ WRITE",
"autocommitted""NO",
"gtid""AUTOMATIC",
"isolation""READ COMMITTED",
"statements_executed": [
  {
    "sql_text""select * from t_luoxiaobo limit 200",
    "time""544.65 us",
    "schema""luoxiaobo",
    "rows_examined"200,
    "rows_affected"0,
    "rows_sent"200,
    "tmp_tables"0,
    "tmp_disk_tables"0,
    "sort_rows"0,
    "sort_merge_passes"0
   }
   ]
}
]
1 row in set (0.01 sec)

root@localhost : (none) 02:58:42> select sys.ps_thread_trx_info(50)\G
*************************** 1. row ***************************
sys.ps_thread_trx_info(50): [
{
"time""12.51 m",
"state""COMMITTED",
"mode""READ WRITE",
"autocommitted""NO",
"gtid""AUTOMATIC",
"isolation""READ COMMITTED",
"statements_executed": [
  {
    "sql_text""select * from t_luoxiaobo limit 200",
    "time""544.65 us",
    "schema""luoxiaobo",
    "rows_examined"200,
    "rows_affected"0,
    "rows_sent"200,
    "tmp_tables"0,
    "tmp_disk_tables"0,
    "sort_rows"0,
    "sort_merge_passes"0
  },
  {
    "sql_text""commit",
    "time""55.36 us",
    "schema""luoxiaobo",
    "rows_examined"0,
    "rows_affected"0,
    "rows_sent"0,
    "tmp_tables"0,
    "tmp_disk_tables"0,
    "sort_rows"0,
    "sort_merge_passes"0
  }
  ]
}
]
1 row in set (0.00 sec)

 火龙身形缩小到只有十几丈的长度,在熔岩之海内遨游,在这里,不容易被人发现目标。

    实际上整个天龙火域是没有真正陆地的,那所谓的陆地,不过是漂浮在熔岩之海上的巨大岛屿而已。

    所以在熔岩之海内,基本上可以到达任何一个地方,一路前行,火龙不断壮大,因为它的一道又一道分身都被召唤了回来。

10.quote_identifier()

返回字符串作为引用的标识符,即给字符串前后加上反撇,对于已存在的反撇直接替换为两个反撇,当SQL语句文本中存在着保留字或者是反撇号(`)字符时,该函数可以快速帮助添加反撇

  • 该函数在MySQL 5.7.14中新增

参数:

  • in_identifier TEXT:要作为引用标识符的文本字符串

返回值:一个TEXT文本值

 火龙身形缩小到只有十几丈的长度,在熔岩之海内遨游,在这里,不容易被人发现目标。

    实际上整个天龙火域是没有真正陆地的,那所谓的陆地,不过是漂浮在熔岩之海上的巨大岛屿而已。

    所以在熔岩之海内,基本上可以到达任何一个地方,一路前行,火龙不断壮大,因为它的一道又一道分身都被召唤了回来。

函数定义语句文本

DROP FUNCTION IF EXISTS quote_identifier;
DELIMITER $$
-- https://dev.mysql.com/doc/refman/5.7/en/identifiers.html
-- Maximum supported length for any of the current identifiers in 5.7.5+ is 256 characters.
-- Before that, user variables could have any length.
--
-- Based on Paul Dubois' suggestion in Bug #78823/Bug #22011361.
CREATE DEFINER='root'@'localhost' FUNCTION quote_identifier(in_identifier TEXT)
RETURNS TEXT CHARSET UTF8
COMMENT '
        Description
        -----------

        Takes an unquoted identifier (schema name, table name, etc.) and
        returns the identifier quoted with backticks.

        Parameters
        -----------

        in_identifier (TEXT):
          The identifier to quote.

        Returns
        -----------

        TEXT

        Example
        -----------

        mysql> SELECT sys.quote_identifier(''my_identifier'') AS Identifier;
        +-----------------+
        | Identifier      |
        +-----------------+
        | `my_identifier` |
        +-----------------+
        1 row in set (0.00 sec)

        mysql> SELECT sys.quote_identifier(''my`idenfier'') AS Identifier;
        +----------------+
        | Identifier    |
        +----------------+
        | `my``idenfier` |
        +----------------+
        1 row in set (0.00 sec)
        '

SQL SECURITY INVOKER
DETERMINISTIC
NO SQL
BEGIN
RETURN CONCAT('`'REPLACE(in_identifier, '`''``'), '`');
END$$
DELIMITER ;

 火龙身形缩小到只有十几丈的长度,在熔岩之海内遨游,在这里,不容易被人发现目标。

    实际上整个天龙火域是没有真正陆地的,那所谓的陆地,不过是漂浮在熔岩之海上的巨大岛屿而已。

    所以在熔岩之海内,基本上可以到达任何一个地方,一路前行,火龙不断壮大,因为它的一道又一道分身都被召唤了回来。

11.sys_get_config()

返回给定sys 系统库配置选项名称的设置值,两个传参,第一个是要查看的配置变量名称,第二个是传入的默认值,如果在sys.sys_config表中查询到了该变量的非null值,则直接返回,如果查询到是null值,则使用第二个传参返回

  • 按照惯例,调用者在sys_get_config()函数之前需要先检查相应的用户定义变量是否存在并且是否非NULL。如果存在所需配置选项的自定义变量,且值不为NULL,该调用者直接使用自定义配置选项变量值而不是第哦啊用sys_get_config()函数读取sys.sys_config表中的值,除此之外,其他情形都需要调用sys_get_config()函数读取sys.sys_config表中的值并赋值给用户自定义配置选项变量,以便下次优先使用自定义配置选项变量中的值而不是直接查询sys.sys_config表中的值

    火龙身形缩小到只有十几丈的长度,在熔岩之海内遨游,在这里,不容易被人发现目标。

        实际上整个天龙火域是没有真正陆地的,那所谓的陆地,不过是漂浮在熔岩之海上的巨大岛屿而已。

        所以在熔岩之海内,基本上可以到达任何一个地方,一路前行,火龙不断壮大,因为它的一道又一道分身都被召唤了回来。

  • 当调这需要获取配置选项值时,如果要检查配置选项是否设置了自定义配置选项变量,那么可以使用IFNULL(...)语句IF(...)THEN ... END IF;语句把这一些逻辑封装在一个流程控制语句里,但是,这两个语句中,IFNULL(...)语句在需要反复查询一个配置选项值时其执行速度会显著比IF(...)THEN ... END IF;语句慢,因为IFNULL(...)语句无法在加入一个干活的逻辑在里边,IF(...)THEN ... END IF;语句可以把一些干活的逻辑加入到里边,只在第一次调用时才需要去判断自定义变量知否存在以及是否为NULL值

参数:

  • in_variable_name VARCHAR(128):给定的配置选项名称字符串

  • in_default_value VARCHAR(128):如果在sys_config表中找不到给定的配置选项名称,则返回该参数给定的值

返回值:一个VARCHAR(128)文本值

 火龙身形缩小到只有十几丈的长度,在熔岩之海内遨游,在这里,不容易被人发现目标。

    实际上整个天龙火域是没有真正陆地的,那所谓的陆地,不过是漂浮在熔岩之海上的巨大岛屿而已。

    所以在熔岩之海内,基本上可以到达任何一个地方,一路前行,火龙不断壮大,因为它的一道又一道分身都被召唤了回来。

示例

-- Get the configuration value from sys.sys_config falling back on 128 if the option is not present in the table.
mysql> SELECT sys.sys_get_config(''statement_truncate_len'', 128) AS Value;
+-------+
| Value |
+-------+
64 |
+-------+
1 row in set (0.00 sec)

-- Check whether the option is already setif not assign - IFNULL(...) one liner example.
mysql> SET @sys.statement_truncate_len = IFNULL(@sys.statement_truncate_len, sys.sys_get_config(''statement_truncate_len'', 64));
Query OK, 0 rows affected (0.00 sec)

-- Check whether the option is already setif not assign - IF ... THEN ... END IF example.
IF (@sys.statement_truncate_len IS NULL) THEN
SET @sys.statement_truncate_len = sys.sys_get_config(''statement_truncate_len'', 64);
END IF;

 火龙身形缩小到只有十几丈的长度,在熔岩之海内遨游,在这里,不容易被人发现目标。

    实际上整个天龙火域是没有真正陆地的,那所谓的陆地,不过是漂浮在熔岩之海上的巨大岛屿而已。

    所以在熔岩之海内,基本上可以到达任何一个地方,一路前行,火龙不断壮大,因为它的一道又一道分身都被召唤了回来。

12.version_major()

通过version()函数获取并返回MySQL server的主版本号,该函数在MySQL 5.7.9中新增

  • 该函数调用时无需传入任何参数

返回值:一个TINYINT UNSIGNED值

 火龙身形缩小到只有十几丈的长度,在熔岩之海内遨游,在这里,不容易被人发现目标。

    实际上整个天龙火域是没有真正陆地的,那所谓的陆地,不过是漂浮在熔岩之海上的巨大岛屿而已。

    所以在熔岩之海内,基本上可以到达任何一个地方,一路前行,火龙不断壮大,因为它的一道又一道分身都被召唤了回来。

函数定义语句文本

DROP FUNCTION IF EXISTS version_major;
DELIMITER $$
CREATE DEFINER='root'@'localhost' FUNCTION version_major ()
RETURNS TINYINT UNSIGNED
COMMENT '
        Description
        -----------

        Returns the major version of MySQL Server.

        Returns
        -----------

        TINYINT UNSIGNED

        Example
        -----------

        mysql> SELECT VERSION(), sys.version_major();
        +--------------------------------------+---------------------+
        | VERSION()                            | sys.version_major() |
        +--------------------------------------+---------------------+
        | 5.7.9-enterprise-commercial-advanced | 5                  |
        +--------------------------------------+---------------------+
        1 row in set (0.00 sec)
        '

SQL SECURITY INVOKER
NOT DETERMINISTIC
NO SQL
BEGIN
RETURN SUBSTRING_INDEX(SUBSTRING_INDEX(VERSION(), '-'1), '.'1);
END$$
DELIMITER ;

 火龙身形缩小到只有十几丈的长度,在熔岩之海内遨游,在这里,不容易被人发现目标。

    实际上整个天龙火域是没有真正陆地的,那所谓的陆地,不过是漂浮在熔岩之海上的巨大岛屿而已。

    所以在熔岩之海内,基本上可以到达任何一个地方,一路前行,火龙不断壮大,因为它的一道又一道分身都被召唤了回来。

13.version_minor()

通过version()函数获取并返回MySQL server的次要版本号,该函数在MySQL 5.7.9中新增

  • 该函数执行时无需传入任何参数

返回值:一个TINYINT UNSIGNED值

 火龙身形缩小到只有十几丈的长度,在熔岩之海内遨游,在这里,不容易被人发现目标。

    实际上整个天龙火域是没有真正陆地的,那所谓的陆地,不过是漂浮在熔岩之海上的巨大岛屿而已。

    所以在熔岩之海内,基本上可以到达任何一个地方,一路前行,火龙不断壮大,因为它的一道又一道分身都被召唤了回来。

函数定义语句文本

DROP FUNCTION IF EXISTS version_minor;
DELIMITER $$
CREATE DEFINER='root'@'localhost' FUNCTION version_minor ()
RETURNS TINYINT UNSIGNED
COMMENT '
        Description
        -----------

        Returns the minor (release series) version of MySQL Server.

        Returns
        -----------

        TINYINT UNSIGNED

        Example
        -----------

        mysql> SELECT VERSION(), sys.server_minor();
        +--------------------------------------+---------------------+
        | VERSION()                            | sys.version_minor() |
        +--------------------------------------+---------------------+
        | 5.7.9-enterprise-commercial-advanced | 7                  |
        +--------------------------------------+---------------------+
        1 row in set (0.00 sec)
        '

SQL SECURITY INVOKER
NOT DETERMINISTIC
NO SQL
BEGIN
RETURN SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(VERSION(), '-'1), '.'2), '.'-1);
END$$
DELIMITER ;

 火龙身形缩小到只有十几丈的长度,在熔岩之海内遨游,在这里,不容易被人发现目标。

    实际上整个天龙火域是没有真正陆地的,那所谓的陆地,不过是漂浮在熔岩之海上的巨大岛屿而已。

    所以在熔岩之海内,基本上可以到达任何一个地方,一路前行,火龙不断壮大,因为它的一道又一道分身都被召唤了回来。

14.version_patch()

通过version()函数获取并返回MySQL server的补丁版本号,该函数在MySQL 5.7.9中新增

  • 该函数执行时无需传入任何参数

返回值:一个TINYINT UNSIGNED值

 火龙身形缩小到只有十几丈的长度,在熔岩之海内遨游,在这里,不容易被人发现目标。

    实际上整个天龙火域是没有真正陆地的,那所谓的陆地,不过是漂浮在熔岩之海上的巨大岛屿而已。

    所以在熔岩之海内,基本上可以到达任何一个地方,一路前行,火龙不断壮大,因为它的一道又一道分身都被召唤了回来。

函数定义语句文本

DROP FUNCTION IF EXISTS version_patch;
DELIMITER $$
CREATE DEFINER='root'@'localhost' FUNCTION version_patch ()
RETURNS TINYINT UNSIGNED
COMMENT '
        Description
        -----------

        Returns the patch release version of MySQL Server.

        Returns
        -----------

        TINYINT UNSIGNED

        Example
        -----------

        mysql> SELECT VERSION(), sys.version_patch();
        +--------------------------------------+---------------------+
        | VERSION()                            | sys.version_patch() |
        +--------------------------------------+---------------------+
        | 5.7.9-enterprise-commercial-advanced | 9                  |
        +--------------------------------------+---------------------+
        1 row in set (0.00 sec)
        '

SQL SECURITY INVOKER
NOT DETERMINISTIC
NO SQL
BEGIN
RETURN SUBSTRING_INDEX(SUBSTRING_INDEX(VERSION(), '-'1), '.'-1);
END$$
DELIMITER ;



文章转载自海鲨数据库架构师,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论