Перемещение системной версионной (временной) базы данных MariaDB из Windows в Linux - PullRequest
0 голосов
/ 02 ноября 2019

После перемещения всего каталога data из Win установки MariaDB в Linux, MariaDB не может видеть разделенные временные таблицы (или системы с управлением версиями).

Все в порядке с "традиционными" таблицами, MariaDB может получить доступих на линуксе. Но для многораздельных временных таблиц есть проблема: в разделах Windows файлы данных называются так: <table name>#p#p_cur.ibd (для текущего раздела данных), но в Linux MariaDB ожидают, что этот файл будет называться <table name>#P#p_cur.ibd, и поэтому MariaDB не может использовать такие разделы,выдает сообщение:

таблица не существует в движке

Переименование файла .ibd не помогает, в этом случае MariaDB не может найти файл.

Может ли кто-нибудь помочь, пожалуйста?

1 Ответ

2 голосов
/ 03 ноября 2019

Я думаю, что это должно повлиять на любые секционированные таблицы. Вы можете подтвердить это?

В 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. Удалитеfile 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).

Примечание: Iне проверял это. Пожалуйста, сообщите, сработало ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...