Post

데이터베이스 서버로 데이터베이스 옮기기

들어가며


프로젝트를 진행함에 따라 관리해야 할 인스턴스 개수가 늘어났다.

그리고 데이터베이스 또한 매번 설치하고 개별로 관리하고 있었다.

매번 같은 작업을 반복하는 데에 불편함을 느끼고 있었고 마침 인스턴스 내의 데이터베이스와 통신이 제대로 동작하지 않아서 이참에 데이터베이스 서버를 구축하기로 정했다.

데이터베이스의 데이터를 새로운 데이터베이스 서버로 옮겨보자.

데이터 베이스 서버


Google Cloud Platform 을 활용해서 우분투로 인스턴스를 생성해주고 MySQL 을 설치한뒤 3306 허용 방화벽을 설정해주었다.

  • 우분투 방화벽 설정
    1
    
    sudo ufw allow 3306/tcp
    
  • GCP 방화벽 설정
    1
    2
    
    VPC 네트워크 -> 방화벽 -> 방화벽 규칙 만들기 -> 3306 포트 허용 , 태그로 설정
    -> 인스턴스에 생성한 태그를 네트워크 태그에 추가
    

MySQL(8.0.33) 은 보안상의 이유로 기본적으로 외부 접속을 막아둔 상태이기 때문에 외부 접속 허용 설정을 해야한다.

/etc/mysql/mysql.conf.d/mysqld.cnf 혹은 etc/mysql/my.cnf 에 접속하여 bind-address 을 주석처리한다면 모든 IP 주소에서 접근을 허용한다.

1
2
3
#bind-address           = 127.0.0.1
혹은
bind-address           = 0.0.0.0

bind-address 는 MySQL 구성파일에서 설정되는 옵션 중 하나로 설정이 되어 있으면 그 주소로 들어오는 IP만 바인딩되어 연결을 허용합니다. 그렇지 않으면 거부합니다.

MySQL 8.0.13 부터 bind-address에 콤마로 허용하는 IP 주소를 여러개 둘 수 있다고 했는데 왜 난 안되지

이렇게 외부 IP 주소로 접속을 허용했다면 사용하고자하는 데이터베이스에 접근 권한을 최소로 해야한다.

데이터베이스 백업과 복원


기존의 인스턴스의 데이터베이스를 새로운 데이터베이스에 옮기는 방법 중 하나는 데이터베이스 백업과 복원 기능을 사용하는 것이다.

MySQL 의 데이터베이스 백업 명령어는 다음과 같다.

1
mysqldump -u [mysql 사용자ID] -p --add-drop-table --set-charset --default-character-set=utf8 [백업 할 데이터베이스 명] > [생성 할 파일 명] 

그러면 백업 파일이 생성되고 이를 로컬 컴퓨터로 가져온 뒤 데이터베이스 서버에 전송한다.

백업 파일을 로컬로 가져오고 다시 원격 서버로 전송하는 방법은 로컬에서 SSH 키를 생성하고 클라우드 인스턴스에 SSH 공개키를 등록한 후 FileZilla 를 사용하였다.

그 다음 MySQL 의 데이터베이스 백업 파일을 복원하기 위해서 복원할 데이터베이스를 생성해준다.

1
create database [복원할 데이터베이스 명];

그리고 MySQL 의 데이터베이스 복원 명령어를 수행

1
mysql -u [mysql 사용자ID] -p [복원할 데이터베이스 명] < [백업 파일]

사용자 생성하고 연결


  • root 권한을 가진 사용자로 mysql 접속
    1
    
    mysql -u [사용자 아이디] -p
    
  • 복원한 데이터베이스를 사용할 사용자를 생성해줍니다.
    1
    
    create user [생성할 유저 아이디]@[이 사용자가 접속할 수 있는 IP] identified by '[비밀 번호]';
    

    이때 [이 사용자가 접속할 수 있는 IP] 를 설정함으로써 해당 유저아이디와 패스워드를 가진 사용자가 해당 IP 로만 접속할 수 있도록 설정해줍니다.

  • 사용자 정보 조회
    1
    
    SELECT USER, HOST FROM mysql.user;
    

    사용자 정보 조회 쿼리로 사용자 생성이 되었는지 확인해줍니다.

  • 생성한 사용자에게 특정 데이터베이스 접근 권한 주기
    1
    
    grant all privileges on [database].[table] to [생성할 유저 아이디]@[이 사용자가 접속할 수 있는 IP];
    

    마찬 가지로 생성한 유저가 사용할 database.table 만 설정하여 다른 데이터베이스에는 접근할 수 없도록 제한해줍니다.

마치며


bind-address에서 접속 허용 IP 주소를 여러 개 설정할 수 있었다면 좋았을 것이다.

하지만 그렇지 않았기에 외부 IP 주소를 모두 허용해 준 뒤 사용자가 접속할 수 있는 IP를 설정하고 사용자가 접근할 수 있는 데이터베이스에만 권한을 부여함으로써 보안 문제를 해결했다.

데이터베이스 서버를 구축하니 이제 데이터베이스를 설치하고 설정하는 작업이 간소화되었다.

This post is licensed under CC BY 4.0 by the author.