April 2018 bukan hanya tanggal untuk dunia MySQL. MySQL 8.0 dirilis di sana, dan lebih dari 1 tahun setelahnya, mungkin sudah waktunya untuk mempertimbangkan untuk bermigrasi ke versi baru ini.
MySQL 8.0 memiliki peningkatan kinerja dan keamanan yang penting, dan, seperti dalam semua migrasi ke versi database baru, ada beberapa hal yang harus dipertimbangkan sebelum masuk ke produksi untuk menghindari masalah sulit seperti kehilangan data, downtime, atau bahkan rollback selama tugas migrasi.
Di blog ini, kami akan menyebutkan beberapa fitur baru MySQL 8.0, beberapa hal yang tidak digunakan lagi, dan apa yang perlu Anda ingat sebelum bermigrasi.
Apa yang Baru di MySQL 8.0?
Sekarang mari kita rangkum beberapa fitur terpenting yang disebutkan dalam dokumentasi resmi untuk versi MySQL baru ini.
- MySQL menggabungkan kamus data transaksional yang menyimpan informasi tentang objek database.
- Pernyataan DDL atomik menggabungkan pembaruan kamus data, operasi mesin penyimpanan, dan penulisan log biner yang terkait dengan operasi DDL menjadi satu transaksi atomik.
- Server MySQL secara otomatis melakukan semua tugas pemutakhiran yang diperlukan pada startup berikutnya untuk memutakhirkan tabel sistem dalam skema mysql, serta objek dalam skema lain seperti skema sys dan skema pengguna. DBA tidak perlu memanggil mysql_upgrade.
- Ini mendukung pembuatan dan pengelolaan grup sumber daya, dan mengizinkan penetapan utas yang berjalan di dalam server ke grup tertentu sehingga utas dijalankan sesuai dengan sumber daya yang tersedia untuk grup.
- Enkripsi tabel sekarang dapat dikelola secara global dengan mendefinisikan dan menerapkan default enkripsi. Variabel default_table_encryption mendefinisikan default enkripsi untuk skema yang baru dibuat dan tablespace umum. Default enkripsi diterapkan dengan mengaktifkan variabel table_encryption_privilege_check.
- Set karakter default telah berubah dari latin1 menjadi utf8mb4.
- Ini mendukung penggunaan ekspresi sebagai nilai default dalam spesifikasi tipe data. Ini termasuk penggunaan ekspresi sebagai nilai default untuk tipe data BLOB, TEXT, GEOMETRY, dan JSON.
- Error logging telah ditulis ulang untuk menggunakan arsitektur komponen MySQL. Pencatatan kesalahan tradisional diimplementasikan menggunakan komponen bawaan, dan pencatatan menggunakan log sistem diimplementasikan sebagai komponen yang dapat dimuat.
- Jenis kunci cadangan baru mengizinkan DML selama pencadangan online sambil mencegah operasi yang dapat menghasilkan snapshot yang tidak konsisten. Kunci cadangan baru didukung oleh sintaks LOCK INSTANCE FOR CADANGAN dan UNLOCK INSTANCE. Hak istimewa BACKUP_ADMIN diperlukan untuk menggunakan pernyataan ini.
- MySQL Server sekarang mengizinkan port TCP/IP untuk dikonfigurasi secara khusus untuk koneksi administratif. Ini memberikan alternatif untuk koneksi administratif tunggal yang diizinkan pada antarmuka jaringan yang digunakan untuk koneksi biasa bahkan ketika koneksi max_connections telah dibuat.
- Ini mendukung indeks yang tidak terlihat. Indeks ini tidak digunakan oleh pengoptimal dan memungkinkan pengujian efek penghapusan indeks pada kinerja kueri, tanpa menghapusnya.
- Document Store untuk mengembangkan aplikasi dokumen SQL dan NoSQL menggunakan database tunggal.
- MySQL 8.0 memungkinkan untuk mempertahankan variabel server global dan dinamis menggunakan perintah SET PERSIST alih-alih yang biasa SET GLOBAL.
Keamanan MySQL dan Manajemen Akun
Karena ada banyak peningkatan terkait keamanan dan manajemen pengguna, kami akan mencantumkannya di bagian terpisah.
- Tabel hibah dalam database sistem mysql sekarang menjadi tabel InnoDB.
- Plugin otentikasi caching_sha2_password baru sekarang menjadi metode otentikasi default di MySQL 8.0. Ini mengimplementasikan hashing kata sandi SHA-256, tetapi menggunakan caching untuk mengatasi masalah latensi pada waktu koneksi. Ini memberikan enkripsi kata sandi yang lebih aman daripada plugin mysql_native_password, dan memberikan kinerja yang lebih baik daripada sha256_password.
- MySQL sekarang mendukung peran, yang diberi nama kumpulan hak istimewa. Peran dapat memiliki hak istimewa yang diberikan dan dicabut darinya, dan peran dapat diberikan dan dicabut dari akun pengguna.
- MySQL sekarang menyimpan informasi tentang riwayat kata sandi, memungkinkan pembatasan penggunaan kembali kata sandi sebelumnya.
- Ini memungkinkan administrator untuk mengonfigurasi akun pengguna sehingga terlalu banyak kegagalan login berturut-turut karena kata sandi yang salah menyebabkan penguncian akun sementara.
Peningkatan InnoDB
Seperti poin sebelumnya, ada juga banyak perbaikan terkait topik ini, jadi kami akan mencantumkannya di bagian terpisah juga.
- Nilai penghitung kenaikan otomatis maksimum saat ini ditulis ke log ulang setiap kali nilai berubah, dan disimpan ke tabel sistem mesin-pribadi di setiap pos pemeriksaan. Perubahan ini membuat nilai penghitung kenaikan otomatis maksimum saat ini tetap ada di seluruh server dimulai ulang
- Saat menghadapi korupsi pohon indeks, InnoDB menulis tanda korupsi ke log redo, yang membuat tanda korupsi aman dari kerusakan. InnoDB juga menulis data tanda korupsi dalam memori ke tabel sistem mesin-pribadi di setiap pos pemeriksaan. Selama pemulihan, InnoDB membaca tanda korupsi dari kedua lokasi dan menggabungkan hasil sebelum menandai tabel dalam memori dan objek indeks sebagai rusak.
- Variabel dinamis baru, innodb_deadlock_detect, dapat digunakan untuk menonaktifkan deteksi kebuntuan. Pada sistem konkurensi tinggi, deteksi kebuntuan dapat menyebabkan perlambatan ketika banyak utas menunggu kunci yang sama. Terkadang, mungkin lebih efisien untuk menonaktifkan deteksi kebuntuan dan mengandalkan setelan innodb_lock_wait_timeout untuk pengembalian transaksi saat terjadi kebuntuan.
- Tabel sementara InnoDB sekarang dibuat di tablespace sementara bersama, ibtmp1.
- tabel sistem mysql dan tabel kamus data sekarang dibuat dalam satu file tablespace InnoDB bernama mysql.ibd di direktori data MySQL. Sebelumnya, tabel ini dibuat dalam file tablespace InnoDB individual di direktori database mysql.
- Secara default, log undo sekarang berada di dua tablespace undo yang dibuat saat instance MySQL diinisialisasi. Undo log tidak lagi dibuat di tablespace sistem.
- Variabel innodb_dedicated_server baru, yang dinonaktifkan secara default, dapat digunakan agar InnoDB secara otomatis mengonfigurasi opsi berikut sesuai dengan jumlah memori yang terdeteksi di server:innodb_buffer_pool_size, innodb_log_file_size, dan innodb_flush_method. Opsi ini ditujukan untuk instans server MySQL yang berjalan di server khusus.
- File tablespace dapat dipindahkan atau dikembalikan ke lokasi baru saat server offline menggunakan opsi innodb_directories.
Sekarang, mari kita lihat beberapa fitur yang seharusnya tidak Anda gunakan lagi di versi MySQL baru ini.
Apa yang Tidak Digunakan Lagi di MySQL 8.0?
Fitur berikut tidak digunakan lagi dan akan dihapus di versi mendatang.
- Set karakter utf8mb3 tidak digunakan lagi. Silakan gunakan utf8mb4 sebagai gantinya.
- Karena caching_sha2_password adalah plugin autentikasi default di MySQL 8.0 dan menyediakan superset dari kemampuan plugin autentikasi sha256_password, sha256_password tidak digunakan lagi.
- Plugin Valid_password telah diimplementasikan ulang untuk menggunakan infrastruktur komponen server. Bentuk plugin validasi_password masih tersedia tetapi tidak digunakan lagi.
- Klausa ENGINE untuk pernyataan ALTER TABLESPACE dan DROP TABLESPACE.
- Mode SQL PAD_CHAR_TO_FULL_LENGTH.
- dukungan AUTO_INCREMENT tidak digunakan lagi untuk kolom jenis FLOAT dan DOUBLE (dan sinonim apa pun). Pertimbangkan untuk menghapus atribut AUTO_INCREMENT dari kolom tersebut, atau mengubahnya menjadi tipe integer.
- Atribut UNSIGNED tidak digunakan lagi untuk kolom bertipe FLOAT, DOUBLE, dan DECIMAL (dan sinonim apa pun). Pertimbangkan untuk menggunakan batasan CHECK sederhana untuk kolom seperti itu.
- FLOAT(M,D) dan DOUBLE(M,D) sintaks untuk menentukan jumlah digit untuk kolom tipe FLOAT dan DOUBLE (dan sinonim apa pun) adalah ekstensi MySQL yang tidak standar. Sintaks ini tidak digunakan lagi.
- Gaya-C tidak standar &&, ||, dan ! operator yang sinonim untuk standar SQL AND, OR, dan NOT operator, masing-masing, tidak digunakan lagi. Aplikasi yang menggunakan operator nonstandar harus disesuaikan dengan penggunaan operator standar.
- Klien mysql_upgrade tidak digunakan lagi karena kemampuannya untuk memutakhirkan tabel sistem dalam skema sistem mysql dan objek dalam skema lain telah dipindahkan ke server MySQL.
- File mysql_upgrade_info, yang merupakan direktori data yang dibuat dan digunakan untuk menyimpan nomor versi MySQL.
- Variabel sistem relay_log_info_file dan opsi --master-info-file tidak digunakan lagi. Sebelumnya, ini digunakan untuk menentukan nama log info log relai dan log info master saat relai_log_info_repository=FILE dan master_info_repository=FILE disetel, tetapi setelan tersebut tidak digunakan lagi. Penggunaan file untuk log info log relai dan log info master telah digantikan oleh tabel slave yang aman dari kerusakan, yang merupakan default di MySQL 8.0.
- Penggunaan variabel lingkungan MYSQL_PWD untuk menentukan kata sandi MySQL tidak digunakan lagi.
Dan sekarang, mari kita lihat beberapa fitur yang harus Anda hentikan di versi MySQL ini.
Apa yang Dihapus di MySQL 8.0?
Fitur berikut telah dihapus di MySQL 8.0.
- Variabel sistem innodb_locks_unsafe_for_binlog telah dihapus. Tingkat isolasi READ COMMITTED menyediakan fungsionalitas serupa.
- Menggunakan GRANT untuk membuat pengguna. Sebagai gantinya, gunakan CREATE USER. Mengikuti praktik ini membuat mode SQL NO_AUTO_CREATE_USER tidak penting untuk pernyataan GRANT, jadi mode tersebut juga dihapus, dan kesalahan sekarang ditulis ke log server ketika keberadaan nilai ini untuk opsi sql_mode dalam file opsi mencegah mysqld untuk memulai.
- Menggunakan GRANT untuk mengubah properti akun selain penetapan hak istimewa. Ini termasuk otentikasi, SSL, dan properti batas sumber daya. Sebagai gantinya, buat properti tersebut pada waktu pembuatan akun dengan CREATE USER atau modifikasi setelahnya dengan ALTER USER.
- DIIDENTIFIKASI OLEH SANDI 'auth_string' sintaks untuk CREATE USER dan GRANT. Sebagai gantinya, gunakan IDENTIFIED WITH auth_plugin AS 'auth_string' untuk CREATE USER dan ALTER USER, dengan nilai 'auth_string' dalam format yang kompatibel dengan plugin bernama.
- Fungsi PASSWORD(). Selain itu, penghapusan PASSWORD() berarti sintaks SET PASSWORD ... =PASSWORD('auth_string') tidak lagi tersedia.
- Variabel sistem old_passwords.
- Pernyataan FLUSH QUERY CACHE dan RESET QUERY CACHE.
- Variabel sistem ini:query_cache_limit, query_cache_min_res_unit, query_cache_size, query_cache_type, query_cache_wlock_invalidate.
- Variabel status ini:Qcache_free_blocks, Qcache_free_memory, Qcache_hits, Qcache_inserts, Qcache_lowmem_prunes, Qcache_not_cached, Qcache_queries_in_cache, Qcache_total_blocks.
- Utas ini menyatakan:memeriksa hak istimewa pada kueri yang di-cache, memeriksa cache kueri untuk kueri, membatalkan entri cache kueri, mengirimkan hasil yang di-cache ke klien, menyimpan hasil dalam cache kueri, Menunggu kunci cache kueri.
- Variabel sistem tx_isolation dan tx_read_only telah dihapus. Gunakan transaction_isolation dan transaction_read_only sebagai gantinya.
- Variabel sistem sync_frm telah dihapus karena file .frm sudah usang.
- Variabel sistem secure_auth dan opsi klien --secure-auth telah dihapus. Opsi MYSQL_SECURE_AUTH untuk fungsi mysql_options() C API telah dihapus.
- Variabel sistem log_warnings dan opsi server --log-warnings telah dihapus. Gunakan variabel sistem log_error_verbosity sebagai gantinya.
- Cakupan global untuk variabel sistem sql_log_bin telah dihapus. sql_log_bin hanya memiliki cakupan sesi, dan aplikasi yang mengandalkan akses ke @@GLOBAL.sql_log_bin harus disesuaikan.
- Variabel sistem date_format, datetime_format, time_format, dan max_tmp_tables yang tidak digunakan dihapus.
- Kualifier ASC atau DESC yang tidak digunakan lagi untuk klausa GROUP BY dihapus. Kueri yang sebelumnya mengandalkan penyortiran GROUP BY dapat menghasilkan hasil yang berbeda dari versi MySQL sebelumnya. Untuk menghasilkan urutan pengurutan tertentu, berikan klausa ORDER BY.
- Pengurai tidak lagi memperlakukan \N sebagai sinonim untuk NULL dalam pernyataan SQL. Gunakan NULL sebagai gantinya. Perubahan ini tidak mempengaruhi operasi impor atau ekspor file teks yang dilakukan dengan LOAD DATA atau SELECT ... INTO OUTFILE, yang NULL terus diwakili oleh \N.
- Opsi --ssl dan --ssl-verify-server-cert sisi klien telah dihapus. Gunakan --ssl-mode=REQUIRED alih-alih --ssl=1 atau --enable-ssl. Gunakan --ssl-mode=DISABLED alih-alih --ssl=0, --skip-ssl, atau --disable-ssl. Gunakan --ssl-mode=VERIFY_IDENTITY alih-alih opsi --ssl-verify-server-cert.
- Program mysql_install_db telah dihapus dari distribusi MySQL. Inisialisasi direktori data harus dilakukan dengan menjalankan mysqld dengan opsi --initialize atau --initialize-insecure sebagai gantinya. Selain itu, opsi --bootstrap untuk mysqld yang digunakan oleh mysql_install_db telah dihapus, dan opsi INSTALL_SCRIPTDIR CMake yang mengontrol lokasi penginstalan untuk mysql_install_db telah dihapus.
- Utilitas mysql_plugin telah dihapus. Alternatifnya termasuk memuat plugin saat server mulai menggunakan opsi --plugin-load atau --plugin-load-add, atau saat runtime menggunakan pernyataan INSTALL PLUGIN.
- Utilitas resolveip dihapus. nslookup, host, atau dig dapat digunakan sebagai gantinya.
Ada banyak fitur baru, usang, dan dihapus. Anda dapat memeriksa situs web resmi untuk informasi lebih rinci.
Pertimbangan Sebelum Bermigrasi ke MySQL 8.0
Mari kita sebutkan beberapa hal terpenting untuk dipertimbangkan sebelum bermigrasi ke versi MySQL ini.
Metode Otentikasi
Seperti yang kami sebutkan, caching_sha2_password bukan metode autentikasi default, jadi Anda harus memeriksa apakah aplikasi/konektor Anda mendukungnya. Jika tidak, mari kita lihat bagaimana Anda dapat mengubah metode otentikasi default dan plugin otentikasi pengguna menjadi 'mysql_native_password' lagi.
Untuk mengubah metode autentikasi default, edit file konfigurasi my.cnf, dan tambahkan/edit baris berikut:
$ vi /etc/my.cnf
[mysqld]
default_authentication_plugin=mysql_native_password
Untuk mengubah plugin otentikasi pengguna, jalankan perintah berikut dengan pengguna yang memiliki hak istimewa:
$ mysql -p
ALTER USER ‘username’@’hostname’ IDENTIFIED WITH ‘mysql_native_password’ BY ‘password’;
Bagaimanapun, perubahan ini bukanlah solusi permanen karena autentikasi lama dapat segera dihentikan, jadi Anda harus mempertimbangkannya untuk peningkatan basis data di masa mendatang.
Peran juga merupakan fitur penting di sini. Anda dapat mengurangi hak istimewa individu yang menetapkannya ke peran dan menambahkan pengguna yang sesuai di sana.
Misalnya, Anda dapat membuat peran baru untuk tim pemasaran dan pengembang:
$ mysql -p
CREATE ROLE 'marketing', 'developers';
Tetapkan hak istimewa untuk peran baru ini:
GRANT SELECT ON *.* TO 'marketing';
GRANT ALL PRIVILEGES ON *.* TO 'developers';
Dan kemudian, tetapkan peran ke pengguna:
GRANT 'marketing' TO 'marketing1'@'%';
GRANT 'marketing' TO 'marketing2'@'%';
GRANT 'developers' TO 'developer1'@'%';
Dan hanya itu. Anda akan memiliki hak istimewa berikut:
SHOW GRANTS FOR 'marketing1'@'%';
+-------------------------------------------+
| Grants for [email protected]% |
+-------------------------------------------+
| GRANT USAGE ON *.* TO `marketing1`@`%` |
| GRANT `marketing`@`%` TO `marketing1`@`%` |
+-------------------------------------------+
2 rows in set (0.00 sec)
SHOW GRANTS FOR 'marketing';
+----------------------------------------+
| Grants for [email protected]% |
+----------------------------------------+
| GRANT SELECT ON *.* TO `marketing`@`%` |
+----------------------------------------+
1 row in set (0.00 sec)
Kumpulan Karakter
Karena set karakter default baru adalah utf8mb4, Anda harus memastikan bahwa Anda tidak menggunakan karakter default karena akan berubah.
Untuk menghindari beberapa masalah, Anda harus menentukan variabel character_set_server dan collation_server dalam file konfigurasi my.cnf.
$ vi /etc/my.cnf
[mysqld]
character_set_server=latin1
collation_server=latin1_swedish_ci
Mesin MyISAM
Tabel hak istimewa MySQL dalam skema MySQL dipindahkan ke InnoDB. Anda dapat membuat tabel engine=MyISAM, dan itu akan berfungsi seperti sebelumnya, tetapi menyalin tabel MyISAM ke server MySQL yang sedang berjalan tidak akan berfungsi karena tidak akan ditemukan.
Mempartisi
Tidak boleh ada tabel yang dipartisi yang menggunakan mesin penyimpanan yang tidak memiliki dukungan partisi asli. Anda dapat menjalankan kueri berikut untuk memverifikasi poin ini.
$ mysql -p
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE NOT IN ('innodb', 'ndbcluster') AND CREATE_OPTIONS LIKE '%partitioned%';
Jika Anda perlu mengubah mesin tabel, Anda dapat menjalankan:
ALTER TABLE table_name ENGINE = INNODB;
Pemeriksaan Peningkatan Versi
Sebagai langkah terakhir, Anda dapat menjalankan perintah mysqlcheck menggunakan flag check-upgrade untuk mengonfirmasi apakah semuanya baik-baik saja.
$ mysqlcheck -uroot -p --all-databases --check-upgrade
Enter password:
mysql.columns_priv OK
mysql.component OK
mysql.db OK
mysql.default_roles OK
mysql.engine_cost OK
mysql.func OK
mysql.general_log OK
mysql.global_grants OK
mysql.gtid_executed OK
mysql.help_category OK
mysql.help_keyword OK
mysql.help_relation OK
mysql.help_topic OK
mysql.innodb_index_stats OK
mysql.innodb_table_stats OK
mysql.password_history OK
mysql.plugin OK
mysql.procs_priv OK
mysql.proxies_priv OK
mysql.role_edges OK
mysql.server_cost OK
mysql.servers OK
mysql.slave_master_info OK
mysql.slave_relay_log_info OK
mysql.slave_worker_info OK
mysql.slow_log OK
mysql.tables_priv OK
mysql.time_zone OK
mysql.time_zone_leap_second OK
mysql.time_zone_name OK
mysql.time_zone_transition OK
mysql.time_zone_transition_type OK
mysql.user OK
sys.sys_config OK
world_x.city OK
world_x.country OK
world_x.countryinfo OK
world_x.countrylanguage OK
Ada beberapa hal yang harus diperiksa sebelum melakukan upgrade. Anda dapat memeriksa dokumentasi resmi MySQL untuk informasi lebih detail.
Metode Tingkatkan Versi
Ada berbagai cara untuk memutakhirkan MySQL 5.7 ke 8.0. Anda dapat menggunakan pemutakhiran di tempat atau bahkan membuat budak replikasi di versi baru, sehingga Anda dapat mempromosikannya nanti.
Namun sebelum melakukan upgrade, langkah 0 harus membackup data anda. Cadangan harus mencakup semua database termasuk database sistem. Jadi, jika ada masalah, Anda dapat mengembalikan secepatnya.
Opsi lain, tergantung pada sumber daya yang tersedia, dapat membuat replikasi kaskade MySQL 5.7 -> MySQL 8.0 -> MySQL 5.7, jadi setelah mempromosikan versi baru, jika terjadi kesalahan, Anda dapat mempromosikan node budak dengan versi lama kembali. Tapi itu bisa berbahaya jika ada masalah dengan data, jadi backup adalah suatu keharusan sebelum itu.
Agar metode apa pun dapat digunakan, lingkungan pengujian diperlukan untuk memverifikasi bahwa aplikasi berfungsi tanpa masalah apa pun menggunakan versi MySQL 8.0 yang baru.
Kesimpulan
Lebih dari 1 tahun setelah rilis MySQL 8.0, sekarang saatnya untuk mulai berpikir untuk memigrasikan versi MySQL lama Anda, tetapi untungnya, karena akhir dukungan untuk MySQL 5.7 adalah tahun 2023, Anda memiliki waktu untuk membuat rencana migrasi dan menguji perilaku aplikasi dengan tidak terburu-buru. Meluangkan waktu dalam langkah pengujian itu diperlukan untuk menghindari masalah apa pun setelah memigrasikannya.