AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 8087
Accepted
Mokus
Mokus
Asked: 2011-11-18 23:38:58 +0800 CST2011-11-18 23:38:58 +0800 CST 2011-11-18 23:38:58 +0800 CST

INFORMATION_SCHEMA 选择错误

  • 772

我正在尝试从中选择数据,information_schema但出现以下错误。我怎样才能解决这个问题?

mysql> SELECT * FROM information_schema.tables ;
ERROR 1018 (HY000): Can't read dir of '.' (errno: 13)
mysql ubuntu
  • 4 4 个回答
  • 4604 Views

4 个回答

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2011-11-19T05:50:52+08:002011-11-19T05:50:52+08:00

    我发现这个错误特别令人不安,因为 MySQL 在引入 MySQL 5.0 时引入了 INFORMATION_SCHEMA。@gbn 的回答表明这个错误

    • 回到 MySQL 5.0.16
    • 报告了任何具有此功能的操作
    • 基于 IBM AIX 5.3 ML2 操作系统中发生的错误
    • 于2006-01-26关闭

    MySQL对数据库的定义只是datadir下的一个子文件夹。

    现在,这就是我发现该错误特别令人不安的原因:INFORMATION_SCHEMA 数据库不应该是 datadir 下的清单文件夹。

    例如

    • 数据目录是 /var/lib/mysql
    • 您有两个数据库:db1 和 db2

    转到操作系统并运行以下命令:

    cd /var/lib/mysql
    ls -l
    

    您将看到几个文件夹:

    • mysql
    • db1
    • 数据库2
    • 测试(因为 MySQL 默认安装一个测试数据库)
    • . (当前目录)
    • ..(父目录)

    在 mysql 中,当你这样做时SHOW DATABASES;,你不应该看到.and ..。源代码会确保这一点。现在,INFORMATION_SCHEMA 在哪里?你猜怎么着?INFORMATION_SCHEMA 中的所有表都是临时表并使用内存存储引擎。另请注意,您看不到名为 INFORMATION_SCHEMA 的文件夹。现在,查看 INFORMATON_SCHEMA.TABLES 的定义:

    mysql> use information_schema
    Database changed
    mysql> show create table tables\G
    *************************** 1. row ***************************
           Table: TABLES
    Create Table: CREATE TEMPORARY TABLE `TABLES` (
      `TABLE_CATALOG` varchar(512) NOT NULL DEFAULT '',
      `TABLE_SCHEMA` varchar(64) NOT NULL DEFAULT '',
      `TABLE_NAME` varchar(64) NOT NULL DEFAULT '',
      `TABLE_TYPE` varchar(64) NOT NULL DEFAULT '',
      `ENGINE` varchar(64) DEFAULT NULL,
      `VERSION` bigint(21) unsigned DEFAULT NULL,
      `ROW_FORMAT` varchar(10) DEFAULT NULL,
      `TABLE_ROWS` bigint(21) unsigned DEFAULT NULL,
      `AVG_ROW_LENGTH` bigint(21) unsigned DEFAULT NULL,
      `DATA_LENGTH` bigint(21) unsigned DEFAULT NULL,
      `MAX_DATA_LENGTH` bigint(21) unsigned DEFAULT NULL,
      `INDEX_LENGTH` bigint(21) unsigned DEFAULT NULL,
      `DATA_FREE` bigint(21) unsigned DEFAULT NULL,
      `AUTO_INCREMENT` bigint(21) unsigned DEFAULT NULL,
      `CREATE_TIME` datetime DEFAULT NULL,
      `UPDATE_TIME` datetime DEFAULT NULL,
      `CHECK_TIME` datetime DEFAULT NULL,
      `TABLE_COLLATION` varchar(32) DEFAULT NULL,
      `CHECKSUM` bigint(21) unsigned DEFAULT NULL,
      `CREATE_OPTIONS` varchar(255) DEFAULT NULL,
      `TABLE_COMMENT` varchar(2048) NOT NULL DEFAULT ''
    ) ENGINE=MEMORY DEFAULT CHARSET=utf8
    1 row in set (0.05 sec)
    

    我完全将这个错误归咎于源代码,因为就像 mysql 绕过.和..不被视为数据库的特殊情况文件夹一样,INFORMATION_SCHEMA 也应该被视为特殊情况文件夹,一个没有特殊情况的文件夹datadir 下的清单文件。

    我强烈建议将 MySQL 升级到最新版本,因为正如@gbn 发现的那样,有一个错误报告,但它被标记为已关闭。这只能发生

    • 如果您仍在运行非常旧版本的 mysql
    • 这种情况在 Ubuntu 操作系统的源代码中没有得到正确处理

    @gbn 因发现错误报告而得到我的 +1,这有助于我更深入地了解

    • 4
  2. gbn
    2011-11-19T00:32:22+08:002011-11-19T00:32:22+08:00

    权限错误,报告为(旧)MySQL 错误

    查看MySQL 安装文档中的权限位

    • 3
  3. Sysop100
    2012-09-24T21:59:50+08:002012-09-24T21:59:50+08:00

    在 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 客户端中看到的那样。我猜这是它在启动时加载到内存中的副本。我看到我的版本似乎比你的长,而且我的也有一个用户配置部分。

    如果您没有使用常规备份datadir或sqldump在我的系统上备份,您将失去用户配置设置和权限。还有其他类似的文件包含表的实际数据。我猜这个.mbp扩展名是用来表示内存引擎备份或复制的。我知道它必须存储在某个地方,并且必须有一种访问它的方法。

    当我升级到 5.5 时,我确实导入了我的旧用户配置和权限。它们由服务器发送到该数据库。然而,它并没有像过去那样被保存下来。因此,如果当您使用我的版本时,您需要备份此文件,否则您将失去所有用户和权限。我想这就是这个内置数据库在我的情况下的用途。

    <?xml version="1.0"?>
    <backup_profile>
      <profile_name>information_schema</profile_name>
      <last_used></last_used>
      <options>288</options>
      <backup_type>0</backup_type>
      <tables>
        <table>
          <name>CHARACTER_SETS</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>COLLATIONS</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>COLLATION_CHARACTER_SET_APPLICABILITY</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>COLUMNS</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>COLUMN_PRIVILEGES</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>ENGINES</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>EVENTS</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>FILES</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>GLOBAL_STATUS</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>GLOBAL_VARIABLES</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>KEY_COLUMN_USAGE</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>PARAMETERS</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>PARTITIONS</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>PLUGINS</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>PROCESSLIST</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>PROFILING</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>REFERENTIAL_CONSTRAINTS</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>ROUTINES</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>SCHEMATA</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>SCHEMA_PRIVILEGES</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>SESSION_STATUS</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>SESSION_VARIABLES</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>STATISTICS</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>TABLES</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>TABLESPACES</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>TABLE_CONSTRAINTS</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>TABLE_PRIVILEGES</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>TRIGGERS</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>USER_PRIVILEGES</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>VIEWS</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>INNODB_CMP_RESET</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>INNODB_TRX</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>INNODB_CMPMEM_RESET</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>INNODB_LOCK_WAITS</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>INNODB_CMPMEM</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>INNODB_CMP</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
        <table>
          <name>INNODB_LOCKS</name>
          <schema>information_schema</schema>
          <catalog>def</catalog>
        </table>
      </tables>
    </backup_profile>
    

    对不起,这个太大了!我想向您展示它的外观以及如何通过名称找到它。嗯,我还没有尝试过,但是我想知道你是否在当前位置创建了另一个像这个一样的数据文件,并且如果它会在启动时加载它,那么它是否会在相同的文件扩展名中加载它?也就是说,如果您真的想以这种方式创建数据库。

    • 2
  4. Tony Mays
    2013-04-11T11:17:54+08:002013-04-11T11:17:54+08:00

    我在为存储过程创建临时表时遇到了问题。我想使用 information_schema.tables 视图来搜索我的临时表,以确定我是尝试创建临时表语句还是从临时表本身中删除。但是,information_schema.tables 视图从未显示它存在,因此我编写的如下代码无法正常工作:

    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;
    

    我发现这个解决方案在正常工作的同时为我提供了会话中的临时存储。

    • 1

相关问题

  • 是否有任何 MySQL 基准测试工具?[关闭]

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve