Skip to content

extract_schema_from_file_name()

xiaoboluo768 edited this page Jun 9, 2020 · 2 revisions
  • 从给定文件完整路径中提取schema名称,该函数在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 ;

上一篇: table_exists()存储过程 | 下一篇: extract_table_from_file_name()函数

Clone this wiki locally