在调查问题时,我遇到了这个错误:
30503 [错误] InnoDB:尝试打开以前打开的表空间。以前的表空间mysql / innodb_index_stats在文件路径中使用空间ID:2:./ mysql / innodb_index_stats.ibd。无法在文件路径中打开使用空格ID:2的表空间Mydb / be_command_log:./ Model / be_command_log.ibd
在仔细阅读了这个问题后,我发现这是a known issue of MySQL。
但我的问题是我不太了解表空间是如何工作的。它们有用吗?我读了this definition,但没有提供所有信息。
有人可以分享一些关于什么是表空间以及它们如何工作的详细信息?
答案 0 :(得分:9)
一个数据文件,可以保存一个或多个InnoDB表和相关索引的数据。
有许多类型的表空间基于w.r.t每个表的信息俱乐部的配置。这些是,
一个。系统表空间 湾每个表空间的文件 C。常规表空间
系统表空间包含,
除此之外,它还包含,
关联文件为.idbdata1
innodb_file_per_table选项,默认情况下在MySQL 5.6及更高版本中启用,允许在每个表的文件表空间中创建表,每个表都有一个单独的数据文件。启用innodb_file_per_table选项可以使用其他MySQL功能,例如表压缩和可传输表空间。
关联文件为.idbd
InnoDB在MySQL 5.7.6中引入了通用表空间。常规表空间是使用CREATE TABLESPACE语法创建的共享表空间。它们可以在MySQL数据目录之外创建,能够保存多个表,并支持所有行格式的表。
答案 1 :(得分:3)
默认情况下,InnoDB只包含一个称为系统表空间的表空间,其标识符为0.可以使用innodb_file_per_table配置参数间接创建更多表空间。表空间由一系列文件组成。文件的大小不必被数据库块大小整除,因为我们可能只保留最后一个未完成的块。将新文件追加到表空间时,还会指定文件的最大大小。目前,我们认为最好在创建文件时将文件扩展到其最大大小,因为当表空间需要更多空间时,我们可以避免动态扩展文件。数据文件是动态扩展的,但重做日志文件是预先分配的。此外,如前所述,只有系统表空间可以有多个数据文件。还清楚地提到,即使表空间可以有多个文件,它们也被认为是连接在一起的单个大文件。因此,表空间中文件的顺序很重要。
来自https://blogs.oracle.com/mysqlinnodb/entry/data_organization_in_innodb
答案 2 :(得分:1)
MySQL Innodb TableSpace是数据驻留在名为 data directory 的磁盘中的位置(默认为"系统表空间" )。示例:
"在/ var / lib中/ MySQL的"
从MySQL 5.6.6版开始,用户可以创建并指定他们想要存储数据的表空间,从而实现数据操作和恢复过程的吞吐量。 InnoDB的每表格文件功能为每个表格提供了单独的 .ibd 数据&索引文件,表示单个通用表空间。这样数据库中的每个表都可以指向various locations of data directories。
前:
/家庭/ {用户} /测试/数据/ {DBNAME} / {TABLENAME}的.ibd
/家庭/ {用户} /工作/数据/ {DBNAME} / {TABLENAME}的.ibd
有关每表文件表空间的更多信息,请参阅此mysql documentation。
答案 3 :(得分:1)
sql客户端只能使用sql对象,而不关心数据库服务器物理存储该信息的位置。
这就是为什么需要表空间的概念。从表数据这样的sql对象从sql客户端的角度进入表空间。
数据库服务器管理员现在可以自由地将表空间物理地放置在他们想要的物理位置,sql客户端程序仍然有效。