Преобразовать секционированную таблицу MRG_MYISAM в Innodb - PullRequest
0 голосов
/ 22 февраля 2019

Я хочу преобразовать многораздельную таблицу MYISAM (MRG_MYISAM) с более чем 110 миллионами строк (примерно в 60 таблицах разделов) в Innodb.

Есть ли безопасный способ сделать это?(например, Alter Table ....)

Или я должен подготовить дамп (который займет 10 с гигабайт диска, и он может никогда не закончиться)

1 Ответ

0 голосов
/ 23 февраля 2019

Я попробовал пример таблицы MERGE на этой странице: https://dev.mysql.com/doc/refman/5.5/en/merge-storage-engine.html

CREATE TABLE `total` (
  `a` int(11) NOT NULL AUTO_INCREMENT,
  `message` char(20) DEFAULT NULL,
  KEY `a` (`a`)
) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8mb4 INSERT_METHOD=LAST UNION=(`t1`,`t2`)

И я преобразовал ее:

ALTER TABLE total ADD PRIMARY KEY (a),
  ENGINE=InnoDB
  PARTITION BY HASH(a) PARTITIONS 4;

Я должен был убедиться, что в дубликатах не будетстолбец a первый.

В результате получается таблица:

CREATE TABLE `total` (
  `a` int(11) NOT NULL AUTO_INCREMENT,
  `message` char(20) DEFAULT NULL,
  PRIMARY KEY (`a`),
  KEY `a` (`a`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4
PARTITION BY HASH (a)
PARTITIONS 4

Таким образом, он все еще имеет избыточный индекс для столбца a, но в остальном он, похоже, сработал.

Обратите внимание, что для этого требуется дополнительное место для хранения.Исходные таблицы, для которых таблица слияния была определена как объединение, все еще существуют.

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| t1             |
| t2             |
| total          |
+----------------+

Любые дальнейшие изменения данных в t1, t2 НЕ станут частью таблицы total.

...