Prasyarat
-
Hanya mesin penyimpanan InnoDB dan MyISAM yang mendukung pernyataan OPTIMIZE TABLE.
-
Instans harus memiliki ruang disk yang tersedia lebih besar dari atau sama dengan ukuran tabel yang ingin Anda optimalkan.
Catatan
Jika instans Anda tidak memiliki cukup ruang disk, terlebih dahulu perluas ruang disk. Setelah optimasi selesai, Anda dapat mengurangi kembali ukuran disk sesuai kebutuhan, dan sistem akan mengembalikan selisih harga.
Pertimbangan
-
Anda harus terlebih dahulu menghapus sejumlah besar data: Menjalankan OPTIMIZE TABLE tanpa terlebih dahulu menghapus banyak data menggunakan DELETE tidak akan secara efektif mengurangi penggunaan tablespace.
-
Peningkatan sementara dalam penggunaan ruang disk: Menjalankan OPTIMIZE TABLE membuat tabel sementara untuk data yang telah diatur ulang, sehingga secara singkat meningkatkan penggunaan ruang disk. Setelah operasi selesai, tabel sementara tersebut dihapus, dan penggunaan ruang disk kembali normal.
-
Statistik usang: Meskipun ruang disk telah direklaim, perubahan ini mungkin tidak langsung terlihat pada statistik tabel karena statistik tersebut belum diperbarui. Untuk informasi lebih lanjut, lihat Mengapa penggunaan ruang disk instans ApsaraDB RDS for MySQL tetap tidak berubah setelah saya menjalankan OPTIMIZE TABLE?.
-
Dampak performa dan risiko selama jam sibuk: Pada ApsaraDB RDS for MySQL 5.7 dan 8.0, OPTIMIZE TABLE menggunakan metode DDL online yang mendukung operasi DML secara konkuren. Namun, menjalankan pernyataan ini pada tabel besar dapat menyebabkan lonjakan tiba-tiba pada konsumsi I/O dan resource buffer. Hal ini berisiko menyebabkan penguncian tabel atau konflik sumber daya. Selama jam sibuk, bahkan dapat menyebabkan instans tidak tersedia atau gangguan pemantauan. Oleh karena itu, kami menyarankan menjalankan operasi ini selama jam sepi agar tidak mengganggu bisnis Anda.
Gunakan command line
-
Sambungkan ke instans ApsaraDB RDS for MySQL Anda menggunakan client.
-
Gunakan pernyataan DELETE untuk membersihkan data yang tidak diperlukan sesuai kebutuhan bisnis Anda.
-
Jalankan pernyataan OPTIMIZE TABLE untuk mereklaim tablespace.
OPTIMIZE TABLE <$Database1>.<Table1>,<$Database2>.<Table2>;
Catatan
-
<$Database1> dan <$Database2> adalah nama database, sedangkan <Table1> dan <Table2> adalah nama tabel.
-
Saat Anda menjalankan pernyataan OPTIMIZE TABLE pada tabel yang menggunakan mesin penyimpanan InnoDB, pesan berikut mungkin dikembalikan. Ini merupakan hal yang diharapkan, dan Anda dapat mengabaikannya serta memastikan bahwa operasi mengembalikan status "OK". Untuk informasi lebih lanjut, lihat Pernyataan OPTIMIZE TABLE.
Table does not support optimize, doing recreate + analyze instead
Gunakan DMS
-
Masuk ke instans ApsaraDB RDS for MySQL menggunakan DMS.
-
Pada panel navigasi kiri, pilih ID instans target, klik ganda database target, klik kanan nama tabel apa pun, lalu pilih batch operation table.
-
Pilih kotak centang untuk tabel-tabel yang ingin Anda reklaim ruangnya, lalu pilih .
-
Pada kotak dialog yang muncul, verifikasi perubahan, lalu klik OK.
FAQ
Ruang disk tidak berubah setelah OPTIMIZE TABLE
Masalah
Setelah menghapus sejumlah besar data dan menjalankan OPTIMIZE TABLE sesuai petunjuk dalam dokumentasi resmi ApsaraDB RDS for MySQL, jika Anda melakukan kueri terhadap bidang DATA_FREE di information_schema.tables, Anda mungkin menemukan bahwa nilainya tidak diperbarui, sehingga Anda mengira operasi tersebut gagal.
Penyebab
Ruang disk sebenarnya telah direklaim, tetapi statistik tabel di MySQL belum diperbarui. Masalah ini umum terjadi pada ApsaraDB RDS for MySQL 5.6, 5.7, dan 8.0 (dengan versi mesin minor sebelum 20250531). Pada versi-versi tersebut, menjalankan OPTIMIZE TABLE tidak secara otomatis memperbarui statistik tabel dan indeks. Akibatnya, nilai DATA_FREE di information_schema.tables tetap menyimpan data lama dan tidak mencerminkan penggunaan ruang aktual. Untuk informasi lebih lanjut, lihat Bug #117426: optimize table does not update table and index stats.
Solusi
-
Solusi yang direkomendasikan: Upgrade versi mesin minor ke 20250531 (untuk MySQL 8.0)
Masalah ini telah diperbaiki pada versi mesin minor 20250531 untuk ApsaraDB RDS for MySQL 8.0. Setelah Anda menjalankan OPTIMIZE TABLE, statistik akan diperbarui secara otomatis, dan nilai DATA_FREE akan mencerminkan penggunaan ruang aktual dengan benar.
-
Solusi sementara: Paksa refresh statistik (untuk skenario di mana upgrade segera tidak memungkinkan)
Jika Anda saat ini tidak dapat melakukan upgrade versi database, jalankan perintah ALTER TABLE table_name ENGINE=InnoDB; pada tabel yang telah Anda optimalkan. Ini akan memaksa tabel dibangun ulang dan statistiknya diperbarui. Setelah perintah dieksekusi, nilai DATA_FREE di information_schema.tables akan menampilkan ruang yang telah direklaim secara akurat.
Ruang disk tidak direklaim setelah DELETE
Pada ApsaraDB RDS for MySQL, saat Anda menggunakan pernyataan DELETE untuk menghapus data, perintah tersebut hanya menandai lokasi catatan atau halaman data sebagai dapat digunakan kembali. File disk tidak menyusut, artinya tablespace tidak segera direklaim. Hal ini dapat menyebabkan fragmentasi ruang penyimpanan yang mengonsumsi storage instans.
Anda dapat menggunakan DDL native atau fitur perubahan skema bebas-lock di DMS untuk mengatasi masalah ini. Sebelum menggunakan salah satu metode tersebut, pastikan instans memiliki ruang bebas yang cukup untuk mencegah kehabisan ruang dan terkunci.
-
Mereklaim ruang terfragmentasi menggunakan perintah: Jalankan operasi DDL seperti OPTIMIZE TABLE atau ALTER TABLE <table_name> ENGINE=InnoDB; untuk mengatur ulang struktur data dan indeks tabel, sehingga mereklaim ruang terfragmentasi.
Penting
Jika Anda menggunakan perintah DDL native, jalankan selama jam sepi untuk mencegah pemblokiran akibat kunci metadata. Untuk informasi lebih lanjut, lihat Pertimbangan.
-
Mereklaim ruang terfragmentasi menggunakan perubahan skema bebas-lock di DMS: Untuk menghindari masalah terkait kunci metadata, Anda dapat menggunakan fitur perubahan skema bebas-lock DMS untuk mereklaim ruang tabel terfragmentasi.
Ruang disk tidak direklaim setelah TRUNCATE atau DROP
Pada ApsaraDB RDS for MySQL, jika Anda menemukan bahwa ruang disk tidak direklaim setelah menjalankan operasi TRUNCATE atau DROP, ikuti langkah-langkah berikut:
-
Verifikasi Reklamasi Ruang
Setelah menjalankan TRUNCATE atau DROP, pantau penggunaan ruang disk instans Anda untuk memastikan apakah ruang tersebut telah direklaim. Biasanya, penurunan penggunaan disk harus mencerminkan ukuran tabel yang dihapus relatif terhadap total ruang instans.
-
Hindari mengandalkan informasi usang
Jika Anda memeriksa ukuran tabel menggunakan information_schema.tables atau konsol ApsaraDB RDS (), tablespace mungkin tampak tidak berubah karena keterlambatan pembaruan data. Oleh karena itu, kami menyarankan Anda mengandalkan metrik penggunaan disk sebagai ukuran pasti.
-
Pahami dampak penghapusan asinkron
Jika instans Anda memiliki fitur penghapusan asinkron yang diaktifkan (seperti Purge Large File Asynchronously milik Alibaba Cloud), ruang yang ditempati oleh file tabel tidak segera dilepaskan. Sebaliknya, proses latar belakang secara bertahap membersihkannya. Anda harus menunggu hingga proses ini selesai agar ruang disk direklaim.