Halaman ini menjelaskan masalah dan ketidakcocokan umum yang mungkin Anda alami saat melakukan upgrade versi utama dari Cloud SQL untuk MySQL 5.7 ke Cloud SQL untuk MySQL 8.0.
Untuk mengetahui informasi selengkapnya tentang upgrade versi utama, lihat Mengupgrade versi utama database yang diterapkan dan Melihat log error.
Perubahan SQL yang tidak kompatibel
Bagian ini mencantumkan ketidakcocokan SQL di Cloud SQL 5.7 dan Cloud SQL 8.0 yang dapat muncul saat Anda menjalankan utilitas pemeriksaan awal dan selama upgrade.
Kata Kunci yang Dicadangkan
Berikut adalah contoh pesan error:
Warning: The following objects have names that conflict with new reserved keywords. Ensure queries sent by your applications use `quotes` when referring to them or they will result in errors.
Beberapa kata kunci, seperti GROUPS
, LEAD
, atau RANK
,
kini diklasifikasikan sebagai kata yang dicadangkan di MySQL versi 8.0. Artinya, beberapa kata yang sebelumnya digunakan sebagai ID kini dapat dianggap ilegal. Untuk memperbaiki
pernyataan yang terpengaruh, gunakan kutipan ID atau ganti nama ID.
Untuk mengetahui daftar lengkap kata kunci, lihat Kata Kunci dan Kata yang Dicadangkan.
Menghapus ASC/DESC dengan klausa GROUP BY
Berikut adalah contoh pesan error:
[ERROR] [MY-013235] [Server] Error in parsing Routine db_name.routine_name during upgrade. You may have an error in your SQL syntax; check the manual that corresponding to your MySQL server version for the right syntax to use near 'some_text'
Berikut adalah contoh pesan error lainnya:
[ERROR] [MY-013235] [Server] Unknown trigger has an error in its body: 'You have an error in you SQL syntax; [ERROR] [MY-010198] [Server] Error in parsing Triggers from trigger_name.TRG file.
Kueri yang sebelumnya mengandalkan pengurutan GROUP BY
dapat menghasilkan
hasil yang berbeda dari versi MySQL sebelumnya. Untuk mempertahankan urutan pengurutan tertentu,
berikan klausa ORDER BY
.
Jika prosedur tersimpan, pemicu, atau definisi peristiwa berisi kueri yang menggunakan ASC
atau DESC
dengan klausa GROUP BY
, maka kueri objek tersebut memerlukan klausa ORDER BY
.
Untuk mengetahui informasi selengkapnya, lihat Menghapus sintaksis untuk GROUP BY ASC dan DESC.
Campuran data spasial dengan jenis lain sebagai kunci
Berikut adalah contoh pesan error:
[ERROR] [MY-013140] [Server] Incorrect prefix key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique prefix keys [ERROR] [MY-013140] [Server] Too many key parts specified; max 1 parts allowed
Di MySQL versi 8.0 dan yang lebih baru, indeks tidak boleh berisi campuran jenis data spasial dan lainnya. Anda harus menghapus kunci dan membuat kunci baru yang didukung di MySQL versi 8.0 atau yang lebih baru. Untuk mengetahui informasi selengkapnya, lihat Indeks Spasial. Untuk mengidentifikasi indeks data spasial, gunakan kueri yang mirip dengan berikut ini:
SELECT s.TABLE_SCHEMA, s.TABLE_NAME, s.INDEX_NAME, s.COLUMN_NAME, s.INDEX_TYPE, c.DATA_TYPE FROM information_schema.STATISTICS s JOIN information_schema.COLUMNS c ON s.TABLE_SCHEMA = c.TABLE_SCHEMA AND s.TABLE_NAME = c.TABLE_NAME AND s.COLUMN_NAME = c.COLUMN_NAME WHERE c.DATA_TYPE IN ( 'geometry', 'point', 'linestring', 'polygon', 'multipoint', 'multilinestring', 'multipolygon', 'geometrycollection' ) AND s.INDEX_TYPE = 'BTREE';
Karakter UTF8 tidak valid
Berikut adalah contoh pesan error:
[ERROR] [MY-010765] [Server] Error in Creating DD entry for %s.%s [ERROR] [MY-013140] [Server] Invalid utf8 character string: invalid_string
Jika definisi tabel berisi karakter UTF8 yang tidak valid, konversi definisi tabel menjadi kamus data mungkin gagal. Untuk mengatasi masalah ini, ganti karakter yang tidak valid dengan karakter UTF8 yang sesuai atau hapus karakter tersebut sepenuhnya.
Untuk mengidentifikasi dan mengatasi karakter yang tidak valid, Anda dapat menggunakan kueri yang mirip dengan berikut:
SHOW CREATE TABLE table_name; ALTER TABLE table_name MODIFY COLUMN column_name data_type comment=''; // removing invalid utf8 character from comment
Transaksi XA yang tidak di-commit
Berikut adalah contoh pesan error:
[ERROR] [MY-013527] [Server] Upgrade cannot proceed due to an existing prepared XA transactions
Jika ada transaksi XA yang belum di-commit,
upgrade versi utama di tempat akan gagal. Untuk mengatasi masalah ini, jalankan pernyataan
XA RECOVER
sebelum menyelesaikan upgrade. Pernyataan ini memeriksa transaksi XA yang belum di-commit. Jika respons ditampilkan, commit transaksi XA dengan mengeluarkan XA COMMIT
atau roll back transaksi XA dengan mengeluarkan pernyataan XA ROLLBACK
. Untuk memeriksa transaksi XA yang ada, Anda dapat
menjalankan perintah yang mirip dengan perintah berikut:
mysql> XA RECOVER CONVERT xid; +----------+--------------+--------------+-------------------------- | formatID | gtrid_length | bqual_length | data | +----------+--------------+--------------+-------------------------- | 787611 | 9 | 9 | 0x787887111212345678812676152F12345678 | +----------+--------------+--------------+-------------------------- 1 row in set (0.00 sec)
Dalam contoh ini, kita dapat melihat bahwa nilai untuk gtrid
dan bqual
diberikan dalam format heksadesimal, tetapi digabungkan secara keliru. Untuk mengatasi masalah ini, Anda harus membuat nilai ini secara manual menggunakan kolom berikut:
gtrid = 0x787887111212345678
bqual = 0x812676152F12345678
Untuk melakukan atau membatalkan transaksi XA ini, Anda dapat membuat xid
dari informasi ini menggunakan perintah yang mirip dengan berikut ini:
xid: gtrid [, bqual [, formatID ]] mysql> XA ROLLBACK|COMMIT 0x787887111212345678,0x812676152F12345678,787611;
Melebihi panjang kunci maksimum
Berikut adalah contoh pesan error:
[ERROR] [MY-013140] [Server] Specified key was too long; max key length is [INTEGER] bytes
Masalah ini dapat disebabkan oleh konfigurasi sql_mode
. Di MySQL versi 5.7, tidak adanya mode ketat berarti indeks dapat dibuat dengan batasan pada awalan atau panjang indeks.
Namun, di MySQL versi 8.0, mode ketat seperti STRICT_ALL_TABLES
atau STRICT_TRANS_TABLES
diperkenalkan yang menerapkan aturan yang lebih ketat
pada panjang indeks, yang menyebabkan error ini.
Untuk mengatasi masalah ini, perbarui panjang awalan indeks agar berada dalam batas byte maksimum yang ditunjukkan dalam pesan error. Dengan protokol default UTFMB4, setiap karakter dapat menggunakan hingga 4 byte, yang berarti jumlah karakter maksimum dapat ditentukan dengan membagi jumlah byte maksimum dengan 4.
Informasi metadata tidak cocok
Berikut adalah contoh pesan error:
[ERROR] [MY-012084] [InnoDB] Num of Indexes in InnoDB doesn't match with Indexes from server [ERROR] [MY-012069] [InnoDB] table: TABLE_NAME has xx columns but InnoDB dictionary has yy columns
Berikut adalah contoh pesan error lainnya:
[ERROR] [MY-010767] [Server] Error in fixing SE data for db_name.table_name
Jika Anda mencoba mengupgrade tabel dengan metadata yang tidak cocok antara file frm dan kamus InnoDB, upgrade akan gagal. Dalam hal ini, file frm mungkin rusak. Untuk mengatasi masalah ini, Anda harus mengekspor dan memulihkan tabel yang terpengaruh sebelum mencoba mengupgrade.
Untuk mengetahui informasi selengkapnya, lihat Mencoba mengupgrade tabel dengan metadata yang tidak cocok.
Untuk mengekspor dan memulihkan tabel yang terpengaruh, Anda dapat menjalankan perintah yang mirip dengan berikut ini:
mysqldump --databases database_name --host=$host --user=$user --password=$password > database_dump.sql mysql> source database_dump.sql;
Nama Kunci Asing lebih dari 64 karakter
Berikut adalah contoh pesan error:
[ERROR] [MY-012054] [InnoDB] Foreign key name:key_name is too long
Error ini menunjukkan bahwa nama batasan kunci asing tabel tidak boleh lebih dari 64 karakter. Untuk mengidentifikasi tabel dengan nama batasan yang terlalu panjang, Anda dapat menggunakan perintah yang mirip dengan berikut ini:
SELECT CONSTRAINT_NAME, TABLE_NAME FROM information_schema.REFERENTIAL_CONSTRAINTS WHERE CHAR_LENGTH(CONSTRAINT_NAME) > 64;
Jika tabel berisi nama batasan yang melebihi 64 karakter, gunakan perintah
ALTER TABLE
untuk mengganti nama batasan dalam batas karakter ini:
ALTER TABLE your_table RENAME CONSTRAINT your_long_constraint_name TO your_new_constraint_name;
Huruf tidak cocok dalam nama tabel
Berikut adalah contoh pesan error:
[ERROR] [MY-013521] [Server] Table name 'SCHEMA_NAME.TABLE_NAME' containing upper case characters is not allowed with lower_case_table_names = 1.
Jika instance di MySQL versi 5.7 memerlukan nama tabel huruf kecil (lower_case_table_names=1
),
semua nama tabel harus dikonversi ke huruf kecil sebelum mengupgrade ke MySQL
versi 8.0.
Atau, Anda dapat menonaktifkan persyaratan (lower_case_table_names=0
)
lalu mengupgrade instance. Ingat, jika Anda mengubah nilai kolom
lower_case_table_names
dari 1
menjadi 0
,
Anda tidak dapat mengubah nilai tersebut kembali di MySQL versi 8.0.
Tabel yang dikenali oleh InnoDB yang termasuk dalam mesin yang berbeda
Berikut adalah contoh pesan error:
Error: Following tables are recognized by InnoDB engine while the SQL layer believes they belong to a different engine. Such situation may happen when one removed InnoDB files manually from the disk and creates a table with same name by using different engine.
Jika ada tabel dalam database yang dikenali oleh mesin InnoDB, tetapi tidak dikenali oleh lapisan SQL, upgrade akan gagal.
Temukan semua tabel dalam database yang tidak menggunakan mesin penyimpanan InnoDB:
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'db_name' AND ENGINE != 'InnoDB'
Untuk setiap tabel yang diidentifikasi, jalankan perintah ALTER TABLE
untuk mengubah mesin penyimpanannya menjadi InnoDB.
ALTER TABLE db_name.table_name ENGINE='INNODB';
Partisi mesin penyimpanan tidak diketahui
Berikut adalah contoh pesan error:
[System] [MY-011012] [Server] Starting upgrade of data directory. [ERROR] [MY-013140] [Server] Unknown storage engine 'partition'
MySQL versi 8.0 tidak mengizinkan partisi di mesin selain InnoDB
dan ndbcluster
. Anda harus memeriksa tabel dengan partisi dan yang
mesinnya bukan InnoDB. Untuk mengidentifikasi tabel ini, jalankan kueri berikut:
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE ENGINE NOT IN ('innodb', 'ndbcluster') AND CREATE_OPTIONS LIKE '%partitioned%';
Tabel apa pun yang dilaporkan oleh kueri harus diupdate untuk menggunakan InnoDB atau dikonfigurasi agar tidak dipartisi. Untuk mengubah mesin penyimpanan tabel ke InnoDB, jalankan pernyataan ini:
ALTER TABLE db_name.table_name ENGINE = INNODB;
Operasi MVU berjalan lebih lama
Ada dua tugas pokok yang terkait dengan upgrade versi utama:
- Operasi pra-pemeriksaan: Menampilkan error waktu tunggu habis jika tidak selesai dalam tiga jam.
- Operasi upgrade: Menampilkan error waktu tunggu habis jika tidak selesai dalam enam jam.
Jika instance memiliki operasi MAJOR_VERSION_UPGRADE
yang sedang berlangsung selama jangka waktu yang lebih lama dari yang diharapkan, Anda dapat menyelidiki log error MySQL untuk memeriksa apakah operasi tersebut diblokir dalam upgrade metadata, atau terhenti di beberapa langkah pemeriksaan awal. Penyebab paling umum masalah ini meliputi:
- Jumlah tabel, tampilan, atau indeks yang sangat besar
- Resource tidak mencukupi seperti CPU atau memori
- Transaksi utama memblokir penonaktifan database agar proses upgrade dapat dimulai. Anda dapat menggunakan konsol Trusted Cloud by S3NS untuk memeriksa proses saat ini.
Terlalu banyak file terbuka di sistem
Berikut adalah contoh pesan error:
[ERROR] [MY-012592] [InnoDB] Operating system error number 23 in a file operation [ERROR] [MY-012596] [InnoDB] Error number 23 means 'Too many open files in system'
Jika instance berisi lebih dari 2 juta tabel, Anda mungkin akan menerima error yang menunjukkan bahwa "terlalu banyak file terbuka dalam sistem". Anda mungkin perlu mengurangi jumlah tabel menjadi kurang dari 2 juta sebelum mengupgrade.
Error kehabisan memori
Saat mengupgrade dari MySQL 5.7 ke 8.0, memori tambahan diperlukan untuk mengonversi metadata lama ke kamus data baru. Untuk menghindari error "kehabisan memori" selama upgrade versi utama, Cloud SQL merekomendasikan agar Anda memiliki setidaknya 100 KB memori untuk setiap tabel.
Untuk menemukan jumlah tabel, gunakan kueri berikut:
SELECT table_schema AS 'Database Name', COUNT(*) AS 'Number of Tables' FROM information_schema.tables
Untuk mengatasi masalah ini, sebelum memulai upgrade, Anda dapat meningkatkan memori untuk sementara dengan mengubah jenis mesin.
Untuk instance inti bersama (misalnya, inti mikro atau kecil, termasuk db-f1-micro
, db-g1-small
, HA db-f1-micro
, HA db-g1-small
), upgrade ke instance inti khusus selama operasi upgrade untuk menghindari potensi masalah terkait resource. Anda dapat
melakukan downgrade setelah operasi upgrade selesai.
Error penonaktifan MySQL
Berikut adalah contoh pesan error:
[ERROR] [MY-012526] [InnoDB] Upgrade after a crash is not supported.
Cloud SQL melakukan penonaktifan yang bersih sebelum upgrade versi utama. Instance dengan workload berat atau transaksi yang berjalan lama mungkin mengalami proses penonaktifan yang lebih lama, yang berpotensi menyebabkan waktu tunggu habis dan upgrade gagal. Untuk memastikan upgrade berhasil, rencanakan upgrade selama periode traffic rendah tanpa transaksi yang berjalan lama.