반응형
mariadb_10.4_setup

MariaDB 10.4 install / CentOS 7

CentOS 7.9에서 mariaDB 10.4 설치하다 디스크 공간 문제를 고려하여 경로 변경하는 중 계속된 실패로 삽질을 한 참 하였다.

  • 일단 전에 설치된 DB를 지우고 시작.
// 서비스 중지
$systemctl stop mariadb

[패키지 삭제]
$yum remove Maria*

// 전에 설치한 디폴트 경로
$rm -rf /var/lib/mysql

패키지 다운로드 및 기본 설치

yum으로 설치

// MariaDB yum repo 등록
$ vi /etc/yum.repos.d/MariaDB.repo

아래의 내용을 작성한다.

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
// MariaDB 설치
$ yum install MariaDB

// 설치된 버전 확인
$ rpm -qa | grep MariaDB
MariaDB-compat-10.4.17-1.el7.centos.x86_64
MariaDB-common-10.4.17-1.el7.centos.x86_64
MariaDB-server-10.4.17-1.el7.centos.x86_64
MariaDB-client-10.4.17-1.el7.centos.x86_64
또는
$ yum list installed Maria*
Installed Packages
MariaDB-client.x86_64                                10.4.17-1.el7.centos                                @mariadb
MariaDB-common.x86_64                                10.4.17-1.el7.centos                                @mariadb
MariaDB-compat.x86_64                                10.4.17-1.el7.centos                                @mariadb
MariaDB-server.x86_64                                10.4.17-1.el7.centos                                @mariadb

// 버전 확인
$ mariadb --version
mariadb  Ver 15.1 Distrib 10.4.17-MariaDB, for Linux (x86_64) using readline 5.1

기본적으로 /var/lib/mysql에 설치된다.

  • 서비스 실행 및 암호 설정
// mariadb 실행
$ systemctl start mariadb

// 패스워드 설정
$ /usr/bin/mysqladmin -u root password '패스워드'

// 포트 확인
$ netstat -anp | grep 3306
tcp6       0      0 :::3306                 :::*                    LISTEN      102252/mysqld
  • DB 생성 및 초기화 / 사용자 생성
$ mysql -u root -p
> use mysql ;

[사용자 추가]
create user 'crazyj'@'%' identified by 'crazyj00.';
create user 'crazyj'@'localhost' identified by 'crazyj00.';
flush privileges ;

[DB생성]
create database CRAZYJ_DB ;
grant all privileges on CRAZYJ_DB.* to 'crazyj'@'%';
grant all privileges on CRAZYJ_DB.* to 'crazyj'@'localhost';
flush privileges ;


[사용자 패스워드 변경]
ALTER user 'crazyj'@'localhost' IDENTIFIED WITH mysql_native_password BY '새패스워드';
또는 아래와 같이 설정
ALTER user 'crazyj'@'localhost' IDENTIFIED BY '새패스워드';
ALTER user 'crazyj'@'%' IDENTIFIED BY '새패스워드';
flush privileges ;

여기서 기본 경로가 /var/lib/mysql 인데 추후 디스크 공간을 고려하면 다른 파티션으로 옮기고 싶어졌다.
여기서 문제가 시작됨…

데이터 경로 위치 변경

쉽게 생각하면… DB 서비스 중지하고,
/var/lib/mysql 폴더를 용량큰 파티션으로 이동하고
기존 경로를 링크를 걸어주면 끝.
이라고 생각하지만, 여러가지 원인으로 실패할 수 있다.

결론부터 말하면

  1. selinux (접근통제)도 off 해줘야 한다.
  2. mariadb 기본설정에서 /root 나 /home 경로로 이동을 막고 있다.
    설정을 바꾸면 해결됨.
  • selinux off
# getenforce
Enforcing
# setenforce 0
# getenforce
Permissive
#
#vi /etc/selinux/config
--------------
#SELINUX=enforcing
SELINUX=disabled
------------
  • mariadb 서비스 설정 변경
$ systemctl stop mariadb
$ vi /usr/lib/systemd/system/mariadb.service
--------------------
# Prevent accessing /home, /root and /run/user
#ProtectHome=true
ProtectHome=false
------------------------
  • DB 링크 설정하고 서비스 시작.
$ mv /var/lib/mysql /home/mysql
$ ln -s /home/mysql /var/lib/mysql

$ systemctl start mariadb

끝.

참고) 아래는 시도 과정…

아예 처음부터 새로 만들자. 디폴트 경로 변경
$ vi /etc/my.cnf.d/server.cnf
아래 섹션에 추가
------------------------
[mysqld]
datadir=/home/data/mysql
socket=/home/data/mysql/mysql.sock
-----------------

$ vi /etc/my.cnf.d/mysql-clients.cnf
아래를 추가 (client 섹션이 없어서 추가)
-----------------
[client]
socket=/home/data/mysql/mysql.sock
----------------

$ cd /bin
$ mariadb-install-db --user=mysql
위 설정파일에서 지정된 경로에서 초기화됨!!!! 
(--user 옵션을 생략하면 root 계정으로 생성됨)

위와 같이 하면 되야 되는데… 서비스 실행시 그래도 에러발생???

  • centOS7의 selinux 기본 정책으로 실패???

  • selinux 관련 설정 변경

$ yum install policycoreutils-python
  
$ ls -lZ /var/lib/mysql
$ cp -rf /var/lib/mysql /home/data/mysql
$ chown -R mysql:mysql /home/data/mysql
$ ls -lZ /home/data/mysql

$ vi my.cnf
datadir=/home/data/mysql

$ semanage fcontext -a -t mysqld_db_t "/home/data/mysql(/.*)?"

$ grep -i mysql /etc/selinux/targeted/contexts/files/file_contexts.local

$ restorecon -R -v /home/data/mysql

$ ls -lZ /home/data/mysql
-----------------------------------
위와 같이 했는데도 결국 안되서 selinux 옵션을 끄기로...

# getenforce
Enforcing
# setenforce 0
# getenforce
Permissive
#
#vi /etc/selinux/config
--------------
#SELINUX=enforcing
SELINUX=disabled
------------

위와 같이 해도 selinux를 off했음에도 실패했음.

원인은… 기본적으로 centos에서 mariadb는 /home, /root 경로를 사용할 수 없다나…
아니, 이런 설정도 있었나??? 헐… 삽질만…

데이터 폴더 이동 방법 찾던 중 발견.

$ systemctl stop mysql
$ mkdir -p /home/data/mysql

$ cp -rf /var/lib/mysql /home/data/mysql
$ chown -R mysql:mysql /home/data/mysql
(나중에 정상작동 확인후, 기존data인 /var/lib/mysql은 삭제)

==================> 이 문제였음. <===================
$ vi /usr/lib/systemd/system/mariadb.service
# Prevent accessing /home, /root and /run/user
#ProtectHome=true
ProtectHome=false
==================> 이 문제였음. <===================

서비스 시작
$ systemctl start mysql

Author: crazyj7@gmail.com

+ Recent posts