Моят личен и професионален живот

2020-01-17

Излезе MySQL 8.0.19 набор от продукти

MySQL 8.0.19 набора от продукти включващ Community Server, Router и Shell, беше пуснат в Понедленик (13.01). Фокуса на тези версии е новата InnoDB ReplicaSet функционалност, която улеснява управлението на класическа MySQL репликация с един първичен и множество вторични по същия начин както пускането на Групова репликация с InnoDB Cluster. Можете да прочетете повече за нея в статията The all new MySQL InnoDB ReplicaSet. Освен това има някои подобрения за които можете да прочетете отдолу.

SQL синтаксис

Сървъра вече разбира по-общия и стандартен ALTER TABLE … DROP/ALTER CONSTRAINT синтаксис за което чуруликнах по-рано. Това е искане за функционалност към MySQL 4.1 от преди повече от 15 години. Можете да откриете повече в Foreign Keys and Other Constraints секцията на ALTER TABLE статията в документацията.

Конструктори на стойности са друго подобрение към стандарта позволяващо създаването на редове в VALUES израза (да не се бърка с ключовата дума VALUES за INSERT изрза). Поради конфликт с името на VALUES функцията е необходимо да се ползва разширената форма с  ROW конструктор. Основно това означава, че самостоятелния израз VALUES ROW(1), ROW(2), ROW(3) сега се разбира правилно от сървъра. VALUES израза може да се използва също в обединения, съединения, като производна таблица и в други случаи където можете да ползвате SELECT. Виж статията VALUES израз в документацията за повече подробности.

Новия TABLE израз реализира друга възможност от стандарта - явни клаузи за таблица. Той също може да се ползва като SELECT, защото TABLE t е също като SELECT * FROM t, така че може да се ползва в обединения, с INTO, в IN подзаявка и всякъде другаде където SELECT може да се ползва.

Интересно ново допълнение е LIMIT клаузата за рекурсивни CTEs, която позволява дебъгването на изрази генериращи твърде много резултати. Идеята е просто да се ограничи резултата от рекурсивния CTE до някакъв разумен брой редове (напр. 10, 100, и т.н.), за да можете да видите създадения изход и да можете да разберете как и защо се създава така. Тази нова възможност се покрива от статията A new, simple way to figure out why your recursive CTE is running away и в Limiting Common Table Expression Recursion секцията на WITH (Common Table Expressions) в документацията.

Вече е възможно да се ползва псевдоним за новия ред и допълнително колони с INSERT ... ON DUPLICATE KEY UPDATE израз след VALUES или SET клаузи с изпулването на AS ключова дума. Предполагам това е първата стъпка към премахването на VALUES функцията (виж отгоре) за по-добра поддръжка на стандарта. Можете да намерите повече в статията ON DUPLICATE KEY UPDATE Statement.

Промени по типове данни

Типовете TIMESTAMP и DATETIME вече могат да включват информация за времева зона като корекция (напр. +02:00 или -08:00) добавена към стойността. Подробностите са в статията The DATE, DATETIME, and TIMESTAMP Types в документацията.

Типа YEAR(4) (т.е. с явна дължина на показване) и (недокументираният) UNSIGNED атрибут за YEAR са вече остарели и ще бъдат премахнати в бъдеще. Това следва други премахвания на дължини на показване и други атрибути с 8.0.17 за които писах преди, така че разработчиците трябва да проверят и поправят всеки SQL скрипт използващ остарели типове данни и атрибути. С тази версия изрази, които печатат определения на типове данни (напр. SHOW CREATE TABLE) вече не показват дължина на показване за целочислени типове с изключение на TINYINT(1)  и ZEROFILL  атрибута.

Други промени в сървър

Потребителски определени функции (UDFs) вече могат да определят кодировката и подреждането на низови аргументи както забелязах по-рано. Можете да прочетете повече за това в статията A Tale of UDFs with Character Sets.

Вече има стандартни INFORMATION_SCHEMA изгледи свързани с роли като ADMINISTRABLE_ROLE_AUTHORIZATION, APPLICABLE_ROLES, ENABLED_ROLES, ROLE_COLUMN_GRANTS, ROLE_ROUTINE_GRANTS и ROLE_TABLE_GRANTS.

InnoDB машината вече поддържа ефективно взимане на проби от данни за хистограми. Взимането на проби вече не изисква пълно сканиране на таблица, което може да е скъпо за големи таблици, а взима проби от страниците с данни на клъстерирания индекс вместо това. Трябва да пробвам при първа възможност.

Функцията JSON_SCHEMA_VALID вече връща подробна информация за причините за пропаднала валидация с използването на SHOW WARNINGS.

Други забележителни промени са възможността за заключване на потребителски сметки след FAILED_LOGIN_ATTEMPTS опита за вход за PASSWORD_LOCK_TIME дни (виж Failed-Login Tracking and Temporary Account Locking), компресия в X протокол (виж Connection Compression with X Plugin) и много други както можете да откриете в бележките към версията.

Бъгове оправени в сървър

Докладвания преди проблем с EXPLAIN ANALYZE неизпълняващ и докладващ заявки в SELECT списъка беше оправен (виж бъг 97296).

Workbench

Четейки в бележките към новата версия, че "The following MySQL server language features are now supported: value references in INSERT statements, new options (TLS version, cipher suite, compression, and privilege check) in CHANGE MASTER TO replication statements, random passwords in CREATE USER and ALTER USER statements, EXPLAIN ANALYZE, and binary collation names." бях обнадежден, че приложението най-накрая наваксва със сървъра, но това беше докато на прегледах новия SQL синтаксис (виж отгоре).

Два от бъговете, които докладвах преди бяха оправени - 97416 (за EXPLAIN ANALYZE) и 97281 (за ANALYZE TABLE ... UPDATE HISTOGRAM), но отворих два нови за TABLE (виж бъг 98263) и VALUES (виж бъг 98266) изразите. Тези проблеми са очевидни, но все още ми е странно как продължават да се появяват.
Има нов елемент "Copy Row (with names, tab separated)" в контекстното меню за копиране на заглавия и редове от получените данни с табулация като разделител, което прави лесно преместването на данни към Excel или LibreOffice Calc.

Щастливо ползване и експериментиране с новите MySQL версии!

Няма коментари: