sql >> Databáze >  >> RDS >> Mysql

Přechod z MySQL 5.7 na MySQL 8.0 – Co byste měli vědět

Duben 2018 není jen datum pro svět MySQL. Tam byla vydána MySQL 8.0 a po více než 1 roce je pravděpodobně čas zvážit migraci na tuto novou verzi.

MySQL 8.0 má důležitá vylepšení výkonu a zabezpečení a stejně jako u každé migrace na novou verzi databáze je třeba vzít v úvahu několik věcí před uvedením do provozu, abyste se vyhnuli vážným problémům, jako je ztráta dat, nadměrné prostoje nebo dokonce vrácení během úlohy migrace.

V tomto blogu se zmíníme o některých nových funkcích MySQL 8.0, některých zastaralých věcech a o tom, co je třeba mít na paměti před migrací.

Co je nového v MySQL 8.0?

Pojďme nyní shrnout některé z nejdůležitějších funkcí zmíněných v oficiální dokumentaci pro tuto novou verzi MySQL.

  • MySQL obsahuje transakční datový slovník, který ukládá informace o databázových objektech.
  • Příkaz atomického DDL kombinuje aktualizace datového slovníku, operace úložiště a zápisy binárních protokolů spojené s operací DDL do jediné atomické transakce.
  • Server MySQL automaticky provede všechny nezbytné úlohy upgradu při příštím spuštění, aby upgradoval systémové tabulky ve schématu mysql a také objekty v jiných schématech, jako je schéma sys a uživatelská schémata. Není nutné, aby DBA vyvolával mysql_upgrade.
  • Podporuje vytváření a správu skupin prostředků a umožňuje přiřadit vlákna běžící na serveru konkrétním skupinám, aby se vlákna spouštěla ​​podle zdrojů, které má skupina k dispozici.
  • Šifrování tabulek lze nyní spravovat globálně definováním a vynucováním výchozích nastavení šifrování. Proměnná default_table_encryption definuje výchozí šifrování pro nově vytvořená schémata a obecný tabulkový prostor. Výchozí nastavení šifrování se vynucuje povolením proměnné table_encryption_privilege_check.
  • Výchozí znaková sada se změnila z latin1 na utf8mb4.
  • Podporuje použití výrazů jako výchozích hodnot ve specifikacích datových typů. To zahrnuje použití výrazů jako výchozích hodnot pro datové typy BLOB, TEXT, GEOMETRY a JSON.
  • Protokolování chyb bylo přepsáno tak, aby používalo architekturu komponent MySQL. Tradiční protokolování chyb je implementováno pomocí vestavěných komponent a protokolování pomocí systémového protokolu je implementováno jako načítatelná komponenta.
  • Nový typ zámku zálohy umožňuje DML během online zálohování a zároveň zabraňuje operacím, které by mohly vést k nekonzistentnímu snímku. Nový zámek zálohování je podporován syntaxí LOCK INSTANCE FOR BACKUP a UNLOCK INSTANCE. K použití těchto příkazů je vyžadováno oprávnění BACKUP_ADMIN.
  • MySQL Server nyní umožňuje konfiguraci portu TCP/IP specificky pro administrativní připojení. To poskytuje alternativu k jedinému připojení pro správu, které je povoleno na síťových rozhraních používaných pro běžná připojení, i když jsou připojení max_connections již vytvořena.
  • Podporuje neviditelné indexy. Tento index optimalizátor nepoužívá a umožňuje otestovat účinek odebrání indexu na výkon dotazu, aniž by byl odstraněn.
  • Document Store pro vývoj aplikací pro dokumenty SQL i NoSQL pomocí jediné databáze.
  • MySQL 8.0 umožňuje zachovat globální dynamické serverové proměnné pomocí příkazu SET PERSIST namísto obvyklého příkazu SET GLOBAL.

Zabezpečení MySQL a správa účtů

Protože existuje mnoho vylepšení týkajících se zabezpečení a správy uživatelů, uvedeme je v samostatné části.

  • Tabulky grantů v databázi systému mysql jsou nyní tabulky InnoDB.
  • Nový plugin pro ověřování caching_sha2_password je nyní výchozí metodou ověřování v MySQL 8.0. Implementuje hašování hesel SHA-256, ale k řešení problémů s latencí v době připojení používá ukládání do mezipaměti. Poskytuje bezpečnější šifrování hesel než plugin mysql_native_password a poskytuje lepší výkon než sha256_password.
  • MySQL nyní podporuje role, které se nazývají kolekce oprávnění. Role mohou mít oprávnění udělená a odebraná a mohou být udělena a odebrána uživatelským účtům.
  • MySQL nyní uchovává informace o historii hesel, což umožňuje omezení opětovného použití předchozích hesel.
  • Umožňuje správcům konfigurovat uživatelské účty tak, aby příliš mnoho po sobě jdoucích selhání přihlášení kvůli nesprávným heslům způsobilo dočasné uzamčení účtu.

Vylepšení InnoDB

Stejně jako v předchozím bodě existuje také mnoho vylepšení souvisejících s tímto tématem, takže je také uvedeme v samostatné sekci.

  • Aktuální maximální hodnota počítadla automatického přírůstku se zapíše do protokolu opakování pokaždé, když se hodnota změní, a uloží se do tabulky soukromého systému v každém kontrolním bodě. Tyto změny zajistí, že aktuální maximální hodnota počítadla automatického přírůstku bude trvalá po restartování serveru
  • Když dojde k poškození indexového stromu, InnoDB zapíše příznak korupce do protokolu redo, díky kterému je příznak korupce bezpečný při pádu. InnoDB také zapisuje data příznaku poškození v paměti do tabulky soukromého systému v každém kontrolním bodě. Během obnovy InnoDB načte příznaky poškození z obou umístění a sloučí výsledky, než označí objekty tabulky a indexu v paměti jako poškozené.
  • Novou dynamickou proměnnou, innodb_deadlock_detect, lze deaktivovat detekci uváznutí. V systémech s vysokou souběžností může detekce uváznutí způsobit zpomalení, když mnoho vláken čeká na stejný zámek. Někdy může být efektivnější zakázat detekci uváznutí a spoléhat se na nastavení innodb_lock_wait_timeout pro vrácení transakce, když dojde k uváznutí.
  • Dočasné tabulky InnoDB jsou nyní vytvářeny ve sdíleném dočasném tabulkovém prostoru ibtmp1.
  • systémové tabulky mysql a tabulky datového slovníku jsou nyní vytvářeny v jediném souboru tabulkového prostoru InnoDB s názvem mysql.ibd v datovém adresáři MySQL. Dříve byly tyto tabulky vytvořeny v jednotlivých souborech tabulkového prostoru InnoDB v adresáři databáze mysql.
  • Ve výchozím nastavení jsou protokoly zpět nyní umístěny ve dvou tabulkových prostorech zpět, které jsou vytvořeny při inicializaci instance MySQL. V systémovém tabulkovém prostoru se již nevytvářejí protokoly zpět.
  • Novou proměnnou innodb_dedicated_server, která je ve výchozím nastavení zakázána, lze použít k tomu, aby InnoDB automaticky konfiguroval následující možnosti podle množství paměti detekované na serveru:innodb_buffer_pool_size, innodb_log_file_size a innodb_flush_method. Tato možnost je určena pro instance serveru MySQL, které běží na vyhrazeném serveru.
  • Soubory tabulkového prostoru lze přesunout nebo obnovit do nového umístění, když je server offline, pomocí možnosti innodb_directories.

Nyní se podíváme na některé funkce, které byste v této nové verzi MySQL již neměli používat.

Co je v MySQL 8.0 zastaralé?

Následující funkce jsou zastaralé a v budoucí verzi budou odstraněny.

  • Znaková sada utf8mb3 je zastaralá. Místo toho použijte utf8mb4.
  • Protože caching_sha2_password je výchozím ověřovacím pluginem v MySQL 8.0 a poskytuje nadmnožinu možností ověřovacího pluginu sha256_password, je sha256_password zastaralé.
  • Plugin validate_password byl přeimplementován, aby mohl používat infrastrukturu serverových komponent. Forma pluginu validate_password je stále dostupná, ale je zastaralá.
  • Klauzule ENGINE pro příkazy ALTER TABLESPACE a DROP TABLESPACE.
  • Režim PAD_CHAR_TO_FULL_LENGTH SQL.
  • Podpora AUTO_INCREMENT je pro sloupce typu FLOAT a DOUBLE (a všechna synonyma) zastaralá. Zvažte odstranění atributu AUTO_INCREMENT z takových sloupců nebo je převeďte na celočíselný typ.
  • Atribut UNSIGNED je zastaralý pro sloupce typu FLOAT, DOUBLE a DECIMAL (a všechna synonyma). Zvažte použití jednoduchého omezení CHECK pro takové sloupce.
  • FLOAT(M,D) a DOUBLE(M,D) syntaxe k určení počtu číslic pro sloupce typu FLOAT a DOUBLE (a případná synonyma) je nestandardní rozšíření MySQL. Tato syntaxe je zastaralá.
  • Nestandardní styl C &&, || a ! operátory, které jsou synonymy pro standardní operátory SQL AND, OR a NOT, jsou zastaralé. Aplikace, které používají nestandardní operátory, by měly být upraveny tak, aby používaly standardní operátory.
  • Klient mysql_upgrade je zastaralý, protože jeho schopnosti pro upgrade systémových tabulek v systémovém schématu mysql a objektů v jiných schématech byly přesunuty na server MySQL.
  • Soubor mysql_upgrade_info, který je vytvořeným datovým adresářem a slouží k uložení čísla verze MySQL.
  • Systémová proměnná relay_log_info_file a možnost --master-info-file jsou zastaralé. Dříve se tyto údaje používaly k zadání názvu informačního protokolu přenosu a hlavního informačního protokolu, když byly nastaveny relay_log_info_repository=FILE a master_info_repository=FILE, ale tato nastavení byla zastaralá. Použití souborů pro informační protokol přenosu a hlavní informační protokol bylo nahrazeno podřízenými tabulkami bezpečnými při zhroucení, které jsou výchozí v MySQL 8.0.
  • Použití proměnné prostředí MYSQL_PWD k zadání hesla MySQL je zastaralé.

A nyní se pojďme podívat na některé funkce, které musíte v této verzi MySQL přestat používat.

Co bylo odstraněno v MySQL 8.0?

Následující funkce byly z MySQL 8.0 odstraněny.

  • Systémová proměnná innodb_locks_unsafe_for_binlog byla odstraněna. Úroveň izolace READ COMMITTED poskytuje podobnou funkčnost.
  • Použití programu GRANT k vytváření uživatelů. Místo toho použijte CREATE USER. Při dodržování tohoto postupu je režim NO_AUTO_CREATE_USER SQL pro příkazy GRANT nepodstatný, takže je také odstraněn a do protokolu serveru se nyní zapíše chyba, když přítomnost této hodnoty pro volbu sql_mode v souboru voleb zabrání spuštění mysqld.
  • Pomocí GRANT upravit vlastnosti účtu jiné než přiřazení oprávnění. To zahrnuje vlastnosti ověřování, SSL a omezení zdrojů. Místo toho vytvořte takové vlastnosti při vytváření účtu pomocí CREATE USER nebo je upravte později pomocí ALTER USER.
  • IDENTIFIKOVANÉ HESLEM syntaxe 'auth_string' pro CREATE USER a GRANT. Místo toho použijte IDENTIFIED WITH auth_plugin AS 'auth_string' pro CREATE USER a ALTER USER, kde hodnota 'auth_string' je ve formátu kompatibilním s pojmenovaným pluginem.
  • Funkce PASSWORD(). Kromě toho odstranění PASSWORD() znamená, že syntaxe SET PASSWORD ... =PASSWORD('auth_string') již není k dispozici.
  • Systémová proměnná old_passwords.
  • Příkazy FLUSH QUERY CACHE a RESET QUERY CACHE.
  • Tyto systémové proměnné:query_cache_limit, query_cache_min_res_unit, query_cache_size, query_cache_type, query_cache_wlock_invalidate.
  • Tyto stavové proměnné:Qcache_free_blocks, Qcache_free_memory, Qcache_hits, Qcache_inserts, Qcache_lowmem_prunes, Qcache_not_cached, Qcache_queries_in_cache, Qcache_total_blocks.
  • Tyto stavy vlákna:kontrola oprávnění u dotazu uloženého v mezipaměti, kontrola mezipaměti dotazu pro dotaz, zneplatnění položek mezipaměti dotazů, odeslání výsledku uloženého v mezipaměti klientovi, uložení výsledku do mezipaměti dotazu, čekání na zámek mezipaměti dotazu.
  • Systémové proměnné tx_isolation a tx_read_only byly odstraněny. Místo toho použijte Transaction_isolation a Transaction_read_only.
  • Systémová proměnná sync_frm byla odstraněna, protože soubory .frm jsou zastaralé.
  • Systémová proměnná secure_auth a možnost klienta --secure-auth byly odstraněny. Volba MYSQL_SECURE_AUTH pro funkci mysql_options() C API byla odstraněna.
  • Systémová proměnná log_warnings a serverová možnost --log-warnings byly odstraněny. Místo toho použijte systémovou proměnnou log_error_verbosity.
  • Globální rozsah systémové proměnné sql_log_bin byl odstraněn. sql_log_bin má pouze rozsah relace a aplikace, které spoléhají na přístup k @@GLOBAL.sql_log_bin, by měly být upraveny.
  • Nepoužívané systémové proměnné date_format, datetime_format, time_format a max_tmp_tables jsou odstraněny.
  • Zastaralé kvalifikátory ASC nebo DESC pro klauzule GROUP BY jsou odstraněny. Dotazy, které se dříve spoléhaly na řazení GROUP BY, mohou poskytovat výsledky, které se liší od předchozích verzí MySQL. Chcete-li vytvořit dané pořadí řazení, zadejte klauzuli ORDER BY.
  • Analyzátor již nepovažuje \N za synonymum pro NULL v příkazech SQL. Místo toho použijte NULL. Tato změna nemá vliv na operace importu nebo exportu textového souboru prováděné pomocí LOAD DATA nebo SELECT ... INTO OUTFILE, pro které je NULL i nadále představováno \N.
  • Možnosti --ssl a --ssl-verify-server-cert na straně klienta byly odstraněny. Místo --ssl=1 nebo --enable-ssl použijte --ssl-mode=REQUIRED. Použijte --ssl-mode=DISABLED namísto --ssl=0, --skip-ssl nebo --disable-ssl. Místo možností --ssl-verify-server-cert použijte --ssl-mode=VERIFY_IDENTITY.
  • Program mysql_install_db byl odstraněn z distribucí MySQL. Inicializace datového adresáře by měla být provedena vyvoláním mysqld s volbou --initialize nebo --initialize-insecure. Kromě toho byla odstraněna volba --bootstrap pro mysqld, kterou používal mysql_install_db, a byla odstraněna volba INSTALL_SCRIPTDIR CMake, která řídila umístění instalace pro mysql_install_db.
  • Obslužný program mysql_plugin byl odebrán. Mezi alternativy patří načítání zásuvných modulů při spuštění serveru pomocí volby --plugin-load nebo --plugin-load-add nebo za běhu pomocí příkazu INSTALL PLUGIN.
  • Obslužný program resolveip byl odebrán. Místo toho lze použít nslookup, host nebo dig.

Je zde mnoho nových, zastaralých a odstraněných funkcí. Podrobnější informace naleznete na oficiálních stránkách.

Úvahy před migrací na MySQL 8.0

Pojďme nyní zmínit některé z nejdůležitějších věcí, které je třeba zvážit před migrací na tuto verzi MySQL.

Metoda ověření

Jak jsme zmínili, caching_sha2_password není výchozí metoda ověřování, takže byste měli zkontrolovat, zda ji vaše aplikace/konektor podporuje. Pokud ne, podívejme se, jak můžete změnit výchozí metodu ověřování a plugin pro ověřování uživatelů znovu na ‚mysql_native_password‘.

Chcete-li změnit výchozí metodu ověřování, upravte konfigurační soubor my.cnf a přidejte/upravte následující řádek:

$ vi /etc/my.cnf

[mysqld]

default_authentication_plugin=mysql_native_password

Chcete-li změnit plugin pro ověření uživatele, spusťte následující příkaz s privilegovaným uživatelem:

$ mysql -p

ALTER USER ‘username’@’hostname’ IDENTIFIED WITH ‘mysql_native_password’ BY ‘password’;

Tyto změny každopádně nepředstavují trvalé řešení, protože staré ověřování může být brzy ukončeno, takže byste to měli vzít v úvahu při budoucím upgradu databáze.

Důležitou funkcí jsou zde také role. Můžete snížit jednotlivá oprávnění, přiřazovat roli a přidávat tam odpovídající uživatele.

Můžete například vytvořit novou roli pro marketingový tým a týmy vývojářů:

$ mysql -p

CREATE ROLE 'marketing', 'developers';

Přidělte oprávnění těmto novým rolím:

GRANT SELECT ON *.* TO 'marketing';

GRANT ALL PRIVILEGES ON *.* TO 'developers';

A poté přidělte roli uživatelům:

GRANT 'marketing' TO 'marketing1'@'%';

GRANT 'marketing' TO 'marketing2'@'%';

GRANT 'developers' TO 'developer1'@'%';

A je to. Budete mít následující oprávnění:

SHOW GRANTS FOR 'marketing1'@'%';

+-------------------------------------------+

| Grants for [email protected]%                   |

+-------------------------------------------+

| GRANT USAGE ON *.* TO `marketing1`@`%`    |

| GRANT `marketing`@`%` TO `marketing1`@`%` |

+-------------------------------------------+

2 rows in set (0.00 sec)

SHOW GRANTS FOR 'marketing';

+----------------------------------------+

| Grants for [email protected]%                 |

+----------------------------------------+

| GRANT SELECT ON *.* TO `marketing`@`%` |

+----------------------------------------+

1 row in set (0.00 sec)

Znakové sady

Protože nová výchozí znaková sada je utf8mb4, měli byste se ujistit, že nepoužíváte výchozí, protože se změní.

Abyste se vyhnuli některým problémům, měli byste zadat proměnné character_set_server a collation_server v konfiguračním souboru my.cnf.

$ vi /etc/my.cnf

[mysqld]

character_set_server=latin1

collation_server=latin1_swedish_ci

MyISAM Engine

Tabulky oprávnění MySQL ve schématu MySQL jsou přesunuty do InnoDB. Můžete vytvořit tabulkový engine=MyISAM a bude fungovat jako dříve, ale kopírování tabulky MyISAM do běžícího serveru MySQL nebude fungovat, protože nebude objevena.

Rozdělení

Nesmí existovat žádné rozdělené tabulky, které používají úložiště, které nemá nativní podporu pro dělení. Pro ověření tohoto bodu můžete spustit následující dotaz.

$ mysql -p

SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE NOT IN ('innodb', 'ndbcluster') AND CREATE_OPTIONS LIKE '%partitioned%';

Pokud potřebujete změnit jádro tabulky, můžete spustit:

ALTER TABLE table_name ENGINE = INNODB;

Kontrola upgradu

Jako poslední krok můžete spustit příkaz mysqlcheck pomocí příznaku check-upgrade pro potvrzení, zda vše vypadá v pořádku.

$ mysqlcheck -uroot -p --all-databases --check-upgrade

Enter password:

mysql.columns_priv                                 OK

mysql.component                                    OK

mysql.db                                           OK

mysql.default_roles                                OK

mysql.engine_cost                                  OK

mysql.func                                         OK

mysql.general_log                                  OK

mysql.global_grants                                OK

mysql.gtid_executed                                OK

mysql.help_category                                OK

mysql.help_keyword                                 OK

mysql.help_relation                                OK

mysql.help_topic                                   OK

mysql.innodb_index_stats                           OK

mysql.innodb_table_stats                           OK

mysql.password_history                             OK

mysql.plugin                                       OK

mysql.procs_priv                                   OK

mysql.proxies_priv                                 OK

mysql.role_edges                                   OK

mysql.server_cost                                  OK

mysql.servers                                      OK

mysql.slave_master_info                            OK

mysql.slave_relay_log_info                         OK

mysql.slave_worker_info                            OK

mysql.slow_log                                     OK

mysql.tables_priv                                  OK

mysql.time_zone                                    OK

mysql.time_zone_leap_second                        OK

mysql.time_zone_name                               OK

mysql.time_zone_transition                         OK

mysql.time_zone_transition_type                    OK

mysql.user                                         OK

sys.sys_config                                     OK

world_x.city                                       OK

world_x.country                                    OK

world_x.countryinfo                                OK

world_x.countrylanguage                            OK

Před provedením upgradu je třeba zkontrolovat několik věcí. Podrobnější informace naleznete v oficiální dokumentaci MySQL.

Metody upgradu

Existují různé způsoby upgradu MySQL 5.7 na 8.0. Upgrade můžete použít na místě nebo dokonce vytvořit replikační slave v nové verzi, abyste jej mohli propagovat později.

Před upgradem však musí být v kroku 0 zálohování dat. Záloha by měla zahrnovat všechny databáze včetně systémových databází. Takže pokud se vyskytne nějaký problém, můžete jej co nejdříve vrátit.

Další možností, v závislosti na dostupných zdrojích, může být vytvoření kaskádové replikace MySQL 5.7 -> MySQL 8.0 -> MySQL 5.7, takže po propagaci nové verze, pokud se něco pokazilo, můžete propagovat slave uzel se starou verzí zpět. Ale mohlo by to být nebezpečné, pokud by došlo k nějakému problému s daty, takže záloha je nutností.

Pro použití jakékoli metody je nutné testovací prostředí, které ověří, že aplikace funguje bez problémů pomocí nové verze MySQL 8.0.

Závěr

Více než 1 rok po vydání MySQL 8.0 je čas začít uvažovat o migraci vaší staré verze MySQL, ale naštěstí, protože konec podpory pro MySQL 5.7 je v roce 2023, máte čas vytvořit plán migrace a otestovat chování aplikace. bez spěchu. Strávit nějaký čas v tomto testovacím kroku je nutné, aby se předešlo problémům po migraci.


  1. MariaDB JSON_REPLACE() Vysvětleno

  2. PŘÍPADOVÁ STUDIE:ARKWARE MS ACCESS CRM

  3. Automatizace každodenních úloh PostgreSQL pomocí Jenkinse

  4. Funkce NULLIF() v Oracle