sql >> Database >  >> RDS >> Mysql

Overstappen van MySQL 5.7 naar MySQL 8.0 - Wat u moet weten

April 2018 is niet alleen een datum voor de MySQL-wereld. MySQL 8.0 werd daar uitgebracht en meer dan 1 jaar later is het waarschijnlijk tijd om te overwegen om naar deze nieuwe versie te migreren.

MySQL 8.0 heeft belangrijke prestatie- en beveiligingsverbeteringen, en, zoals bij elke migratie naar een nieuwe databaseversie, zijn er verschillende dingen waarmee u rekening moet houden voordat u in productie gaat om moeilijke problemen zoals gegevensverlies, overmatige downtime, of zelfs een rollback tijdens de migratietaak.

In deze blog bespreken we enkele van de nieuwe MySQL 8.0-functies, enkele verouderde dingen en waar u rekening mee moet houden voordat u migreert.

Wat is er nieuw in MySQL 8.0?

Laten we nu enkele van de belangrijkste functies samenvatten die in de officiële documentatie voor deze nieuwe MySQL-versie worden genoemd.

  • MySQL bevat een transactioneel datadictionary waarin informatie over databaseobjecten wordt opgeslagen.
  • Een atomaire DDL-instructie combineert de datadictionary-updates, opslagengine-bewerkingen en binaire log-schrijfbewerkingen die zijn gekoppeld aan een DDL-bewerking in een enkele atomaire transactie.
  • De MySQL-server voert automatisch alle noodzakelijke upgradetaken uit bij de volgende keer opstarten om de systeemtabellen in het mysql-schema te upgraden, evenals objecten in andere schema's zoals het sys-schema en gebruikersschema's. Het is niet nodig voor de DBA om mysql_upgrade aan te roepen.
  • Het ondersteunt het aanmaken en beheren van resourcegroepen en maakt het mogelijk om threads die binnen de server worden uitgevoerd aan bepaalde groepen toe te wijzen, zodat threads worden uitgevoerd volgens de resources die beschikbaar zijn voor de groep.
  • Tabelversleuteling kan nu wereldwijd worden beheerd door standaardversleutelingsstandaarden te definiëren en af ​​te dwingen. De variabele default_table_encryption definieert een coderingsstandaard voor nieuw gemaakte schema's en algemene tabelruimte. Standaardinstellingen voor versleuteling worden afgedwongen door de variabele table_encryption_privilege_check in te schakelen.
  • De standaardtekenset is gewijzigd van latin1 in utf8mb4.
  • Het ondersteunt het gebruik van expressies als standaardwaarden in gegevenstypespecificaties. Dit omvat het gebruik van expressies als standaardwaarden voor de gegevenstypen BLOB, TEXT, GEOMETRY en JSON.
  • Foutregistratie is herschreven om de MySQL-componentarchitectuur te gebruiken. Traditionele foutregistratie wordt geïmplementeerd met behulp van ingebouwde componenten en registratie met behulp van het systeemlogboek wordt geïmplementeerd als een laadbare component.
  • Een nieuw type back-upvergrendeling staat DML toe tijdens een online back-up, terwijl bewerkingen worden voorkomen die kunnen leiden tot een inconsistente momentopname. De nieuwe back-upvergrendeling wordt ondersteund door de syntaxis LOCK INSTANCE FOR BACKUP en UNLOCK INSTANCE. Het BACKUP_ADMIN-recht is vereist om deze instructies te gebruiken.
  • MySQL Server staat nu toe dat een TCP/IP-poort specifiek voor administratieve verbindingen wordt geconfigureerd. Dit biedt een alternatief voor de enkele administratieve verbinding die is toegestaan ​​op de netwerkinterfaces die worden gebruikt voor gewone verbindingen, zelfs wanneer max_connections-verbindingen al tot stand zijn gebracht.
  • Het ondersteunt onzichtbare indexen. Deze index wordt niet gebruikt door de optimizer en maakt het mogelijk om het effect van het verwijderen van een index op de queryprestaties te testen, zonder deze te verwijderen.
  • Document Store voor het ontwikkelen van zowel SQL- als NoSQL-documenttoepassingen met behulp van één database.
  • MySQL 8.0 maakt het mogelijk om globale, dynamische servervariabelen aan te houden met het SET PERSIST-commando in plaats van het gebruikelijke SET GLOBAL-commando.

MySQL-beveiliging en accountbeheer

Omdat er veel verbeteringen zijn met betrekking tot beveiliging en gebruikersbeheer, zullen we ze in een apart gedeelte vermelden.

  • De toekenningstabellen in de mysql-systeemdatabase zijn nu InnoDB-tabellen.
  • De nieuwe caching_sha2_password authenticatie-plug-in is nu de standaard authenticatiemethode in MySQL 8.0. Het implementeert SHA-256 wachtwoord-hashing, maar gebruikt caching om latentieproblemen bij het verbinden aan te pakken. Het biedt een veiligere wachtwoordcodering dan de mysql_native_password-plug-in en biedt betere prestaties dan sha256_password.
  • MySQL ondersteunt nu rollen, die verzamelingen van privileges worden genoemd. Aan rollen kunnen privileges worden toegekend en van hen worden ingetrokken, en ze kunnen worden verleend aan en ingetrokken van gebruikersaccounts.
  • MySQL houdt nu informatie bij over de wachtwoordgeschiedenis, waardoor beperkingen op hergebruik van eerdere wachtwoorden mogelijk zijn.
  • Het stelt beheerders in staat om gebruikersaccounts zo te configureren dat te veel opeenvolgende mislukte aanmeldingen als gevolg van onjuiste wachtwoorden tijdelijke accountvergrendeling veroorzaken.

InnoDB-verbeteringen

Zoals het vorige punt zijn er ook veel verbeteringen met betrekking tot dit onderwerp, dus we zullen ze ook in een apart gedeelte vermelden.

  • De huidige maximale tellerwaarde voor automatisch ophogen wordt elke keer dat de waarde verandert naar het herhalingslogboek geschreven en op elk controlepunt opgeslagen in een engine-private systeemtabel. Deze wijzigingen zorgen ervoor dat de huidige maximale tellerwaarde voor automatisch ophogen blijft bestaan ​​bij het opnieuw opstarten van de server
  • Bij het tegenkomen van corruptie in de indexstructuur, schrijft InnoDB een corruptievlag naar het redo-logboek, waardoor de corruptievlag crashveilig wordt. InnoDB schrijft ook corruptievlaggegevens in het geheugen naar een engine-private systeemtabel op elk controlepunt. Tijdens het herstel leest InnoDB corruptievlaggen van beide locaties en worden de resultaten samengevoegd voordat tabel- en indexobjecten in het geheugen als beschadigd worden gemarkeerd.
  • Een nieuwe dynamische variabele, innodb_deadlock_detect, kan worden gebruikt om deadlock-detectie uit te schakelen. Op high-concurrency-systemen kan deadlock-detectie een vertraging veroorzaken wanneer meerdere threads op dezelfde lock wachten. Soms kan het efficiënter zijn om deadlock-detectie uit te schakelen en te vertrouwen op de innodb_lock_wait_timeout-instelling voor het terugdraaien van transacties wanneer een deadlock optreedt.
  • InnoDB tijdelijke tabellen worden nu aangemaakt in de gedeelde tijdelijke tabelruimte, ibtmp1.
  • mysql-systeemtabellen en datadictionary-tabellen worden nu gemaakt in een enkel InnoDB-tabelruimtebestand met de naam mysql.ibd in de MySQL-gegevensdirectory. Voorheen werden deze tabellen gemaakt in individuele InnoDB-tabelruimtebestanden in de mysql-databasedirectory.
  • Logboeken voor ongedaan maken bevinden zich standaard in twee tabelruimten voor ongedaan maken die worden gemaakt wanneer de MySQL-instantie wordt geïnitialiseerd. Logboeken voor ongedaan maken worden niet langer gemaakt in de systeemtabelruimte.
  • De nieuwe variabele innodb_dedicated_server, die standaard is uitgeschakeld, kan worden gebruikt om InnoDB automatisch de volgende opties te laten configureren op basis van de hoeveelheid geheugen die op de server wordt gedetecteerd:innodb_buffer_pool_size, innodb_log_file_size en innodb_flush_method. Deze optie is bedoeld voor MySQL-serverinstances die op een dedicated server draaien.
  • Tablespace-bestanden kunnen worden verplaatst of hersteld naar een nieuwe locatie terwijl de server offline is met de optie innodb_directories.

Laten we nu eens kijken naar enkele van de functies die u niet meer zou moeten gebruiken in deze nieuwe MySQL-versie.

Wat is verouderd in MySQL 8.0?

De volgende functies zijn verouderd en zullen in een toekomstige versie worden verwijderd.

  • De utf8mb3-tekenset is verouderd. Gebruik in plaats daarvan utf8mb4.
  • Omdat caching_sha2_password de standaard authenticatie-plug-in in MySQL 8.0 is en een superset van de mogelijkheden van de sha256_password authenticatie-plug-in biedt, is sha256_password verouderd.
  • De plug-in valid_password is opnieuw geïmplementeerd om de infrastructuur van de servercomponent te gebruiken. De plug-in-vorm valid_password is nog steeds beschikbaar, maar is verouderd.
  • De ENGINE-component voor de ALTER TABLESPACE- en DROP TABLESPACE-statements.
  • De PAD_CHAR_TO_FULL_LENGTH SQL-modus.
  • AUTO_INCREMENT-ondersteuning is verouderd voor kolommen van het type FLOAT en DOUBLE (en eventuele synoniemen). Overweeg om het kenmerk AUTO_INCREMENT uit dergelijke kolommen te verwijderen, of converteer ze naar een geheel getal.
  • Het UNSIGNED-kenmerk is verouderd voor kolommen van het type FLOAT, DOUBLE en DECIMAL (en eventuele synoniemen). Overweeg in plaats daarvan een eenvoudige CHECK-beperking te gebruiken voor dergelijke kolommen.
  • FLOAT(M,D) en DOUBLE(M,D) syntaxis om het aantal cijfers op te geven voor kolommen van het type FLOAT en DOUBLE (en eventuele synoniemen) is een niet-standaard MySQL-extensie. Deze syntaxis is verouderd.
  • De niet-standaard C-stijl &&, ||, en ! operatoren die synoniem zijn voor de standaard SQL-operators AND, OR en NOT, respectievelijk, zijn verouderd. Toepassingen die de niet-standaard operators gebruiken, moeten worden aangepast om de standaard operators te gebruiken.
  • De mysql_upgrade-client is verouderd omdat de mogelijkheden voor het upgraden van de systeemtabellen in het mysql-systeemschema en objecten in andere schema's zijn verplaatst naar de MySQL-server.
  • Het mysql_upgrade_info-bestand, dat een gegevensmap is en wordt gebruikt om het MySQL-versienummer op te slaan.
  • De systeemvariabele relay_log_info_file en de optie --master-info-file zijn verouderd. Voorheen werden deze gebruikt om de naam van het relaislog-infolog en hoofdinfo-log te specificeren wanneer relay_log_info_repository=FILE en master_info_repository=FILE waren ingesteld, maar die instellingen zijn verouderd. Het gebruik van bestanden voor het relay-log-infolog en master-infolog is vervangen door crashveilige slave-tabellen, die standaard zijn in MySQL 8.0.
  • Het gebruik van de omgevingsvariabele MYSQL_PWD om een ​​MySQL-wachtwoord op te geven is afgeschaft.

Laten we nu eens kijken naar enkele van de functies die u in deze MySQL-versie niet meer moet gebruiken.

Wat is er verwijderd in MySQL 8.0?

De volgende functies zijn verwijderd in MySQL 8.0.

  • De systeemvariabele innodb_locks_unsafe_for_binlog is verwijderd. Het isolatieniveau READ COMMITTED biedt vergelijkbare functionaliteit.
  • Grant gebruiken om gebruikers aan te maken. Gebruik in plaats daarvan GEBRUIKER MAKEN. Als u deze oefening volgt, is de SQL-modus NO_AUTO_CREATE_USER niet van belang voor GRANT-instructies, dus wordt deze ook verwijderd en wordt er nu een fout naar het serverlogboek geschreven wanneer de aanwezigheid van deze waarde voor de optie sql_mode in het optiebestand verhindert dat mysqld wordt gestart.
  • Grant gebruiken om andere accounteigenschappen dan privilegetoewijzingen te wijzigen. Dit omvat eigenschappen voor authenticatie, SSL en resourcelimiet. Stel in plaats daarvan dergelijke eigenschappen in tijdens het maken van een account met CREATE USER of wijzig ze daarna met ALTER USER.
  • GEDENTIFICEERD DOOR WACHTWOORD 'auth_string'-syntaxis voor CREATE USER en GRANT. Gebruik in plaats daarvan IDENTIFICEERD MET auth_plugin AS 'auth_string' voor CREATE USER en ALTER USER, waarbij de 'auth_string'-waarde in een formaat is dat compatibel is met de genoemde plug-in.
  • De PASWOORD() functie. Bovendien betekent het verwijderen van PASSWORD() dat de syntaxis SET PASSWORD ... =PASSWORD('auth_string') niet langer beschikbaar is.
  • De systeemvariabele old_passwords.
  • De instructies FLUSH QUERY CACHE en RESET QUERY CACHE.
  • Deze systeemvariabelen:query_cache_limit, query_cache_min_res_unit, query_cache_size, query_cache_type, query_cache_wlock_invalidate.
  • Deze statusvariabelen:Qcache_free_blocks, Qcache_free_memory, Qcache_hits, Qcache_inserts, Qcache_lowmem_prunes, Qcache_not_cached, Qcache_queries_in_cache, Qcache_total_blocks.
  • Deze threadstatussen:privileges controleren op gecachte query, querycache controleren op een query, querycache-items ongeldig maken, gecachte resultaten naar de client verzenden, resultaat opslaan in de querycache, wachten op vergrendeling van querycache.
  • De systeemvariabelen tx_isolation en tx_read_only zijn verwijderd. Gebruik in plaats daarvan transaction_isolation en transaction_read_only.
  • De systeemvariabele sync_frm is verwijderd omdat .frm-bestanden verouderd zijn.
  • De systeemvariabele secure_auth en de clientoptie --secure-auth zijn verwijderd. De optie MYSQL_SECURE_AUTH voor de mysql_options() C API-functie is verwijderd.
  • De systeemvariabele log_warnings en de serveroptie --log-warnings zijn verwijderd. Gebruik in plaats daarvan de systeemvariabele log_error_verbosity.
  • Het globale bereik voor de systeemvariabele sql_log_bin is verwijderd. sql_log_bin heeft alleen een sessiebereik en toepassingen die afhankelijk zijn van toegang tot @@GLOBAL.sql_log_bin moeten worden aangepast.
  • De ongebruikte systeemvariabelen date_format, datetime_format, time_format en max_tmp_tables zijn verwijderd.
  • De verouderde ASC- of DESC-kwalificaties voor GROUP BY-clausules zijn verwijderd. Query's die voorheen afhankelijk waren van GROUP BY-sortering, kunnen resultaten opleveren die verschillen van eerdere MySQL-versies. Geef een ORDER BY-clausule op om een ​​bepaalde sorteervolgorde te produceren.
  • De parser behandelt \N niet langer als een synoniem voor NULL in SQL-instructies. Gebruik in plaats daarvan NULL. Deze wijziging heeft geen invloed op import- of exportbewerkingen van tekstbestanden die worden uitgevoerd met LOAD DATA of SELECT ... INTO OUTFILE, waarvoor NULL nog steeds wordt weergegeven door \N.
  • De opties --ssl en --ssl-verify-server-cert aan de clientzijde zijn verwijderd. Gebruik --ssl-mode=VEREIST in plaats van --ssl=1 of --enable-ssl. Gebruik --ssl-mode=DISABLED in plaats van --ssl=0, --skip-ssl of --disable-ssl. Gebruik --ssl-mode=VERIFY_IDENTITY in plaats van --ssl-verify-server-cert opties.
  • Het programma mysql_install_db is verwijderd uit MySQL-distributies. Initialisatie van de gegevensmap moet worden uitgevoerd door mysqld aan te roepen met de optie --initialize of --initialize-insecure. Daarnaast is de --bootstrap optie voor mysqld die werd gebruikt door mysql_install_db verwijderd, en is de INSTALL_SCRIPTDIR CMake optie die de installatielocatie voor mysql_install_db bestuurde verwijderd.
  • Het hulpprogramma mysql_plugin is verwijderd. Alternatieven zijn onder meer het laden van plug-ins bij het opstarten van de server met behulp van de optie --plugin-load of --plugin-load-add, of tijdens runtime met behulp van de instructie INSTALL PLUGIN.
  • Het hulpprogramma resolveip is verwijderd. nslookup, host of dig kunnen in plaats daarvan worden gebruikt.

Er zijn veel nieuwe, verouderde en verwijderde functies. U kunt de officiële website raadplegen voor meer gedetailleerde informatie.

Overwegingen voordat u migreert naar MySQL 8.0

Laten we nu enkele van de belangrijkste dingen noemen die u moet overwegen voordat u naar deze MySQL-versie migreert.

Verificatiemethode

Zoals we al zeiden, is caching_sha2_password niet de standaard authenticatiemethode, dus je moet controleren of je applicatie/connector dit ondersteunt. Als dat niet het geval is, gaan we kijken hoe u de standaard authenticatiemethode en de plug-in voor gebruikersauthenticatie kunt wijzigen in 'mysql_native_password'.

Als u de standaardverificatiemethode wilt wijzigen, bewerkt u het my.cnf-configuratiebestand en voegt u de volgende regel toe/bewerkt u deze:

$ vi /etc/my.cnf

[mysqld]

default_authentication_plugin=mysql_native_password

Als u de plug-in voor gebruikersauthenticatie wilt wijzigen, voert u de volgende opdracht uit met een bevoegde gebruiker:

$ mysql -p

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

Hoe dan ook, deze wijzigingen zijn geen permanente oplossing, aangezien de oude authenticatie binnenkort kan worden beëindigd, dus u moet er rekening mee houden bij een toekomstige database-upgrade.

Ook de rollen zijn hier een belangrijk kenmerk. U kunt de individuele privileges verminderen door het aan een rol toe te wijzen en de bijbehorende gebruikers daar toe te voegen.

U kunt bijvoorbeeld een nieuwe rol maken voor de marketing- en de ontwikkelaarsteams:

$ mysql -p

CREATE ROLE 'marketing', 'developers';

Bevoegdheden toewijzen aan deze nieuwe rollen:

GRANT SELECT ON *.* TO 'marketing';

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

En dan, wijs de rol toe aan de gebruikers:

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

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

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

En dat is het. Je hebt de volgende rechten:

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)

Tekensets

Aangezien de nieuwe standaardtekenset utf8mb4 is, moet je ervoor zorgen dat je niet de standaardtekenset gebruikt, aangezien deze zal veranderen.

Om problemen te voorkomen, moet u de variabelen character_set_server en collation_server specificeren in het my.cnf-configuratiebestand.

$ vi /etc/my.cnf

[mysqld]

character_set_server=latin1

collation_server=latin1_swedish_ci

MijnISAM-engine

De MySQL-privilegetabellen in het MySQL-schema zijn verplaatst naar InnoDB. U kunt een table engine=MyISAM maken, en het zal werken zoals voorheen, maar het kopiëren van een MyISAM-tabel naar een draaiende MySQL-server zal niet werken omdat het niet zal worden ontdekt.

Partitionering

Er mogen geen gepartitioneerde tabellen zijn die een opslagengine gebruiken die geen native partitieondersteuning heeft. U kunt de volgende query uitvoeren om dit punt te verifiëren.

$ mysql -p

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

Als u de engine van een tabel moet wijzigen, kunt u het volgende uitvoeren:

ALTER TABLE table_name ENGINE = INNODB;

Upgrade-controle

Als laatste stap kun je de opdracht mysqlcheck uitvoeren met behulp van de check-upgrade-vlag om te bevestigen of alles er goed uitziet.

$ 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

Er zijn verschillende dingen die u moet controleren voordat u de upgrade uitvoert. U kunt de officiële MySQL-documentatie raadplegen voor meer gedetailleerde informatie.

Upgrademethoden

Er zijn verschillende manieren om MySQL 5.7 naar 8.0 te upgraden. U kunt de upgrade ter plaatse gebruiken of zelfs een replicatieslave maken in de nieuwe versie, zodat u deze later kunt promoten.

Maar voordat u gaat upgraden, moet stap 0 een back-up van uw gegevens zijn. De back-up moet alle databases bevatten, inclusief de systeemdatabases. Dus als er een probleem is, kunt u dit zo snel mogelijk terugdraaien.

Een andere optie, afhankelijk van de beschikbare bronnen, kan het creëren van een cascadereplicatie zijn MySQL 5.7 -> MySQL 8.0 -> MySQL 5.7, dus als er na het promoten van de nieuwe versie iets mis is gegaan, kunt u de slave node met de oude versie terug. Maar het kan gevaarlijk zijn als er een probleem is met de gegevens, dus de back-up is daarvoor een must.

Voor elke methode die kan worden gebruikt, is een testomgeving nodig om te verifiëren dat de applicatie probleemloos werkt met de nieuwe MySQL 8.0-versie.

Conclusie

Meer dan 1 jaar na de release van MySQL 8.0 is het tijd om na te denken over het migreren van je oude MySQL-versie, maar gelukkig, aangezien het einde van de ondersteuning voor MySQL 5.7 in 2023 is, heb je tijd om een ​​migratieplan te maken en het applicatiegedrag te testen zonder haast. Het is nodig enige tijd in die teststap te steken om problemen na de migratie te voorkomen.


  1. Hoe VARCHAR(MAX) afdrukken met Print Statement?

  2. Docker gebruiken op Azure Container Service met Swarm Cluster

  3. Hoe de GO-verklaring in SQL Server te gebruiken om records in de identiteitskolom in te voegen - SQL Server / T-SQL-zelfstudie, deel 42

  4. SQLite Linker Join