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

Pindah dari MySQL 5.7 ke MySQL 8.0 - Yang Harus Anda Ketahui

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara menginstal dan mengkonfigurasi MySQL di Ubuntu

  2. Temukan gaji tertinggi ke-2 dengan cara terbaik

  3. Jumlah MySQLi (*) selalu mengembalikan 1

  4. Nilai string salah:'\xF0\x9F\x8E\xB6\xF0\x9F...' MySQL

  5. mySQL Error 1040:Terlalu Banyak Koneksi