서비스를 재시작하면 다음과 같은 오류를 남기고 기동이 멈춘다.
Fatal error: Can't open and lock privileges tables: Table 'mysql.user' doesn't exist
권한 테이블이 들어 있는 시스템 데이터베이스 mysql 을 열지 못했다는 뜻이다. 데이터 디렉터리가 비었거나, 초기화를 하지 않은 채 기동했거나, 소유권·권한이 틀어졌거나, 파일이 손상된 것이다.
먼저 데이터 디렉터리 위치를 확인한다. 설정 파일을 짐작하지 말고 실제 값을 본다.
mysqld --verbose --help 2>/dev/null | grep -A1 'Default options'
my_print_defaults mysqld | grep -i datadir
그 디렉터리에 mysql/ 하위 디렉터리와 테이블 파일이 있는지 본다.
ls -al /var/lib/mysql/
ls -al /var/lib/mysql/mysql/ | head
mysql/ 자체가 없으면 초기화가 되지 않은 것이고, 있는데 소유자가 mysql 이 아니면 권한 문제다.
chown -R mysql:mysql /var/lib/mysql
chmod 750 /var/lib/mysql
systemctl restart mariadb
SELinux 가 켜진 RHEL 계열에서 데이터 디렉터리를 옮겼다면 레이블도 함께 봐야 한다.
ls -Z /var/lib/mysql | head
restorecon -Rv /var/lib/mysql
데이터 디렉터리가 비어 있다면 초기화한다. 기존 사용자 데이터가 남아 있는 디렉터리에는 실행하지 않는다.
MariaDB 는 mariadb-install-db(예전 이름 mysql_install_db)를 쓴다.
mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql
MySQL 5.7 이상은 명령이 다르다. mysql_install_db 는 없어졌다.
mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql
둘을 섞어 쓰면 안 된다. 설치된 것이 MariaDB 인지 MySQL 인지 mysqld --version 으로 먼저 확인한다.
초기화로 만든 시스템 테이블에는 기존 계정과 권한이 없다. 사용자 데이터베이스 파일이 남아 있어도 계정은 다시 만들어야 한다. 백업이 있으면 백업의 mysql 데이터베이스를 함께 복원하는 편이 빠르다.
InnoDB 테이블스페이스 파일(ibdata1, ib_logfile*)과 테이블 파일을 손으로 지우면 남은 데이터도 함께 잃는다. 반드시 디렉터리 전체를 먼저 복사해 두고 작업한다.