Promover partição de tabela MySQL para tabela

Aug 17 2020

Minhas habilidades de pesquisa no Google não foram suficientes para encontrar uma solução para isso. Se possível, como posso promover uma partição em uma tabela para uma tabela independente?

Vamos supor que eu tenha part0, part1e part2. Existe algum ALTER TABLEque eu possa dar que converta part0em uma nova tabela?

Meu processo de pensamento foi, como os dados já existem em um arquivo separado no disco, o processo de criação da tabela pode ser mais rápido do que criar uma nova tabela usando uma SELECTconsulta.

Respostas

RolandoMySQLDBA Aug 17 2020 at 23:04

Você não precisa SELECT. Isso pode ser feito com DDL puro.

Para este exemplo, digamos que a tabela particionada seja a seguinte:

  1. Base de dadosmydb
  2. Mesamytable
  3. Partições ( part0, part1, part2)

Isso pode ser complicado, mas aqui vai

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;

O que isso faz é primeiro fazer mynewtablesem partições e o mesmo esquema em todos os outros aspectos. Em seguida, ele troca a mynewtabletabela por part0.

Se você não tem certeza disso, execute

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

Examine as linhas dentro mynewtablee as novas part0e certifique-se

  • mynewtabletem os dados do originalpart0
  • O novo part0deve estar vazio

Quando tiver certeza de que a transposição funcionou, execute

ALTER TABLE mytable DROP PARTITION p0;

Por favor, teste isso em um laboratório ou sqlfiddle. DE UMA CHANCE !!!

RickJames Aug 17 2020 at 21:54

Sim, um PARTITIONé um TABLE. No entanto, são necessários alguns comandos especiais para transformar uma partição em uma tabela ou vice-versa.

Veja "tablespaces transportáveis" e FLUSH TABLES ptable FOR EXPORT; ALTER TABLE ptable DISCARD TABLESPACE; ALTER TABLE ptable IMPORT TABLESPACE. Os detalhes são diferentes entre o MySQL 5.6 e 5.7+.

http://mysql.rjweb.org/doc.php/partitionmaint#use_cases_for_partitioningtem links para alguns lugares que discutem as técnicas.