Переместить раздел таблицы MySQL в таблицу

Aug 17 2020

Моих навыков поиска в Google было недостаточно, чтобы найти решение этой проблемы. Если возможно, как я могу преобразовать раздел таблицы в отдельную таблицу?

Давайте предположим , что у меня есть part0, part1и part2. ALTER TABLEМогу ли я дать что- нибудь , что преобразовывает part0в новую таблицу?

Я думал, что, поскольку данные уже существуют в отдельном файле на диске, процесс создания таблицы может быть быстрее, чем создание новой таблицы с помощью SELECTзапроса.

Ответы

RolandoMySQLDBA Aug 17 2020 at 23:04

Вам не нужно SELECT. Это можно сделать с помощью чистого DDL.

В этом примере предположим, что секционированная таблица выглядит следующим образом:

  1. База данных mydb
  2. Таблица mytable
  3. Перегородки ( part0, part1, part2)

Это может быть сложно, но вот

USE mydb
CREATE TABLE mynewtable LIKE mytable;
ALTER TABLE mynewtable REMOVE PARTITIONING; 
ALTER TABLE mytable
    EXCHANGE PARTITION p0
    WITH TABLE mynewtable
    WITHOUT VALIDATION
;
ALTER TABLE mytable DROP PARTITION p0;

Сначала это делается mynewtableбез каких-либо разделов и той же схемы во всех других аспектах. Затем он меняет местами mynewtableтаблицу с part0.

Если вы не уверены в этом, запустите

USE mydb
CREATE TABLE mynewtable LIKE mytable;
ALTER TABLE mynewtable REMOVE PARTITIONING; 
ALTER TABLE mytable
    EXCHANGE PARTITION p0
    WITH TABLE mynewtable
    WITHOUT VALIDATION
;

Изучите ряды в mynewtableновой part0и новой и убедитесь, что

  • mynewtable имеет данные из оригинала part0
  • Новый part0должен быть пустым

Убедившись, что транспозиция сработала, запустите

ALTER TABLE mytable DROP PARTITION p0;

Пожалуйста, проверьте это в лаборатории или sqlfiddle. ПОПРОБУЙТЕ !!!

RickJames Aug 17 2020 at 21:54

Да, это PARTITIONа TABLE. Однако для превращения раздела в таблицу или наоборот требуются специальные команды.

См. «Переносимые табличные пространства» и FLUSH TABLES ptable FOR EXPORT; ALTER TABLE ptable DISCARD TABLESPACE; ALTER TABLE ptable IMPORT TABLESPACE. Детали различаются между MySQL 5.6 и 5.7+.

http://mysql.rjweb.org/doc.php/partitionmaint#use_cases_for_partitioning содержит ссылки на несколько мест, где обсуждаются методы.