将系统版本化的(临时)MariaDB数据库从Windows移动到Linux

时间:2019-11-01 21:09:39

标签: mariadb

将整个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无法找到文件。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

我认为这应该影响任何分区表。你能确认吗?

在Windows上,由于某种原因,InnoDB将#P转换为小写。如果您设置lower_case_table_names=2,则该表在其他平台上也可以访问。我认为这样的设置不应该首先存在。

要在InnoDB上将分区重命名为正确的名称,可以执行以下操作:

  1. CREATE TABLE t(a INT)ENGINE=InnoDB;并将t.frm文件复制到tablename#p#p_cur.frm
  2. RENAME TABLE ``#mysql50#tablename#p#p_cur`` TO ``#mysql50#tablename#P#p_cur``;(注意:只有单引号而不是双引号。我在StackOverflow上的格式设置有麻烦。)
  3. 删除文件tablename#P#p_cur.frm
  4. 为每个分区重复。
  5. 最后,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读取)中重命名。

注意:我没有对此进行测试。请报告是否可行。