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
Hubungkan ke instans ApsaraDB RDS for MySQL dari klien.
Gunakan pernyataan DELETE untuk menghapus data yang tidak diinginkan sesuai kebutuhan.
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
Masuk ke instans ApsaraDB RDS for MySQL menggunakan DMS.
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.
Pilih tabel untuk mana Anda ingin melepaskan ruang, lalu pilih .
Di kotak dialog yang muncul, konfirmasikan bahwa informasi tersebut benar dan klik Confirm.
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:
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.
Hindari bergantung pada informasi usang
Jika Anda memeriksa ukuran tabel menggunakan information_schema.tables atau konsol RDS (), ruang tabel mungkin tampak tidak berubah karena latensi pembaruan data. Oleh karena itu, Anda harus menggunakan penggunaan disk sebagai metrik utama.
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.