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».
Изменения конфигурации
-
Несовместимое изменение: В 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, «Системные переменные сервера». Для лучшего понимания настоятельно рекомендуется ознакомиться также с этими разделами: -
Несовместимое изменение: Начиная с 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:
Остановите старый сервер (MySQL 5.6)
Обновите двоичные файлы MySQL на месте, заменив старые на новые
Запустите сервер MySQL 5.7 в обычном режиме (без специальных параметров)
Запустите mysql_upgrade для обновления системных таблиц
Перезапустите сервер MySQL 5.7
Если вы планируете обновление, перезагрузив файл дампа, созданный из вашей существующей установки MySQL:
Для создания файла дампа запустите mysqldump с параметром
--add-drop-tableи без параметра--flush-privilegesОстановите старый сервер (MySQL 5.6)
Обновите двоичные файлы MySQL на месте (замените старые на новые)
Запустите сервер MySQL 5.7 в обычном режиме (без специальных параметров)
Загрузите файл дампа (mysql <
dump_file)Запустите mysql_upgrade для обновления системных таблиц
Перезапустите сервер MySQL 5.7
Перед MySQL 5.7.6 процедура более сложная:
Если вы планируете обновление с использованием каталога данных из вашей существующей установки MySQL:
Остановите старый сервер (MySQL 5.6)
Обновите двоичные файлы MySQL на месте (замените старые на новые)
Перезапустите сервер с параметром
--skip-grant-tablesдля отключения проверки привилегийЗапустите mysql_upgrade для обновления системных таблиц
Перезапустите сервер в обычном режиме (без
--skip-grant-tables)
Если вы планируете обновление, перезагрузив файл дампа, созданный из вашей существующей установки MySQL:
Для создания файла дампа запустите mysqldump без параметра
--flush-privilegesОстановите старый сервер (MySQL 5.6)
Обновите двоичные файлы MySQL на месте (замените старые на новые)
Перезапустите сервер с параметром
--skip-grant-tablesдля отключения проверки привилегийЗагрузите файл дампа (mysql <
dump_file)Запустите mysql_upgrade для обновления системных таблиц
Перезапустите сервер в обычном режиме (без
--skip-grant-tables)
mysql_upgrade по умолчанию выполняется как пользователь MySQL
root. Для предыдущих процедур, если парольrootистек во время запуска mysql_upgrade, отображается сообщение, что ваш пароль истек и mysql_upgrade завершился неудачно. Для исправления этого сбросьте парольrootи запустите mysql_upgrade снова:$>
mysql -u root -pEnter 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 -pEnter 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>
Если вы ранее использовали более старую версию плагина аудита журнала, воспользуйтесь этой процедурой, чтобы избежать записи записей журнала нового формата в существующий файл журнала, который содержит записи старого формата:
Остановите сервер.
Переименуйте текущий файл журнала аудита вручную. Этот файл содержит записи журнала, использующие только старый формат.
Обновите сервер и перезапустите его. Плагин аудита журнала создаст новый файл журнала, который содержит записи журнала, использующие только новый формат.
Сведения о плагине аудита журнала см. в Разделе 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, которые также можно увидеть в журнале информации источника). Попытки повторного подключения создают множество «зомби» потоков, которые источник должен убить, что приводит к появлению в журнале ошибок источника множества ошибок вида При инициализации потока загрузки для реплики с UUIDuuid, обнаружен «зомби» поток загрузки с тем же 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_shutdown0или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_shutdown0или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_nameUPGRADE 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.