2009/01/21

Split dump mysql besar per-tabel dengan csplit

Pasti pernah dong ditugasi untuk impor file sql hasil dump ke database mysql baru. Sering lah, hay. Ya sering kalau buat yg berkecimpung di dunia itu. Kalau hidup di dunia lain, bisa pernah bisa engga.

Nah, kemaren suatu ketika ada file sql yang ukurannya 2GB. Kecil, lah, dibanding ukuran HD zaman sekarang. Tapi kebayang aja, untuk impor data sql segede itu pasti butuh memori dan CPU yang juga gede2an. Dengan naif, saya langsung aja impor itu file dengan perintah yang biasa,

mysql -u bigdb -p bigdb < bigdump.sql

alhasil, 5 jam berlalu tanpa ada kepastian apakah prosesnya akan selesai atau tidak. Dan terlalu males untuk melihat ukuran database yang telah tercipta setelah 5 jam itu.

Dengan hati yang ditabahkan, terpaksa kombinasi interupsi (ctrl-c) ditekan. Dan tabel terakhir dari proses impor tadi menggantung dengan status crashed.

Dulu pernah ngalamin hal mirip. Tapi waktu itu mysql langsung error ketika mengeksekusi baris tertentu (nomor baris diberitahu) dari file sql. Error disinyalir karena memori habis. Jadi dengan mudah saya split aja itu file dengan maksimum sekian baris per-file. Lancar.

Kali ini, selain ukurannya 4 kali lebih besar, saya juga tidak tahu harus splitting di mana. Errornya juga karena terpaksa diinterupsi, bukan karena memori yang habis. Google memberi informasi tentang bigdump.php untuk mengimpor database yang ukurannya amit2. Tapi teman mengonfirmasi bahwa hasil impor tidak lengkap.

Akhirnya, dipaksalah untuk melaksanakan ide untuk splitting file tersebut per-tabel. Kan di file dump database itu ada informasi (sintaks) untuk membuat tabel serta mengisikan data ke dalam tabel tersebut. Mudah diketahui, dalam file dump mysql tiap tabel diawali dengan tiga baris ini:

---
-- Table structure for table `contoh`
---


Nah sekarang, tinggal mencari cara untuk split file hasil dump mysql setiap kali baris itu ada (saya pilih baris ke-2 untuk penanda). Halah, harus ngoprek perl, nih. Secara si Aa bukan programmer. Yah, pablebuat, gugling dulu.

Dasar nasib lagi baik, nemuin halaman Spliting files with a regular expression. Di situ dia bilang bahwa skrip yang dibuat adalah untuk pengganti csplit. Iseng, saya cari di cache apt saya,

$ apt-cache search csplit
coreutils - The GNU core utilities


Weksssssss...!!! Ada di coreutils? Hihihi, malu sendiri, ternyata alat yang diperlukan sudah ada sejak dulu tanpa diketahui keberadaanya. Coreutils adalah salahsatu paket dari GNU yang wajib ada di distro linux.

Dan akhirnya, setelah sedikit baca2 manual untuk program ini, dibuatlah perintah untuk splitting file dump sql tersebut menjadi beberapa file dengan satu tabel per-file. Begini perintahnya:

csplit -f tabelsql. -n 3 bigdump.sql /^\-\-\ Table/ {*}

Output akan berupa tabelsql.000 dan seterusnya. Untuk opsi serta pattern yang saya pakai bisa dilihat penjelasannya di manual csplit.

Setelah displit, ya tinggal impor satu-per-satu. Yang bisa pake loop, silahkan pake, sederhana kok.

Distro2 linux emang dibuat untuk menjadi sesuatu yang sakti.

1 comment:

wim said...

thx kang.. sy catet neeh buat jaga2 klo ada masalah db yg segede gambreng gene :P
luph yu dah.. hahaha