在 MySQL 版本 5.5 上,NFORMATION_SCHEMA目录/文件夹存在;我假设它适用于其他版本。它不受my.ini或my.cnfas的设置控制datadir=whatever;它似乎是在 MySQL 的安装路径中预定义的,并且在 MySQL 在启动时首次加载时被读取。
没有my.ini或my.cnf设置用于放置此架构的位置。这似乎适用于 MySQL 5.5 的 Unix/Linux 和 Windows 版本,并且可能会追溯到首次引入此模式时。我在 Windows 和 Unix 机器上都从 4.1 升级到了 5.5,所以我不知道中间的版本。
我忘了提到在我的情况下的文件夹不是模式的名称,而只是另一个文件夹,它简单地调用MySQL了以下目录/XML 文件information_schema.mbp,其中包含以下数据,正如您在 MySQL Admin 客户端中看到的那样。我猜这是它在启动时加载到内存中的副本。我看到我的版本似乎比你的长,而且我的也有一个用户配置部分。
declare v_table_exists int;
select count(*) from information_schema.tables where table_name = 'MY_TEMP_TABLE';
if v_table_exists = 0 then
create temporary table MY_TEMP_TABLE(...);
else
delete from MY_TEMP_TABLE; // sets up for the next iteration within the same session
end if;
我发现了一个令人满意的解决方法。我重写了上面的代码,如下所示:
create temporary table if not exists MY_TEMP_TABLE(...);
delete from MY_TEMP_TABLE;
我发现这个错误特别令人不安,因为 MySQL 在引入 MySQL 5.0 时引入了 INFORMATION_SCHEMA。@gbn 的回答表明这个错误
MySQL对数据库的定义只是datadir下的一个子文件夹。
现在,这就是我发现该错误特别令人不安的原因:INFORMATION_SCHEMA 数据库不应该是 datadir 下的清单文件夹。
例如
转到操作系统并运行以下命令:
您将看到几个文件夹:
在 mysql 中,当你这样做时
SHOW DATABASES;
,你不应该看到.
and..
。源代码会确保这一点。现在,INFORMATION_SCHEMA 在哪里?你猜怎么着?INFORMATION_SCHEMA 中的所有表都是临时表并使用内存存储引擎。另请注意,您看不到名为 INFORMATION_SCHEMA 的文件夹。现在,查看 INFORMATON_SCHEMA.TABLES 的定义:我完全将这个错误归咎于源代码,因为就像 mysql 绕过
.
和..
不被视为数据库的特殊情况文件夹一样,INFORMATION_SCHEMA 也应该被视为特殊情况文件夹,一个没有特殊情况的文件夹datadir 下的清单文件。我强烈建议将 MySQL 升级到最新版本,因为正如@gbn 发现的那样,有一个错误报告,但它被标记为已关闭。这只能发生
@gbn 因发现错误报告而得到我的 +1,这有助于我更深入地了解
权限错误,报告为(旧)MySQL 错误
查看MySQL 安装文档中的权限位
在 MySQL 版本 5.5 上,
NFORMATION_SCHEMA
目录/文件夹存在;我假设它适用于其他版本。它不受my.ini
或my.cnf
as的设置控制datadir=whatever
;它似乎是在 MySQL 的安装路径中预定义的,并且在 MySQL 在启动时首次加载时被读取。没有
my.ini
或my.cnf
设置用于放置此架构的位置。这似乎适用于 MySQL 5.5 的 Unix/Linux 和 Windows 版本,并且可能会追溯到首次引入此模式时。我在 Windows 和 Unix 机器上都从 4.1 升级到了 5.5,所以我不知道中间的版本。我忘了提到在我的情况下的文件夹不是模式的名称,而只是另一个文件夹,它简单地调用
MySQL
了以下目录/XML 文件information_schema.mbp
,其中包含以下数据,正如您在 MySQL Admin 客户端中看到的那样。我猜这是它在启动时加载到内存中的副本。我看到我的版本似乎比你的长,而且我的也有一个用户配置部分。如果您没有使用常规备份
datadir
或sqldump
在我的系统上备份,您将失去用户配置设置和权限。还有其他类似的文件包含表的实际数据。我猜这个.mbp
扩展名是用来表示内存引擎备份或复制的。我知道它必须存储在某个地方,并且必须有一种访问它的方法。当我升级到 5.5 时,我确实导入了我的旧用户配置和权限。它们由服务器发送到该数据库。然而,它并没有像过去那样被保存下来。因此,如果当您使用我的版本时,您需要备份此文件,否则您将失去所有用户和权限。我想这就是这个内置数据库在我的情况下的用途。
对不起,这个太大了!我想向您展示它的外观以及如何通过名称找到它。嗯,我还没有尝试过,但是我想知道你是否在当前位置创建了另一个像这个一样的数据文件,并且如果它会在启动时加载它,那么它是否会在相同的文件扩展名中加载它?也就是说,如果您真的想以这种方式创建数据库。
我在为存储过程创建临时表时遇到了问题。我想使用 information_schema.tables 视图来搜索我的临时表,以确定我是尝试创建临时表语句还是从临时表本身中删除。但是,information_schema.tables 视图从未显示它存在,因此我编写的如下代码无法正常工作:
我发现了一个令人满意的解决方法。我重写了上面的代码,如下所示:
我发现这个解决方案在正常工作的同时为我提供了会话中的临时存储。