Promouvoir la partition de table MySQL en table

Aug 17 2020

Mes compétences en recherche Google n'étaient pas suffisantes pour trouver une solution à cela. Si possible, comment puis-je promouvoir une partition sur une table en table seule ?

Supposons que j'ai part0, part1et part2. Y en a-t-il ALTER TABLEque je puisse donner qui se convertit part0en une nouvelle table ?

Mon processus de réflexion était que, puisque les données existent déjà dans un fichier séparé sur le disque, le processus de création de table peut être plus rapide que la création d'une nouvelle table à l'aide d'une SELECTrequête.

Réponses

RolandoMySQLDBA Aug 17 2020 at 23:04

Vous n'avez pas besoin SELECT. Cela peut être fait avec du DDL pur.

Pour cet exemple, supposons que la table partitionnée est la suivante :

  1. Base de donnéesmydb
  2. Tablemytable
  3. Cloisons ( part0, part1, part2)

Cela peut être délicat, mais c'est parti

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;

Ce que cela fait, c'est d'abord créer mynewtablesans aucune partition et le même schéma dans tous les autres aspects. Ensuite, il échange la mynewtabletable avec part0.

Si vous n'êtes pas sûr de cela, exécutez

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

Examinez les lignes dans mynewtableet le nouveau part0et assurez-vous

  • mynewtablea les données de l'originalpart0
  • Le nouveau part0doit être vide

Une fois que vous êtes sûr que la transposition a fonctionné, exécutez

ALTER TABLE mytable DROP PARTITION p0;

Veuillez tester cela dans un laboratoire ou sqlfiddle. ESSAIE !!!

RickJames Aug 17 2020 at 21:54

Oui, un PARTITIONest un TABLE. Cependant, certaines commandes spéciales sont nécessaires pour transformer une partition en table ou vice versa.

Voir "tablespaces transportables" et FLUSH TABLES ptable FOR EXPORT ; ALTER TABLE table DISCARD TABLESPACE; ALTER TABLE ptable IMPORT TABLESPACE. Les détails sont différents entre MySQL 5.6 et 5.7+.

http://mysql.rjweb.org/doc.php/partitionmaint#use_cases_for_partitioninga des liens vers quelques endroits qui discutent des techniques.