Comment se préparer à votre mise à jour MySQL 5.7

Un article de l 'http://www.oracle.com/us/products/mysql/mysqlcommunityserver/overview/index.html[MySQL Team chez Oracle]

introduction

MySQL 5.7 est la version la plus récente de la populaire base de données open source. Il offre de nouvelles fonctionnalités d’évolutivité qui devraient vous donner envie de faire le changement.

Pour mettre en évidence l’un des changements, l’évolutivité a été grandement améliorée. Sur le haut de gamme, MySQL 5.7 évolue linéairement sur des serveurs à 48 coeurs. MySQL 5.7 fonctionne également immédiatement avec un droplet DigitalOcean de 512 Mo (chose qui n’était pas possible sans modification de la configuration dans MySQL 5.6).

Les nouvelles performances maximales pour un serveur MySQL dépassent les 640 000 requêtes par seconde et l’API memcached, qui s’adresse directement au moteur de stockage InnoDB, est capable de gérer https://blogs.oracle.com/mysqlinnodb/entry/mysql_5_7_3_de_fr.overover 1,1 million de requêtes par seconde].

Avant de vous précipiter pour exécuter + mysql_upgrade +, vous devez vous assurer que vous êtes préparé. Ce tutoriel peut vous aider à faire exactement cela.

Modifications de l’intégrité des données, avec exemples

Un changement majeur dans MySQL 5.7 est que l’intégrité des données a été améliorée pour correspondre davantage à ce à quoi les développeurs et les administrateurs de bases de données s’attendent. Auparavant, MySQL ajustait les valeurs incorrectes à la valeur correcte la plus proche, mais sous les nouvelles valeurs par défaut, une erreur serait renvoyée.

Voici cinq exemples de requêtes nécessitant des modifications pour fonctionner correctement avec MySQL 5.7. Votre application utilise-t-elle l’un de ces comportements?

[[1-inserting-a-negative-value-into-an-unsigned-column]] ==== 1) Insertion d’une valeur négative dans une colonne non signée

Créez une table avec une colonne non signée:

CREATE TABLE test (
id int unsigned
);

Insérer une valeur négative.

Comportement précédent:

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 par zéro

Créer une table de test:

CREATE TABLE test2 (
id int unsigned
);

Essayez de diviser par zéro.

Comportement précédent:

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) Insérer une chaîne de 20 caractères dans une colonne de 10 caractères

Créez une table avec une colonne de 10 caractères:

CREATE TABLE test3 (
a varchar(10)
);

Essayez d’insérer une chaîne plus longue.

Comportement précédent:

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) Insertion de la date zéro non standard dans une colonne datetime

Créez une table avec une colonne datetime:

CREATE TABLE test3 (
a datetime
);

Insérer «+ 0000-00-00 00: 00: 00 +».

Comportement précédent:

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) Utiliser GROUP BY et sélectionner une colonne ambiguë

Cela se produit lorsque la description ne fait pas partie de + GROUP BY + et qu’aucune fonction d’agrégat (telle que + MIN + ou + MAX +) ne lui est appliquée.

Comportement précédent:

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

Comprendre les comportements définis par sql_mode

En termes MySQL, chacun des comportements présentés dans la section précédente est influencé par ce qu’on appelle un + sql_mode +.

La fonctionnalité a fait ses débuts dans MySQL 4.1 (2004), mais n’a pas été compilée par défaut. MySQL 5.7 présente les modes suivants activés par défaut:

Le mode http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_strict_trans_tables [+ + STRICT_TRANS_TABLES +] est également devenu plus strict et active le comportement spécifié précédemment dans les modes http: //dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_error_for_division_by_zero [+ ERROR_FOR_DIVISION_BY_ZERO +], http://dev.mysql.com/doc/refman/5.7/en/sql- mode.html # sqlmode_no_zero_date [+ NO_ZERO_DATE `] et http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_zero_in_date [` NO_ZERO_IN_DATE + '].

Cliquez sur l’un de ces noms de mode pour consulter le manuel MySQL et obtenir plus d’informations.

Suggestions sur la transition

Si vous utilisez une version récente de Wordpress, Drupal ou Magento, la bonne nouvelle est que vous n’avez rien à faire. Ces applications connaissent déjà la fonctionnalité + sql_mode + de MySQL et lorsqu’elles se connectent à MySQL, elles définissent les options avec lesquelles elles sont compatibles.

Si vous construisez actuellement une nouvelle application *, il peut être judicieux de modifier la configuration de votre serveur MySQL 5.6 existant afin qu’elle se comporte avec les paramètres + sql_mode + fournis avec MySQL 5.7.

Si vous avez une * application existante *, vous voudrez peut-être utiliser vos mises à jour plus progressivement. Ces suggestions peuvent vous aider à faire la transition:

  • * http: //en.wikipedia.org/wiki/Whitelist [Liste blanche] *: demandez aux nouvelles parties de votre application d’activer les nouvelles options <tt> sqlmode </ tt> par défaut. Par exemple, si vous créez un ensemble de tâches cron pour reconstruire des caches de données, celles-ci peuvent définir le <tt> sqlmode </ tt> dès leur connexion à MySQL. Le code d’application existant peut initialement rester avec le comportement non strict existant.

  • * http: //en.wikipedia.org/wiki/blacklist [Blacklist] *: Lorsque vous avez progressé dans la conversion des applications, il est temps de définir le nouveau <tt> sqlmode </ tt> sur votre serveur. Il est possible de conserver le comportement précédent d’applications héritées en leur demandant de changer le sqlmode

Related