存储有关 MySQL 数据库的元数据的简单方法

mal*_*ave 5 mysql database metadata

今天早些时候,我要求提供一种简单的方法来存储您在 SQLite 中使用的 SQL 表布局的版本号,并得到了使用PRAGMA user_version. 由于Pragma在 MySQL 中没有 a 这样的东西,我想知道您将如何在 MySQL 中进行此操作(除了创建一个名为“META”且带有“DB-Scheme-Version”列的表)。

只是重复我在链接问题中所说的话:我不是在寻找一种方法来找出安装了哪个版本的 MySQL,而是要保存一个版本号,告诉我我正在使用什么版本的 MySQL-Scheme,而不是通过脚本检查每个表。

我也看到了这个问题,但它只允许我对单个表进行版本控制。对于整个数据库,是否有类似的或者更简单的东西(因为单独查询每个表并不有趣)?提前致谢。

MySQLSET GLOBAL可能会工作,但我更喜欢这样的解决方案,它不会在服务器每次重新启动时自行重置,并且不需要SUPER权限和/或访问配置文件的权限。简而言之:它应该与您租用小型虚拟主机包时获得的标准 MySQL 数据库配合使用,而不是租用完整服务器时获得的那些,因为您往往可以更多地访问这些。

dan*_*ton 5

有多种选择,具体取决于您拥有的特权。您拥有的权限越高,解决方案就越“优雅”。

最直接的途径是创建一个存储函数,这需要CREATE ROUTINE权限。例如

mysql> CREATE FUNCTION `mydb`.DB_VERSION() RETURNS VARCHAR(15)
       RETURN '1.2.7.2861';
Query OK, 0 rows affected (0.03 sec)

mysql> SELECT `mydb`.DB_VERSION();
+--------------+
| DB_VERSION() |
+--------------+
| 1.2.7.2861   |
+--------------+
1 row in set (0.06 sec)
Run Code Online (Sandbox Code Playgroud)

如果您的权限限制您只能创建表,您可以创建一个简单的表并将版本置于默认值中:

mysql> CREATE TABLE `mydb`.`db_version` (
    `version` varchar(15) not null default '1.2.7.2861');
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW COLUMNS FROM `mydb`.`db_version`;
+---------+-------------+------+-----+------------+-------+
| Field   | Type        | Null | Key | Default    | Extra |
+---------+-------------+------+-----+------------+-------+
| version | varchar(15) | NO   |     | 1.2.7.2861 |       |
+---------+-------------+------+-----+------------+-------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)