sql >> Databasteknik >  >> RDS >> Mysql

Tips för att uppgradera till från MySQL 5.7 till MySQL 8

MySQL 8.0 har redan funnits med oss ​​ganska länge och många MySQL-användare har redan uppgraderat till denna version. För de som fortfarande använder äldre MySQL-versioner vill vi presentera den här bloggen där vi kommer att dela med oss ​​av några tips och information som hjälper till i uppgraderingsprocessen för MySQL 8.0.

Tänk på din version

Programversioner är ganska viktiga i uppgraderingsprocessen. Till att börja med stöds endast en större versionsskillnad. Du måste köra MySQL 5.7 innan du kan uppgradera till MySQL 8.0. Detta är ganska viktigt att komma ihåg med tanke på att MySQL 5.6 närmar sig slutet av livet och det kommer inte att stödjas längre. För alla er som använder MySQL 5.6 måste ni se till att uppgradera den till MySQL 5.7 först och sedan, så småningom, till MySQL 8.0.

Det som starkt rekommenderas är att du uppgraderar till den senaste versionen för MySQL 5.7. När jag skrev den här bloggen var den 5.7.31 men detta kommer så småningom att ändras, du kan alltid slå upp det på MySQL-webbplatsen.

Observera också att uppgraderingar från icke-GA-versioner (och till icke-GA-versioner) inte stöds. Inte för att det är meningsfullt att köra icke-GA-versioner i produktion, men vi ville göra detta tydligt också.

Det är en enkelbiljett

När du bestämmer dig för att utföra uppgraderingen, var medveten om att när uppgraderingen är klar finns det ingen återvändo. Ändringarna är inte kompatibla och du kan helt enkelt inte använda datakatalogen från MySQL 8.0 på MySQL 5.7. Se till att du tar en säkerhetskopia av dina MySQL 5.7-data direkt före uppgraderingen - du skulle kunna återställa den på MySQL 5.7-instans om du skulle behöva återställa ändringen. Tänk också på, eftersom det kan komma som en överraskning, att uppgradering från MySQL 8.0.x till MySQL 8.0.x+1 kanske inte heller är kompatibel och även om det är en mindre versionsuppgradering bör du inte förvänta dig den nedgraderingen skulle vara möjligt. Detta är resultatet av Oracles distributionscykel - istället för att göra funktionsfrysning för den senaste GA-grenen, som det var fallet med tidigare versioner, skjuts nya funktioner, ibland inkompatibla sådana, som nya versioner av 8.0-grenen.

In-Place Upgrade är en Go

Tidigare var det inte alltid möjligt att utföra en uppgradering av MySQL på plats. I vissa fall var du tvungen att dumpa data till SQL-format och sedan ladda upp den igen till den nya versionen. Lyckligtvis är MySQL 8.0 mer administratörsvänligt och uppgradering på plats stöds. Allt du behöver göra är att köra apt upgrade eller yum update och du är redo. Uppgraderingen är ännu bekvämare - tidigare var man tvungen att tänka på att köra mysql_upgrade för att säkerställa att alla systemtabeller är korrekt uppgraderade till det format som krävs av den nya versionen av MySQL. I MySQL 8.0, från och med MySQL 8.0.16, behövs detta inte längre - allt du behöver göra är att starta MySQL-processen, mysqld, och som standard kommer uppgraderingen att utföras över dataordboken och andra systemscheman närhelst det är bestämt sig för att krävas. Det är möjligt att ändra detta beteende genom att skicka olika parametrar till --upgrade server alternativet, men i de flesta fall skulle du vilja dra nytta av denna förbättring.

Är jag säker att uppgradera?

Naturligtvis finns det förutsättningar för den säkra uppgraderingen. Låt oss ta en titt på några metoder som bör hjälpa dig att säkerställa att du säkert kan uppgradera till MySQL 8.0.

Syndhetskontroller

Innan du försöker något bör du dubbelkolla att din befintliga MySQL 5.7-installation kryssar i alla rutorna på förnuftschecklistan innan du uppgraderar till MySQL 8.0. MySQL-dokumentationen presenterar en omfattande lista över saker att testa. Det är inte meningsfullt att gå igenom listan här eftersom den täcks av MySQL-dokumentationen, men här är ett par punkter som du kanske vill ha i åtanke.

För det första, partitionering stöds nu endast i motorer som implementerar det på sin sida, som endast är NDB och InnoDB. Se till att alla partitionerade tabeller använder någon av dessa lagringsmotorer eller att du tar bort partitioneringen före uppgraderingen.

Du kanske vill köra

mysqlcheck -u root -p --all-databases --check-upgrade

för att dubbelkolla att tabeller har rätt format.

Det finns också andra kontroller som du bör utföra - nästan varje ny MySQL-version kommer med en uppdaterad lista med reserverade ord och du bör kontrollera att du inte använder dem i din databas. Du måste kontrollera namnen på främmande nyckelbegränsningar, de får inte vara längre än 64 tecken. Vissa alternativ för sql_mode har tagits bort så du bör se till att du inte använder dem. Som vi nämnde finns det en omfattande lista över saker att testa.

MySQL Shell till räddning

Att testa alla dessa villkor är ganska tidskrävande, därför skapade Oracle ett alternativ i MySQL-skalet som är avsett att köra en serie tester för att verifiera om din befintliga installation är säker att uppgradera till MySQL 8.0. Till att börja med, om du inte har MySQL Shell installerat, bör du göra det. Du kan hitta nedladdningar på Oracles webbplats. När du har ställt in det kan du ansluta till din MySQL 5.7 och köra testet. Låt oss se hur det kan se ut:

[email protected]:~# mysqlsh

MySQL Shell 8.0.21



Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates.

Other names may be trademarks of their respective owners.



Type '\help' or '\?' for help; '\quit' to exit.

 MySQL  JS > \c [email protected]

Creating a session to '[email protected]'

Please provide the password for '[email protected]': ****

Save password for '[email protected]'? [Y]es/[N]o/Ne[v]er (default No):

Fetching schema names for autocompletion... Press ^C to stop.

Your MySQL connection id is 71 (X protocol)

Server version: 5.7.31-log MySQL Community Server (GPL)

No default schema selected; type \use <schema> to set one.

Vi kopplade till MySQL-instansen på den lokala värden med MySQL Shell. Nu kan vi köra kontrollen. Vi skickar sökvägen till konfigurationsfilen för mer omfattande tester:

MySQL  localhost:33060+ ssl  JS > util.checkForServerUpgrade({"configPath":"/etc/mysql/my.cnf"})

Då har vi en lång utgång.

The MySQL server at localhost:33060, version 5.7.31-log - MySQL Community

Server (GPL), will now be checked for compatibility issues for upgrade to MySQL

8.0.21...



1) Usage of old temporal type

  No issues found



2) Usage of db objects with names conflicting with new reserved keywords

  No issues found



3) Usage of utf8mb3 charset

  No issues found



4) Table names in the mysql schema conflicting with new tables in 8.0

  No issues found



5) Partitioned tables using engines with non native partitioning

  No issues found



6) Foreign key constraint names longer than 64 characters

  No issues found



7) Usage of obsolete MAXDB sql_mode flag

  No issues found



8) Usage of obsolete sql_mode flags

  No issues found



9) ENUM/SET column definitions containing elements longer than 255 characters

  No issues found



10) Usage of partitioned tables in shared tablespaces

  No issues found



11) Circular directory references in tablespace data file paths

  No issues found



12) Usage of removed functions

  No issues found



13) Usage of removed GROUP BY ASC/DESC syntax

  No issues found



14) Removed system variables for error logging to the system log configuration

  No issues found



15) Removed system variables

  Error: Following system variables that were detected as being used will be

    removed. Please update your system to not rely on them before the upgrade.

  More information:

    https://dev.mysql.com/doc/refman/8.0/en/added-deprecated-removed.html#optvars-removed



  log_warnings - is set and will be removed, consider using log_error_verbosity

    instead

  query_cache_size - is set and will be removed

  query_cache_type - is set and will be removed



16) System variables with new default values

  Warning: Following system variables that are not defined in your

    configuration file will have new default values. Please review if you rely on

    their current values and if so define them before performing upgrade.

  More information:

    https://mysqlserverteam.com/new-defaults-in-mysql-8-0/



  back_log - default value will change

  character_set_server - default value will change from latin1 to utf8mb4

  collation_server - default value will change from latin1_swedish_ci to

    utf8mb4_0900_ai_ci

  event_scheduler - default value will change from OFF to ON

  explicit_defaults_for_timestamp - default value will change from OFF to ON

  innodb_flush_neighbors - default value will change from 1 (enable) to 0

    (disable)

  innodb_max_dirty_pages_pct - default value will change from 75 (%)  90 (%)

  innodb_max_dirty_pages_pct_lwm - default value will change from_0 (%) to 10

    (%)

  innodb_undo_log_truncate - default value will change from OFF to ON

  innodb_undo_tablespaces - default value will change from 0 to 2

  log_error_verbosity - default value will change from 3 (Notes) to 2 (Warning)

  max_error_count - default value will change from 64 to 1024

  optimizer_trace_max_mem_size - default value will change from 16KB to 1MB

  performance_schema_consumer_events_transactions_current - default value will

    change from OFF to ON

  performance_schema_consumer_events_transactions_history - default value will

    change from OFF to ON

  slave_rows_search_algorithms - default value will change from 'INDEX_SCAN,

    TABLE_SCAN' to 'INDEX_SCAN, HASH_SCAN'

  transaction_write_set_extraction - default value will change from OFF to

    XXHASH64



17) Zero Date, Datetime, and Timestamp values

  No issues found



18) Schema inconsistencies resulting from file removal or corruption

  No issues found



19) Tables recognized by InnoDB that belong to a different engine

  No issues found



20) Issues reported by 'check table x for upgrade' command

  No issues found



21) New default authentication plugin considerations

  Warning: The new default authentication plugin 'caching_sha2_password' offers

    more secure password hashing than previously used 'mysql_native_password'

    (and consequent improved client connection authentication). However, it also

    has compatibility implications that may affect existing MySQL installations.

    If your MySQL installation must serve pre-8.0 clients and you encounter

    compatibility issues after upgrading, the simplest way to address those

    issues is to reconfigure the server to revert to the previous default

    authentication plugin (mysql_native_password). For example, use these lines

    in the server option file:



    [mysqld]

    default_authentication_plugin=mysql_native_password



    However, the setting should be viewed as temporary, not as a long term or

    permanent solution, because it causes new accounts created with the setting

    in effect to forego the improved authentication security.

    If you are using replication please take time to understand how the

    authentication plugin changes may impact you.

  More information:

    https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password-compatibility-issues

    https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password-replication



Errors:   3

Warnings: 18

Notices:  0



3 errors were found. Please correct these issues before upgrading to avoid compatibility issues.

Som du kan se har totalt 21 tester utförts, kontrollen har hittat 3 fel relaterade till konfigurationsalternativen som inte kommer att existera i MySQL 8.0.21. Testerna är ganska detaljerade. Du kommer bland annat att lära dig om ändringar i standardvärdena för variabler som du inte har konfigurerat i din MySQL-konfiguration (så dessa inställningar kommer att ändras när du installerar MySQL 8.0).

Återställa en misslyckad uppgradering

Som vi nämnde tidigare kan du inte nedgradera från MySQL 8.0 när uppgraderingen är klar. Lyckligtvis betyder det inte att du inte kan återställa uppgraderingen om den misslyckas i mitten. Egentligen sker det halvautomatiskt om något av de problem som vi diskuterade i föregående avsnitt upptäcks. Den enda manuella åtgärd som krävs är att ta bort redo-loggar och starta MySQL 5.7 för att åtgärda problemen som upptäcktes under uppgraderingen. Sedan bör du göra en långsam avstängning (innodb_fast_shutdown=0) för att säkerställa att allt skrivs till tabellutrymmena och sedan är du redo att försöka uppgradera en gång till.

Sluta tips

Det finns två, ganska viktiga ändringar i standardbeteendet som följer med MySQL 8.0 som vi skulle vilja lyfta fram.

Caching_sha2_password som standard

Se till att du dubbelkolla om dina applikationer och proxyservrar kommer att fungera korrekt med plugin-programmet caching_sha2_password-autentisering eftersom det blir standard i MySQL 8.0. Äldre applikationer kan påverkas och inte kunna ansluta till databasen. Naturligtvis kan du ändra detta till vilken autentiseringsplugin du vill (som mysql_native_password till exempel, eftersom det var standard i tidigare MySQL-versioner) så det är inte en blockerare på något sätt. Det är bara något att komma ihåg att testa innan uppgraderingen så att du inte får MySQL 8.0 och appar som inte kan ansluta till den om du inte konfigurerar om din databas för att använda en äldre autentiseringsmekanism.

UTF8mb4 som standardteckenuppsättning

Detta borde inte komma som en överraskning med tanke på hur omfattande förändringar till UTF8 diskuterades i communityn, men det är faktum - MySQL 8.0 kommer med UTF8mb4-teckenuppsättning som standard. Detta har ytterligare effekter som du bör vara medveten om. För det första kan din datauppsättnings storlek öka om du använder UTF8mb4 teckenuppsättning. Detta leder till att minnesbuffertar kan lagra mindre mängder data än för data med latin1 teckenuppsättning. För det andra förväntas prestanda för MySQL att minska. Visst, Oracle gjorde ett bra jobb med att minimera effekten av den här förändringen, men du kan inte förvänta dig att det inte kommer att bli någon effekt alls – det kommer att bli en del.

Vi hoppas att det här blogginlägget hjälper dig att gå igenom processen med att uppgradera från MySQL 5.7 till MySQL 8.0. Om du har dina tankar om processen uppmuntrar vi dig att dela dem i kommentarerna under det här inlägget.


  1. Översikt över T-SQL PRINT Statement

  2. Få storleken på ett stort objekt i PostgreSQL-frågan?

  3. Bestäm Oracle null ==null

  4. Hur LN() fungerar i MariaDB