[Pangtudy-web] MySQL 설치 및 DB 생성, 외부 접속 계정 설정

MySQL 설치 (8.x)

sudo apt-get update
sudo apt-get install mysql-server

포트 및 외부접속 활성화

sudo ufw allow mysql
sudo ufw allow out 3306/tcp
sudo ufw allow in 3306/tcp
sudo systemctl start mysql
sudo systemctl enable mysql

가장 먼저 아래 세팅이 필요할 것이다. 계정 설정, 권한 설정이 모두 완료되어도 access denied 가 발생할 수 있다.

접속 에러가 날 때는 아래 명령어로 mysqld.cnf 설정 파일을 연다.

sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

이곳에서 bind-address=0.0.0.0 으로 바꾸거나 주석처리를 한다.

계정 생성 및 확인 쿼리

mysql 에 관리자 권한으로 접속

sudo mysql -u root -p

이후 계정 생성을 해준다.

# CREATE USER 'USER_ID'@'ACCESS_ADRESS' IDENTIFIED BY 'PASSWORD'
CREATE USER 'pangtudy'@'%' IDENTIFIED BY 'Qwerasdf!'

생성된 사용자 정보는 아래 쿼리로 확인해 볼 수 있다.

# 사용자 정보 확인
SELECT USER, HOST, AUTHENTICATION_STRING FROM MYSQL.USER;

생성된 계정의 비밀번호도 바꿀 수 있다. 이를 꼭 수행해주는 것이 중요하다. application.properties 값에 저장된 비밀번호로 바꿔주어야 access denied 에러를 피할 수 있다.

# 비밀번호 변경 (8.x 기준)
ALTER USER 'pangtudy'@'%' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY '1234';

# 변경 사항 적용
FLUSH PRIVILEGES;

적용된 사항을 확인하기 위해 아래 쿼리로 가장 최근에 변경된 내용이 현재 시간과 일치하는지 확인한다.

# password  최근 언제 변경되었는지 확인
# authentication_string  암호화되어 저장되었음
select host, user, plugin, authentication_string, password_last_changed from mysql.user;

권한 부여

계정 생성 후에는 해당 계정에 접근 권한과 명령 권한을 부여해야 한다.

생성한 계정에 권한을 부여하는 방법을 살펴보자. 아래 명령어로 mysql 데이터베이스에 접속해 사용자 목록을 확인해본다.

# mysql 스키마를 사용함을 명시 (mysql.[] 으로 쓰기 가능)
use mysql;

# mysql 5.x 에서는 password 가능
select host, user, password from user;

# mysql 8.x 에서는 authentication_string 대체
select host, user, authentication_string from user;

위에서 생성한 사용자에게 아래 쿼리를 통해 권한을 부여할 수 있다.

# DB.TABLE 권한 부여 (모든 권한) 부여
GRANT ALL PRIVILEGES ON *.* TO 'pangtudy'@'%' IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'pangtudy'@'%';

# 특정 권한만 부여 : select, insert, update, delete
GRANT select, insert, update, delete ON 'PANGTUDY'.* TO 'pangtudy'@'%';

아래 명령어로 부여된 계정 권한을 확인할 수 있다.

# CREATE 권한 있는지 확인
SELECT USER, HOST, CREATE_PRIV FROM USER;

# 또는
SHOW GRANTS FOR `pangtudy`@'%';

계정 삭제

만약 특정 게정을 삭제하고 싶다면 아래 쿼리를 사용하자.

# 사용자 정보 삭제
drop user 'pangtudy';
drop user 'pangtudy'@'%';

데이터베이스 생성

먼저 현재 존재하는 데이터베이스 스키마를 확인하려면 아래 명령어를 입력해본다.

# 현재 생성된 데이터베이스
show databases;

그 후 개발에 활용할 데이터베이스를 생성한다.

# 'PANGTUDY' 라는 이름으로 데이터베이스 생성
create database 'PANGTUDY';

# 'PANGTUDY' 라는 이름으로 default character set  utf8  생성
create database 'PANGTUDY' default character set utf8;

다시 한 번 show databases; 명령어를 통해 생성된 DB를 확인해보자.

데이터베이스 삭제

데이터베이스를 삭제하는 방법은 간단하다.

# drop 으로 database 삭제
drop database 'PANGTUDY';

MySQL 한글 깨짐 문제

만약 INSERT 명령에 java.sql.SQLException: Incorrect string value: ‘\xEC\x84\x9C\xEC\x9A\xB8…’ for column ‘address’ at row 1 오류가 발생하면 근본적으로 데이터베이스 character set 을 변경해야 한다.

MySQL 에서 명시적으로 charset 을 설정하지 않으면 기본 charset 이 적용된다. 이를 해결하기 위해 아래 과정으로 config 파일에 인코딩 속성을 적용한다.

먼저 whereis mysql 명령어로 MySQL 의 config 위치를 찾는다. 보통 /etc/mysql 에 있는데, cd /etc/mysql 로 해당 디렉토리로 이동한다. 그리고 sudo vim my.cnf 를 통해 편집기를 열어 아래 내용을 맨 밑에 입력하고 저장한다.

[mysql]
default-character-set = utf8

[client]
default-character-set = utf8

[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci
init_connect=’SET NAMES utf8’

끝으로 sudo service mysql restart 명령으로 서비스를 재시작한다. 이후 MySQL에 접속해 STATUS 또는 SHOW VARIABLE LIKE 'char%'; 를 입력했을 때, 아래와 같이 나타나면 적용이 완료된 것이다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

기존에 생성된 테이블은 아래와 같은 방법으로 charset 을 변경할 수 있다.

alter table 'PANGTUDY' convert to character set utf8;

간혹 utf8mb4 가 초기 값으로 잡혀있는 경우가 있다. 결론부터 얘기하자면 utf8mb4는 emoji 값까지 입력 가능하다.

데이터베이스 및 테이블 인코딩 정보 확인

먼저 데이터베이스 인코딩 정보 확인 쿼리를 살펴보자.

# 데이터베이스 인코딩 확인
SELECT default_character_set_name, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA 
WHERE schema_name = "PANGTUDY";

다음은 테이블의 기본 타입과 인코딩 정보를 살펴보는 쿼리다.

SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA='PANGTUDY';

# 테이블 이름만 조회
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA='PANGTUDY';

해당 테이블에 어떤 컬럼들이 있는지를 확인하려면 아래 쿼리를 사용해 조회해보자.

SELECT *
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE TABLE_SCHEMA='PANGTUDY'  
   AND TABLE_NAME='테이블명';

Updated:

Leave a comment