8 minute read

MariaDB

마리아DB(MariaDB) 이란?

: MariaDB는 MySQL 개발자들이 오라클에서 뛰쳐나와 만든 MySQL의 클론 버전이다.

마리아DB(MairaDB) vs 오라클 차이점

참고블로그 이동

MariaDB 구축

MariaDB 설치

: apt-get 명령어로 설치를 진행한다.

  1. 패키지 업데이트 선행
    sudo apt-get update
    sudo apt-get upgrade
    
  2. apt-get 명령어로 설치
    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install mariadb-server 
    
  3. 정상 테스트 ```bash //mariaDB 서비스 시작 명령어 $ service mariadb start

//mariaDB 상태확인 ps -ef | grep mysql netstat -antp - grep mysql

//mariaDB 시작 명령어 //mysql -u [유저명] $ mysql -u root -p

// mysql 이라는 데이터베이스의 root계정 // 비밀번호 셋팅을 확인! MariaDB [(none)]> select user, host, password from mysql.user;



4. 설치완료

## MariaDB 보안 초기설정
: 설치가 완료된 후에는 다음 명령어를 사용하여 DB의 root 패스워드 및 각종 보안 설정을 해준다.

```bash
$ sudo mysql_secure_installation

> 설정 1 : Set root password? [Y/n] y 
> - ⇒ DB의 root #초기 패스워드를 설정합니다. 기본적으로 설치시에는 #DB의 패스워드가 없기때문에 y를 눌러서 무조건 #설정해줍시다
> 
> 설정 2 : Remove anonymous users? [Y/n] y 
> - ⇒ #익명 사용자를 제거합니다. 보안상 y 해줍시다
> 
> 설정 3 : Disallow root login remotely? [Y/n] n 
> - ⇒ 원격 제어 여부입니다. 우리는 원격 제어를 위해 n #을 해줍니다
> 
> 설정 4 : Remove test database and access to it? [Y/n] y 
> - ⇒ 초기 테스트 DB 삭제 여부입니다. 사용을 #할꺼면 n 아니면 y 을 해줍시다. 저는 제가 만들어서 #테스트 할꺼라서...삭제!!
> 
> 설정 5 : Reload privilege tables now? [Y/n] y 
> - ⇒ #DB reload 를 통한 지금까지의 설정 저장 여부입니다. #당연히 y!!


MariaDB 외부접속허용처리 초기설정

: 애플리케이션 서버와 디비 인스턴스를 분리하면서,
원격으로 DB에 커넥션 연결을 요청해야했다. 그렇게 하기 위해서는 DB 인스턴스에 mysql을 설치하고, mysql.cnf 파일에서 보안 그룹에 알맞은 port와 bind-address를 설정해주어야한다.

bind-address란?
데이터베이스 서버가 어떤 주소로의 요청을 허용할 것인지 설정하는 것이다. 그래서 0.0.0.0/0을 설정하게 되면 네트워크 전체 대역, 즉 모든 트래픽에 대해서 요청을 허용한다 뜻이기에 문제없이 원격 커넥션이 이루어진다.


//Mysql, MariaDB는 보안정책으로 127.0.0.1 으로
//바인딩되어있는것을 확인 가능하다.
$ netstat -an | grep 3306
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN


//50-server.cnf 파일 열기.
$ sudo vi /etc/mysql/mariadb.conf.d/50-server.cnf

//내용중 아래 라인을 주석처리.
bind-address = 127.0.0.1 //AS-IS
#bind-address = 127.0.0.1 //TO-BE

//서버 재기동으로 적용
$ sudo service mysql restart

//다시 netstat 명령으로 확인해보면 
//mariadb의 3306 포트가 0.0.0.0 에 
//바인딩 된 것을 알 수 있다.
$ netstat -antp | grep mysql
tcp6       0      0 :::3306                 :::*                    LISTEN      10927/mysqld


MariaDB 포트포워딩 설정

: 현재기준 DB서버 라즈베리파이측으로 포트포워딩이 필요하다

내부IP: 192.168.0.13
포트외부: 3306 / 내부: 3306
프로토콜: TCP

MariaDB 방화벽처리

: MariaDB 기본 포트(3306)를 허용한다.

// 방화벽(3306 TCP포트) 허용
$ ufw allow 3306/tcp

//서버 재기동으로 적용
$ sudo service mysql restart


MariaDB 사용자 계정 생성

: 사용자 계정을 생성 + 권한부여

// ------------------------------
// 사용자 삭제
// ------------------------------
// drop user '계정아이디'@'접속위치';
// drop user 'INSTC'@'%';

// ------------------------------
// 사용자 생성
// ------------------------------
//create user '사용자'@'IP' identified by '비밀번호';
//  사용자 : 사용자 아이디 입력
//  IP : 접근을 허용할 IP 입력 
//      -(case1). localhost(로컬 접속),
//      -(case2). 1.2.3.4(1,2,3,4 IP 허용)
//      -(case3). 1.2.3.%(1,2,3 번대 IP 허용)
//      -(case4). %(모든 IP 허용)
//  비밀번호 : 사용자 비밀번호 입력 

MariaDB [(none)]> create user 'MT01301'@'%' identified by 'a';

// ------------------------------
// 생성한 계정으로 db 접속가능한지 확인
// ------------------------------
$ mysql -u MT01301 -p;
Enter password: [패스워드 입력]

Mysql 버전별 비권장 사용자생성 문법 MySQL 8부터는 더 이상 GRANT명령을 사용하여 (암시적으로) 사용자를 생성할 수 없다. 대신 CREATE USER 를 사용하고 그 뒤에 GRANT 문이 온다.

// MySQL 10버전 이상부터 다음과 같이 사용
MariaDB [(none)]> CREATE USER 'root'@'%' IDENTIFIED BY 'PASSWORD';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
MariaDB [(none)]> FLUSH PRIVILEGES;



MariaDB 권한

MariaDB 권한조회

: 권한을 조회하는 방법


// 기본권한 조회
// select * from mysql.user where user = [사용자ID]

// 기본권한조회 (원격접속권한보기)
// 초기설치에는 root계정 1개이며 localhost   접속할  있음
// SELECT Host,User,authentication_string FROM mysql.user;

// 사용자별 권한 조회
// SHOW GRANTS FOR '사용자계정'@'호스트';

// 접속된 계정 권한 확인
// SHOW GRANTS FOR CURRENT_USER;


MariaDB 계정별 권한추가

: 생성한 사용자 계정에게 권한을 부여하는 방법.

// 등록된 사용자에게 권한추가하기

// ------------------------------
// DB, 테이블, 원격접속IP 권한추가 방법
// ------------------------------
//  IP(접속위치): IP부분에는 접근을 허용할 IP 입력 
//      -(case1). localhost(로컬 접속),
//      -(case2). 1.2.3.4(1,2,3,4 IP 허용)
//      -(case3). 1.2.3.%(1,2,3 대역대 IP 허용)
//      -(case4). %(모든 IP 허용)

// (유형1). 특정DB(특정테이블) 대해 권한허용
// grant all privileges on DB이름.테이블 to '계정아이디'@'IP';

// (유형2). 특정DB(전체 테이블) 대해 권한허용
// grant all privileges on DB이름.* to '사용자'@'IP';

// (유형3). 전체 DB(전체 테이블에) 대한 권한허용
// grant all privileges on *.* to '사용자'@'IP';


// ------------------------------
// DML 권한추가 방법
// ------------------------------
// (유형1) 특정 데이터베이스의 특정 테이블에 select 권한허용
// grant select on DB이름.테이블명 to '사용자'@'localhost';

// (유형2) 특정 데이터베이스의 특정 테이블에 select, insert 권한허용
// grant select, insert on DB이름.테이블명 to '사용자'@'localhost';
	
// (유형3) 특정 데이터베이스의 특정 테이블의 컬럼1 컬럼2 update 권한허용
// grant update(컬럼1, 컬럼2) on DB이름.테이블명 to '사용자'@'localhost';


// ------------------------------
// 원상복구 방법
// ------------------------------
//(유형1)
MariaDB [(none)]> DELETE FROM mysql.user WHERE Host='%' AND User='root'; 
MariaDB [(none)]> FLUSH PRIVILEGES;

// (유형2)
revoke all on DB이름.테이블명 from userid@host





MariaDB [(none)]> grant all privileges on *.* to INSTC@'%';

MariaDB [(none)]> grant all privileges on *.* to root@'%';

MariaDB [(none)]> flush privileges;


flush privileges 명령어
현재 사용중인 MySQL의 캐시를 지우고 새로운 설정을 적용하기 위해 사용합니다. 이 명령어를 사용하려는 사용자는 reload권한을 가지고 있어야 합니다.

즉 말그대로 MySQL의 환경 설정을 변경할경우, MySQL의 재시작 없이 변경한 설정부분을 적용시키고자 할 때 사용합니다. 데이터베이스의 TABLE의 추가, 삭제 등의 변경은 MySQL 환경 설정이 아니므로 해당 명령어가 필요가 없습니다. 하지만 id, 패스워드가 추가 & 수정 되었을 경우, 환경 설정이 변경되었기에 해당 명령어가 필요합니다.

*2건 권한 반영 후 조회 *
image

SQL클라이언트 접속테스트

: 포트포워딩, 방화벽, bind-address주석처리, public한 계정이 준비되었다면 sql 클라이언트로 외부에서 접속이가능한지 테스트해본다.

  • SQL Client 라는 안드로이드 앱을 사용했다. image

정상적으로 접속이 된다^^!

DDL, DML

DB, 테이블을 생성한다

데이터베이스 생성

// ------------------------------
// 새로만든 계정으로 접속
// ------------------------------
MariaDB [(none)]> mysql -u INSTC -p
Enter password: [비밀번호 입력]


// ------------------------------
// DB 생성
// DB표준명명설계
// DS###@#
//  > DS: 데이터베이스를 나타내는 DS
//  > ###: 대표업무코드 3자리
//  > @: 환경구분(D:개발, S:스테이징, C:운영, E:교육, M:전환)
//  > #[일련번호]: 0부터시작
// DB명은 대문자로한다.
// 시스템코드가아닌 대표업무코드 기준으로 명명한다.
// 대표업무코드 별로 다수의 DB 필요한 경우 "맨끝에 #+숫자"  추가입력  구분하여 '0'부터 시작하도록한다.

// ex) DSSZCD0 상품처리 개발 DB
// ------------------------------
MariaDB [(none)]> CREATE DATABASE DSDBDO0;
Query OK, 1 row affected (0.001 sec)

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| DSDBDO0            |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.001 sec)

MariaDB [(none)]>

테이블 생성

// ------------------------------
// 새로 만든 DB 접속
// ------------------------------
MariaDB[(none)]> use DSDBDO0

// ------------------------------
// 테이블 생성
// ------------------------------
MariaDB [DSDBDO0]> --테이블생성
MariaDB [DSDBDO0]> CREATE TABLE TBDBDW001
    -> (
    ->     회원일련번호           VARCHAR(8) NOT NULL
    ->     ,업체명               VARCHAR(130)
    ->     ,사업자등록번호         VARCHAR(10)
    ->     ,우편번호             VARCHAR(6)
    ->     ,사업장기본주소         VARCHAR(100)
    ->     ,사업장상세주소         VARCHAR(150)
    ->     ,사업장전화번호         VARCHAR(20)
    ->     ,업체이메일주소         VARCHAR(70)
    ->     ,유효기간년월일         VARCHAR(8)
    ->     ,회원신규가입년월일      VARCHAR(8)
    ->     ,유료서비스여부         VARCHAR(1)
    ->     ,서비스탈퇴여부         VARCHAR(1)
    ->     ,시스템최종갱신일시      TIMESTAMP(6) NOT NULL
    ->     ,시스템최종갱신식별자   VARCHAR(12) NOT NULL
    ->     ,시스템최종거래일시      VARCHAR(20) NOT NULL
    -> );
Query OK, 0 rows affected (0.093 sec)

인덱스(index) 생성

// ------------------------------
// 인덱스생성
// ------------------------------
MariaDB [DSDBDO0]> -- 인덱스설정                                             MariaDB [DSDBDO0]> CREATE UNIQUE INDEX XBDBDW001P
CREATE UNIQUE INDEX XBDBDW001P
    -> ON TBDBDW001 (회원일련번호);
Query OK, 0 rows affected (0.107 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [DSDBDO0]>

기본키(primary key) 설정

: 테이블생성 시점에 못한경우 진행한다.

// ------------------------------
// 기본키설정
// ------------------------------
MariaDB [DSDBDO0]> ALTER TABLE TBDBDW001 ADD CONSTRAINT XBDBDW001P PRIMARY KEY (회원일련번호);
Query OK, 0 rows affected, 1 warning (0.106 sec)
Records: 0  Duplicates: 0  Warnings: 1

MariaDB [DSDBDO0]>

코멘트(Comment) 설정

: 테이블생성 시점에 못한경우 진행한다.

  • MySQL 에서 컬럼 코멘트만 깔끔하게 변경하는 방법은 없다.
  • MODIFY 또는 CHANGE 로 전체 컬럼을 변경해야한다.
  • 컬럼 comment 설정시 적용하는게 10000만배 쉽다… 꼭 선행하자..
// ------------------------------
// 코멘트 설정
// ------------------------------
// 테이블코멘트
ALTER TABLE TBDBDW001 COMMENT = 'DBD회원기본';

// 적용한 테이블코멘트 확인
SELECT  table_name, table_comment 
FROM information_schema.tables
WHERE table_schema = 'DSDBDO0' AND table_name = 'TBDBDW001';

// 컬럼코멘트
/*ALTER TABLE [테이블명] MODIFY [컬럼명] [데이터타입] [제약조건] COMMENT 'column1 comment';*/
ALTER TABLE DSDBDO0.TBDBDW001 MODIFY COLUMN 회원일련번호 varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '회원일련번호';
ALTER TABLE DSDBDO0.TBDBDW001 MODIFY COLUMN 회원신규가입년월일 varchar(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL NULL COMMENT '회원신규가입년월일';
..(중략)

시퀀스(Sequence) 설정

:ID 값을 숫자가 아닌 다양한 방식으로 저장하고 싶은 경우 사용한다. Thread-safety 하게 ID를 발급 받을 수 있으며, AUTO_INCREMENT 대신 사용할 수 있다. Sequence는 값을 캐시하므로 경우에 따라 AUTO_INCREMENT 보다 빠를 수 있다고 한다.

MariaDB의 Sequence 기능은 10.3버전 부터 지원됩니다.

// SELECT VERSION(); 버전확인

// ------------------------------
// 시퀀스생성
// ------------------------------
MariaDB [DSDBDO0]> CREATE SEQUENCE DSDBDO0.SQ_TBDBDW001_01
    -> start with 1
    -> increment by 1
    -> minvalue 1
    -> maxvalue 999999
    -> cycle;
Query OK, 0 rows affected (0.030 sec)
MariaDB [DSDBDO0]>

// ------------------------------
// 시퀀스조회
// ------------------------------
MariaDB [DSDBDO0]> SELECT * FROM SQ_TBDBDW001_01;
+-----------------------+---------------+---------------+-------------+-----------+------------+--------------+-------------+
| next_not_cached_value | minimum_value | maximum_value | start_value | increment | cache_size | cycle_option | cycle_count |
+-----------------------+---------------+---------------+-------------+-----------+------------+--------------+-------------+
|                     1 |             1 |        999999 |           1 |         1 |       1000 |            1 |           0 |
+-----------------------+---------------+---------------+-------------+-----------+------------+--------------+-------------+
1 row in set (0.001 sec)

// 마지막 시퀀스 조회
MariaDB [DSDBDO0]> SELECT LASTVAL(SQ_TBDBDW001_01);
+--------------------------+
| LASTVAL(SQ_TBDBDW001_01) |
+--------------------------+
|                     NULL |
+--------------------------+
1 row in set (0.001 sec)

// 시퀀스 증가
MariaDB [DSDBDO0]> SELECT NEXTVAL(SQ_TBDBDW001_01);
+--------------------------+
| NEXTVAL(SQ_TBDBDW001_01) |
+--------------------------+
|                        1 |
+--------------------------+
1 row in set (0.001 sec)

// 시퀀스 증가  다시확인해보면 마지막값이 증가되어짐
MariaDB [DSDBDO0]> SELECT LASTVAL(SQ_TBDBDW001_01);
+--------------------------+
| LASTVAL(SQ_TBDBDW001_01) |
+--------------------------+
|                        1 |
+--------------------------+
1 row in set (0.001 sec)

// 시퀀스 초기화 (그리고 NEXTVAL 해보면 다시 1부터 셋팅되어짐)
MariaDB [DSDBDO0]> ALTER SEQUENCE SQ_TBDBDW001_01 RESTART 1;
Query OK, 0 rows affected (0.001 sec)

// 실제 적용방법(업무에 맞는 형태로 프로그래밍)
MariaDB [DSDBDO0]>
MariaDB [DSDBDO0]>
MariaDB [DSDBDO0]> SELECT CONCAT('C', LPAD(NEXTVAL(SQ_TBDBDW001_01), 7, 0) );+----------------------------------------------------+
| CONCAT('C', LPAD(NEXTVAL(SQ_TBDBDW001_01), 7, 0) ) |
+----------------------------------------------------+
| M0000001                                           |
+----------------------------------------------------+
1 row in set (0.001 sec)

MariaDB [DSDBDO0]> SELECT CONCAT('C', LPAD(NEXTVAL(SQ_TBDBDW001_01), 7, 0) );+----------------------------------------------------+
| CONCAT('C', LPAD(NEXTVAL(SQ_TBDBDW001_01), 7, 0) ) |
+----------------------------------------------------+
| M0000002                                           |
+----------------------------------------------------+
1 row in set (0.001 sec)

MariaDB [DSDBDO0]> SELECT CONCAT('C', LPAD(NEXTVAL(SQ_TBDBDW001_01), 7, 0) );+----------------------------------------------------+
| CONCAT('C', LPAD(NEXTVAL(SQ_TBDBDW001_01), 7, 0) ) |
+----------------------------------------------------+
| M0000003                                           |
+----------------------------------------------------+
1 row in set (0.001 sec)

권한(DML) 설정

// ------------------------------
// 권한설정
// ------------------------------
MariaDB [DSDBDO0]> -- 권한설정
MariaDB [DSDBDO0]> GRANT SELECT ON TBDBDW001 TO MT01301;
Query OK, 0 rows affected (0.001 sec)

MariaDB [DSDBDO0]> GRANT INSERT ON TBDBDW001 TO MT01301;
Query OK, 0 rows affected (0.001 sec)

MariaDB [DSDBDO0]> GRANT DELETE ON TBDBDW001 TO MT01301;
Query OK, 0 rows affected (0.001 sec)

MariaDB [DSDBDO0]> GRANT UPDATE ON TBDBDW001 TO MT01301;
Query OK, 0 rows affected (0.001 sec)

MariaDB [DSDBDO0]>

데이터 삽입(insert)

// ------------------------------
// 테이블 데이터 삽입
// ------------------------------
MariaDB [DSDBDO0]> INSERT INTO TBDBDW001 VALUES (
    -> (SELECT CONCAT('C', LPAD(NEXTVAL(SQ_TBDBDW001_01), 7, 0)))
    -> , '최초테스트기업'
    -> , '9999999999'
    -> , null
    -> , '인천광역시 인하로 999'
    -> , null
    -> , '0328635363'
    -> , 'test@naver.co.kr'
    -> , '20301231'
    -> , '20221123'
    -> , 'Y'
    -> , 'N'
    -> , date_format(sysdate(), '%Y/%m/%d %H:%i:%s')
    -> , 'test'
    -> , date_format(sysdate(6), '%Y%m%d%H%i%s%f')
    -> );
Query OK, 1 row affected (0.010 sec)

Leave a comment