본문 바로가기

about DEV/server - infra

Ubuntu 환경에서의 Database server 구축 (MySQL)

우분투 서버 환경에서 Database 서버를 구축하고, 기본적인 설정을 하는 것에 대한 기록을 남긴다.

기본 시스템 환경 파악 및 설정

IDC에 들어가있는, 서버의 OS 를 확인해보니

$ lsb_release -a

No LSB modules are available.
Distributor ID:    Ubuntu
Description:    Ubuntu 18.04.1 LTS
Release:    18.04
Codename:    bionic

Ubuntu 18.04.1 LTS 버젼이 설치되어있다.
free -h 으로 확인해보니, 아래와 같이 확인된다.

              total        used        free      shared  buff/cache   available
Mem:            31G        383M         29G        2.0M        1.5G         30G
스왑:         31G          0B         31G

swap 은 사용하지 않을 예정이기에, swapoff -a 명령어를 통해서 disable 설정을 진행한다.

- 2. 시스템 이름(hostname) 설정

Fully qualifield Domain name 을 사용해서 시스템 이름을 수정한다.
db 서버인 관계로 db.domain.com 으로 할 지정한다. 

$ vi /etc/hostname

db.domain.com 으로 수정하고, 재부팅 혹은, $ hostname -F /etc/hostname 을 실행 한 후, 재접속을 하면 변경된 것을 확인할 수 있다.

- 3. apt 업데이트 / 업그레이드 및 일반적으로 설치해야하는 기본 패키지들 설치

$ apt update
$ apt upgrade
$ apt install git unzip

 

MySQL 서버 설치 & 설정

apt 를 이용한 mysql 설치

$ apt install mysql-server

mysql 초기 설정

$ mysql_secure_installation

모두다 y 로 설정하고, 비밀번호 정책만 0으로 설정한다.

기본 언어셋 설정을 위한 작업

$ vi /etc/mysql/mysql.conf.d/override.cnf

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

query_cache_type = ON
query_cache_limit = 4M
query_cache_size = 64M

slow_query_log         = 1
slow_query_log_file    = /var/log/mysql/mysql-slow.log
long_query_time = 5

sql_mode = NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

이상태에서 MySQL 서비스를 재 실행하면, 설정된 characterset 으로 변경 된 것을 확인할 수 있다.

mysql 버젼업에 따른 secure policy 에 따라서, root 계정은 외부에서 접근할 수 없으며 오직 localhost Root 권한에게만 접근이 허용된다.
그래서 일단 root 를 제외한 super visor 계정을 만들어서 외부 접근이 가능하도록 해야한다. 
mysql cli 를 접속해보자. OS root 계정일 경우, auth socket plugin 을 통해서 별도 password 입력 없이 mysql 명령어만 치면 바로 mysql cli 에 접속할 수 있다.

mysql> INSERT INTO mysql.user (host,user,authentication_string,ssl_cipher, x509_issuer, x509_subject) VALUES ('%','supervisor',password('supervisor_password'),'','','');
mysql> GRANT ALL PRIVILEGES ON *.* TO 'supervisor'@'%' identified by 'supervisor_password';
mysql> FLUSH PRIVILEGES;
mysql> exit;

사용자를 추가한 후, 모든 권한을 모든 호스트에서 주기 위해 GRANT ALL PRIVILEGES 명령어를 때렸는데,  비밀번호가 입력되지 않으면 해당 명령어가 말을 듣지 않는다. -_-; 만약 password policy 어쩌구 메세지를 보게 된다면, identified by 가 추가되었는지 꼭 확인하기 바란다.

이제 외부에서 접속할 수 있도록 bind-address 를 풀어야한다. 

$ vi /etc/mysql/mysql.conf.d/override.cnf 

bind-address = 0.0.0.0 

bind-address 를 0.0.0.0 처리를 하면, 외부 접속이 모두 허용이 된다. 
이제 거의 모든 설정이 끝나간다. 

 

MySQL Data directory 변경

기본적으로 시스템이 설치되어있는 파티션은 250G 용량이라, 마운트해둔 1TB SSD 드라이브로 데이터 위치를 변경하려한다.
일단 mysql cli 를 접속한 후 다음 명령어를 입력한다.

mysql> select @@datadir;

그러면 기본적으로 /var/lib/mysql/ 라는 디렉토리로 설정이 되어있는 것을 확인할 수 있다.
일단 데이터 이전과 설정 변경 이전에 mysql service 를 종료한다. 명령어는 service mysql stop 이다.
이동하고자 하는 파티션을 확인한다. 필자의 경우  /data 디렉토리가 해당 파티션의 위치다.

$ rsync -av /var/lib/mysql /data/
$ chown -R mysql:mysql /data/mysql

rsync 를 통해서 데이터를 이전했다면, 소유자와 소유그룹을 root 에서 mysql 으로 바꿔주자.

이제 수정된 경로를 mysql.cnf 에 수정해주어야한다. 

$ vi /etc/mysql/mysql.conf.d/override.cnf 

[mysqld]
datadir=/data/mysql

거의 다 끝나갔지만, 한가지가 더 남아있다. AppArmor 에서 별칭을 등록해준다.

$ vi /etc/apparmor.d/tunables/alias
alias /var/lib/mysql/ -> /data/mysql/,

그리고 Apparmor 를 재시작해준다. service apparmor restart 
여기까지 되었다면, service mysql restart 를 때려 볼탠데, 막상 하면 안된다.
error 로그를 찾아보니 [ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable 라고 권한 이슈 발생.

새로 마운트한 파티션이라 그런가보다. OS 에서 권한을 줘야한다.

$ vi /etc/apparmor.d/local/usr.sbin.mysqld

.........
/data/ lrwk,
/data/** lrwk,
.........

그리고 service apparmor restart; service mysql restart 하면 완료

database 새로 만들고, table 새로 만들어보면 새롭게 설정된 디렉토리에서 잘 생성되는 것을 확인할 수 있다!