0

Sharing pengalaman – yang perlu diperhatikan sebelum upgrade mysql 5.7 ke mysql 8.0, aplikasi kena impact?

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.

Upgrade ke mysql 8.0? Aplikasi aman?

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!

Ambar Hasbiyatmoko

Hello, I'm web developer. Passionate about programming, web server, and networking.

Leave a Reply

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload the CAPTCHA.