
Kami baru-baru ini meningkatkan server kami dari MySQL 5.7 ke 8.0.
Mari kita tinggalkan di luar ruang lingkup artikel ini mengapa dan roti baru apa yang muncul di MySQL 8.0, tetapi sebaliknya kita akan berbicara tentang kesulitan apa yang kami temui selama proses peningkatan.
Pertama, sebelum memperbarui perlu melihat
daftar perubahan dan memperbaiki file konfigurasi Anda.
Minimal, opsi berikut telah dihapus:
innodb_file_format, innodb_file_format_check, innodb_file_format_max, innodb_large_prefix
query_cache_limit, query_cache_min_res_unit, query_cache_size, query_cache_type, query_cache_wlock_invalidate.
Dalam parameter sql_mode, khususnya, NO_AUTO_CREATE_USER dihapus - yang sangat penting, karena di MySQL 5.7, dihidupkan secara default.
Percona memiliki instruksi untuk peningkatan di tempat. Dan dalam kasus umum, Anda dapat mengikutinya, namun, kami berhasil memperbarui hanya satu cluster dengan cara ini, untuk sisanya, upaya untuk memperbarui ini gagal dengan kesalahan yang sama:
2019-06-22T05:04:18.510888Z 1 [ERROR] [MY-011014] [Server] Found partially upgraded DD. Aborting upgrade and deleting all DD tables. Start the upgrade process again. 2019-06-22T05:04:23.115018Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed. 2019-06-22T05:04:23.115655Z 0 [ERROR] [MY-010119] [Server] Aborting
Oleh karena itu, kami memperbarui cluster yang tersisa dengan meningkatkan instance kosong baru dan mengembalikan dump database dari versi sebelumnya.
Untuk melakukan ini, pertama, Anda perlu dump database. Dan di sini bahaya # 1 menunggu - tempat pembuangan dibuat dengan cara standar:
mysqldump -u root -p --hex-blob --default-character-set=utf8mb4 --all-databases --triggers --routines --events > dump.sql
itu tidak pulih memberikan kesalahan:
ERROR 3554 (HY000) at line 15915: Access to system table 'mysql.innodb_index_stats' is rejected.
Deskripsi ada
di MySQL bugtracker (dengan status Bukan bug :), ada juga saran tentang cara membuangnya agar dapat dipulihkan:
mysqldump -u root -p --hex-blob --default-character-set=utf8mb4 --all-databases --triggers --routines --events --ignore-table=mysql.innodb_index_stats --ignore-table=mysql.innodb_table_stats > dump.sql
Tetapi ketika mencoba menggunakan dump seperti itu, jika ada pemicu di dalamnya (dan kami memilikinya), bahaya # 2 dapat diharapkan, dalam bentuk kesalahan seperti itu:
ERROR 1231 (42000) at line 54: Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER'
Alasan untuk ini adalah karena MySQL menggunakan sql_mode untuk pemicu, yaitu: MySQL menyimpan nilai sql_mode untuk pemicu pada saat itu dibuat dan kemudian selalu menjalankannya dengan nilai itu. Dan karenanya menyimpan nilai ini dalam dump.
Deskripsi bantuan untuk ini:
dev.mysql.com/doc/refman/8.0/id/create-trigger.html
MySQL menyimpan pengaturan variabel sistem sql_mode pada saat pemicu dibuat, dan selalu menjalankan tubuh pemicu dengan pengaturan ini yang berlaku, terlepas dari mode SQL server saat ini ketika pemicu mulai dijalankan.
Apa yang kita lakukan Kami baru saja memotong NO_AUTO_CREATE_USER dari dump yang sudah selesai. Perintah serupa:
sed "s/50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER/50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO/g" dump.sql > dump2.sql
Setelah itu, dump berhasil dikembalikan, tetapi bahaya # 3 menunggu kita (kebenaran yang cukup diharapkan) - tabel sistem dikembalikan ke keadaan dari versi 5.7 dan kami memiliki kesalahan berikut dalam log:
[ERROR] [MY-013143] [Server] Column count of mysql.user is wrong. Expected 51, found 45. The table is probably corrupted
Dari pengalaman dengan versi sebelumnya, ini diperlakukan dengan menjalankan mysql_upgrade - tetapi karena versi 8.0.16 - ini tidak berfungsi, karena mysql_upgrade dinyatakan usang dan tidak melakukan apa-apa.
Sekarang, untuk menyebabkan tabel sistem diperbarui, Anda harus memulai MySQL dengan opsi
upgrade = FORCE .
Di ubuntu baru, ini bisa dilakukan sebagai berikut:
systemctl set-environment MYSQLD_OPTS="--upgrade=FORCE"
Kemudian restart MySQL. Nah, setelah pembaruan berhasil, hapus:
systemctl unset-environment MYSQLD_OPTS