데이터베이스를 배우기 위해 MySQL을 사용하고 있다.
처음에는 테이블에 데이터를 INSERT 명령어를 사용하여 하나씩 입력했다.
점점 불편함을 느껴 외부 파일에서 데이터를 읽어 테이블에 적재하는 방법이 쓰려 했다.
"LOAD DATA INFILE"명령으로 외부 파일을 읽어 올 때 뜬금 없는 오류가 발생했다.
1. "LOAD DATA INFILE" 시도할 때 "ERROR 13" 발생.
mysql> load data infile '/home/DB/sampbd/d2013_52.txt' into table student;
ERROR 13 (HY000): Can't get stat of '/home/DB/sampbd/d2013_52.txt' (Errcode: 2)
2. 해결책 발견
읽어올 외부 파일의 권한을 777로 변경했으나 동일 문제 발생.
문제는 AppArmor("Application Armor")란 리눅스 보안모듈이 MySQL의 권한을 제한하고 있는 것이다.
2.1 [sudo aa-status] 사용하여 현재 AppArmor 정책 확인.
hyunmu@hyunmu:/etc/mysql$ sudo aa-status
[sudo] password for hyunmu:
apparmor module is loaded.
21 profiles are loaded.
21 profiles are in enforce mode.
/sbin/dhclient
/usr/bin/evince
/usr/bin/evince-previewer
/usr/bin/evince-previewer//sanitized_helper
/usr/bin/evince-thumbnailer
/usr/bin/evince-thumbnailer//sanitized_helper
/usr/bin/evince//sanitized_helper
/usr/lib/NetworkManager/nm-dhcp-client.action
/usr/lib/connman/scripts/dhclient-script
/usr/lib/cups/backend/cups-pdf
/usr/lib/lightdm/lightdm-guest-session
/usr/lib/lightdm/lightdm-guest-session//chromium
/usr/lib/telepathy/mission-control-5
/usr/lib/telepathy/telepathy-*
/usr/lib/telepathy/telepathy-*//pxgsettings
/usr/lib/telepathy/telepathy-*//sanitized_helper
/usr/lib/telepathy/telepathy-ofono
/usr/sbin/cups-browsed
/usr/sbin/cupsd
/usr/sbin/mysqld
/usr/sbin/tcpdump
0 profiles are in complain mode.
5 processes have profiles defined.
5 processes are in enforce mode.
/sbin/dhclient (760)
/usr/lib/telepathy/mission-control-5 (2864)
/usr/sbin/cups-browsed (1066)
/usr/sbin/cupsd (1904)
/usr/sbin/mysqld (1080)
0 processes are in complain mode.
0 processes are unconfined but have a profile defined.
mysqld가 강제 모드에 포함되어 있어서 쓰기를 거부하는 것이다.
AppArmor가 쓰기 / 액세스를 차단하면 항목이 / var / log / 에 기록된다.
해야하는 일은 /etc/apparmor.d/usr.sbin.mysqld를 편집하고 / data / 및 / data / *를 아래와 같이 추가하는 것이다.
2.2 etc/apparmor.d/usr.sbin.mysqld를 편집
[수정 전]
/usr/sbin/mysqld {
#include <abstractions/base>
#include <abstractions/nameservice>
#include <abstractions/user-tmp>
#include <abstractions/mysql>
#include <abstractions/winbind>
capability dac_override,
capability sys_resource,
capability setgid,
capability setuid,
network tcp,
/etc/hosts.allow r,
/etc/hosts.deny r,
/etc/mysql/*.pem r,
/etc/mysql/conf.d/ r,
/etc/mysql/conf.d/* r,
/etc/mysql/*.cnf r,
/usr/lib/mysql/plugin/ r,
/usr/lib/mysql/plugin/*.so* mr,
/usr/sbin/mysqld mr,
/usr/share/mysql/** r,
/var/log/mysql.log rw,
/var/log/mysql.err rw,
/var/lib/mysql/ r,
/var/lib/mysql/** rwk,
/var/log/mysql/ r,
/var/log/mysql/* rw,
/var/run/mysqld/mysqld.pid rw,
/var/run/mysqld/mysqld.sock w,
/run/mysqld/mysqld.pid rw,
/run/mysqld/mysqld.sock w,
/sys/devices/system/cpu/ r,
# Site-specific additions and overrides. See local/README for details.
#include <local/usr.sbin.mysqld>
}
[수정 후]
/var/run/mysqld/mysqld.pid rw,
/var/run/mysqld/mysqld.sock w,
/run/mysqld/mysqld.pid rw,
/run/mysqld/mysqld.sock w,
**/home/hyunmu/DB/sampdb/ r,
/home/hyunmu/DB/sampdb/* rw,**
/sys/devices/system/cpu/ r,
# Site-specific additions and overrides. See local/README for details.
#include <local/usr.sbin.mysqld>
3. 정상동작 확인.
mysql> load data infile '/home/hyunmu/DB/sampdb/s2013_52.txt' into table student; Query OK, 5 rows affected (0.05 sec) Records: 5 Deleted: 0 Skipped: 0 Warnings: 0 |
MySQL 재실행 후 외부 파일 읽기가 정상동작하는 것을 확인하였다.