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.