Alternative to 'disabled-LOAD-DATA-INFILE' MYSQL

Tuesday, January 15, 2013 0 Comments

Mysql versi 5.5, mulai menonaktifkan fitur LOAD DATA INFILE, karena terkait masalah keamanan, katanya. Dan itulah sumber masalahnya. Bukan saya saja, hampir kebanyakan user di seluruh dunia yang sudah terbiasa memakai kenyamaman ber-LOAD-DATA-INFILE, mengalami trauma serupa *bahasa dialih-lebay-kan*
LOCAL works only if your server and your client both have been
configured to permit it. For example, if mysqld was started with
--local-infile=0, LOCAL does not work. See Section 6.1.6, 
“Security Issues with LOAD DATA LOCAL”.
Saya menggunakan Ubuntu 12.04, yang otomatis menyertakan MySQL versi 5.5 dengan LOAD DATA INFILE dinonaktifkan di reponya (default). Sayang sekali. Padahal salah satu sistem yang saya kembangkan cukup bergantung dengan adanya fitur tersebut. Dan itu cukup membuat repot! Bagaimana kalau besok diinstal di Ubuntu yang baru? Bagaimana jika anu? Bagaimana jika blah-blah-blah.. Tapi akhirnya saya dapat juga jawabannya.

Bukan dengan compile source sendiri. Tidak! Terlalu njlimet bagi saya, karena saya sudah pernah merasakan bagaimana ketika compile-an ternyata gagal :D Dan karena saya terlalu malas, 'masa iya tidak ada alternatif lain?'; walhasil saya meninggalkan solusi untuk compile ulang dengan enable opsi LOAD DATA INFILE. Mungkin lain jika terpaksa tidak ada jalan lain.

PHP
Memang bisa menggunakan fgetcsv(). Tapi bagaimana jika suatu saat sistem dihadapkan untuk menghandle file berukuran besar (dalam kasus saya)? Bisanya tetep bisa. Tapi pasti makan resource yang besar dan lama juga. Kalah jauh dengan LOAD DATA LOCAL INFILE :3

Mysql
Sebagai alternatif, kita bisa gunakan mysqlimport. Thanks to +Rachman Chavik that gimme clue :D 
... The mysqlimport client provides a command-line interface 
to the LOAD DATA INFILE SQL statement. Most options to 
mysqlimport correspond directly to clauses of LOAD DATA 
INFILE syntax. See Section 13.2.6, “LOAD DATA INFILE Syntax”. 
... 
Contoh opsi yang sering digunakan adalah
$ mysqlimport \
--user=root \
--password=password \
--columns=empno,ename,job \
--compress \
--delete \
--fields-optionally-enclosed-by='"' \
--fields-terminated-by='\t' \
--fields-escaped-by='' \
--lines-terminated-by='\n' \
--local \
--lock-tables \
--verbose \
database table.txt

Hampir mirip dengan LOAD DATA bukan?
Keterangan :
  1. compress : Compress informasi antara client-server
  2. delete : Empty table sebelum import data
  3. local : Read input dari file lokal
  4. lock-tables : Mengunci semua table dari 'penulisan' sebelum memproses
Yang perlu diperhatikan pada contoh di atas adalah table.txt, di mana nama file table HARUS merupakan nama table yang akan di-impor-kan, dengan extension bisa sembarang. Tapi seharusnya tidak masalah bukan? Just another way :D Yang penting ada penggantinya hehehe

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

Do you think I forgot to change this text? No, dude. I did it on purpose ahahahay..