Spec-Zone.ru › MySQL 5.7

2.10.3 Изменения в MySQL 5.7

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

Изменения, помеченные как Несовместимое изменение, являются несовместимостями с более ранними версиями MySQL и могут потребовать вашего внимания перед обновлением. Наша цель – избежать таких изменений, но иногда они необходимы для исправления проблем, которые были бы хуже, чем несовместимость между выпусками. Если проблема обновления, применимая к вашей установке, включает несовместимость, следуйте инструкциям, приведенным в описании. Иногда это включает в себя дамп и перезагрузку таблиц или использование оператора, такого как CHECK TABLE или REPAIR TABLE.

Инструкции по дампу и перезагрузке см. в Разделе 2.10.12, «Перестройка или ремонт таблиц или индексов». Любая процедура, которая включает REPAIR TABLE с опцией USE_FRM обязательно должна быть выполнена перед обновлением. Использование этого оператора с версией MySQL, отличной от версии, используемой для создания таблицы (то есть, после обновления), может повредить таблицу. См. Раздел 13.7.2.5, «Оператор REPAIR TABLE».

  • Изменения конфигурации

  • Изменения таблиц системы

  • Изменения сервера

  • Изменения InnoDB

  • Изменения SQL

Изменения конфигурации

  • Несовместимое изменение: В MySQL 5.7.11 значение по умолчанию для --early-plugin-load является именем файла библиотеки плагина keyring_file, что приводит к его автоматической загрузке по умолчанию. В MySQL 5.7.12 и более поздних версиях значение по умолчанию для --early-plugin-load пустое; для загрузки плагина keyring_file необходимо явно указать опцию со значением, содержащим имя файла библиотеки плагина keyring_file.

    Шифрование табличного пространства InnoDB требует, чтобы плагин keyring загружался до инициализации InnoDB, поэтому это изменение значения по умолчанию для --early-plugin-load вводит несовместимость для обновлений с 5.7.11 до 5.7.12 или выше. Администраторы, которые зашифровали InnoDB табличные пространства, должны предпринять явные действия для обеспечения дальнейшей загрузки плагина keyring: Запустите сервер с опцией --early-plugin-load, указывающей имя файла библиотеки плагина. Для дополнительной информации см. Раздел 6.4.4.1, «Установка плагина keyring».

  • Несовместимое изменение: В INFORMATION_SCHEMA есть таблицы, содержащие информацию о системных и статусных переменных (см. Раздел 24.3.11, «Таблицы INFORMATION_SCHEMA GLOBAL_VARIABLES и SESSION_VARIABLES» и Раздел 24.3.10, «Таблицы INFORMATION_SCHEMA GLOBAL_STATUS и SESSION_STATUS»). Начиная с MySQL 5.7.6, Performance Schema также содержит таблицы системных и статусных переменных (см. Раздел 25.12.13, «Таблицы переменных системы Performance Schema» и Раздел 25.12.14, «Таблицы статусных переменных Performance Schema»). Таблицы Performance Schema предназначены для замены таблиц INFORMATION_SCHEMA, которые устарели начиная с MySQL 5.7.6 и удалены в MySQL 8.0.

    Советы по миграции от таблиц INFORMATION_SCHEMA к таблицам Performance Schema см. в Разделе 25.20, «Миграция к таблицам системных и статусных переменных Performance Schema». Для облегчения миграции можно использовать системную переменную show_compatibility_56, которая влияет на то, как информация о системных и статусных переменных предоставляется таблицами INFORMATION_SCHEMA и Performance Schema, а также операторами SHOW VARIABLES и SHOW STATUS. show_compatibility_56 включена по умолчанию в 5.7.6 и 5.7.7 и выключена по умолчанию в MySQL 5.7.8.

    Подробности о влиянии show_compatibility_56 см. в Разделе 5.1.7, «Системные переменные сервера». Для лучшего понимания настоятельно рекомендуется ознакомиться также с этими разделами:

    • Раздел 25.12.13, «Таблицы переменных системы Performance Schema»

    • Раздел 25.12.14, «Таблицы статусных переменных Performance Schema»

    • Раздел 25.12.15.10, «Таблицы сводного отчёта о статусных переменных»

  • Несовместимое изменение: Начиная с MySQL 5.7.6, инициализация каталога данных создает только один учётную запись, 'root'@'localhost'. (См. Раздел 2.9.1, «Инициализация каталога данных».) Попытка подключения к хосту 127.0.0.1 обычно приводит к учётной записи localhost. Однако это не удаётся, если сервер запускается с включённой опцией skip_name_resolve. Если вы планируете это сделать, убедитесь, что существует учётная запись, которая может принять подключение. Например, чтобы подключиться как root используя --host=127.0.0.1 или --host=::1, создайте эти учётные записи:

    CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY 'root-password';
    CREATE USER 'root'@'::1' IDENTIFIED BY 'root-password';
    
  • Несовместимое изменение: Начиная с MySQL 5.7.6, для некоторых платформ Linux, при установке MySQL с помощью пакетов RPM и Debian, запуск и остановка сервера теперь управляются с помощью systemd, а не mysqld_safe, и mysqld_safe не установлен. Это может потребовать некоторой корректировки способа указания опций сервера. Подробности см. в Разделе 2.5.10, «Управление сервером MySQL с помощью systemd».

  • Несовместимое изменение: В MySQL 5.7.5 исполняемый бинарный файл mysql_install_db находится в каталоге установки bin, в то время как версия Perl находилась в каталоге установки scripts. При обновлении с более старой версии MySQL вы можете найти версию в обоих каталогах. Чтобы избежать путаницы, удалите версию в каталоге scripts. При свежих установках MySQL 5.7.5 или более поздних версий mysql_install_db находится только в каталоге bin, а каталог scripts больше не существует. Приложения, ожидающие найти mysql_install_db в каталоге scripts, должны быть обновлены для поиска по каталогу bin вместо этого.

    Расположение mysql_install_db становится менее существенным начиная с MySQL 5.7.6, так как с этой версии оно устарело в пользу mysqld --initialize (или mysqld --initialize-insecure). См. Раздел 2.9.1, «Инициализация каталога данных».

  • Несовместимое изменение: В MySQL 5.7.5 были внесены следующие изменения в SQL-режим:

    • Строгий SQL-режим для транзакционных движков хранения (STRICT_TRANS_TABLES) теперь включен по умолчанию.

    • Реализация SQL-режима ONLY_FULL_GROUP_BY была усовершенствована, чтобы больше не отклонять детерминированные запросы, которые ранее отклонялись. Вследствие этого, ONLY_FULL_GROUP_BY теперь включен по умолчанию, чтобы запретить недетерминированные запросы, содержащие выражения, не гарантирующие уникальное определение в группе.

    • Изменения в режиме SQL по умолчанию приводят к значению переменной сервера по умолчанию sql_mode с включенными этими режимами: ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ENGINE_SUBSTITUTION.

    • Режим ONLY_FULL_GROUP_BY также теперь включен в режимы, входящие в состав SQL-режима ANSI.

    Если вы обнаружите, что включение ONLY_FULL_GROUP_BY приводит к отклонению запросов существующих приложений, выполнение любого из этих действий должно восстановить работу:

    • Если можно изменить нарушающий запрос, сделайте это, либо так, чтобы недетерминированные не агрегированные столбцы были функционально зависимы от GROUP BY столбцов, либо ссылаясь на не агрегированные столбцы с помощью ANY_VALUE().

    • Если изменить нарушающий запрос невозможно (например, если он сгенерирован приложением сторонних разработчиков), установите переменную сервера sql_mode при запуске сервера, чтобы не включать ONLY_FULL_GROUP_BY.

    Для получения дополнительной информации о SQL-режимах и запросах GROUP BY см. Раздел 5.1.10, «Режим SQL сервера» и Раздел 12.19.3, «Обработка GROUP BY в MySQL».

Изменения в системных таблицах

  • Несовместимое изменение: Столбец Password системной таблицы mysql.user был удален в MySQL 5.7.6. Все учетные данные хранятся в столбце authentication_string, включая те, которые ранее хранились в столбце Password. Если вы выполняете обновление MySQL 5.7.6 или более поздней версии на месте, запустите mysql_upgrade, как указано в процедуре обновления на месте, чтобы перенести содержимое столбца Password в столбец authentication_string.

    Если вы выполняете логическое обновление с использованием файла дампа mysqldump из установки MySQL версии до 5.7.6, вам необходимо соблюдать следующие условия для команды mysqldump, используемой для создания файла дампа:

    • Вы должны указать параметр --add-drop-table

    • Вы не должны использовать параметр --flush-privileges

    Как указано в процедуре логического обновления, загрузите файл дампа версии до 5.7.6 в сервер версии 5.7.6 (или более поздней) перед запуском mysql_upgrade.

Изменения на сервере

  • Несовместимое изменение: Начиная с MySQL 5.7.5, поддержка паролей, использующих более старый формат хеширования паролей (до версии 4.1), удалена, что влечёт за собой следующие изменения. Приложения, использующие какие-либо больше не поддерживаемые функции, должны быть изменены.

    • Плагин аутентификации mysql_old_password, который использовал значения хешей паролей до версии 4.1, удален. Учетные записи, использующие этот плагин, отключаются при запуске, и сервер записывает сообщение “неизвестный плагин” в журнал ошибок. Инструкции по обновлению учетных записей, использующих этот плагин, см. в разделе 6.4.1.3, «Переход от хеширования паролей до версии 4.1 и плагина mysql_old_password».

    • Для переменной сервера old_passwords значение 1 (генерировать хеши до версии 4.1) больше не допускается.

    • Параметр --secure-auth для серверных и клиентских программ является по умолчанию, но теперь он является бесполезным. Он устарел; ожидайте его удаления в будущей версии MySQL.

    • Параметр --skip-secure-auth для серверных и клиентских программ больше не поддерживается, и его использование приводит к ошибке.

    • Переменная сервера secure_auth допускает только значение 1; значение 0 больше не допускается.

    • Функция OLD_PASSWORD() удалена.

  • Несовместимое изменение: В MySQL 5.6.6 тип данных YEAR(2) с 2-значным годом был устаревшим. В MySQL 5.7.5 поддержка типа данных YEAR(2) удалена. После обновления до MySQL 5.7.5 или более поздней версии любые оставшиеся столбцы с 2-значным типом данных YEAR(2) необходимо преобразовать в столбцы с 4-значным типом данных YEAR, чтобы снова использовать их. Стратегии преобразования см. в разделе 11.2.5, «Ограничения 2-значного года YEAR(2) и переход к 4-значному YEAR». Одним из возможных способов преобразования является выполнение mysql_upgrade после обновления.

  • Начиная с MySQL 5.7.7, CHECK TABLE ... FOR UPGRADE сообщает, что таблица нуждается в перестроении, если она содержит старые временные столбцы в формате до 5.6.4 (TIME, DATETIME и TIMESTAMP столбцы без поддержки точности дробных секунд) и переменная сервера avoid_temporal_upgrade отключена. Это помогает mysql_upgrade обнаружить и обновить таблицы, содержащие старые временные столбцы. Если avoid_temporal_upgrade включена, FOR UPGRADE игнорирует старые временные столбцы, присутствующие в таблице; в результате mysql_upgrade их не обновляет.

    Начиная с MySQL 5.7.7, REPAIR TABLE обновляет таблицу, если она содержит старые временные столбцы в формате до 5.6.4, и переменная сервера avoid_temporal_upgrade отключена. Если avoid_temporal_upgrade включена, REPAIR TABLE игнорирует старые временные столбцы, присутствующие в таблице, и не обновляет их.

    Чтобы проверить таблицы, содержащие такие временные столбцы и нуждающиеся в перестроении, отключите avoid_temporal_upgrade перед выполнением CHECK TABLE ... FOR UPGRADE.

    Чтобы обновить таблицы, содержащие такие временные столбцы, отключите avoid_temporal_upgrade перед выполнением REPAIR TABLE или mysql_upgrade.

  • Несовместимое изменение: Начиная с MySQL 5.7.2, сервер требует, чтобы строки учетных записей в таблице системы mysql.user имели ненулевое значение столбца plugin, и отключает учетные записи с пустым значением. Это требует, чтобы вы обновили таблицу mysql.user, чтобы заполнить все значения plugin. Начиная с MySQL 5.7.6, используйте следующую процедуру:

    Если вы планируете обновление с использованием каталога данных из вашей существующей установки MySQL:

    1. Остановите старый сервер (MySQL 5.6)

    2. Обновите двоичные файлы MySQL на месте, заменив старые на новые

    3. Запустите сервер MySQL 5.7 в обычном режиме (без специальных параметров)

    4. Запустите mysql_upgrade для обновления системных таблиц

    5. Перезапустите сервер MySQL 5.7

    Если вы планируете обновление, перезагрузив файл дампа, созданный из вашей существующей установки MySQL:

    1. Для создания файла дампа запустите mysqldump с параметром --add-drop-table и без параметра --flush-privileges

    2. Остановите старый сервер (MySQL 5.6)

    3. Обновите двоичные файлы MySQL на месте (замените старые на новые)

    4. Запустите сервер MySQL 5.7 в обычном режиме (без специальных параметров)

    5. Загрузите файл дампа (mysql < dump_file)

    6. Запустите mysql_upgrade для обновления системных таблиц

    7. Перезапустите сервер MySQL 5.7

    Перед MySQL 5.7.6 процедура более сложная:

    Если вы планируете обновление с использованием каталога данных из вашей существующей установки MySQL:

    1. Остановите старый сервер (MySQL 5.6)

    2. Обновите двоичные файлы MySQL на месте (замените старые на новые)

    3. Перезапустите сервер с параметром --skip-grant-tables для отключения проверки привилегий

    4. Запустите mysql_upgrade для обновления системных таблиц

    5. Перезапустите сервер в обычном режиме (без --skip-grant-tables)

    Если вы планируете обновление, перезагрузив файл дампа, созданный из вашей существующей установки MySQL:

    1. Для создания файла дампа запустите mysqldump без параметра --flush-privileges

    2. Остановите старый сервер (MySQL 5.6)

    3. Обновите двоичные файлы MySQL на месте (замените старые на новые)

    4. Перезапустите сервер с параметром --skip-grant-tables для отключения проверки привилегий

    5. Загрузите файл дампа (mysql < dump_file)

    6. Запустите mysql_upgrade для обновления системных таблиц

    7. Перезапустите сервер в обычном режиме (без --skip-grant-tables)

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

    $> mysql -u root -p
    Enter password: ****  <- enter root password here
    mysql> ALTER USER USER() IDENTIFIED BY 'root-password'; # MySQL 5.7.6 and up
    mysql> SET PASSWORD = PASSWORD('root-password');        # Before MySQL 5.7.6
    mysql> quit
    
    $> mysql_upgrade -p
    Enter password: ****  <- enter root password here
    

    Обычно команда сброса пароля не работает, если сервер запущен с --skip-grant-tables, но первый вызов mysql_upgrade очищает привилегии, поэтому при запуске mysql, команда принимается.

    Если у mysql_upgrade истекает пароль root, необходимо повторно сбросить пароль таким же образом.

    После выполнения предыдущих инструкций, администраторам баз данных рекомендуется также преобразовать учетные записи, использующие плагин аутентификации mysql_old_password, на использование mysql_native_password, так как поддержка mysql_old_password была удалена. Инструкции по обновлению учетных записей см. в Разделе 6.4.1.3, «Переход от хеширования паролей до 4.1 и плагина mysql_old_password».

  • Несовместимое изменение: Возможно, что значение столбца DEFAULT является допустимым для значения sql_mode во время создания таблицы, но недопустимым для значения sql_mode при вставке или обновлении строк. Пример:

    SET sql_mode = '';
    CREATE TABLE t (d DATE DEFAULT 0);
    SET sql_mode = 'NO_ZERO_DATE,STRICT_ALL_TABLES';
    INSERT INTO t (d) VALUES(DEFAULT);
    

    В этом случае 0 должно быть принято для CREATE TABLE, но отклонено для INSERT. Однако ранее сервер не оценивал значения DEFAULT, используемые для вставки или обновления, относительно текущего значения sql_mode. В примере INSERT успешно выполняется и вставляет '0000-00-00' в столбец DATE.

    Начиная с MySQL 5.7.2, сервер применяет надлежащую проверку sql_mode, чтобы генерировать предупреждение или ошибку во время вставки или обновления.

    Результатом несовместимости для репликации, если используется протоколирование на основе инструкций (binlog_format=STATEMENT), является то, что если реплика обновлена, источник, который не был обновлен, выполняет предыдущий пример без ошибки, в то время как INSERT завершается ошибкой на реплике, и репликация останавливается.

    Для решения этой проблемы остановите все новые инструкции на источнике и подождите, пока реплики не догонят. Затем обновите реплики, а затем источник. В качестве альтернативы, если вы не можете остановить новые инструкции, временно измените протоколирование на основе строк на источнике (binlog_format=ROW) и подождите, пока все реплики не обработают все бинарные журналы, созданные до момента этого изменения. Затем обновите реплики, а затем источник, и измените источник обратно на протоколирование на основе инструкций.

  • Несовместимое изменение: Были внесены изменения в плагин аудита журнала для лучшей совместимости с Oracle Audit Vault. Для целей обновления основной проблемой является изменение формата файла журнала аудита по умолчанию: информация внутри элементов <AUDIT_RECORD>, которая ранее записывалась с помощью атрибутов, теперь записывается с помощью дочерних элементов.

    Пример старого формата <AUDIT_RECORD>:

    <AUDIT_RECORD
     TIMESTAMP="2013-04-15T15:27:27"
     NAME="Query"
     CONNECTION_ID="3"
     STATUS="0"
     SQLTEXT="SELECT 1"
    />
    

    Пример нового формата:

    <AUDIT_RECORD>
     <TIMESTAMP>2013-04-15T15:27:27 UTC</TIMESTAMP>
     <RECORD_ID>3998_2013-04-15T15:27:27</RECORD_ID>
     <NAME>Query</NAME>
     <CONNECTION_ID>3</CONNECTION_ID>
     <STATUS>0</STATUS>
     <STATUS_CODE>0</STATUS_CODE>
     <USER>root[root] @ localhost [127.0.0.1]</USER>
     <OS_LOGIN></OS_LOGIN>
     <HOST>localhost</HOST>
     <IP>127.0.0.1</IP>
     <COMMAND_CLASS>select</COMMAND_CLASS>
     <SQLTEXT>SELECT 1</SQLTEXT>
    </AUDIT_RECORD>
    

    Если вы ранее использовали более старую версию плагина аудита журнала, воспользуйтесь этой процедурой, чтобы избежать записи записей журнала нового формата в существующий файл журнала, который содержит записи старого формата:

    1. Остановите сервер.

    2. Переименуйте текущий файл журнала аудита вручную. Этот файл содержит записи журнала, использующие только старый формат.

    3. Обновите сервер и перезапустите его. Плагин аудита журнала создаст новый файл журнала, который содержит записи журнала, использующие только новый формат.

    Сведения о плагине аудита журнала см. в Разделе 6.4.5, «MySQL Enterprise Audit».

  • Начиная с MySQL 5.7.7, значение по умолчанию для таймаута подключения к реплике было изменено с 3600 секунд (один час) на 60 секунд (одна минута). Новое значение по умолчанию применяется при обновлении реплики без настройки системной переменной slave_net_timeout до MySQL 5.7. Значение по умолчанию для интервала проверки работоспособности (heartbeat), которое регулирует сигнал проверки работоспособности для предотвращения таймаута подключения при отсутствии данных, если подключение все еще активно, рассчитывается как половина значения slave_net_timeout. Интервал проверки работоспособности записывается в журнал информации источника реплики (таблица mysql.slave_master_info или файл master.info), и он не меняется автоматически при изменении значения или значения по умолчанию для slave_net_timeout. Таким образом, реплика MySQL 5.6, которая использовала значение по умолчанию для таймаута подключения и интервала проверки работоспособности, после обновления до MySQL 5.7 будет иметь интервал проверки работоспособности, который значительно больше, чем таймаут подключения.

    Если уровень активности в источнике таков, что обновления в бинарном журнале отправляются реплике как минимум раз в 60 секунд, то эта ситуация не является проблемой. Однако если данные не поступают от источника, потому что сигнал проверки работоспособности не отправляется, таймаут подключения истекает. Таким образом, реплика считает, что подключение к источнику потеряно, и выполняет несколько попыток повторного подключения (как управляется настройками MASTER_CONNECT_RETRY и MASTER_RETRY_COUNT, которые также можно увидеть в журнале информации источника). Попытки повторного подключения создают множество «зомби» потоков, которые источник должен убить, что приводит к появлению в журнале ошибок источника множества ошибок вида При инициализации потока загрузки для реплики с UUID uuid, обнаружен «зомби» поток загрузки с тем же UUID. Мастер уничтожает «зомби» поток загрузки threadid. Чтобы избежать этой проблемы, сразу перед обновлением реплики до MySQL 5.7, проверьте, использует ли системная переменная slave_net_timeout значение по умолчанию. Если да, то выполните CHANGE MASTER TO с опцией MASTER_HEARTBEAT_PERIOD и установите интервал проверки работоспособности в 30 секунд, чтобы он работал с новым таймаутом подключения в 60 секунд, который применяется после обновления.

  • Несовместимое изменение: MySQL 5.6.22 и более поздние версии распознавали привилегию REFERENCES, но не полностью её применяли; пользователь с хотя бы одной из привилегий SELECT, INSERT, UPDATE, DELETE или REFERENCES мог создать внешнее ключевое ограничение для таблицы. MySQL 5.7 (и более поздние версии) требуют, чтобы у пользователя была привилегия REFERENCES для этого. Это означает, что если вы мигрируете пользователей с сервера MySQL 5.6 (любой версии) на сервер, работающий под MySQL 5.7, вы должны убедиться, что этой привилегией явно наделены все пользователи, которым необходимо создавать внешние ключи. Это включает учётную запись пользователя, используемую для импорта дампов, содержащих таблицы с внешними ключами.

Изменения InnoDB

  • Начиная с MySQL 5.7.24, версия библиотеки zlib, входящей в состав MySQL, была повышена с версии 1.2.3 до версии 1.2.11.

    Функция zlib compressBound() в zlib 1.2.11 возвращает несколько более высокую оценку размера буфера, необходимого для сжатия заданной длины байтов, чем в zlib версии 1.2.3. Функция compressBound() вызывается функциями InnoDB, которые определяют максимальный размер строки, разрешённый при создании сжатых InnoDB таблиц или вставки строк в сжатые InnoDB таблицы. В результате операции CREATE TABLE ... ROW_FORMAT=COMPRESSED или INSERT со строками, размеры которых очень близки к максимальному размеру строки, которые были успешны в предыдущих выпусках, теперь могут завершиться неудачей.

    Если у вас есть сжатые InnoDB таблицы с большими строками, рекомендуется протестировать операторы CREATE TABLE сжатых таблиц на тестовом экземпляре MySQL 5.7 перед обновлением.

  • Несовместимое изменение: Для упрощения обнаружения файловой системы InnoDB при восстановлении после сбоя в MySQL 5.7.5 были введены новые типы записей журнала редо. Это улучшение изменяет формат журнала редо. Перед выполнением обновления на месте выполните чистую остановку, используя значение innodb_fast_shutdown 0 или 1. Рекомендуется выполнить медленную остановку, используя innodb_fast_shutdown=0 при обновлении.

  • Несовместимое изменение: Журналы отката MySQL 5.7.8 и 5.7.9 могут содержать недостаточную информацию о пространственных столбцах, что может привести к сбою обновления (Ошибка #21508582). Перед выполнением обновления на месте с MySQL 5.7.8 или 5.7.9 на 5.7.10 или выше, выполните медленную остановку, используя innodb_fast_shutdown=0 для очистки журналов отката. Рекомендуется выполнить медленную остановку, используя innodb_fast_shutdown=0 при обновлении.

  • Несовместимое изменение: Журналы отката MySQL 5.7.8 могут содержать недостаточную информацию о виртуальных столбцах и индексах виртуальных столбцов, что может привести к сбою обновления (Ошибка #21869656). Перед выполнением обновления на месте с MySQL 5.7.8 на MySQL 5.7.9 или выше, выполните медленную остановку, используя innodb_fast_shutdown=0 для очистки журналов отката. Рекомендуется выполнить медленную остановку, используя innodb_fast_shutdown=0 при обновлении.

  • Несовместимое изменение: Начиная с MySQL 5.7.9, заголовок журнала редо первого файла журнала редо (ib_logfile0) включает идентификатор версии формата и текстовую строку, которая идентифицирует версию MySQL, которая создала файлы журнала редо. Это улучшение изменяет формат журнала редо, требуя, чтобы MySQL был остановлен в безопасном режиме, используя значение innodb_fast_shutdown 0 или 1 перед выполнением обновления на месте до MySQL 5.7.9 или более поздней версии. Рекомендуется выполнить медленную остановку, используя innodb_fast_shutdown=0 при обновлении.

  • В MySQL 5.7.9, DYNAMIC заменяет COMPACT в качестве неявного значения по умолчанию для формата строк для таблиц InnoDB. Новая конфигурационная опция innodb_default_row_format определяет формат строк по умолчанию. Разрешенные значения включают DYNAMIC (значение по умолчанию), COMPACT и REDUNDANT.

    После обновления до 5.7.9 все новые таблицы, которые вы создаете, используют формат строки, определенный в innodb_default_row_format, если вы явно не определите формат строки (ROW_FORMAT).

    Для существующих таблиц, которые не явно определяют параметр ROW_FORMAT или которые используют ROW_FORMAT=DEFAULT, любая операция, которая перестраивает таблицу, также безмолвно меняет формат строк таблицы на формат, определяемый innodb_default_row_format. В противном случае существующие таблицы сохраняют текущее значение формата строк. Более подробную информацию см. в разделе Определение формата строк таблицы.

  • Начиная с MySQL 5.7.6, хранилище InnoDB использует собственный встроенный ( «родной») обработчик разбиения для любых новых разнесенных таблиц, созданных с помощью InnoDB. Разнесенные таблицы InnoDB, созданные в предыдущих версиях MySQL, не обновляются автоматически. Вы можете легко обновить такие таблицы для использования родного разбиения InnoDB в MySQL 5.7.9 или более поздней версии, используя любой из следующих методов:

    • Для обновления отдельной таблицы от общего обработчика разбиения до родного разбиения InnoDB, выполните оператор ALTER TABLE table_name UPGRADE PARTITIONING.

    • Для обновления всех таблиц InnoDB, которые используют общий обработчик разбиения, для использования родного обработчика разбиения вместо этого, выполните mysql_upgrade.

Изменения в SQL

  • Несовместимое изменение: Функция GET_LOCK() была переимплементирована в MySQL 5.7.5 с использованием подсистемы блокировок метаданных (MDL) и её возможности были расширены:

    • Ранее, функция GET_LOCK() позволяла приобрести только один именованный замок за раз, и второй вызов GET_LOCK() освобождал любой существующий замок. Теперь GET_LOCK() позволяет приобретать более одного именованного замка одновременно и не освобождает существующие блокировки.

      Приложения, которые полагаются на поведение GET_LOCK() при освобождении предыдущей блокировки, должны быть изменены для соответствия новому поведению.

    • Возможность приобретения нескольких замков приводит к возможности тупика между клиентами. Подсистема MDL обнаруживает тупик и возвращает ошибку, когда это происходит.

    • Подсистема MDL устанавливает ограничение в 64 символа на имена замков, поэтому это ограничение теперь также применяется к именованным замкам. Ранее ограничение длины не применялось.

    • Замки, приобретённые с помощью GET_LOCK(), теперь отображаются в таблице Схемы производительности metadata_locks. Столбец OBJECT_TYPE говорит USER LEVEL LOCK, а столбец OBJECT_NAME указывает имя замка.

    • Новая функция RELEASE_ALL_LOCKS() позволяет освободить все приобретённые именованные замки одновременно.

    Для получения дополнительной информации см. Раздел 12.14, «Функции блокировки».

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

    Однако в MySQL 5.7 до MySQL 5.7.11, и для таких операторов, как DELETE или UPDATE, которые изменяют таблицы, использование стратегии слияния для производной таблицы, которая ранее материализовывалась, может привести к ошибке:

    mysql> DELETE FROM t1
        -> WHERE id IN (SELECT id
        ->              FROM (SELECT t1.id
        ->                    FROM t1 INNER JOIN t2 USING (id)
        ->                    WHERE t2.status = 0) AS t);
    ERROR 1093 (HY000): You can't specify target table 't1'
    for update in FROM clause
    

    Ошибка возникает, когда слияние производной таблицы в внешний блок запроса приводит к оператору, который как выбирает из, так и изменяет таблицу. (Материализация не вызывает проблемы, потому что, по сути, она преобразует производную таблицу в отдельную таблицу.) Решение для предотвращения этой ошибки заключалось в отключении флага derived_merge переменной системы optimizer_switch перед выполнением оператора:

    SET optimizer_switch = 'derived_merge=off';
    

    Флаг derived_merge контролирует, пытается ли оптимизатор слить подзапросы и представления в ключе FROM во внешний блок запроса, предполагая, что ни одна другая инструкция не препятствует слиянию. По умолчанию флаг on для включения слияния. Установка флага на значение off предотвращает слияние и избегает описанной выше ошибки. Для получения дополнительной информации, см. Раздел 8.2.2.4, «Оптимизация производных таблиц и ссылок на представления с помощью слияния или материализации».

  • Некоторые ключевые слова могут быть зарезервированы в MySQL 5.7, которые не были зарезервированы в MySQL 5.6. См. Раздел 9.3, «Ключевые слова и зарезервированные слова». Это может привести к тому, что слова, ранее использовавшиеся в качестве идентификаторов, станут незаконными. Для исправления затронутых операторов используйте цитирование идентификаторов. См. Раздел 9.2, «Имена объектов схемы».

  • После обновления рекомендуется проверить подсказки оптимизатора, указанные в коде приложения, чтобы убедиться, что подсказки по-прежнему необходимы для достижения желаемой стратегии оптимизации. Улучшения оптимизатора иногда делают ненужными определенные подсказки оптимизатора. В некоторых случаях ненужная подсказка оптимизатора может даже быть вредной.

  • В операторах UNION, чтобы применить ORDER BY или LIMIT к отдельному SELECT, поместите ключевую фразу внутри скобок, которые заключают SELECT:

    (SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
    UNION
    (SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);
    

    Предыдущие версии MySQL могут допускать такие операторы без скобок. В MySQL 5.7 требование скобок является обязательным.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/upgrading-from-previous-series.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API