mysql 을 사용하고 있는데 데이터 양이 너무 많아지다보니 리눅스 서버 용량에 부하가 걸리기 시작했다.

use 퍼센트가 90% 가량을 찍어가면서 덤프 데이터까지 넣으니 중간에 에러가 나면서 

데이터 insert 는 물론 select 에도 에러를 뱉어냈다. ㅠㅠ 

 

서버 용량을 살펴보니 mysql 이 설치되어있던 SSD 는 full 인데 HDD 1T 는 놀고있는것을 발견했다. 

ㅎ...

mysql database 저장소 변경을 진행한다.  

 

 


 

[환경]

CentOS 7.7

Mysql 8.0.18

 

 

1.  현재 mysql 데이터베이스 저장 경로 확인하기

[root@localhost ~]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7472
Server version: 8.0.18 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select @@datadir;
+-------------------+
| @@datadir         |
+-------------------+
| /var/lib/mysql/   |
+-------------------+
1 row in set (0.00 sec)

mysql>

- root 계정으로 로그인

- select @@datadir; 으로 기본 데이터 저장소 확인

- 확인 후 quit; 으로 종료한다. 

 

 

 

2.  mysql 서버 종료

$ systemctl stop mysqld

- 환경 설정 변경을 위해 mysql 을 종료한다.

 

 

 

3.  변경할 신규 저장디렉토리 생성

# 신규 경로의 디렉토리 생성
$ mkdir /home/sunny/database

# mysql 복사  
$ rsync -av /var/lib/mysql /home/sunny/database/

# mysql 권한 부여
$ chown -R mysql:mysql /home/sunny/database/mysql

- rsync 작업 시 기존 스키마들을 모두 복사하여 가져온다. 

 

 

 

4.  mysql 설정파일 변경

# mysql 설정파일 조회
vi /etc/my.cnf


-----------


#datadir=/var/lib/mysql
#socket=/var/lib/mysql/mysql.sock
datadir=/home/sunny/database/mysql
socket=/home/sunny/database/mysql/mysql.sock

- 파일의 datadir 와 socket 경로를 생성한 디렉토리로 변경한다.

- 이때 기존 경로를 주석하는 과정에서 #사이에 띄어쓰기는 하면 안됨... 이것때매 안되서 엄청 헤맸다 ㅠㅠ 

 

 

 

5.  SElinux 보안 추가

$ semanage fcontext -a -t mysqld_db_t "/home/sunny/database/mysql(/.*)?"
$ restorecon -R /home/sunny/database/mysql

- 프로세스에 새로 권한을 추가해주었기 때문에 해당 경로의 selinux 보안 컨텍스트를 추가해주어야한다.

- 추가 하지 않으면 mysql 실행시 permission 에러가 발생한다. 해당 에러내용은 /var/log/audit/audit.log 에서 확인 가능하다.

- 안된다고 selinux 를 해제하는것은 매우 위험하다. 인터넷 연결이 되어있으면 가급적 해제는 비추한다.

- 설정이 잘 되었는지는 semanage fcontext -l | grep mysql 으로 확인하면 된다.

$ semanage fcontext -l | grep mysql
$ /home/sunny/database/mysql(/.*)?        all files          system_u:object_r:mysqld_db_t:s0

 

 

 

6. mysql 재실행

$ systemctl start mysql

- 재실행 후 1번 과정으로 디렉토리가 변경되었는지 확인한다. 

- 정상적으로 변경되었으면 성공! 추가 데이터를 넣으면 앞으로 mysql data는 설정한 경로로 들어간다. 

 

 

 

 

*** 정상적으로 실행이 안될경우! 

$ ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

실행하려고 하니 위와같이 소켓 에러가 발생했다. 분명 socket 경로를 변경해주었는데도 기존의 소켓경로를 찾는다. 

일단 새로 설정한 (my.cnf) 경로로 링크를 설정한다. 

$ ln -sf /home/sunny/database/mysql.sock /var/lib/mysql/mysql.sock

 

 

 

 

[ 참고 ]

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=yswon72&logNo=56982175  

 

[mysql] MySQL Socket 에러 발생시...

### MySQL Socket 에러 발생시... Mysql 데이터베이스를 관리하다 보면 여러가지 에러메시지를 만나...

blog.naver.com

 

'Database > Mysql' 카테고리의 다른 글

[MySQL/Linux] 덤프 파일 생성 스케줄링 및 복원  (0) 2021.04.14