Как подготовиться к обновлению MySQL 5.7

Статья от MySQL Team в Oracle

Вступление

MySQL 5.7 является самым последним кандидатом на выпуск популярной базы данных с открытым исходным кодом. Он предлагает новые функции масштабируемости, которые вы должны стремиться внести изменения.

Чтобы подчеркнуть одно из изменений, масштабируемость была значительно улучшена. С другой стороны, MySQL 5.7 линейно масштабируется на 48-ядерных серверах. На нижнем уровне, MySQL 5.7 также работает из коробки на 512 МБ DigitalOcean Droplet (что было невозможно без изменений конфигурации в MySQL 5.6).

Новая пиковая производительность для сервера MySQL превышает 640 тыс. Запросов в секунду, а API memcached, который напрямую обращается к механизму хранения InnoDB, способен поддерживать https://blogs.oracle.com/mysqlinnodb/entry/mysql_5_7_3_deep[over 1,1 миллиона запросов в секунду.

MySQL 5.7 API-интерфейс Memcached NoSQL

Однако, прежде чем запускать + mysql_upgrade +, убедитесь, что вы подготовлены. Этот урок может помочь вам сделать это.

Изменения целостности данных, с примерами

Одним из основных изменений в MySQL 5.7 является то, что целостность данных была улучшена, чтобы больше соответствовать ожиданиям опытных разработчиков и администраторов баз данных. Ранее MySQL корректировал неверные значения до максимально возможного правильного значения, но при новых значениях по умолчанию вместо этого он возвращал ошибку.

Вот пять примеров запросов, которые потребуют модификации для работы в MySQL 5.7 из коробки. Использует ли ваше приложение какое-либо из этих поведений?

[[1-inserting-a-negative-value-into-an-unsigned-column]] ==== 1) Вставка отрицательного значения в столбец без знака

Создайте таблицу с неподписанным столбцом:

CREATE TABLE test (
id int unsigned
);

Введите отрицательное значение.

Предыдущее поведение:

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) Деление на ноль

Создайте тестовую таблицу:

CREATE TABLE test2 (
id int unsigned
);

Попытка разделить на ноль.

Предыдущее поведение:

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) Вставка строки из 20 символов в столбец из 10 символов

Создайте таблицу с 10-символьным столбцом:

CREATE TABLE test3 (
a varchar(10)
);

Попробуйте вставить более длинную строку.

Предыдущее поведение:

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) Вставка нестандартной нулевой даты в столбец datetime

Создайте таблицу со столбцом даты и времени:

CREATE TABLE test3 (
a datetime
);

Вставьте + 0000-00-00 00: 00: 00 +.

Предыдущее поведение:

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) Использование GROUP BY и выбор неоднозначного столбца

Это происходит, когда описание не является частью + GROUP BY +, и к нему не применяется агрегатная функция (например, + MIN + или + MAX +).

Предыдущее поведение:

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

Понимание поведения, установленного sql_mode

В терминах MySQL на каждое поведение, показанное в предыдущем разделе, влияет то, что известно как + sql_mode +.

Функция дебютировала в MySQL 4.1 (2004), но не была скомпилирована по умолчанию. MySQL 5.7 поддерживает следующие режимы, включенные по умолчанию:

Режим http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_strict_trans_tables [+ STRICT_TRANS_TABLES +] также стал более строгим и включает поведение, ранее указанное в режимах 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/ql mode.html # sqlmode_no_zero_date [+ NO_ZERO_DATE +] и http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_zero_in_date [+ NO_ZERO_IN_DATE +].

Нажмите на любое из этих имен режимов, чтобы посетить руководство MySQL, чтобы узнать больше информации.

Предложения о том, как перейти

Если вы используете последнюю версию Wordpress, Drupal или Magento, хорошей новостью является то, что вам не нужно ничего делать. Эти приложения уже знают о функции MySQL + sql_mode + и после подключения к MySQL устанавливают параметры, с которыми они совместимы.

Если вы в настоящее время * создаете новое приложение *, то, возможно, будет хорошей идеей изменить конфигурацию вашего существующего сервера MySQL 5.6, чтобы она работала с настройками + sql_mode +, которые поставляются в MySQL 5.7.

Если у вас есть * существующее приложение *, возможно, вы захотите работать с обновлениями более постепенно. Эти предложения могут помочь вам в переходе:

  • * http: //en.wikipedia.org/wiki/Whitelist [Белый список] *: новые части вашего приложения включают новые параметры по умолчанию <tt> sqlmode </ tt>. Например, если вы создаете набор заданий cron для перестроения кэшей данных, они могут установить <tt> sqlmode </ tt>, как только они подключатся к MySQL. Существующий код приложения может изначально оставаться с существующим нестандартным поведением.

  • * http: //en.wikipedia.org/wiki/blacklist [черный список] *: Когда вы добились определенных успехов в конвертации приложений, пришло время установить новый <tt> sqlmode </ tt> по умолчанию для вашего сервера. Унаследованные приложения по-прежнему могут иметь прежнее поведение, если они изменяют sqlmode

Related