MyISAM 用于将每个表存储在相应的文件中很方便。InnoDB 在很多方面都取得了进步,但我想知道为什么 InnoDB 将所有数据库存储在一个文件中(ibdata1
默认情况下)。
我知道 InnoDB 将通过表的单个索引文件映射文件中数据的位置,但我不明白为什么它将所有数据混合在一个文件中。更重要的是,为什么要混合服务器上所有数据库的数据?
MyISAM 的一个有趣功能是,可以将数据库文件夹复制/粘贴到另一台机器上,然后使用该数据库(无需转储)。
我以前保存了 /var/lib/mysql/ddms 目录的副本(“ddms”是架构名称)。现在我通过运行在新安装的 Ubuntu 10.04.3 LTS 上安装了一个新的 MySQL apt-get install mysql-server
,我相信安装了 5.1 版。在我复制 /var/lib/mysql 下的 ddms 目录后,它的一些表工作正常,这些表具有一组关联的三个文件:一个 .frm 文件、一个 .MYD 文件和一个 .MYI 文件。
但是,有两个表具有不同的文件集:一个 .frm 文件和一个 .ibd 文件。这两个表没有显示在 phpMyAdmin 的表列表中。当我查看错误日志时,它说:
[ERROR] Cannot find or open table ddms/dictionary_item from
the internal data dictionary of InnoDB though the .frm file for the
table exists. Maybe you have deleted and recreated InnoDB data
files but have forgotten to delete the corresponding .frm files
of InnoDB tables, or you have moved .frm files …
Run Code Online (Sandbox Code Playgroud) 所以我有一个在复制流上设置的测试数据库服务器。在名称上出现了一个优化,它迅速填满了 slaves 数据目录上的空间。Mysql 尽职尽责地等待更多空间。
这个 datadir 是一个文件系统,只用作 mysql 的 datadir,所以没有其他东西可以释放。
我有一个 4 g innodb 测试表,它不是复制流的一部分,所以我想我会尝试一些东西来看看它是否有效,作为一个测试环境,如果事情出现严重错误,我并不太担心。
这是我采取的步骤
.err 日志中没有显示任何内容,看起来不错。我连接并使用 mydb;并查看我在展示表中弄乱的表。但是,如果我尝试
select * from testtable limit 10;
Run Code Online (Sandbox Code Playgroud)
我收到错误
ERROR 1146 (42S02): Table 'mydb.testtable' doesn't exist
Run Code Online (Sandbox Code Playgroud)
到目前为止,我可以从所有其他表中读取数据,并且复制开始备份,没有任何抱怨。
我能做些什么来从这一点上恢复过来吗?如果需要,我可以从头开始重建它,但很好奇其他人对这次冒险的总体看法。我采取的一系列步骤是否有任何结果会导致更完美的结果?
如果这不是一个测试服务器,我不能只是“实时运行”看看会发生什么?如果我不得不喜欢,有什么最好的方法可以暂时释放生产从站上的空间?
我有两个数据库,当我提示 SHOW DATABASES 时,我可以看到一个数据库列表,包括 mysql、performance_schema 和 informations_schema。我可以在它们两个上提示“SELECT DATABASE_NAME”,我可以在它们两个上提示“SHOW TABLES”,但是当我尝试查询时,我得到了这个问题标题中提到的错误。我使用 MySQL 5.7.7,并且 InnoDB 设置为 FILE_PER_TABLE。所有文件都在正确的文件夹中,包括 ibdata1 和两个日志文件。
有没有人有解决方案?