Tabel turunan

Halaman ini membahas masalah umum terkait tabel turunan di MySQL.

Apa itu tabel yatim piatu?

Tabel yatim adalah tabel dengan definisi yang terputus di seluruh kamus data MySQL dan dapat terjadi di MySQL 5.6 atau MySQL 5.7. Salah satu skenario berikut dapat memblokir upgrade versi utama (MVU) dari MySQL 5.7 ke MySQL 8.0:

  • Adanya file data InnoDB (.ibd) tanpa file definisi yang sesuai (.frm), atau sebaliknya.
  • Keberadaan tabel perantara yang tersisa dari pernyataan ALTER TABLE yang tidak lagi dirujuk atau digunakan oleh logika aplikasi aktif mana pun.

Tabel sementara tanpa induk

Nama tabel sementara yatim piatu dimulai dengan awalan #sql-, seperti #sql-123.

Gunakan kueri berikut untuk membantu mengidentifikasi tabel sementara (temp) yang tidak memiliki induk:

SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME RLIKE '#sql-[0-9].*';

Anda dapat menggunakan perintah DROP TABLE untuk menghapus tabel sementara yatim piatu tanpa langkah tambahan lainnya. Hal ini akan mengatasi sebagian besar kasus:

DROP TABLE `DB`.`#mysql50#TEMPORARY_ORPHAN_TABLE`;

Ganti DB dengan nama database yang ingin Anda gunakan.

Contohnya mungkin terlihat seperti berikut:

DROP TABLE `testdb`.`#mysql50##sql-1234`;

Jika perintah tabel DROP sebelumnya tidak berfungsi, file definisi (.frm) mungkin digunakan kembali oleh operasi ALTER TABLE lain. Dalam kasus tersebut, file penampung .frm harus dibuat di disk untuk menghapus tabel. Hubungi dukungan Cloud SQL untuk mendapatkan bantuan. Jika Anda tidak memiliki kontrak dukungan, lihat Metode layanan mandiri untuk mengetahui langkah-langkah pemecahan masalah.

Tabel perantara yang tidak memiliki induk

Nama tabel perantara yang tidak memiliki induk dimulai dengan awalan #sql-ib, misalnya, #sql-ib23-343224.

Gunakan kueri berikut untuk mengidentifikasi tabel perantara yatim piatu:

SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%#sql-ib%';

Untuk menghapus tabel turunan sementara, ubah terlebih dahulu nama file definisi turunan (.frm) agar cocok dengan nama tabel, lalu hapus tabel dari command line.

Untuk menghapus tabel turunan perantara, hubungi tim dukungan Cloud SQL untuk mendapatkan bantuan. Jika Anda tidak memiliki kontrak dukungan, lihat Metode layanan mandiri untuk mengetahui langkah-langkah pemecahan masalah.

Tabel normal yatim piatu

Tabel InnoDB yatim piatu terjadi saat file data yang sesuai (.ibd) tetap berada di sistem file, tetapi kamus data tidak lagi mereferensikan file data dengan benar. Skenario ini memerlukan intervensi manual.

Untuk menyelesaikan masalah ini, hubungi dukungan Cloud SQL. Tim dukungan dapat membuat file .frm placeholder, lalu menggunakan perintah DROP TABLE untuk mencoba menghapus tabel. Jika gagal, file InnoDB (.ibd) kemungkinan memerlukan penghapusan manual dari direktori data.

Setelah file dihapus secara manual, Anda dapat mencadangkan semua tabel dan struktur database.

Hapus database menggunakan DROP DATABASE dan buat database menggunakan CREATE DATABASE. Langkah terakhir ini mungkin memerlukan periode nonaktif untuk aplikasi yang terhubung ke database yang terpengaruh.

Jika Anda tidak memiliki kontrak dukungan, lihat Metode layanan mandiri untuk mengetahui langkah-langkah pemecahan masalah.

Pemecahan masalah layanan mandiri

Metode pemecahan masalah layanan mandiri berikut melibatkan penghapusan atau migrasi seluruh database untuk menghapus tabel yatim piatu jika penghapusan tabel individual tidak berhasil. Metode ini mengganggu. Jika organisasi Anda memiliki kontrak dukungan, sebaiknya hubungi tim dukungan Cloud SQL untuk mendapatkan bantuan.

Untuk menghapus tabel sementara yatim piatu, pastikan untuk mengikuti langkah-langkah di Tabel sementara yatim piatu terlebih dahulu. Jika perintah DROP TABLE tidak berhasil, coba saran berikut.

Sebelum memulai

  • Sebaiknya Anda mencadangkan instance secara penuh untuk membantu mengurangi risiko kehilangan data.

  • Untuk membantu mengurangi durasi kemungkinan periode nonaktif aplikasi, sebaiknya klon instance dan verifikasi langkah-langkah migrasi berikut sebelum menyelesaikannya di lingkungan produksi.

    Untuk mengetahui informasi selengkapnya, lihat Meng-clone instance.

Menghapus skema menggunakan migrasi objek

Migrasi objek database adalah proses multi-langkah untuk memindahkan objek database, seperti tabel, ke skema sementara:

  1. Mencadangkan objek database lainnya, termasuk prosedur, fungsi, dan tampilan.
  2. Hapus dan buat ulang skema yang terpengaruh.
  3. Impor kembali objek yang dicadangkan ke dalam skema asli.

Metode migrasi ini biasanya menyebabkan aplikasi tidak tersedia. Untuk meminimalkan gangguan, siapkan semua skrip yang diperlukan terlebih dahulu. Misalnya, pastikan skrip Anda siap menangani:

  • Mengganti nama tabel dan memindahkannya ke skema sementara.
  • Mencadangkan objek database lainnya, seperti prosedur, fungsi, tampilan, dan lainnya.
  • Memulihkan semua objek database ke skema asli.

Setelah skrip ini siap, selesaikan langkah-langkah berikut:

  1. Buat skema sementara (contoh: fix_orphan_tables) pada instance yang sama.
  2. Hentikan traffic aplikasi pada skema yang terpengaruh.
  3. Pindahkan semua tabel ke skema sementara menggunakan RENAME TABLE:

    RENAME TABLE DB.TABLE_NAME TO fix_orphan_tables.TABLE_NAME;
    

    Lakukan penggantian berikut:

    • DB: nama database yang ingin Anda gunakan.
    • TABLE_NAME: nama tabel.
  4. Mencadangkan objek database, seperti tampilan, rutin, prosedur tersimpan, pemicu, dan peristiwa. Salah satu caranya adalah dengan menggunakan mysqldump:

    mysqldump -u USER --password=PASSWORD \
      -h HOST_IP --set-gtid-purged=OFF --no-data --no-create-db  \
      --no-create-info --routines --triggers --skip-opt --events \
      DB > DB_export.sql
    

    Lakukan penggantian berikut:

    • USER: nama pengguna.
    • PASSWORD: sandi database.
    • HOST_IP: alamat IP host.
    • DB: nama database yang ingin Anda gunakan.

    Sebaiknya Anda mencadangkan tampilan secara manual menggunakan cuplikan perintah SHOW CREATE VIEW.

  5. Hapus skema yang berisi tabel tidak terkait.

  6. Buat skema dengan nama asli.

  7. Verifikasi apakah tabel yatim piatu telah dihapus:

    SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%ORPHAN_TABLE_NAME</var>';
    

    Ganti ORPHAN_TABLE_NAME dengan nama tabel turunan.

  8. Menyalin tabel kembali ke skema asli:

    RENAME TABLE fix_orphan_tables.TABLE_NAME TO DB.TABLE_NAME;
    

    Lakukan penggantian berikut:

    • TABLE_NAME: nama tabel.
    • DB: nama database yang ingin Anda gunakan.
  9. Salin semua objek database dari cadangan yang dibuat pada langkah 4.

    mysql -u USER \
      --password=PASSWORD \
      -h <var>HOST_IP \
      -D<var>DB < <var>DB_export.sql
    

    Lakukan penggantian berikut:

    • USER: nama pengguna.
    • PASSWORD: sandi database.
    • HOST_IP: alamat IP host.
    • DB: nama database yang ingin Anda gunakan.

    Sebaiknya Anda memulihkan tampilan secara manual dengan membuatnya lagi menggunakan pernyataan CREATE VIEW.

  10. Lanjutkan traffic aplikasi yang sebelumnya Anda hentikan.

Menghapus skema menggunakan dump dan memuat ke instance yang sama

Cara lain untuk menghapus tabel yatim piatu adalah dengan melakukan dump penuh skema yang terpengaruh, menghapus dan membuat ulang skema, lalu memulihkan dump. Dalam beberapa skenario, metode ini mungkin lebih cepat dan tidak terlalu rumit. Untuk meminimalkan gangguan, pastikan Anda menyiapkan semua skrip pencadangan dan pemulihan sebelumnya.

Setelah skrip ini siap, selesaikan langkah-langkah berikut:

  1. Hentikan traffic aplikasi pada skema yang terpengaruh.
  2. Cadangkan skema tempat tabel yatim berada, termasuk semua prosedur tersimpan, pemicu, tampilan, dan peristiwa menggunakan mysqldump.
  3. Hapus skema.
  4. Buat skema lagi dan pulihkan file cadangan.
  5. Lanjutkan traffic aplikasi yang dihentikan pada langkah pertama.

Mengekspor dan memuat ke instance baru atau yang dibuat ulang

Dalam kondisi tertentu, skema yang berisi tabel yatim piatu tidak dapat dihapus. Dalam kasus ini, Anda harus bermigrasi ke instance baru atau membuat ulang instance yang ada menggunakan dump dan pemuatan logis. Kedua pendekatan tersebut dapat menyebabkan gangguan pada aplikasi dan mungkin memerlukan konfigurasi ulang aplikasi Anda agar mengarah ke instance database yang baru dibuat atau dibuat ulang. Bagian berikut membahas kedua metode tersebut.

Memigrasikan data ke instance baru menggunakan Database Migration Service (DMS)

  1. Gunakan Database Migration Service untuk membuat instance Cloud SQL for MySQL baru.
  2. Setelah instance replika selesai mereplikasi data yang terkait dengan instance baru, hentikan semua aplikasi yang terhubung ke instance sumber.
  3. Promosikan instance Cloud SQL untuk MySQL replika.
  4. Ubah semua koneksi aplikasi agar mengarah ke instance Cloud SQL untuk MySQL yang baru dipromosikan dan mulai ulang aplikasi.

Dump dan pemulihan manual

  1. Jika Anda membuat instance database baru, buat instance dengan konfigurasi yang sama seperti instance saat ini.
  2. Hentikan semua traffic aplikasi pada instance database saat ini.
  3. Cadangkan semua skema menggunakan mysqldump atau utilitas serupa.
  4. Jika menggunakan instance yang sama, hapus dan buat ulang instance.
  5. Dengan menggunakan cadangan yang Anda buat pada langkah ketiga, pulihkan cadangan ke instance baru atau ke instance yang sama yang dibuat ulang.
  6. Arahkan aplikasi Anda ke instance baru atau ke instance yang sama yang dibuat ulang dan lanjutkan operasi aplikasi.

Langkah berikutnya

  1. Pemecahan masalah
  2. Mengupgrade versi utama database yang sudah diterapkan