CentOS 7, MariaDB 10.0 에서 MariaDB 10.5 Upgrade, MariaDB Directory 변경

두 대의 CentOS 7에서 같은 버전의 MariaDB 10.0을 MariaDB 10.5로 업데이트 해 보았다.  차이가 있다면 오래된 구형의 PC에 설치된 서비스 서버는 CentOS 7.6이며 mariadb도 mysql 5.3 버전부터 MariaDB10.0 버전을 거쳐 10.5로 업그레이드, 마이그레인션 작업을 진행해 왔었고 비교적 신형의 PC는 CentOS 7.9버전에 MariaDB10.0 버전에서 바로 10.5로 업그레이드 했다. 두 PC 모두 100G 정도의 DB가 설치되어 있었고 동일한 프로그램으로 동일하게 조회가 되도록 서비스가 복제되어 있는 상태에서 업그레이드가 진행되었다. 단, 데이터 디렉토리는 두 PC 모두 별도의 디렉토리에 설정되어 있었다.

  1.  DB Backup

   모든 DB 작업 전에는 Backup이 필수적이다. 당연히 Full Backup을 진행해야 하고 mysqldump 를 이용하여 모든 데이터베이스를 백업하였다.

root:/root> mysql -u root -p --all-databases | gzip -c > mysql_20210405.sql.gz
Enter Password : xxxxxxxxxx <Enter>

2. MariaDB 10.0 삭제

현재 사용중인 MariaDB 10.0은 삭제를 해 준다.

root:/> systemctl stop mysqld
root:/> yum remove mysql-server MariaDB-server MariaDB-client

3. MariaDB 10.5 설치

/etc/yum.repos.d/MariaDB10.repo 파일의 내용(10.0 -> 10.5로 )을 수정해 준다.

# MariaDB 10.0 CentOS repository list - created 2014-10-13 13:04 UTC 
# http://mariadb.org/mariadb/repositories/ 
 
[mariadb]  
name=MariaDB
#(10.0을 10.5로 고친다) 
baseurl=http://yum.mariadb.org/10.5/centos7-amd64 
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB 
gpgcheck=1

파일 수정 후 프로그램을 설치한다.

root:/> yum install MariaDB-server MariaDB-client

4. 서비스 시작

프로그램 설치가 끝났으면 MariaDB 서비스를 시작한다.

root:/> systemctl start mariadb

정상적으로 접속이 되는 지 mysql 로 접속하여 확인한다.

5. 데이터 디렉토리 변경

프로그램 설치가 끝난 다음 mysql/mariadb의 home directory인 /var/lib/mysql을 변경해야 할 경우에는 Default Directory 에 있는 파일을 복사한다.

root:/> rsync -av /var/lib/mysql/* /data/mysql 
(rsync는 cp명령에 비해 소유자, link, permission을 그대로 복사해 주므로 편리하다. 만약 rsync가 설치되어 있지 않으면 복사한 다음 owner와 permission을 맞춰 주거나 tar로 묶어서 옮겨 풀어주어야 한다. )

서비스를 시작하기 전에 /etc/my.cnf.d/server.cnf 파일에 다음의 내용을 추가한다.

[server]
datadir=/data/mysql   <- 데이터가 저장될 새로운 디렉토리 
socket=/data/mysql/mysql.sock 
innodb_data_home_dir=/data/mysql

파일 저장 후 mariadb 서비스를 시작한다.

root:/> systemctl start mariadb

이 때, mariadb가 정상적으로 시작하지 못하고 에러가 발생하면 다음의 경우를 확인한다. ( MariaDB 10.5 기준 )

  • 새로 지정한 data /home directory의 소유자(owner)와 권한(permission)을 확인한다. (directory의 소유자는 mysql이어야 하며 directory 내 각 파일의 소유자 모두 mysql로 되어 있어야 하며 read/write 권한을 가져야 한다)
  • selinux로 설정되어 있는 경우 selinux에서 mariadb 관련 directory를 등록해 주어야 한다.
  • selinux가 enable 되어 있지 않음에도 불구하고 계속 permission error가 발생하며 시작되지 않는 경우 /usr/lib/systemd/system/mariadb.service 파일의 다음 항목을 수정하여 저장한다.
ProtectSystem=full -> off 로 변경
ProtectHome=true -> false 로 변경

이 부분은 mariadb 자체적으로 home directory를 /home이나 /root directory 등으로 변경하지 못하도록 막는 역할을 하므로 off와 false로 각각 변경해 주어야 한다.

7. 기타

mariadb의 home directory를 변경한 경우 permission error가 발생할 수 있고 속도가 느려질 수 있으므로 속도가 빠른 ssd에 mysql directory가 있도록 ( /var/lib/mysql은 system directory이므로 ssd를 booting disk로 사용하는 경우 ssd에 위치하게 된다 ) 설정하여 사용하는 것이 performance에 도움이 된다.

부득이하게 data directory를 변경 하는 경우 /var/lib/mysql 의 파일을 복사할 때 데이터 호환성 문제가 발생하는 경우가 있다. 즉, mariadb는 겨우겨우 start가 되었는데 실제 쿼리를 실행할 때 에러가 발생하고 쿼리를 실행하지 못하는 경우가 있다. 이 때는 1번 단계에서 full backup 받아 둔 데이터로 모두 restore하는 것이 가장 시간 낭비를 적게 하는 길이다.

root:/root> gunzip -c mysql_20210405.sql.gz | mysql -pxxxxx -uroot