小编Chr*_*wan的帖子

对于故意删除的 InnoDB 表,出现“无法打开只读数据文件”

我们已经记不清我们是如何准确到达这里的了,但是我们在 MySQL 启动时收到以下错误(尽管它仍然使用 InnoDB 启动服务):

[ERROR] InnoDB: Cannot open datafile for read-only: './oldschema/tablename.ibd' OS Error: 71
Run Code Online (Sandbox Code Playgroud)

它所引用的表曾经存在于那里,但被重命名为不同的模式,然后被删除,或者可能只是被删除(模糊内存),以便让对它的所有引用都跟随到其他模式中。最终,该表被替换为通过复制有意建立为副本的表。

它不会出现在信息模式中,不会出现在 SHOW TABLES 列表中,无法使用 SELECT 语句进行查询,并且无法在该模式中对该名称进行 DROP/ALTER TABLE(在获取视图后)让我们:

mysql> drop table oldschema.tablename;
ERROR 1051 (42S02): Unknown table 'oldschema.tablename'
mysql> ALTER TABLE oldschema.tablename DISCARD TABLESPACE;
ERROR 1146 (42S02): Table 'oldschema.tablename' doesn't exist
Run Code Online (Sandbox Code Playgroud)

...正如我们所期望的那样。然而,现在在它的位置有一个同名的视图(它引用另一个模式中的新表),并且它有一个相应的 .frm 文件,当然,没有 .ibd 文件,正如我们所期望的那样。

此外,新模式中的表正如预期一样工作,旧模式中为其别名的视图也是如此。事实上,据我们所知,这不会造成任何问题……我们只是不想再担心看到日志的人。我们甚至可以在其位置创建并删除一个表(在移动视图之后并将其放回之前),但仍然会出现该错误。

那么为什么 MySQL 需要在旧模式中使用该名称的 ibd 文件呢?

我们如何说服它忘记?

mysql innodb tablespaces

6
推荐指数
0
解决办法
6678
查看次数

InnoDB行元数据大小(最小行大小)

我正在尝试决定是否进一步标准化,并且需要知道 InnoDB 中最小的一行可以是多少(我有 MySQL 5.6)。

这并不完全是我的情况,但为了简单起见,我们假设我只有一个代理 PK (bigint) 和两个 TINYINT 列,它们都不能为空。如果我要存储 10 亿个字节,那么每行需要多少字节来存储?

我想每行都需要一些元数据(我知道至少在存在可空列时需要),但似乎找不到有关如何计算它的文档。

那么,页面中的可用空间和页面中的元数据(或者全部一起)会占用多少空间?

我想知道,以便我可以更好地判断何时会有一个足够窄的长表以避免正确的标准化。

mysql innodb metadata

2
推荐指数
1
解决办法
610
查看次数

标签 统计

innodb ×2

mysql ×2

metadata ×1

tablespaces ×1