알게 된 이유는 MySQL을 패키지로 설치하고나서 데이터 디렉토리만 스토리지가 마운트 된 디렉토리가 이동시켰는데 아무리 삽질을 해도 MySQL이 제대로 시작이 안 되는 문제가 발생했다.
그래서 strace로 mysqld 바이너리의 시스템콜까지 추적하면서 원인을 찾아봤는데 데이터 디렉토리에 파일을 읽고 쓰지 못하는 권한 문제로 실행을 못하고 있었다. 그런데 퍼미션은 제대로 다 설정이 되었는데 참 귀신이 곡할 노릇이였다.
패키지로 설치해서 내부적으로 어딘가에서 데이터 디렉토리 경로가 박혀있을거라고 스스로 달래면서 소스 컴파일을 하려고 했는데.. 아무리 생각해도 우분투에 들어가있는 패키지가 이런 문제를 가지고 있을리는 없고, 다시 /etc/mysql/my.cnf 파일을 뒤적거리다가 이유를 찾았다.
my.cnf 파일에 보면 각종 경로가 변경되는 경우, 그리고 시스템이 AppArmor를 사용하는 경우에는 /etc/apparmor.d/usr.sbin.mysqld 파일도 변경해야 한다고 적혀있더라.
그래서 그 파일을 열어보니 아래와 같이 각종 디렉토리에 대한 접근 권한이 명시되어 있었다. OS의 디렉토리 접근 권한과는 별도로 권한 설정을 하는것 같다. 여기서 새로 바뀐 데이터 디렉토리를 반영해주니 정상적으로 MySQL이 실행되었다. :-)
단, AppArmor의 변경이 반영되도록 /etc/init.d./apparmor restart를 한번 해줘야 한다.
# vim:syntax=apparmor
# Last Modified: Tue Jun 19 17:37:30 2007
#include <tunables/global>
/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/my.cnf r,
/usr/sbin/mysqld mr,
/usr/share/mysql/** r,
/var/log/mysql.log rw,
/var/log/mysql.err rw,
/data/mysql/ r,
/data/mysql/** rwk,
/var/log/mysql/ r,
/var/log/mysql/* rw,
/var/run/mysqld/mysqld.pid w,
/var/run/mysqld/mysqld.sock w,
}

comments
comments rss (+댓글 쓰러가기)