全部产品
Search
文档中心

ApsaraDB RDS:Gunakan perintah OPTIMIZE TABLE untuk melepaskan ruang tabel untuk instans ApsaraDB RDS for MySQL

更新时间:Nov 10, 2025

Saat menggunakan pernyataan DELETE untuk menghapus sejumlah besar data dari tabel MySQL, ruang disk tidak langsung dilepaskan. Pernyataan tersebut hanya menandai catatan database atau halaman data sebagai dapat digunakan kembali. Untuk mereklaim ruang tabel dan mengurangi penggunaan disk, jalankan perintah OPTIMIZE TABLE.

Prasyarat

  • Hanya mesin InnoDB dan MyISAM yang mendukung pernyataan OPTIMIZE TABLE.

  • Ruang disk yang tersisa pada instans harus lebih besar dari atau sama dengan ukuran tabel yang ingin dioptimalkan.

    Catatan

    Jika ruang disk tidak mencukupi, Anda harus terlebih dahulu meningkatkan ruang disk. Setelah operasi selesai, Anda dapat menurunkan ruang disk sesuai kebutuhan. Sistem mengembalikan selisih harga.

Pertimbangan

  • Hapus sejumlah besar data terlebih dahulu: Perintah OPTIMIZE TABLE tidak efektif mengurangi penggunaan ruang tabel kecuali Anda terlebih dahulu menghapus sejumlah besar data menggunakan pernyataan DELETE.

  • Peningkatan sementara dalam penggunaan disk: Saat menjalankan perintah OPTIMIZE TABLE, MySQL membuat tabel sementara untuk menyimpan data yang telah diorganisir ulang. Ini menyebabkan peningkatan sementara dalam penggunaan disk. Setelah operasi selesai, tabel sementara dihapus dan penggunaan disk kembali normal.

  • Statistik tabel dan indeks mungkin tidak berubah setelah pelepasan: Ruang disk dilepaskan, tetapi statistik tabel di MySQL tidak diperbarui secara tepat waktu. Untuk informasi lebih lanjut, lihat Mengapa ruang disk instans ApsaraDB RDS for MySQL saya tetap tidak berubah setelah saya menjalankan perintah OPTIMIZE TABLE?.

  • Dampak kinerja dan risiko jam puncak: Di ApsaraDB RDS for MySQL 5.7 dan 8.0, perintah OPTIMIZE TABLE dijalankan menggunakan metode DDL online, yang mendukung operasi DML bersamaan. Namun, menjalankan perintah ini pada tabel besar dapat menyebabkan lonjakan penggunaan I/O dan sumber daya buffer. Hal ini dapat menyebabkan penguncian tabel atau konflik sumber daya. Selama jam puncak, instans bahkan mungkin menjadi tidak tersedia atau pemantauan terganggu. Oleh karena itu, jalankan perintah ini selama jam non-puncak untuk menghindari mempengaruhi layanan Anda.

Gunakan baris perintah

  1. Hubungkan ke instans ApsaraDB RDS for MySQL dari klien.

  2. Gunakan pernyataan DELETE untuk menghapus data yang tidak diinginkan sesuai kebutuhan.

  3. Jalankan perintah OPTIMIZE TABLE untuk melepaskan ruang tabel.

    OPTIMIZE TABLE <$Database1>.<Table1>,<$Database2>.<Table2>;
    Catatan
    • <$Database1> dan <$Database2> mewakili nama database. <Table1> dan <Table2> mewakili nama tabel.

    • Saat menjalankan pernyataan OPTIMIZE TABLE pada tabel yang menggunakan mesin InnoDB, pesan berikut akan dikembalikan. Pesan ini menunjukkan bahwa pernyataan dijalankan dengan sukses. Anda dapat mengabaikan pesan ini. Pastikan "ok" dikembalikan dalam status. Untuk informasi lebih lanjut, lihat Pernyataan OPTIMIZE TABLE.

      Tabel tidak mendukung optimasi, melakukan rekreasi + analisis sebagai gantinya

Gunakan DMS

  1. Masuk ke instans ApsaraDB RDS for MySQL menggunakan DMS.

  2. Di panel navigasi di sebelah kiri, temukan instans target dan klik ID instans. Klik dua kali database tujuan. Klik kanan tabel dan pilih Batch Operations.

  3. Pilih tabel untuk mana Anda ingin melepaskan ruang, lalu pilih Table Maintenance > Optimize Table.Optimize table

  4. Di kotak dialog yang muncul, konfirmasikan bahwa informasi tersebut benar dan klik Confirm.

Referensi

Reklaim ruang dari fragmen tabel

FAQ

Mengapa ruang disk instans ApsaraDB RDS for MySQL saya tetap tidak berubah setelah saya menjalankan OPTIMIZE TABLE perintah?

Deskripsi masalah

Anda mengikuti tutorial resmi ApsaraDB RDS for MySQL untuk menghapus sejumlah besar data menggunakan perintah DELETE dan kemudian menjalankan perintah OPTIMIZE TABLE untuk mereklaim ruang tabel. Segera setelah itu, Anda menanyakan bidang DATA_FREE di information_schema.tables dan menemukan bahwa nilainya tidak diperbarui. Anda mungkin menyimpulkan bahwa ruang disk tidak dilepaskan dan operasi tersebut tidak efektif.

Penyebab

Ruang disk sebenarnya dilepaskan. Masalah ini terjadi karena informasi statistik tabel MySQL tidak diperbarui secara tepat waktu. Masalah ini umum terjadi di instans ApsaraDB RDS for MySQL 5.6, 5.7, dan 8.0 yang menjalankan versi mesin minor lebih awal dari 20250531. Di versi ini, menjalankan perintah OPTIMIZE TABLE tidak secara otomatis memperbarui informasi statistik tabel dan indeks. Akibatnya, nilai DATA_FREE di information_schema.tables tidak diperbarui dan tidak dapat secara akurat mencerminkan penggunaan ruang aktual. Untuk informasi lebih lanjut, lihat Bug #117426: optimize table tidak memperbarui statistik tabel dan indeks.

Solusi

  • Solusi yang direkomendasikan: Tingkatkan versi mesin minor ke 20250531 (untuk MySQL 8.0)

    Masalah ini diperbaiki di ApsaraDB RDS for MySQL 8.0 versi mesin minor 20250531. Peningkatan ini memperbaiki masalah di mana perintah OPTIMIZE TABLE tidak memperbarui status tabel. Setelah Anda menjalankan perintah OPTIMIZE TABLE, informasi statistik diperbarui secara otomatis, dan nilai DATA_FREE dengan benar mencerminkan penggunaan ruang aktual.

  • Solusi sementara: Paksa penyegaran informasi statistik (untuk skenario di mana Anda tidak dapat meningkatkan dalam jangka pendek) Jika Anda tidak dapat meningkatkan versi database Anda dalam jangka pendek, Anda dapat menjalankan perintah ALTER TABLE table_name ENGINE=InnoDB; pada tabel tempat perintah OPTIMIZE TABLE telah dijalankan. Perintah ini secara paksa membangun kembali tabel dan memperbarui informasi statistik. Setelah perintah dijalankan, nilai DATA_FREE di information_schema.tables dengan benar menampilkan ruang yang dilepaskan.

Mengapa ruang disk tidak dilepaskan di instans ApsaraDB RDS for MySQL saya setelah saya menjalankan DELETE perintah?

Di ApsaraDB RDS for MySQL, pernyataan DELETE hanya menandai lokasi catatan atau halaman data sebagai dapat digunakan kembali. Ini tidak mengubah ukuran file disk. Akibatnya, ruang tabel tidak segera direklaim. Perilaku ini menciptakan fragmentasi yang mengonsumsi ruang penyimpanan instans.

Dua solusi tersedia: operasi DDL asli dan evolusi skema bebas kunci DMS. Sebelum Anda menggunakan salah satu solusi, pastikan instans memiliki cukup ruang kosong. Ini mencegah instans terkunci jika penyimpanannya penuh.

  • Gunakan perintah untuk mengelola fragmentasi: Jalankan operasi DDL, seperti OPTIMIZE TABLE atau ALTER TABLE <table_name> ENGINE=InnoDB;, untuk mengatur ulang data tabel dan skema indeks. Ini melepaskan ruang yang terfragmentasi.

    Penting

    Jalankan perintah DDL asli selama jam non-puncak untuk mencegah kunci metadata menghalangi operasi lain. Untuk informasi lebih lanjut, lihat Pertimbangan.

  • Gunakan evolusi skema bebas kunci DMS: Untuk menghindari kunci metadata, gunakan evolusi skema bebas kunci DMS untuk mereklaim ruang tabel yang terfragmentasi.

Mengapa ruang disk tidak dilepaskan di instans ApsaraDB RDS for MySQL saya setelah saya menjalankan TRUNCATE atau DROP perintah?

Di ApsaraDB RDS for MySQL, jika ruang disk tidak dilepaskan setelah Anda mengeksekusi operasi TRUNCATE atau DROP, ikuti langkah-langkah berikut:

  1. Konfirmasi logika pelepasan ruang

    Setelah Anda mengeksekusi perintah TRUNCATE atau DROP, konfirmasikan apakah ruang dilepaskan dengan memantau penggunaan disk instans. Biasanya, penurunan penggunaan disk mencerminkan proporsi ukuran tabel yang dihapus relatif terhadap total ruang instans.

  2. Hindari bergantung pada informasi usang

    Jika Anda memeriksa ukuran tabel menggunakan information_schema.tables atau konsol RDS (Autonomy Service > Quick Diagnostics > Space Analysis), ruang tabel mungkin tampak tidak berubah karena latensi pembaruan data. Oleh karena itu, Anda harus menggunakan penggunaan disk sebagai metrik utama.

  3. Dampak penghapusan asinkron

    Jika instans memiliki fitur penghapusan asinkron yang diaktifkan, seperti fitur Alibaba Cloud Purge Large File Asynchronously, ruang yang ditempati oleh file tabel tidak dilepaskan secara langsung. Sebagai gantinya, proses latar belakang secara bertahap membersihkan ruang tersebut. Anda harus menunggu proses asinkron ini selesai. Ruang disk hanya dilepaskan setelah proses selesai.