如何从物理位置获取已编译的 Mysql 存储过程?
在数据库中
mysql
有一个表proc
,它似乎保存了存储过程的所有数据。编辑:但也许你只是在寻找 SHOW CREATE PROCEDURE?
在 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也支持它。