Upgrade ke mysql 8.0
Ada beberapa hal penting yang harus diperhatikan sebelum mengupgrade mysql 5.7 ke 8.0 karena beberapa konfigurasi telah deprecated atau removed di mysql 8.
Detail apa saja yang berubah di mysql 8 bisa dilihat di website mysql: Changes in mysql 8.0.
Intro
Saat mengupgrade database pasti yang terkena impactnya adalah aplikasi. Apakah aplikasinya akan error atau aman-aman saja?
Sharing pengalaman:
Hal yang saya lakukan sebelum mengupgrade database di production adalah, saya buat database test dari hasil clone database production, kemudian saya naikkan versinya ke 8.0. Kemudian saya test aplikasinya menggunakan database test tersebut, apakah ada error atau tidak?
Nah, selama pengetesan saya menemukan beberapa issue pada sisi aplikasi. Berikut issuenya:
Authentication Plugin: caching_sha2_password
Authentication plugin digunakan untuk enkripsi password dari user mysql.
- di mysql 5.7, default authentication pluginnya adalah
mysql_native_password
- di mysql 8.0, default authentication pluginnya berubah menjadi
caching_sha2_password
Karena authentication pluginnya berubah di mysql 8, user jadi tidak bisa login, karena aplikasi tidak support enkripsi caching_sha2_password
.
Solusinya?, ubah pengaturan authentication menjadi mysql_native_password
(deprecated di mysql 8).
Buka mysqld.cnf, lalu tambahkan pada bagian [mysqld]
default-authentication-plugin=mysql_native_password
Lalu restart mysqlnya.
sql_mode=NO_AUTO_CREATE_USER
Mode NO_AUTO_CREATE_USER
sudah diremove di mysql 8.0. Jadi kita tidak bisa lagi menggunakan mode ini. Solusinya, sebelum menggunakan GRANT pastikan usernya sudah terbuat, jika belum jalankan dengan CREATE_USER
terlebih dahulu.
Query WHERE dengan && sudah deprecated
Query WHERE menggunakan && sudah deprecated di mysql 8:
SELECT * FROM table WHERE column_a = "val_1" && column_b = "val_2"
Solusinya ganti && menjadi AND:
SELECT * FROM table WHERE column_a = "val_1" AND column_b = "val_2"
Replication
Jika kita menggunakan replication (master-slave). Pastikan slave sudah diupgrade terlebih dulu ke versi 8.0, baru kemudian masternya yang diupgrade. Kenapa? karena syarat untuk melakukan replikasi adalah versi mysql di slave harus == atau >= dari versi mysql di master. Jika versi mysql di slave lebih rendah dari master maka akan terjadi error replikasi.
Contohnya:
- slave versi mysqlnya 5.7 dan master mysqlnya 8.0 -> tidak bisa, akan error replikasinya
- slave versi mysqlnya 5.7 dan master mysqlnya 5.7 -> bisa
- slave versi mysqlnya 8.0 dan master mysqlnya 5.7 -> bisa
Chararcter set dan collation
Di mysql 8, default character set berubah menjadi utf8mb4 dan collationnya menjadi utf8mb4_0900_ai_ci.
Sedangkan di mysql 5.7 character setnya latin1 dan collationnya utf8mb4.
Perubahan ini akan menjadi masalah ketika menggunakan statement SELECT .. UNION ALL, karena data lama (existing) di mysql 5.7 menggunakan utf8mb4 dan mysql 8 menggunakan utf8mb4_0900_ai_ci.
Solusinya, saya ubah query selectnya, jadi setiap kolom didefine collationnya utf8mb4_general_ci:
SELECT
0 COLLATE UTF8MB4_GENERAL_CI,
1 COLLATE UTF8MB4_GENERAL_CI,
3 COLLATE UTF8MB4_GENERAL_CI
FROM
(
SELECT ..
) AS atas
UNION ALL
SELECT * FROM (
SELECT ..
) AS bawah;
—
Demikian artikal Upgrade ke mysql 8.0. Sharing pengalaman – yang perlu diperhatikan sebelum upgrade mysql 5.7 ke mysql 8.0, aplikasi kena impact?
Semoga bermanfaat!