Mysql编译好的程序存放在什么位置?

问题描述 投票:0回答:2

如何从物理位置获取已编译的 Mysql 存储过程?

mysql stored-procedures
2个回答
17
投票

在数据库中

mysql
有一个表
proc
,它似乎保存了存储过程的所有数据。
所以物理文件应该是 /mysql/proc.MYI 和 /mysql/proc.MYD。

编辑:但也许你只是在寻找 SHOW CREATE PROCEDURE


0
投票

在 MySQL 主要版本直至 5.7 中,存储例程的持久真实来源是

mysql.proc
中,如 2009 年接受的答案中所述。

但是,在从 8.0(2018 年发布)开始的 MySQL 主要版本中,

mysql.proc
表不再存在,已被 information_schema.routines
 取代,作为存储例程定义的持久事实来源。*

至于

information_schema.routines

的内容实际上存储在磁盘上
的问题,这有点棘手。

如果您在 MySQL 8.0.x 上查询

INFORMATION_SCHEMA.TABLES

,它会将 
INFORMATION_SCHEMA.ROUTINES
 描述为“系统视图”:

mysql> select * from information_schema.tables where lower(table_schema)='information_schema' and lower(table_name)='routines'; +---------------+--------------------+------------+-------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | ENGINE | VERSION | ROW_FORMAT | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH | MAX_DATA_LENGTH | INDEX_LENGTH | DATA_FREE | AUTO_INCREMENT | CREATE_TIME | UPDATE_TIME | CHECK_TIME | TABLE_COLLATION | CHECKSUM | CREATE_OPTIONS | TABLE_COMMENT | +---------------+--------------------+------------+-------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+ | def | information_schema | ROUTINES | SYSTEM VIEW | NULL | 10 | NULL | 0 | 0 | 0 | 0 | 0 | 0 | NULL | 2024-02-12 22:20:48 | NULL | NULL | NULL | NULL | | | +---------------+--------------------+------------+-------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+ 1 row in set (0.00 sec)
但是,如果您创建一个存储例程(例如 

CREATE PROCEDURE

CREATE FUNCTION
)并确保将其刷新到磁盘(例如通过关闭 MySQL 服务器),则 
grep
 查看存储例程的 SQL 源代码片段,你会发现它与 
mysql.ibd 文件匹配
,其中 
mysql.*
 InnoDB 表存储在 MySQL 8.0 中。

因此,存储例程的源代码和元数据实际上是与

mysql.*

 表一起存储的,尽管我找不到任何有关此事实的“官方”文档。


*

information_schema.routines

表/视图的格式有些标准化,因为其他关系数据库
例如PostgreSQL例如Microsoft SQL Server也支持它。

© www.soinside.com 2019 - 2024. All rights reserved.