Sayangnya bahkan melakukan penyalinan dalam batch kecil 100 baris menghasilkan kelambatan yang signifikan setelah beberapa waktu.
Apakah Anda menambahkan penundaan antara setiap batch, atau hanya menumpuk pembaruan dan menjalankan setiap batch langsung setelah yang sebelumnya?
Jika demikian maka cobalah skrip konversi dalam bahasa favorit Anda dengan sesuatu seperti:
repeat
copy oldest 100 rows that haven't been copied yet to new table
sleep for as long as that update took
until there are <100 rows unprocessed
stop logging service
move the last few rows
rename tables
restart logging
delete the old table when you are sure the conversion has worked
Ini harus memastikan bahwa konversi tidak memakan lebih dari atau kurang dari setengah kapasitas server Anda, bahkan memungkinkan perbedaan beban yang dikenakan karena penggunaan sistem bervariasi sesuai waktu.
Atau jika Anda ingin menggunakan waktu sebanyak mungkin ketika layanan ini relatif tidak digunakan tetapi mundur (berpotensi berhenti untuk waktu yang cukup lama) ketika database perlu melakukan beberapa pekerjaan untuk para penggunanya, ganti sleep for as long as the update took
dengan if the server's load is above <upper measure>, sleep for some seconds then check again, loop around the sleep/check until the load drops below <lower measure>
. Ini berarti ia dapat bergerak maju dalam waktu tenang tetapi akan berhenti sepenuhnya ketika server sedang sibuk melakukan itu beban kerja normal. Menentukan beban akan bergantung pada OS Anda - di Linux dan sejenisnya, nilai rata-rata beban 1 menit dari /proc/loadavg
atau keluaran yang uptime
seharusnya dilakukan. <lower measure>
dan <upper measure>
mungkin nilainya sama, meskipun biasanya pada kontrol seperti ini memiliki perbedaan sehingga proses Anda tidak terus berjalan maka segera berhenti karena memulai kembali sendiri memiliki pengaruh pada ukuran beban.
Tentu saja ini tidak akan berfungsi untuk tabel di mana baris lama dapat dimodifikasi, tetapi akan berfungsi dengan baik untuk tabel log seperti yang Anda gambarkan.
Anda akan ingin mengabaikan kebijaksanaan membuat indeks setelah mengisi tabel baru dalam kasus ini. Walaupun hal itu memang lebih efisien ketika Anda ingin segala sesuatunya menjadi secepat mungkin (efeknya pada sistem yang lain terkutuk), dalam hal ini Anda tidak ingin beban yang besar pada akhir proses sebagai indeks dibuat sepenuhnya dalam sekali jalan karena ini adalah proses yang tidak dapat Anda hentikan saat segala sesuatunya menjadi sibuk.