将整个data
目录从MariaDB的Win安装转移到Linux之后,MariaDB无法看到分区的时态表(或系统版本)。
所有的“传统”表都没问题,MariaDB可以在Linux上访问它们。但对于已分区的时态表,存在问题:在Windows分区上,数据文件的命名方式如下:<table name>#p#p_cur.ibd
(用于当前数据分区),但在Linux MariaDB上,希望该文件被命名为<table name>#P#p_cur.ibd
,因此MariaDB不能使用这样的分区,它给出了消息:
引擎中不存在
表
重命名.ibd文件没有帮助,在这种情况下,MariaDB找不到文件。
有人能帮忙吗?
发布于 2019-11-03 09:15:07
我认为这应该会影响任何分区表。你能确认一下吗?
在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.)DROP TABLE t;
的文件tablename#P#p_cur.frm
.
特殊的#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
可读)中重命名表名。
注意:我没有测试这个。请报告这是否有效。
https://stackoverflow.com/questions/58665931
复制相似问题