So bereiten Sie sich auf Ihr MySQL 5.7-Upgrade vor

Ein Artikel aus dem MySQL-Team bei Oracle

Einführung

MySQL 5.7 ist der aktuellste Release-Kandidat der beliebten Open-Source-Datenbank. Es bietet neue Skalierbarkeitsfunktionen, mit denen Sie Änderungen vornehmen möchten.

Um eine der Änderungen hervorzuheben, wurde die Skalierbarkeit erheblich verbessert. Auf der High-End-Ebene lässt sich MySQL 5.7 auf 48-Core-Servern linear skalieren. Auf der unteren Ebene funktioniert MySQL 5.7 auch auf einem 512-MB-DigitalOcean-Droplet (was ohne Konfigurationsänderungen in MySQL 5.6 nicht möglich war).

Die neue Spitzenleistung für einen MySQL-Server liegt bei über 640.000 Abfragen pro Sekunde, und die zwischengespeicherte API, die direkt mit der InnoDB-Speicher-Engine kommuniziert, kann over aufrecht erhalten 1,1 Millionen Anfragen pro Sekunde.

MySQL 5.7 Leistung mit der Memcached NoSQL API

Bevor Sie jedoch "+ mysql_upgrade +" ausführen, sollten Sie sicherstellen, dass Sie vorbereitet sind. Dieses Tutorial kann Ihnen dabei helfen.

Änderungen der Datenintegrität mit Beispielen

Eine wesentliche Änderung in MySQL 5.7 ist, dass die Datenintegrität verbessert wurde, um den Erwartungen erfahrener Entwickler und Datenbankadministratoren besser zu entsprechen. Früher hat MySQL falsche Werte auf den nächstmöglichen korrekten Wert eingestellt, aber unter den neuen Standardwerten wird stattdessen ein Fehler zurückgegeben.

Hier sind fünf Beispiele für Abfragen, die geändert werden müssen, damit sie in MySQL 5.7 sofort ausgeführt werden können. Verwendet Ihre Anwendung eines dieser Verhaltensweisen?

[[1-inserting-a-negative-value-into-an-unsigned-column]] ==== 1) Einfügen eines negativen Wertes in eine vorzeichenlose Spalte

Erstellen Sie eine Tabelle mit einer vorzeichenlosen Spalte:

CREATE TABLE test (
id int unsigned
);

Geben Sie einen negativen Wert ein.

Bisheriges Verhalten:

INSERT INTO test VALUES (-1);
Query OK, 1 row affected, 1 warning (0.01 sec)

MySQL 5.7:

INSERT INTO test VALUES (-1);
ERROR 1264 (22003): Out of range value for column 'a' at row 1

[[2-division-by-zero]] ==== 2) Division durch Null

Erstellen Sie eine Testtabelle:

CREATE TABLE test2 (
id int unsigned
);

Versuch durch Null zu teilen.

Bisheriges Verhalten:

INSERT INTO test2 VALUES (0/0);
Query OK, 1 row affected (0.01 sec)

MySQL 5.7:

INSERT INTO test2 VALUES (0/0);
ERROR 1365 (22012): Division by 0

[[3-inserting-a-20-character-string-into-a-10-character-column]] ==== 3) Einfügen einer 20-stelligen Zeichenfolge in eine 10-stellige Spalte

Erstellen Sie eine Tabelle mit einer 10-stelligen Spalte:

CREATE TABLE test3 (
a varchar(10)
);

Versuchen Sie, eine längere Zeichenfolge einzufügen.

Bisheriges Verhalten:

INSERT INTO test3 VALUES ('abcdefghijklmnopqrstuvwxyz');
Query OK, 1 row affected, 1 warning (0.00 sec)

MySQL 5.7:

INSERT INTO test3 VALUES ('abcdefghijklmnopqrstuvwxyz');
ERROR 1406 (22001): Data too long for column 'a' at row 1

[[4-inserting-the-non-standard-zero-date-into-a-datetime-column]] ==== 4) Einfügen des nicht standardmäßigen Nulldatums in eine datetime-Spalte

Erstellen Sie eine Tabelle mit einer datetime-Spalte:

CREATE TABLE test3 (
a datetime
);

Geben Sie + 0000-00-00 00: 00: 00 + ein.

Bisheriges Verhalten:

INSERT INTO test3 VALUES ('0000-00-00 00:00:00');
Query OK, 1 row affected, 1 warning (0.00 sec)

MySQL 5.7:

INSERT INTO test3 VALUES ('0000-00-00 00:00:00');
ERROR 1292 (22007): Incorrect datetime value: '0000-00-00 00:00:00' for column 'a' at row 1

[[5-using-group-by-and-selecting-an-ambiguous-column]] ==== 5) Verwenden von GROUP BY und Auswählen einer mehrdeutigen Spalte

Dies ist der Fall, wenn die Beschreibung nicht Teil von "+ GROUP BY " ist und keine Aggregatfunktion (wie " MIN " oder " MAX +") darauf angewendet wird.

Bisheriges Verhalten:

SELECT id, invoice_id, description FROM invoice_line_items GROUP BY invoice_id;
+----+------------+-------------+
| id | invoice_id | description |
+----+------------+-------------+
| 1 | 1 | New socks             |
| 3 | 2 | Shoes                 |
| 5 | 3 | Tie                   |
+----+------------+-------------+
3 rows in set (0.00 sec)

MySQL 5.7:

SELECT id, invoice_id, description FROM invoice_line_items GROUP BY invoice_id;
ERROR 1055 (42000): Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'invoice_line_items.description' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

Grundlegendes zu den von sql_mode festgelegten Verhaltensweisen

In MySQL-Begriffen wird jedes der im vorherigen Abschnitt gezeigten Verhaltensweisen durch das beeinflusst, was als "+ sql_mode +" bezeichnet wird.

Die Funktion wurde in MySQL 4.1 (2004) eingeführt, wurde jedoch nicht standardmäßig kompiliert. MySQL 5.7 bietet die folgenden Modi, die standardmäßig aktiviert sind:

Der Modus http://dev.mysql.com/doc/refman/5.7/de/sql-mode.html#sqlmode_strict_trans_tables [+ STRICT_TRANS_TABLES +] wurde ebenfalls strenger und aktiviert das zuvor unter http: //dev.mysql.com/doc/refman/5.7/de/sql-mode.html#sqlmode_error_for_division_by_zero [+ ERROR_FOR_DIVISION_BY_ZERO +], http://dev.mysql.com/doc/refman/5.7/de/sql- mode.html # sqlmode_no_zero_date [+ NO_ZERO_DATE +] und http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_zero_in_date [+ NO_ZERO_IN_DATE +].

Klicken Sie auf einen dieser Modusnamen, um das MySQL-Handbuch aufzurufen und weitere Informationen zu erhalten.

Vorschläge zur Umstellung

Wenn Sie eine neuere Version von Wordpress, Drupal oder Magento verwenden, ist die gute Nachricht, dass Sie nichts tun müssen. Diese Anwendungen kennen bereits die Funktion + sql_mode + von MySQL und stellen beim Herstellen einer Verbindung mit MySQL die Optionen ein, mit denen sie kompatibel sind.

Wenn Sie gerade * eine neue Anwendung * erstellen, ist es möglicherweise eine gute Idee, die Konfiguration Ihres vorhandenen MySQL 5.6-Servers so zu ändern, dass sie mit den in MySQL 5.7 enthaltenen Einstellungen für "+ sql_mode +" übereinstimmt.

Wenn Sie eine * vorhandene * Anwendung haben, möchten Sie Ihre Aktualisierungen möglicherweise schrittweise durcharbeiten. Diese Vorschläge können Ihnen beim Übergang helfen:

  • * http: //en.wikipedia.org/wiki/Whitelist [Whitelist] *: Lassen Sie neue Teile Ihrer Anwendung die neuen Standardoptionen <tt> sqlmode </ tt> aktivieren. Wenn Sie beispielsweise eine Reihe von Cron-Jobs erstellen, um Datencaches neu zu erstellen, können diese den <tt> sqlmode </ tt> festlegen, sobald sie eine Verbindung zu MySQL herstellen. Vorhandener Anwendungscode kann anfänglich bei dem vorhandenen nicht strengen Verhalten bleiben.

  • * http: //en.wikipedia.org/wiki/blacklist [Blacklist] *: Wenn Sie Fortschritte beim Konvertieren von Anwendungen erzielt haben, ist es an der Zeit, den neuen <tt> sqlmode </ tt> als Standard für Ihren Server festzulegen. Es ist möglich, dass ältere Anwendungen das vorherige Verhalten beibehalten, indem sie den sqlmode