Alternative to 'disabled-LOAD-DATA-INFILE' MYSQL
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*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.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”.
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 :
- compress : Compress informasi antara client-server
- delete : Empty table sebelum import data
- local : Read input dari file lokal
- lock-tables : Mengunci semua table dari 'penulisan' sebelum memproses