Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Tips untuk Upgrade ke dari MySQL 5.7 ke MySQL 8

MySQL 8.0 telah bersama kami selama beberapa waktu dan banyak pengguna MySQL telah meningkatkan ke versi ini. Bagi yang masih menggunakan MySQL versi lama, kami ingin mempersembahkan blog ini dimana kami akan berbagi beberapa tips dan informasi yang membantu dalam proses upgrade MySQL 8.0.

Pikirkan Versi Anda

Versi perangkat lunak cukup penting dalam proses peningkatan. Sebagai permulaan, hanya satu perbedaan versi utama yang didukung. Anda harus menjalankan MySQL 5.7 sebelum dapat meningkatkan ke MySQL 8.0. Ini cukup penting untuk diingat mengingat MySQL 5.6 mendekati Akhir Masa Pakainya dan tidak akan didukung lagi. Bagi Anda semua yang menggunakan MySQL 5.6 Anda harus memastikan bahwa Anda mengupgradenya ke MySQL 5.7 terlebih dahulu dan kemudian, akhirnya, ke MySQL 8.0.

Yang sangat disarankan adalah Anda meningkatkan ke versi terbaru yang tersedia untuk MySQL 5.7. Pada saat penulisan blog ini adalah 5.7.31 tetapi ini pada akhirnya akan berubah, Anda selalu dapat mencarinya di situs web MySQL.

Harap perhatikan juga bahwa peningkatan versi dari versi non-GA (dan ke non-GA) tidak didukung. Bukannya masuk akal untuk menjalankan versi non-GA dalam produksi, tetapi kami juga ingin memperjelasnya.

Ini adalah Tiket Sekali Jalan

Setiap kali Anda memutuskan untuk melakukan peningkatan, perlu diketahui bahwa, setelah peningkatan selesai, tidak ada jalan untuk kembali. Perubahan tidak kompatibel dan Anda tidak bisa menggunakan direktori data dari MySQL 8.0 di MySQL 5.7. Pastikan Anda mengambil cadangan data MySQL 5.7 Anda secara langsung sebelum peningkatan - Anda akan dapat memulihkannya pada instans MySQL 5.7 jika Anda perlu mengembalikan perubahan. Harap diingat juga, karena mungkin mengejutkan, bahwa peningkatan dari MySQL 8.0.x ke MySQL 8.0.x+1 mungkin juga tidak kompatibel dan, meskipun ini adalah peningkatan versi kecil, Anda tidak boleh mengharapkan penurunan versi itu. akan mungkin. Ini adalah hasil dari siklus penerapan Oracle - alih-alih melakukan pembekuan fitur untuk cabang GA terbaru, seperti yang terjadi pada versi sebelumnya, fitur baru, terkadang yang tidak kompatibel, didorong sebagai rilis baru cabang 8.0.

Upgrade di Tempat adalah Go

Dulu tidak selalu memungkinkan untuk melakukan upgrade MySQL di tempat. Dalam beberapa kasus Anda terpaksa membuang data ke dalam format SQL dan kemudian memuatnya kembali ke versi baru. Untungnya, MySQL 8.0 lebih ramah admin dan pemutakhiran di tempat didukung. Yang perlu Anda lakukan adalah menjalankan apt upgrade atau yum update dan Anda sudah siap. Upgrade bahkan lebih nyaman - di masa lalu harus diingat untuk menjalankan mysql_upgrade untuk memastikan semua tabel sistem ditingkatkan dengan benar ke format yang diperlukan oleh versi baru MySQL. Di MySQL 8.0, mulai dari MySQL 8.0.16, ini tidak lagi diperlukan - yang harus Anda lakukan adalah memulai proses MySQL, mysqld, dan, secara default, pemutakhiran akan dilakukan pada kamus data dan skema sistem lainnya kapan pun itu ditentukan untuk dibutuhkan. Dimungkinkan untuk mengubah perilaku ini dengan meneruskan parameter yang berbeda ke opsi --upgrade server tetapi dalam sebagian besar kasus, Anda ingin mendapatkan manfaat dari peningkatan ini.

Apakah Saya Aman untuk Meningkatkan?

Tentu saja, ada prasyarat untuk peningkatan yang aman. Mari kita lihat beberapa metode yang akan membantu Anda memastikan Anda dapat meningkatkan ke MySQL 8.0 dengan aman.

Pemeriksaan Kewarasan

Sebelum Anda mencoba sesuatu, Anda harus memeriksa ulang apakah pengaturan MySQL 5.7 Anda yang ada mencentang semua kotak pada daftar periksa kewarasan sebelum memutakhirkan ke MySQL 8.0. Dokumentasi MySQL menyajikan daftar lengkap hal-hal untuk diuji. Tidak masuk akal untuk membahas daftar di sini karena tercakup dalam dokumentasi MySQL, tetapi berikut adalah beberapa poin yang mungkin ingin Anda ingat.

Pertama, partisi sekarang hanya didukung di mesin yang mengimplementasikannya pada akhirnya, yang hanya NDB dan InnoDB. Harap pastikan bahwa semua tabel yang dipartisi menggunakan salah satu mesin penyimpanan tersebut atau Anda menghapus partisi tersebut sebelum melakukan upgrade.

Anda Mungkin Ingin Berlari

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

untuk memeriksa ulang apakah tabel dalam format yang benar.

Ada juga pemeriksaan lain yang harus Anda lakukan - hampir setiap versi MySQL baru dilengkapi dengan daftar kata cadangan yang diperbarui dan Anda harus memeriksa bahwa Anda tidak menggunakannya di database Anda. Anda perlu memeriksa nama batasan kunci asing, mereka tidak boleh lebih dari 64 karakter. Beberapa opsi untuk sql_mode telah dihapus sehingga Anda harus memastikan bahwa Anda tidak menggunakannya. Seperti yang kami sebutkan, ada banyak sekali daftar hal yang harus diuji.

MySQL Shell untuk Menyelamatkan

Menguji semua kondisi tersebut cukup memakan waktu, oleh karena itu Oracle membuat opsi di MySQL Shell yang dimaksudkan untuk menjalankan serangkaian tes untuk memverifikasi apakah instalasi Anda saat ini aman untuk ditingkatkan ke MySQL 8.0. Sebagai permulaan, jika Anda belum menginstal MySQL Shell, Anda harus melakukannya. Anda dapat menemukan unduhan di situs web Oracle. Setelah Anda mengaturnya, Anda dapat terhubung ke MySQL 5.7 Anda dan menjalankan tes. Mari kita lihat bagaimana tampilannya:

[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.

Kami terhubung ke instance MySQL di localhost menggunakan MySQL Shell. Sekarang kita bisa menjalankan pemeriksaan. Kami akan meneruskan jalur ke file konfigurasi untuk pengujian yang lebih ekstensif:

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

Kemudian kita memiliki output yang panjang.

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.

Seperti yang Anda lihat, total 21 pengujian telah dilakukan, pemeriksaan telah menemukan 3 kesalahan terkait dengan opsi konfigurasi yang tidak akan ada di MySQL 8.0.21. Tesnya cukup detail. Antara lain Anda akan mempelajari tentang perubahan nilai default untuk variabel yang tidak Anda konfigurasikan dalam konfigurasi MySQL Anda (jadi, pengaturan tersebut akan berubah setelah Anda menginstal MySQL 8.0).

Mengembalikan Upgrade yang Gagal

Seperti yang kami sebutkan sebelumnya, Anda tidak dapat menurunkan versi dari MySQL 8.0 setelah pemutakhiran selesai. Untungnya, itu tidak berarti Anda tidak dapat mengembalikan pemutakhiran jika gagal di tengah. Sebenarnya, ini terjadi secara semi-otomatis jika salah satu masalah yang kita bahas di bagian sebelumnya terdeteksi. Satu-satunya tindakan manual yang diperlukan adalah menghapus redo logs dan memulai MySQL 5.7 untuk mengatasi masalah yang terdeteksi selama pemutakhiran. Kemudian Anda harus melakukan shutdown lambat (innodb_fast_shutdown=0) untuk memastikan semuanya ditulis ke tablespace dan kemudian Anda siap untuk mencoba upgrade sekali lagi.

Tips Akhir

Ada dua perubahan yang cukup penting dalam perilaku default yang disertakan dengan MySQL 8.0 yang ingin kami soroti.

Caching_sha2_password sebagai default

Pastikan Anda memeriksa ulang apakah aplikasi dan proxy Anda akan berfungsi dengan baik dengan plugin autentikasi caching_sha2_password karena ini menjadi plugin default di MySQL 8.0. Aplikasi yang lebih lama mungkin terpengaruh dan tidak dapat terhubung ke database. Tentu saja, Anda dapat mengubah ini ke plugin autentikasi apa pun yang Anda inginkan (seperti mysql_native_password misalnya, karena ini adalah default di versi MySQL sebelumnya) jadi ini bukan pemblokiran dengan cara apa pun. Ini hanya sesuatu yang perlu diingat untuk diuji sebelum pemutakhiran sehingga Anda tidak akan berakhir dengan MySQL 8.0 dan aplikasi yang tidak dapat terhubung ke sana kecuali Anda mengonfigurasi ulang database Anda untuk menggunakan mekanisme autentikasi yang lebih lama.

UTF8mb4 sebagai charset default

Ini seharusnya tidak mengejutkan mengingat seberapa luas perubahan ke UTF8 dibahas di komunitas, tetapi itulah faktanya - MySQL 8.0 hadir dengan rangkaian karakter UTF8mb4 sebagai default. Ini memiliki beberapa dampak tambahan yang harus Anda waspadai. Pertama, ukuran dataset Anda mungkin meningkat jika Anda akan menggunakan charset UTF8mb4. Hal ini menyebabkan buffer memori dapat menyimpan data dalam jumlah yang lebih kecil daripada data dengan rangkaian karakter latin1. Kedua, kinerja MySQL diperkirakan akan berkurang. Tentu, Oracle melakukan pekerjaan yang baik dalam meminimalkan dampak perubahan ini, tetapi Anda tidak dapat mengharapkan bahwa tidak akan ada dampak kinerja apa pun - hanya akan ada beberapa.

Kami berharap posting blog ini akan membantu Anda melalui proses peningkatan dari MySQL 5.7 ke MySQL 8.0. Jika Anda memiliki pemikiran tentang proses tersebut, kami mendorong Anda untuk membagikannya di komentar di bawah postingan ini.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Fungsi MySQL LOG() – Mengembalikan Logaritma Natural dari suatu Nilai

  2. JDBC mengembalikan Pengecualian MySQLSyntaxError dengan pernyataan yang benar

  3. MySql Transpose Baris ke Kolom dan Kolom ke Baris

  4. Bisakah angka digunakan untuk memberi nama kolom tabel MySQL?

  5. Seberapa besar database MySQL dapat diperoleh sebelum kinerja mulai menurun