Nachdem ich das Unternehmen eine Zeit lang geführt hatte, stellte ich fest, dass die ursprüngliche Primärschlüsseleinstellung unangemessen war. Zu diesem Zeitpunkt wollte ich den Primärschlüssel ändern. Dieser Bedarf ist in der tatsächlichen Produktion immer noch recht groß.
Nachfolgend werfen wir einen Blick darauf, wie pt-online-schema-change diese Art von Problem löst.
Erstellen Sie zunächst eine Testtabelle
Erstellen Sie Tabelle t2(c1 int Primary Key, c2 int);
Konstrukt Testdaten
delimiter // create procedure p1() begin declare v1 int default 1; set autocommit=0; while v1 <=100000 do insert into test.t2(c1,c2) values(v1,v1+100); set v1=v1+1; if v1%1000 =0 then commit; end if; end while; end // delimiter ; call p1;
Als nächstes beginnen Sie mit pt-online-schema-change, um den Primärschlüssel der t2-Tabelle zu ändern
1. Fügen Sie der Spalte c1 einen eindeutigen Schlüssel hinzu
# pt-online-schema-change --execute --alter "modify c1 int unique key" --print D=test,t=t2
Zu diesem Zeitpunkt ist die Tabellenstruktur des Die T2-Tabelle lautet wie folgt:
mysql> show create table t2\G *************************** 1. row *************************** Table: t2 Create Table: CREATE TABLE `t2` ( `c1` int(11) NOT NULL DEFAULT '0', `c2` int(11) DEFAULT NULL, PRIMARY KEY (`c1`), UNIQUE KEY `c1` (`c1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 row in set (0.03 sec)
2. Löschen Sie den Primärschlüssel in Spalte c1
# pt-online-schema-change --execute --alter "drop Primary Key" - -no-check-alter - -print D=test,t=t2
Hinweis: Um den Primärschlüssel zu löschen, müssen Sie die Option --no-check-alter hinzufügen
At Diesmal ist die Tabellenstruktur von t2 wie folgt:
mysql> show create table t2\G *************************** 1. row *************************** Table: t2 Create Table: CREATE TABLE `t2` ( `c1` int(11) NOT NULL DEFAULT '0', `c2` int(11) DEFAULT NULL, UNIQUE KEY `c1` (`c1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 row in set (0.05 sec)
3. Fügen Sie den Primärschlüssel in Spalte c2 hinzu
# pt-online-schema-change --execute --alter „modify c2 int Primary Key“ --print D=test,t=t2
Zu diesem Zeitpunkt ist die Tabellenstruktur von t2 wie folgt:
mysql> show create table t2\G *************************** 1. row *************************** Table: t2 Create Table: CREATE TABLE `t2` ( `c1` int(11) NOT NULL DEFAULT '0', `c2` int(11) NOT NULL, PRIMARY KEY (`c2`), UNIQUE KEY `c1` (`c1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 row in set (0.02 sec)
4 Schlüssel in Spalte c1
# pt-online-schema-change --execute - -alter "drop key c1" --print D=test,t=t2
Zu diesem Zeitpunkt ist der Primärschlüsseländerung von t2 ist abgeschlossen
mysql> show create table t2\G *************************** 1. row *************************** Table: t2 Create Table: CREATE TABLE `t2` ( `c1` int(11) NOT NULL DEFAULT '0', `c2` int(11) NOT NULL, PRIMARY KEY (`c2`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 row in set (0.02 sec)