Flyway

Flyway는 오픈 소스 데이터베이스 마이그레이션 도구입니다.

Migrate, Clean, Info, Validate, Undo, Baseline 및 Repair의 7가지 기본 명령을 기반으로 합니다.

마이그레이션은 SQL 또는 Java로 작성될 수 있고, 다양한 데이터베이스를 지원합니다.

 

Why database migrations?

Shiny라는 프로젝트가 있고 Shiny DB라는 데이터베이스에 연결하는 Shiny Soft라는 소프트웨어가 있다고 가정합니다.

대부분의 프로젝트에서는 다음과 같은 과정으로 소프트웨어나 DB를 관리할 것입니다.

개발자의 개발 환경, 단위테스트 환경, 통합테스트 환경, 운영 환경 등으로 구성될 것입니다.

위와 같은 환경에서 software는 버전관리, 형상관리, 배포관리 등이 잘 관리되고 있습니다.

하지만 DB의 변경관리는 상대적으로 잘 관리되고 있지 않습니다.

많은 프로젝트가 수동으로 SQL 스크립트에 의존하여 DB를 관리하고 있습니다.

  • 이 시스템에서 데이터베이스는 어떤 상태입니까?
  • 이 스크립트가 이미 적용되었거나 적용되지 않았습니까?
  • 프로덕션의 빠른 수정이 나중에 테스트에 적용되었습니까?
  • 새 데이터베이스 인스턴스를 어떻게 설정합니까?

 

데이터베이스 마이그레이션 툴(flyway)은 이러한 질문에 대한 대안을 줄 수 있습니다.

  • 처음부터 데이터베이스 다시 만들기
  • 데이터베이스가 어떤 상태인지 항상 명확
  • 현재 버전의 데이터베이스에서 최신 버전으로 마이그레이션

 

How Flyway works

Flyway가 비어있는 데이터베이스와 연결되어 있다고 가정합니다.

flyway는 flyway_schema_history 테이블을 찾으려고 시도하고, 없을 경우 flyway_schema_history 테이블을 생성합니다. 

이 테이블은 데이터베이스의 상태를 추적하는 데 사용됩니다.
그 직후 Flyway는 마이그레이션을 위해 Sql 또는 Java로 작성된 파일(파일 시스템 또는 애플리케이션의 클래스 경로)을 스캔합니다.

마이그레이션은 버전번호를 기준으로 정렬되고 순서대로 적용됩니다.

여기서 마이그레이션이란 표현은 일련의 변경단위로 생각하시면 됩니다. 예를 들면 테이블 2개 생성, 3개 변경 등이 한 묶음인 경우 이를 하나의 마이그레이션으로 보시면 됩니다.

각 마이그레이션이 적용될 때 flyway_schema_history 데이터도 업데이트됩니다.

<flyway_schema_history>

installed_rank version description type script checksum installed_by installed_on execution_time success
1 1 Initial Setup SQL V1__Initial_Setup.sql 1996767037 axel 2016-02-04 22:23:00.0 546 true
2 2 First Changes SQL V2__First_Changes.sql 1279644856 axel 2016-02-06 09:18:00.0 127 true

메타데이터와 초기 상태가 설정되었으므로 이제 최신 버전으로의 마이그레이션을 진행할 수 있습니다.

Flyway는 마이그레이션을 위해 애플리케이션의 파일 시스템 또는 클래스 경로를 다시 한 번 스캔합니다. 마이그레이션은 스flyway_schema_history 의 정보를 기준으로 버전 번호가 현재 버전보다 낮거나 같으면 무시됩니다.

 

보류 마이그레이션은 아직 적용되지 않은 마이그레이션입니다.

마이그레이션은 버전 번호별로 정렬되고 순서대로 실행됩니다.

 

flyway_schema_history 테이블이  업데이트됩니다.

installed_rank version description type script checksum installed_by installed_on execution_time success
1 1 Initial Setup SQL V1__Initial_Setup.sql 1996767037 axel 2016-02-04 22:23:00.0 546 true
2 2 First Changes SQL V2__First_Changes.sql 1279644856 axel 2016-02-06 09:18:00.0 127 true
3 2.1 Refactoring JDBC V2_1__Refactoring   axel 2016-02-10 17:45:05.4 251 true

DDL 또는 DML에 관계없이 데이터베이스를 변경시켜야 할 때마다 현재 버전보다 높은 버전 번호로 새 마이그레이션을 생성하면 됩니다. 다음에 Flyway가 시작되면 이를 찾아서 데이터베이스를 업그레이드합니다.

 

 

First Steps: Command-line

Flyway Command-line 도구를 시작하고 실행하는 방법을 설명합니다. 

사전준비

Flyway 명령줄 도구를 다운로드하고 압축을 풉니다. Community, Teams, Enterprise 버전이 있습니다. 본 문서에서는 Windows용 Community 버전을 다운로드 합니다.

다운로드 : downloading the Flyway Command-line Tool 

Flyway 설정

Flyway를 다운로드하여 압축해제한 디렉토리로 이동합니다.

이동한 디렉토리 하위의 conf 디렉토리에 있는 flyway.conf 파일을 아래와 같이 설정합니다. 

기본적으로 내장되어 있는 H2 DB의 환경설정 부분입니다. 각자의 DB에 맞는 환경 설정을 하면 됩니다.

jdbc로 DB와 연결되므로 사용하는 DB에 맞는 jdbc 드라이버를 flyway 홈디렉토리 밑에 drivers 디렉토리에 가져다 놓으면 됩니다.

flyway.url=jdbc:h2:file:./foobardb
flyway.user=SA
flyway.password=

 

참고) mysql DBdml flywaydb 데이터베이스에 접속하는 경우

flyway.url=jdbc:mysql://<ip_address>:3606
flyway.schemas=flyway
flyway.user="username"
flyway.password="******"

Baseline

데이터베이스의 기준을 설정합니다.

baseline은 flyway의 기준을 지정하는 명령어입니다.

 

flyway baseline 명령어를 실행하면 아래 내용을 볼수 있습니다.

"Successfully baselined schema with version: 1" 이 있는데 이는 flyway migrate 의 version을 최초 1로 설정한 것입니다.

flyway-9.17.0> flyway baseline
Flyway Community Edition 9.17.0 by Redgate
See release notes here: https://rd.gt/416ObMi

Database: 
Creating Schema History table `flyway`.`flyway_schema_history` with baseline ...
Successfully baselined schema with version: 1

위의 그림처럼 flyway_schema_history 테이블을 생성하고 version 1 의 baseline을 설정합니다.

flyway info를 수행하면  관련 정보를 볼 수 있습니다.

flyway-9.17.0> flyway info

Flyway Community Edition 9.17.0 by Redgate
See release notes here: https://rd.gt/416ObMi

+----------+---------+-----------------------+----------+---------------------+----------+----------+
| Category | Version | Description           | Type     | Installed On        | State    | Undoable |
+----------+---------+-----------------------+----------+---------------------+----------+----------+
|          | 1       | << Flyway Baseline >> | BASELINE | 2023-04-28 13:51:24 | Baseline | No       |
+----------+---------+-----------------------+----------+---------------------+----------+----------+

A Flyway report has been generated here: report.html

 

만약, migrate할 sql 파일명을 V1__ 로 시작되는 파일명으로 작성했을 경우, version이 1로 동일하기 때문에 V1__ 로 시작하는 파일의 sql은 수행되지 않습니다. 그러므로 아래 명령어와 같이 -baselineVersion=0 으로 지정하는 것이 좋습니다.

 

flyway-9.17.0> flyway baseline -baselineVersion=0

## 실행결과
Flyway Community Edition 9.17.0 by Redgate
See release notes here: https://rd.gt/416ObMi

Database: jdbc:mysql://dept-ssgd-aurora-an2-dev.cluster-cktyv4o7rx0c.ap-northeast-2.rds.amazonaws.com:3606/flyway (MySQL 8.0)
Creating Schema History table `flyway`.`flyway_schema_history` with baseline ...
Successfully baselined schema with version: 0


flyway-9.17.0> flyway info

## 실행결과
Flyway Community Edition 9.17.0 by Redgate
See release notes here: https://rd.gt/416ObMi

+----------+---------+-----------------------+----------+---------------------+----------+----------+
| Category | Version | Description           | Type     | Installed On        | State    | Undoable |
+----------+---------+-----------------------+----------+---------------------+----------+----------+
|          | 0       | << Flyway Baseline >> | BASELINE | 2023-04-28 13:51:24 | Baseline | No       |
+----------+---------+-----------------------+----------+---------------------+----------+----------+

A Flyway report has been generated here: report.html

 

 

 

baseline 재설정
마이그레이션이 많은 경우 기본 마이그레이션을 재설정하는 것이 좋습니다. 이렇게 하면 오래되고 관련이 없을 수 있는 많은 스크립트를 처리하는 오버헤드를 줄일 수 있습니다.

마이그레이션 생성

마이그레이션 파일은 /sql 디렉터리에 "V + (version표기) + __ + ... + .sql" 형식으로 파일을 생성합니다.

여기서 대문자 "V"는 version이라는 단어를 의미하고 "version표기"은 version 정보입니다.

version형식은 일반적인 표기와 동일합니다. 예를 들면 1.1.1 등의 형식입니다. migrate은 버전형식의 오름차순으로 수행합니다.

 

migrate 파일형식 : (V + version표기+ __filename.sql)

  • V : version
  • version표기 : 예시) 1, 1.1, 2, 2.1 등
  • __ : 연속된 언더바 2개
  • filename : 임의의 파일명
  • .sql = 파일확장자

예시 : V1__Create_person_table.sql 

 

V1__Create_person_table.sql 이라는 첫 번째 마이그레이션을 만듭니다. V1 다음의 __는 언더바가 2개입니다. 반드시 2개이어야 하며 V는 반드시 대문자를 써야 합니다. 만든 파일을 flyway 홈디렉토리 및에 sql 디렉토리에 위치시킵니다.

create table PERSON (
    ID int not null,
    NAME varchar(100) not null
);

데이터베이스 마이그레이팅

Flyway 마이그레이션을 수행합니다. 

주의할 점은 baseline을 설정하지 않고 flyway migrate 명령어를 수행할 때 데이터베이스에 table이 존재하면 "non-empty schema" 오류가 발생합니다.

스키마에 테이블이 존재할 경우에는 flyway baseline 또는  flyway migrate -baselineOnMigrate=true 명령어를 수행해야 합니다. baselineOnMigrate=true 옵션은 baseline을 설정하고 migrate을 수행합니다.

단, baseline을 수행할 경우에는 version 1의 BASELNE이 설정되므로 "V1__"으로 시작하는 sql 파일이 존재할 경우에 동일한 버전 오류가 발생하니 sql파일명을 V1 이상의 버전으로 설정해야 합니다.

또는 flyway migrate -baselineOnMigrate=true -baselineVersion=0 명령어를 수행하여 baseline의 version을 0으로 설정합니다.

flyway-9.16.3> flyway migrate

 

모든 것이 잘 되었다면 다음 출력이 표시됩니다.

Flyway Community Edition 9.16.3 by Redgate
See release notes here: https://rd.gt/416ObMi

Database: jdbc:h2:file:./foobardb (H2 2.1)
Schema history table "PUBLIC"."flyway_schema_history" does not exist yet
Successfully validated 1 migration (execution time 00:00.014s)
Creating Schema History table "PUBLIC"."flyway_schema_history" ...
Current version of schema "PUBLIC": << Empty Schema >>
Migrating schema "PUBLIC" to version "1 - Create person table"
Successfully applied 1 migration to schema "PUBLIC", now at version v1 (execution time 00:00.022s)

두번째 마이그레이션 추가

 /sql 디렉토리에 V2__Add_people.sql 두 번째 마이그레이션을 추가합니다.

insert into PERSON (ID, NAME) values (1, 'Axel');
insert into PERSON (ID, NAME) values (2, 'Mr. Foo');
insert into PERSON (ID, NAME) values (3, 'Ms. Bar');

 

Flyway를 실행하여 데이터베이스를 마이그레이션합니다.

flyway-9.16.3> flyway migrate

아래와 같은 결과가 표시됩니다.

Flyway Community Edition 9.16.3 by Redgate
See release notes here: https://rd.gt/416ObMi

Database: jdbc:h2:file:./foobardb1 (H2 2.1)
Successfully validated 2 migrations (execution time 00:00.019s)
Current version of schema "PUBLIC": 1
Migrating schema "PUBLIC" to version "2 - Add people"
Successfully applied 1 migration to schema "PUBLIC", now at version v2 (execution time 00:00.026s)

Flyway 실행정보를 보려면 flyway info 명령어를 수행합니다. flyway 버전, type, 수행시간, 수행상태 등의 수행 내역을 보여줍니다.

 

 

1. VSCode에 tomcat 설치

 

VSCode 좌측메뉴의 Extensions에서 "community server connectors"를 검색합니다.검색 후 Community Server Connectors를  [install] 버튼을 클릭하여 설치합니다.

이 VSCode 확장은 Apache Felix, Karaf 및 Tomcat과 같은 커뮤니티 런타임 및 서버를 시작, 중지, 게시 및 제어할 수 있는 런타임 서버 프로토콜 기반 서버 커넥터를 제공합니다.

 

설치가 완료되면 VSCode 의 좌측화면 하단에 "SERVER" 메뉴가 생기고 하위에 "Community Server Connector(Started)"가 생긴 것을 확인할 수 있습니다.

"Community Server Connector(Started)" 마우스 오른쪽 버튼을 클릭한 후 "Create New Serve"를 클릭합니다.

 

VSCode 상단의 검색창으로 커서가 옮겨가면서 아래와 같은 화면이 뜹니다. "Yes"를 선택합니다.

로컬 PC에 tomcat이 설치되어 있고 이를 사용하기 원하는 경우에는 "No, user server on disk"를 선택해서 설치한 tomcat을 지정하면 됩니다. 

community server connectors" Extension이 제공하는 여러 서버(Apache Karaf, Apache Tomcat 등) 가 보이는데 이중 Apache Tomcat 중 설치를 원하는 버전을 선택합니다. 본 문서에서는 Apache Tomcat 10.1.4를 선택했습니다.

라이센트 파일과 함께 "Continue.."라는 메뉴가 보이는데 "Continue.."를 클릭합니다.

"Yes(True)" 를 클릭합니다.

설치가 완료되면 좌측 하단의 Community Server Connector(Started)"가 생긴 것을 확인할 수 있습니다.

브라우저에 http://127.0.0.1:8080 을 입력해보면 tomcat 화면을 볼 수 있습니다.

tomcat 이 설치된 경로는 C:\Users\[window user]\.rsp\redhat-community-server-connector\runtimes\installations\tomcat-10.1.4 입니다.

[window user]는 각자의 Windows 로그인 계정이름입니다.

 

2. comcat 과 mysql connection pool 연결 

tomcat 과 mysql 을 connnection pool 로 연결하는 방법입니다.

tomcat lib 디렉토리에 mysql jdbc 드라이버가 있어야 합니다.

tomcat lib 디렉토리는 C:\Users\ypjeong\.rsp\redhat-community-server-connector\runtimes\installations\tomcat-10.1.4\apache-tomcat-10.1.4\lib 입니다.

 

jdbc 드라이버가 없을 경우 다운로드 후 jdbc 드라이버를 lib 디렉토리 하위에 이동 또는 복사합니다.

mysql DB 접속 설정을 위해 context.xml 파일에 정의해 줍니다. context.xml 파일 위치는

"C:\Users\[user]\.rsp\redhat-community-server-connector\runtimes\installations\tomcat-10.1.4\apache-tomcat-10.1.4\conf" 입니다.

주의할 것은 이 파일에 dbcp를 설정할 경우 webapps/ 디렉토리 하위에 있는 application 개수만큼 수행되어 connection pool 개수가 initialsize * application 개수 만큼 생성됩니다. application 별로 설정하려면 생성한 application 디렉토리 하위에 META-INF 디렉토리에 context.xml 파일을 생성하고 설정하면 됩니다.

 

참고) AWS RDS Aurora DB 접속 방법도 동일합니다.

jdbc 드라이버를 다운로드한 후 tomcat lib 디렉토리에 저장한 후 context.xml 파일의 driver ClassName 그리고 url 만 Aurora DB에 맞도록 수정하면 됩니다.

 

context.xml 파일에 아래 내용을 입력합니다.

<Context>
   ...
 <Resource name="jdbc/mysql"
        auth="Container"
        type="javax.sql.DataSource"
        driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://<mysql_ip>:<3306>/<db_name>"
        username="<username>"
        password="<password>"
        initialSize="5"
        maxTotal="10"
        maxIdle="5"
        minIdle="5"
        validationQuery="SELECT 1"
		testWhileIdle="true"
		timeBetweenEvictionRunsMillis="30000"/>
</Context>
  • name : 각자가 사용할 dbcp 이름
  • driverClassName : jdbc 드라이버의 classname
  • url: "jdbc:mysql://<mysql_ip>:<3306>/<db_name>" 에서 <my_ip>, <3306>, <db_name> 은 각자의 환경에 맞도록 수정한다.
  • username: MySQL 계정 이름
  • password: MySQL 계정 비밀번호
  • initialSize : 초기 connection 개수
  • maxActive : 최대 Connection 객체 수
  • maxIdle = Connection 객체 사용 후 반환할 때, 최대 유지되는 객체 수
  • minIdle = 최소한 유지되야하는 Connection 객체 수
  • validationQuery : Connection 유효성 검사 Query
  • testWhileIdle="true" : 컨넥션이 놀고 있을때, validationQuery 를 이용해서 유효성 검사를 할지 여부
  • timeBetweenEvictionRunsMillis="30000" : 해당 밀리초마다 validationQuery 를 이용하여 유효성 검사

 

참고) AWS RDS Aurora dbcp 설정방법

jdbc 드라이버와 driver ClassName 그리고 url 만 Aurora DB에 맞도록 수정하면 됩니다. 아래 붉은색 글자 부분만 수정하면 aurora DB에 맞는 dbcp 설정입니다.

단, aurora DB용 jdbc 드라이버는 mysql jdbc driver는 호환되지만 aurora DB용 jdbc 드라이버를 사용하는 것이 성능이나 failover 등에 이점이 있습니다.

  • driverClassName="software.aws.rds.jdbc.mysql.Driver"
  • url: "jdbc:mysql:aws//<mysql_ip>:<3306>/<db_name>" 에서 <my_ip>, <3306>, <db_name> 은 각자의 환경에 맞도록 수정한다.

 

JSP에서 테스트 코드 작성

/opt/tomcat/webapps/ROOT 디렉토리에 아래 내용으로 mysql_dbcp.jsp 파일을 생성한다.

아래 내용 중 comp/env/jdbc/mysql 에서 jdbc/mysql 부분은 위의 context.xml 파일에서 정의한 resource name 이다.

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ page import = "java.sql.*"%>
<%@ page import = "javax.sql.*"%>
<%@ page import = "javax.naming.*"%>
<%
    Connection conn=null;

    Context init = new InitialContext();
    DataSource ds = (DataSource) init.lookup("java:comp/env/jdbc/mysql");
    conn = ds.getConnection();
    out.println(conn);
    conn.close();
%>

 

화면에 아래처럼 출력되면 db connection pool 설정이 정상적으로 작동한 것이다.

1907371254, URL=jdbc:mysql://10.0.0.5:3306/mysql, MySQL Connector/J

 

참고) AWS Aurora dbcp 사용 시 결과

AWS Aurora DB driver 사용 시 화면에 아래처럼 출력됩니다.

1055203550, URL=jdbc:mysql:aws://cluster-xxxxx.ap-northeast-2.rds.amazonaws.com:3306/awsdb, Amazon Web Services (AWS) JDBC Driver for MySQL

 

컴파일, 빌드, 배포의 개념 및 차이

 

본인이 번역가라고 생각해보자.

이번에 출판사로부터 일을 하나 받았는데,

영문으로된 글을 한글로 번역하는 일이다.

번역된 글은 출판사에서 적절히 페이지를 나누어 책으로 엮을 것이며,

완성된 책은 출판이 되어 서점에 진열될 것이다.

우리는 방금 컴파일, 빌드, 배포의 모든 과정을 훑어보았다.

1. 영문으로된 글을 한글로 번역하는 것은 컴파일이다.

2. 번역한 글을 책으로 엮는 것은 빌드이다.

3. 완성된 책을 고객들이 읽을 수 있도록 서점에 진열하는 것은 배포이다.

4. 1~2번 과정을 하나로 묶어 '빌드 한다'고 하기도 한다.
벽돌과 시멘트등 여러 재료를 사용해 무엇인가를 짓는(build)것의 결과물이 사람이 살 수 있는 집이 되는 것처럼,

코드와 컴파일러등 여러 도구를 사용해 무엇인가를 만드는(build) 것의 결과물은 동작하는 소프트웨어가 된다고 이해하면 좀 더 쉬우려나?

 

 

참조사이트 : [QA] 컴파일? 빌드? 배포? 개념과 차이는 무엇일까? | 코딩장이 (itholic.github.io)

 

Window 라우팅 테이블 정보 보기

 

Window 명령어창에서 route print 명령어를 수행하면 아래와 같은 윈도우 라우팅 테이블 설정 내용이 보여집니다.

인터페이스 목록, IPv4 라우팅 테이블, IPv6 라우팅 테이블에 대한 정보입니다.

 

Window 라우팅 테이블 추가하기

윈도우에 라우팅 테이블을 추가하는 명령어는 다음과 같은 형식입니다.

route add [IP 주소] mask [서브넷마스크] [게이트웨이] if [인터페이스 ID] -p

route add [IP 주소] mask [서브넷마스크] [게이트웨이] if [인터페이스 ID] -p

 

 

-p : 윈도우 재부팅 이후에도 설정값이 보존되도록 하는 옵션(permanent)

 

 

MySQL Workbench에서 delete나 update 시 where 조건문을 사용하지 않을 경우, 아래와 같은 에러 메시지가 나타나며 원하는 삭제나 수정 작업을 수행할 수 없다. where 조건없이 삭제/수정에 대한 사용자 실수를 예방하는 차원으로 MySQL Workbench 에 옵션으로 적용이 되어 있어서 그런 것이다.

실제 전체 데이터를 대상으로 삭제/수정 작업을 해야할 경우에 옵션 설정을 변경한 후 작업할 수 있다.

 

옵션은 Edit- Preferences - SQL editor 의 [ Safe Updates(rejects UPDATEs and DELETEs with no retrictions) ] 항목이다.

이 옵션을 disable 하면 조건절없이 수정/삭제 작업을 MySQL Workbench에서 수행할 수 있다.

 

0 21 17:36:18 delete from box Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect. 0.000 sec

 

 

옵션 설정을 변경하지 않고 작업할 경우에는 가상의 참인 조건절을 추가하면 된다.

where 1 = 1

 

 

 

 

 

Stored Programs 정의

각 저장 프로그램에는 SQL 문으로 구성된 문장이 포함되어 있습니다. 이 명령문은 세미콜론(;) 문자로 구분된 여러 명령문으로 구성된 복합 명령문입니다. 

예를 들어 다음 저장 프로시저에는 BEGIN ... END 블록에 select 문장이 있습니다.

CREATE PROCEDURE user_count()
BEGIN
  SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
END;

 

mysql 클라이언트 프로그램을 사용하여 위의 세미콜론 문자가 포함된 저장 프로그램을 작성하면 아래와 같이 에러가 발생합니다. 기본적으로 mysql은 세미콜론을 명령문 구분 기호로 인식하기 때문입니다. 

그러므로 mysql이 stored procedure 에서 세미콜론(;)을 인식하도록 임시로 구분 기호를 정의해야 합니다.

mysql> CREATE PROCEDURE user_count()
    -> BEGIN
    ->   SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;

ERROR 1064 (42000): You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version 
for the right syntax to use near '' at line 3

 

mysql 구분 기호를 재정의하려면 delimiter 명령을 사용합니다. 다음 예에서는 user_count() 프로시저를 정의하기 위해  delimiter를 (//) 로 사용했습니다. 이를 통해 프로시저 본문에 사용된 구분 기호*;)를 자체에서 해석하지 않고 서버로 전달하여 stored procedure를 생성할 수 있습니다. 

마지막 줄의 delimiter ; 는 다시 임시로 변경한 delimiter를 세미콜론(;)으로 원복하는 명령어입니다.

 

mysql> delimiter //

mysql> CREATE PROCEDURE user_count()
    -> BEGIN
    ->   SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;
    -> END
    -> //
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

 

PROCEDURE, FUNCTION, TRIGGER에서 세미콜론을 구분하기 위해 delimeter를 사용합니다.

 

 

 

'MySQL' 카테고리의 다른 글

MySQL Lock 발생  (0) 2023.09.22
MySQL - stored procedure 성능  (0) 2023.06.29
MySQL 8.0 connect by  (0) 2023.03.21
GCP-Google Cloud Platform-프로젝트 구축  (0) 2022.03.04
mysql /*! */ 의미  (0) 2022.03.02

블록 스토리지 대 오브젝트 스토리지

 

예제를 통해 블록 스토리지와 오브젝트 스토리지의 차이점을 이해해 봅시다. 크기가 100MB인 Excel 파일이 있다고 가정합니다.

블록 스토리지

100MB 파일이 Block Storage에 어떻게 저장됩니까?
블록 스토리지의 경우 100MB 파일을 10MB씩 10개의 블록으로 나누어 메모리에 저장한다. 여기서 메모리란 하드 디스크를 의미합니다. 각 데이터 블록에는 고유한 식별자가 부여되어 스토리지 시스템이 가장 편리한 위치에 더 작은 데이터 조각을 배치할 수 있습니다.

100MB 파일에 어떻게 액세스할 수 있습니까?

각 블록 스토리지는 개별 하드 디스크로 취급될 수 있으므로 운영 체제를 통해 데이터에 액세스할 수 있습니다. 이 운영 체제는 로컬에 있거나 클라우드 스토리지의 경우 네트워크에 연결되어 있을 수 있습니다.

100MB 파일에서 업데이트는 어떻게 수행됩니까?

따라서 100MB 엑셀 시트의 몇 개의 셀을 변경하려는 경우 메모리에서 변경한 블록만 업데이트됩니다. 업데이트는 10개 블록 모두에서 수행되지 않습니다.

블록 스토리지 사용의 이점:

  1. 읽기/쓰기 작업이 더 빠름
  2. 스토리지 요구 사항이 증가함에 따라 조직은 성능 저하 없이 블록 스토리지 볼륨을 추가할 수 있지만 내구성은 저하될 수 있습니다.
  3. 파일 구조를 따르므로 인간 친화적입니다.

블록 스토리지 사용의 단점

  1. 블록 스토리지는 매우 제한된 메타데이터를 사용합니다. 이는 애플리케이션이 의미 있는 메타데이터로 스토리지 위치를 식별할 수 없고 필요한 데이터를 찾기 위해 많은 수의 블록을 스캔해야 할 수 있기 때문에 검색 및 검색과 같은 메타데이터 중요 작업에서 애플리케이션 성능에 영향을 미칠 수 있습니다.
  2. 스토리지와 애플리케이션 사이의 거리가 멀어질수록 대기 시간이 길어집니다.
  3. 블록 스토리지는 비용이 많이 듭니다. 값비싼 하드웨어와 고도로 훈련된 유지 보수 인력이 필요하기 때문입니다.

사용 사례 및 클라우드 예시

  1. 블록 스토리지는 고도로 구조화된 데이터에 유용합니다.
  2. 데이터베이스 및 트랜잭션 데이터에 유용합니다.
  3. AWS Elastic Block Storage(EBS)는 EC2 인스턴스에 연결할 수 있는 하드 디스크와 같은 원시 스토리지를 제공합니다.

객체 스토리지

100GB 파일은 Object Storage에 어떻게 저장됩니까?
오브젝트 스토리지에서 데이터는 오브젝트라고 하는 개별 단위로 분할되어 폴더에 파일로 보관되거나 서버에 블록으로 보관되는 대신 단일 리포지토리에 보관됩니다.
오브젝트 스토리지의 경우 100MB 파일을 청크로 나누지 않습니다. 대신 전체 데이터 덩어리가 단일 개체로 저장됩니다. 각 개체는 세 가지로 구성됩니다. 데이터(100MB 파일), 확장 가능한 양의 메타데이터 및 전역적으로 고유한 식별자.

100MB 파일에 어떻게 액세스할 수 있습니까?

각 개체에는 전역적으로 고유한 식별자가 있으며 대부분의 클라이언트에서 모든 언어로 사용되는 간단한 HTTP API(응용 프로그래밍 인터페이스)가 필요합니다.

100MB 파일에서 업데이트는 어떻게 수행됩니까?

그래서 100MB 엑셀 시트의 몇 개의 셀을 변경하고 싶다면 개체 저장소에서 전체 파일이 업데이트됩니다. 이로 인해 업데이트 작업이 매우 무거워집니다.

오브젝트 스토리지 사용의 이점:

  1. 개체 기반 스토리지는 파일이 여러 조각으로 나뉘어 하드웨어 간에 분산되는 평면 구조입니다. 오브젝트 스토리지에서 데이터는 오브젝트라고 하는 개별 단위로 분할되어 폴더에 파일로 보관되거나 서버에 블록으로 보관되는 대신 단일 리포지토리에 보관됩니다.
  2. 읽기 작업이 훨씬 빠릅니다.
  3. 노드를 추가하는 것만으로 개체 기반 스토리지 아키텍처를 확장하고 관리할 수 있습니다.

오브젝트 스토리지 사용의 단점

1.객체 스토리지를 사용하여 트랜잭션 및 데이터베이스 데이터를 저장할 수 없습니다.
2. 데이터 일부를 변경할 수 없으며 전체 개체를 읽고 써야 합니다.

사용 사례 및 클라우드 예시

  1. 구조화되지 않은 데이터를 저장하는 데 사용됩니다. 예: 이미지, 동영상
  2. AWS Simple Storage Service(S3)는 읽기 작업이 빈번한 파일을 저장하는 데 광범위하게 사용됩니다.

 

MySQL Workbench 를 활용한 방법을 설명합니다.

 

환경

- SQLServer : Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)

- MySQL : 8.0.32

- MySQL Workbench : 윈도우 10에 설치

 

ODBC 설정

1. SQLServer에 접속할 수 있는 ODBC 설정

MySQL Workbench 가 설치되어 있는 윈도우 환경에서 SQLServer에 접속하는 ODBC를 설정합니다.

제어판 - 관리도구 - ODBC 데이터 원본(64비트)

 

2. MySQL Workbench 에서 migration 수행

- [Database] - [Migration Wizard...] 클릭 후 첫 화면에서 [Start Migration] 버튼을 클릭한다.

아래와 같은 "Source Selection" 화면이 나오면 아래 내용을 선택하거나 입력한다.

- Database System : Microsoft SQ Server 를 선택

- Connection Method : ODBC Data Source 를 선택

- DSN에서는 각자가 만든 SQLServer ODBC를 선택(본 문서의 예시에서는 sqlserver-odbc 선택)

- Username : 소스 DB의 user명 입력

- Database : 데이터 마이그레이션을 할 Database 입력

[Test Connection] 버튼을 클릭하여 정상적으로 접속되는지 확인한 후 [Next] 버튼을 클릭한다.

 

아래와 같은 "Target Selection" 화면이 나오면 아래 내용을 선택하거나 입력한다.

- Connection Method : Standard(TCP/IP)를 선택

- Hostname : 타겟 DB의 IP나 호스트명을 입력

- Port : 타겟DB 접속 Port

- Username : 타겟 DB의 접속 user명 입력

- Database Schema : 데이터 마이그레이션을 할 Database 입력 --> 수정

[Test Connection] 버튼을 클릭하여 정상적으로 접속되는지 확인한 후 [Next] 버튼을 클릭한다.

 

위의 입력 내용을 바탕으로 소스DB와 타겟DB 접속을 확인하고 소스DB로부터 스키마를 조회한다. 아래 화면처럼 3개의 체크상태가 정상이면 [Next] 버튼을 클릭한다.

 

Schemas Selection

아래 화면이 나타나면 마이그레이션할 데이터베이스를 선택한다. 아래 화면은  "migratedb"를 선택한 예제이다.

스키마 이름 매핑 방법(Schema Name Mapping Method)은 Microsoft SQL Server에서 마이그레이션하기 위한 아래의 옵션을 제공한다.

  • Keep schemas as they are: Catalog.Schema.Table -> Schema.Table: 스키마당 하나씩 여러 데이터베이스가 생성
  • Only one schema: Catalog.Schema.Table -> Catalog.Table: 각 스키마를 단일 데이터베이스로 병합(다음 그림 참조).
  • Only one schema, keep current schema names as a prefix: Catalog.Schema.Table -> Catalog.Schema_table: 스키마 이름을 접두사로 유지

 

+ Recent posts