将整个data
目录从WinDB安装的MariaDB移到Linux之后,MariaDB无法看到分区的临时表(或系统版本)。
“过渡”表一切正常,MariaDB可以在Linux上访问它们。但是对于分区的临时表存在问题:
在Windows分区上,数据文件的命名如下:<table name>#p#p_cur.ibd
(对于当前数据分区)
但在Linux上,MariaDB希望该文件名为<table name>#P#p_cur.ibd
因此MariaDB无法使用此类分区,它会显示消息:
表在引擎中不存在
重命名.ibd文件无济于事,在这种情况下,MariaDB无法找到文件。
有人可以帮忙吗?
答案 0 :(得分:2)
我认为这应该影响任何分区表。你能确认吗?
在Windows上,由于某种原因,InnoDB将#P
转换为小写。如果您设置lower_case_table_names=2
,则该表在其他平台上也可以访问。我认为这样的设置不应该首先存在。
要在InnoDB上将分区重命名为正确的名称,可以执行以下操作:
CREATE TABLE t(a INT)ENGINE=InnoDB;
并将t.frm
文件复制到tablename#p#p_cur.frm
RENAME TABLE ``#mysql50#tablename#p#p_cur`` TO ``#mysql50#tablename#P#p_cur``;
(注意:只有单引号而不是双引号。我在StackOverflow上的格式设置有麻烦。)tablename#P#p_cur.frm
。DROP TABLE t;
特殊的#mysql50
前缀应将表的其余部分传递给存储引擎,同时绕过MySQL 5.1中引入的文件名安全编码。那应该允许直接访问分区。通常,#
被编码为序列@0023
,但是分区引擎使用原始的#P#
后缀。
在MySQL 4.1和5.0中,表名直接用UTF-8编码。在MySQL 4.0(当我开始使用InnoDB内部时,这是稳定的发行版系列)中,它们可能直接用latin1
编码,或者表名中的非ASCII字符在某些文件系统或操作系统上不起作用系统。
注意:我认为.frm
文件存储了存储引擎的信息。如果仅复制分区表的tablename.frm
文件,则可能仅调用ha_partition::rename_table()
而不是ha_innobase::rename_table()
。我们确实希望InnoDB执行重命名操作,以便表名将在其自己的数据字典(SYS_TABLES
表,可通过INFORMATION_SCHEMA.INNODB_SYS_TABLES
读取)中重命名。
注意:我没有对此进行测试。请报告是否可行。