Saat bekerja dengan MySQL, khususnya fitur seperti LOAD DATA INFILE atau SELECT INTO OUTFILE, Anda mungkin menemui error:
the upload destination folder does not appear to be writable
Jika folder yang dimaksud adalah:
/var/lib/mysql-files/
maka masalah ini biasanya terkait permission (izin) dan kepemilikan folder, karena folder ini bersifat internal MySQL dan secara default sangat dibatasi demi keamanan.
Artikel ini akan menjelaskan secara lengkap cara mengatur folder ini agar MySQL bisa menulis file dan web server (PHP/Apache/Nginx) bisa menaruh file di sana.
Contents
1. Apa Itu Folder /var/lib/mysql-files/?
- Folder ini digunakan oleh MySQL untuk menyimpan file sementara ketika menggunakan fitur:
LOAD DATA INFILE 'file_path'→ membaca file ke dalam tabel MySQLSELECT ... INTO OUTFILE 'file_path'→ menulis hasil query ke file
- Secara default, folder ini hanya bisa diakses oleh user MySQL (
mysql) dan biasanya permission-nya 700:
drwx------ 2 mysql mysql 4096 Jan 10 10:00 /var/lib/mysql-files
- Permission ini menjamin keamanan karena mencegah user atau aplikasi lain menulis file sembarangan di folder MySQL.
2. Mengapa Error “Folder Not Writable” Muncul?
Error ini muncul ketika:
- User yang mencoba menulis bukan user MySQL.
- Folder
/var/lib/mysql-files/tidak memiliki permission yang memadai. - Folder tidak dimiliki oleh group atau user yang relevan dengan aplikasi.
3. Solusi Aman: mysql:www-data
Jika Anda ingin aplikasi web (misal PHP yang dijalankan oleh www-data) bisa menaruh file supaya MySQL bisa membacanya, langkah yang aman adalah:
- Ubah kepemilikan folder menjadi:
- Owner:
mysql→ MySQL tetap bisa mengelola folder - Group:
www-data→ Web server bisa menulis ke folder
- Owner:
Perintah:
sudo chown mysql:www-data /var/lib/mysql-files/
- Ubah permission folder sehingga group juga bisa menulis:
sudo chmod 770 /var/lib/mysql-files/
Hasilnya akan terlihat seperti ini:
drwxrwx--- 2 mysql www-data 4096 Jan 10 10:00 /var/lib/mysql-files/
Penjelasan Permission:
| Entitas | Permission |
|---|---|
| Owner (mysql) | baca, tulis, eksekusi ✅ |
| Group (www-data) | baca, tulis, eksekusi ✅ |
| Lainnya | tidak bisa ✖ |
Dengan setup ini, MySQL dan web server bisa menulis file, sementara user lain tidak memiliki akses.
4. Contoh Penggunaan MySQL dengan Folder Ini
SELECT * FROM your_table
INTO OUTFILE '/var/lib/mysql-files/output.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
- File akan dibuat oleh MySQL sendiri, sehingga tidak ada masalah permission.
- Pastikan folder
/var/lib/mysql-files/sudah memiliki ownermysqldan permission cukup.
b. Menggunakan LOAD DATA INFILE dari Web Server
Jika aplikasi web menaruh file CSV yang ingin di-import MySQL:
- Upload file ke
/var/lib/mysql-files/(web server memiliki akses via groupwww-data). - Jalankan query:
LOAD DATA INFILE '/var/lib/mysql-files/your_upload.csv'
INTO TABLE your_table
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
- File akan dibaca MySQL tanpa error izin.
5. Catatan Keamanan
- Jangan gunakan
chmod 777pada folder ini → membahayakan server karena semua user bisa menulis file. - Selalu batasi akses hanya pada:
- Owner:
mysql - Group:
www-data(atau user web server yang sah)
- Owner:
- Folder ini tidak boleh diakses publik, karena bisa dimanfaatkan untuk menyisipkan file berbahaya.
6. Ringkasan Langkah Aman
| Langkah | Perintah |
|---|---|
| Ubah owner folder | sudo chown mysql:www-data /var/lib/mysql-files/ |
| Ubah permission folder | sudo chmod 770 /var/lib/mysql-files/ |
| Cek hasil | ls -ld /var/lib/mysql-files/ |
- Pastikan aplikasi web termasuk dalam group
www-data. - File yang dibuat MySQL dapat dibaca/tulis oleh web server sesuai kebutuhan.
✅ Kesimpulan:
Mengatur folder /var/lib/mysql-files/ dengan owner mysql dan group www-data plus permission 770 adalah cara paling aman dan efektif agar:
- MySQL tetap bisa menggunakan folder untuk
LOAD DATA INFILEatauSELECT INTO OUTFILE. - Web server bisa menaruh file untuk diproses MySQL.
- Keamanan server tetap terjaga.