Heim  >  Artikel  >  Datenbank  >  Ändern Sie das Partitionsfeld online in der MySQL-Partitionstabellenpartition und erfahren Sie später mehr über die Partition (1)

Ändern Sie das Partitionsfeld online in der MySQL-Partitionstabellenpartition und erfahren Sie später mehr über die Partition (1)

黄舟
黄舟Original
2017-02-17 13:10:181643Durchsuche

Das Unternehmen verwendet die Partition online und das Partitionsfeld einer Tabelle ist falsch und muss neu erstellt werden. Es stellt sich heraus, dass es keine Möglichkeit gibt, dies direkt mit einer SQL zu tun, wie z. B. das Ändern des Primärschlüsselfelds oder des Index Feld. Stattdessen müssen wir eine temporäre Tabelle erstellen und Ausfallzeiten haben. Deshalb habe ich die Dokumentation sorgfältig gelesen und die Details der Partition studiert.

Wenn mein Unternehmen es während der Spitzenlastzeit um 1 Uhr morgens online stellt, führen Sie Folgendes aus:

Erstellen Sie eine temporäre Tabelle

CREATE TABLE tbname_TMP (    
SHARD_ID INT NOT NULL,    
...
    xxx_DATE DATETIME NOT NULL,    
    PRIMARY KEY (xxx_DATE,shard_id)) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_binPARTITION BY LIST(MONTH(xxx_DATE)) (    
    PARTITION m1 VALUES IN (1),    
    PARTITION m2 VALUES IN (2),    
    PARTITION m3 VALUES IN (3),    
    PARTITION m4 VALUES IN (4),    
    PARTITION m5 VALUES IN (5),    
    PARTITION m6 VALUES IN (6),    
    PARTITION m7 VALUES IN (7),    
    PARTITION m8 VALUES IN (8),    
    PARTITION m9 VALUES IN (9),    
    PARTITION m10 VALUES IN (10),    
    PARTITION m11 VALUES IN (11),    
    PARTITION m12 VALUES IN (12)
    );

Tabellennamen ändern, Tabellenstruktur ändern

RENAME TABLE xxx TO xxx_DELETED, xxx_TMP TO xxx;

Originaldaten importieren

insert into xxx select * from xxx_DELETEDxxx_DELETED;

OK, alles ist erledigt, das Der gesamte Vorgang dauert 50 Minuten, die Umrissoperation ändert die Tabellenstruktur und den Datenimport nach dem MMM-Failover-Switching. Die tatsächliche Ausfallzeit umfasst nicht die Zeit zum Ändern des Tabellenstruktur-Partitionsfelds, nur die Failover-Switching-Zeit beträgt 30 Sekunden

MySQL-Partition, ich habe die offiziellen englischen Informationen gelesen, der Übersetzungsgrad ist begrenzt, einige sind nicht ins Chinesische übersetzt und werden direkt auf Englisch veröffentlicht.
1 Listenpartitionstabelle

mysql> CREATE TABLE `eh` (
    ->   `id` int(11) NOT NULL,
    ->   `ENTITLEMENT_HIST_ID` bigint(20) NOT NULL,
    ->   `ENTITLEMENT_ID` bigint(20) NOT NULL,
    ->   `USER_ID` bigint(20) NOT NULL,
    ->   `DATE_CREATED` datetime NOT NULL,
    ->   `STATUS` smallint(6) NOT NULL,
    ->   `CREATED_BY` varchar(32) COLLATE utf8_bin DEFAULT NULL,
    ->   `MODIFIED_BY` varchar(32) COLLATE utf8_bin DEFAULT NULL,
    ->   `DATE_MODIFIED` datetime NOT NULL,
    ->   PRIMARY KEY (`DATE_MODIFIED`,`id`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
    -> /*!50100 PARTITION BY LIST (MONTH(DATE_MODIFIED))
    -> (PARTITION m1 VALUES IN (1) ENGINE = InnoDB,
    ->  PARTITION m2 VALUES IN (2) ENGINE = InnoDB,
    ->  PARTITION m3 VALUES IN (3) ENGINE = InnoDB,
    ->  PARTITION m4 VALUES IN (4) ENGINE = InnoDB,
    ->  PARTITION m5 VALUES IN (5) ENGINE = InnoDB,
    ->  PARTITION m6 VALUES IN (6) ENGINE = InnoDB,
    ->  PARTITION m7 VALUES IN (7) ENGINE = InnoDB,
    ->  PARTITION m8 VALUES IN (8) ENGINE = InnoDB,
    ->  PARTITION m9 VALUES IN (9) ENGINE = InnoDB,
    ->  PARTITION m10 VALUES IN (10) ENGINE = InnoDB,
    ->  PARTITION m11 VALUES IN (11) ENGINE = InnoDB,
    ->  PARTITION m12 VALUES IN (12) ENGINE = InnoDB) */;
Query OK, 0 rows affected (0.10 sec)


2 Rangpartitionstabelle

mysql> CREATE TABLE rcx (
    ->     a INT,
    ->     b INT,
    ->     c CHAR(3),
    ->     d INT
    -> )
    -> PARTITION BY RANGE COLUMNS(a,d,c) (
    ->     PARTITION p0 VALUES LESS THAN (5,10,'ggg'),
    ->     PARTITION p1 VALUES LESS THAN (10,20,'mmmm'),
    ->     PARTITION p2 VALUES LESS THAN (15,30,'sss'),
    ->     PARTITION p3 VALUES LESS THAN (MAXVALUE,MAXVALUE,MAXVALUE)
    -> );
Query OK, 0 rows affected (0.15 sec)

3 Bereich erstellen, weniger Zeichen verwenden

CREATE TABLE employees_by_lname (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT NOT NULL,
    store_id INT NOT NULL
)
PARTITION BY RANGE COLUMNS (lname)  (
    PARTITION p0 VALUES LESS THAN ('g'),
    PARTITION p1 VALUES LESS THAN ('m'),
    PARTITION p2 VALUES LESS THAN ('t'),
    PARTITION p3 VALUES LESS THAN (MAXVALUE)
);

Tabellenstruktur ändern, neuen Partitionsblock hinzufügen

ALTER TABLE employees_by_lname PARTITION BY RANGE COLUMNS (lname)  (
    PARTITION p0 VALUES LESS THAN ('g'),
    PARTITION p1 VALUES LESS THAN ('m'),
    PARTITION p2 VALUES LESS THAN ('t'),
 PARTITION p3 VALUES LESS THAN ('u'),
    PARTITION p4 VALUES LESS THAN (MAXVALUE)
);


4 Listenspaltenpartitionierung

character column
CREATE TABLE customers_1 (
    first_name VARCHAR(25),
    last_name VARCHAR(25),
    street_1 VARCHAR(30),
    street_2 VARCHAR(30),
    city VARCHAR(15),
    renewal DATE
)
PARTITION BY LIST COLUMNS(city) (
    PARTITION pRegion_1 VALUES IN('Oskarshamn', 'H?gsby', 'M?nster?s'),
    PARTITION pRegion_2 VALUES IN('Vimmerby', 'Hultsfred', 'V?stervik'),
    PARTITION pRegion_3 VALUES IN('N?ssj?', 'Eksj?', 'Vetlanda'),
    PARTITION pRegion_4 VALUES IN('Uppvidinge', 'Alvesta', 'V?xjo')
);

Datumsspalte

CREATE TABLE customers_2 (
    first_name VARCHAR(25),
    last_name VARCHAR(25),
    street_1 VARCHAR(30),
    street_2 VARCHAR(30),
    city VARCHAR(15),
    renewal DATE
)
PARTITION BY LIST COLUMNS(renewal) (
    PARTITION pWeek_1 VALUES IN('2010-02-01', '2010-02-02', '2010-02-03',
        '2010-02-04', '2010-02-05', '2010-02-06', '2010-02-07'),
    PARTITION pWeek_2 VALUES IN('2010-02-08', '2010-02-09', '2010-02-10',
        '2010-02-11', '2010-02-12', '2010-02-13', '2010-02-14'),
    PARTITION pWeek_3 VALUES IN('2010-02-15', '2010-02-16', '2010-02-17',
        '2010-02-18', '2010-02-19', '2010-02-20', '2010-02-21'),
    PARTITION pWeek_4 VALUES IN('2010-02-22', '2010-02-23', '2010-02-24',
        '2010-02-25', '2010-02-26', '2010-02-27', '2010-02-28')
);

5 HASH-Partitionierung

int column,it can use digital function
CREATE TABLE employeesint (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY HASH(MOD(store_id,4))
PARTITIONS 4;

Wenn Sie keine PARTITIONS-Klausel einfügen, ist die Anzahl der Partitionen standardmäßig 1. as unten:

CREATE TABLE employeestest (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY HASH(store_id);

Datumsspalte

CREATE TABLE employees2 (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY HASH( YEAR(hired) )
PARTITIONS 4;

Alle Datenzeilen abschneiden: Tabelle ändern rcx truncate PARTITION;

6 LINEARE HASH-Partitionierung

CREATE TABLE employees_linear (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)

PARTITION NACH LINEAREM HASH( JAHR(angestellt) )
PARTITIONEN 4;

Gegeben ein Ausdruck expr, ist die Partition, in der der Datensatz gespeichert wird, wenn lineares Hashing verwendet wird Partitionsnummer N aus Num-Partitionen, wobei N gemäß dem folgenden Algorithmus abgeleitet wird:
(1) Finden Sie die nächste Potenz von 2, die größer als Num ist. Wir nennen diesen Wert V; er kann wie folgt berechnet werden:
= POWER(2, CEILING(LOG(2, num)))
(Angenommen, num ist 13. Dann ist LOG(2,13) ​​​​​​3,7004397181411. CEILING(3,7004397181411) ist 4 und V = POWER(2 ,4 ), also 16.)
(2) Setze N = F(column_list) & (V - 1) (3) Während N >= num:
Setze V = CEIL( V / 2)
Setze N = N & (V - 1)


[Hinweis] Das Berechnungsprinzip von & in SQL lautet: Zum Beispiel
Konvertieren Sie Dezimalzahl in Binärzahl und Sie erhalten http://www.php.cn/

Zuerst nach rechts ausrichten, zum Beispiel 0011 und 1000 werden, anhand der Anzahl jeder Ziffer beurteilen, wenn beide 1 sind, dann das Ergebnis Die entsprechende Position ist 1, andernfalls ist sie 0
Wenn es 1011 und 1000 ist, ist das Ergebnis 1000
Wenn es 0110 und 1010 ist, ist das Ergebnis 0010
Aber 3 ist 0011, 8 ist 1000, Das Ergebnis von 3&8 ist also 0

CEILING(X) CEIL(X): Gibt den kleinsten ganzzahligen Wert zurück, der nicht kleiner als X ist.

LOG(X) LOG(B,X): Wenn diese Funktion mit einem Parameter aufgerufen wird, gibt sie den natürlichen Logarithmus von X zurück.
POWER(X,Y): Gibt den Ergebniswert von X potenziert mit Y zurück.


Berechnungsmethode, in welcher Kachel die Daten verteilt sind:
Angenommen, die Tabelle t1, die lineare Hash-Partitionierung verwendet und 6 Partitionen hat, wird mit dieser Anweisung erstellt:

CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATE)
    PARTITION BY LINEAR HASH( YEAR(col3) )
    PARTITIONS 6;
Nehmen Sie nun an, dass Sie zwei Datensätze in t1 mit den Spaltenwerten „2003-04-14“ und „1998-10-19“ einfügen möchten. Die Partitionsnummer für den ersten diese werden wie folgt ermittelt:


 V = POWER(2, CEILING( LOG(2,6) )) = 8
 N = YEAR('2003-04-14') & (8 - 1)
    = 2003 & 7
    = 3
 (3 >= 6 is FALSE: record stored in partition #3)

Die Nummer der Partition, in der der zweite Datensatz gespeichert ist, wird wie hier gezeigt berechnet:

 V = 8 N = YEAR('1998-10-19') & (8-1)   = 1998 & 7   = 6
 (6 >= 6 is TRUE: additional step required)
 N = 6 & CEILING(8 / 2)   = 6 & 3   = 2
 (2 >= 6 is FALSE: record stored in partition #2)

Der Vorteil der Partitionierung durch linearen Hash besteht darin, dass das Hinzufügen, Löschen, Zusammenführen und Teilen von Partitionen viel schneller erfolgt, was beim Umgang mit Tabellen mit extrem großen Datenmengen (Terabyte) von Vorteil sein kann Nachteil ist dass die Wahrscheinlichkeit einer gleichmäßigen Verteilung der Daten zwischen den Partitionen geringer ist als bei der Verteilung, die mit der regulären Hash-Partitionierung erzielt wird.

Eine der Fragen: Wie verwendet MySQL ein SQL, ohne eine temporäre Tabelle zu verwenden? ? Partitionsfeld löschen? Eine partitionierte Tabelle in eine normale Tabelle umwandeln?

Im Folgenden erfahren Sie, wie Sie das Partitionsfeld online in der MySQL-Partitionstabelle ändern. Weitere Informationen finden Sie hier Verwandte Inhalte, achten Sie bitte auf die chinesische PHP-Website (www.php.cn)!




Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn