SlideShare a Scribd company logo
1 of 55
Oracle to MySQL/MariaDB
전환 시 알아야 할 기술요소
(개발자 중심)
네오클로바
▶ 2022. 11
2
목차
기준 내용
MySQL 5.7 ~
MariaDB 10.3 ~
- 고민할 것들
- 뭐가 달라요?
- 전환가이드
- 도구들
- 성능개선
- 모니터링
- 관련내용은 당사의 의견임을 참고하세요
Next Opensource Cloud Value
고민할것들
4
고민할것들
▪ DB 운영 환경 – 자원할당, HA을 고려한 시스템구성
▪ DB 내외부 연계방안 – DB간 연결, 접근제어, 데이터 암호화 등
▪ DB 이행 규칙 – 스키마, 오브젝트, 데이터, SQL 등 전환규칙
▪ DB 운영 안정화 방안 – 클라우드, 인적교육, 외부지원
▪ DB(Opensource) 기술동향 – Release, Upgrade
- 사례로 알아보는 오라클 마이그레이션
https://www.slideshare.net/neoclova/mariadb-249171970
Next Opensource Cloud Value
고정관념
6
고정관념
• MySQL/MariaDB 는 공짜다?
• 타 DBMS에 비해 성능이 떨어진다?
• Oracle에서는 되던데, 왜 MySQL에서는 안돼요?
• MySQL이라서 그런지 성능이 안나오는데요?
• SQL튜닝은 DBA가 해야 할 일이다?
Next Opensource Cloud Value
뭐가 달라요?
8
뭐가 달라요?
https://github.com/dveeden/mysql-history-graph
9
뭐가 달라요?
▪ 아키텍처
• Thread 방식이에요
✔ Only mysqld process (cf. mysqld_safe)
• 기본적으로 Single Core로만 SQL을 처리해요
✔ 병렬(Parallel)처리를 지원하지 않아요.
✔ 일부 DDL 병렬처리 기능이 도입되고 있어요( MySQL 8.0.27 - innodb_ddl_threads )
• Nested Loop 방식의 Join을 사용해요
✔ innodb_adaptive_hash_index (mysql enable, mariadb disable)
• 다양한 스토리지 엔진을 지원해요
✔ INNODB 대세( MVCC, #show engines; )
• 복제기능이 내장돼 있어요
✔ Async Replication ( with plugins – semi-sync)
✔ 비동기임을 감안해서 HA 구성하세요.
• Scale-Out > Scale-Up
10
뭐가 달라요?
▪ General
• AUTOCOMMIT=TRUE
✔ 어플리케이션 CONNECTION 처리에 유의
✔ 빈번한 autocommit의 변경은 성능저하 원인
• EXPLAIN PLAN
✔ 실행계획을 저장/재사용 하지 않아요.
• QUERY (RESULTS) CACHE
✔ SQL 수행결과의 캐싱.
✔ 지원여부는 버전별로 차이가 있어요. (MySQL 5.7.20~ deprecated)
• default ISOLATION LEVEL
✔ REPEATABLE-READ
✔ READ-COMMITTED (Oracle, SQLServer)
• Community vs Commercial
✔ 지원하는 기능이 달라요.( storage engine )
✔ MySQL vs MariaDB vs Percona Server for MySQL
11
뭐가 달라요?
▪ 스키마
• 스키마는 데이터베이스와 동의어로 취급해요
✔ 인스턴스 > 데이터베이스 > 스키마 > 테이블
✔ 인스턴스 > 데이터베이스(스키마) > 테이블
• 서로 다른 데이터베이스의 테이블 간에도 조인이 가능
✔ 따라서 개념은 schema에 가까워요
• 소유자(owner) 개념은 없어요
• show databases , show schemas
• system schema
✔ mysql
✔ information_schema
✔ performance_schema
✔ sys
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
mysql> show schemas;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
12
뭐가 달라요?
▪ Tablespace (innodb)
• System Tablespace
✔ ibdataN~
✔ 하나이상의 파일로 구성
✔ 8M단위로 자동확장.
• Table당 Tablespace
✔ Table당 파일이 생성되요(innodb_file_per_table)
✔ 파티션시 개별 파티션별로 파일이 생성되요
✔ 미리 늘려 놓을 수 없어요. 자동확장이 되요.
• General Tablespace (Only MySQL)
✔ 오라클처럼 여러 테이블을 하나의 Tablespace에 저장할 수도 있어요
✔ 인덱스를 별도 Tablespace에 분리할 수는 없어요
• Undo Tablespace
• Temporary Tablespace
13
뭐가 달라요?
▪ Table
• General
✔ 테이블별로 다른 스토리지 엔진을 사용할 수 있어요.
✔ 테이블별로 압축을 제어할 수 있어요.
✔ Page수준 암호화 지원, 플러그인. 컬럼 암호화 아님.
✔ 대소문자 구분 활성화/비활성 할 수 있어요. 초기화 시점에 적용가능
✔ Table에 PK/UK로 AUTO_INCREMENT 컬럼을 1개 만들 수 있어요.
✔ PRIMARY KEY가 곧 테이블 이에요.
✔ 원격지 테이블/파일등에 연결할 수 있어요(federated , connect)
✔ 테이블을 삭제해도 권한이 취소되지 않아요(명시적인 REVOKE 필요)
• InnoDB 제한( 16K page, row_format=DYNAMIC )
✔ 최대 크기 : 64T
✔ 최대 컬럼 수 : 1017개
✔ 최대 행 크기 : 65535 Bytes (기본 + 오버플로 페이지)
✔ 기본 페이지 : 8126 Bytes (255byte 이하 컬럼들 합)
mysql [test]> show create table t1G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int(11) NOT NULL,
`nm` varchar(20) COLLATE utf8mb4_bin DEFAULT NULL,
`rrno` varchar(13) COLLATE utf8mb4_bin NOT NULL,
`srv_yn` varchar(1) COLLATE utf8mb4_bin NOT NULL,
`reti_dt` varchar(8) COLLATE utf8mb4_bin NOT NULL,
PRIMARY KEY (`id`),
KEY `rrno` (`rrno`,`srv_yn`,`reti_dt`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
1 row in set (0.001 sec)
mysql [test]> show global variables like 'innodb_default_row_format';
+---------------------------+---------+
| Variable_name | Value |
+---------------------------+---------+
| innodb_default_row_format | dynamic |
+---------------------------+---------+
1 row in set (0.001 sec)
14
뭐가 달라요?
▪ Table (중요)
• Basic
✔ page size default 16K vs Oracle/MSSQL/PostgreSQL 8K (innodb_page_size)
✔ 바꿀 수 있으나 바꾸지 마세요. 득보다 위험요소가 많아요.
✔ 크기는 미리 늘려 놓을 수 없어요. 자동확장이 되요.
✔ 테이블명에 대소문자 구분을 해요.
• Primary Key
✔ 테이블 생성시 무조건 PK는 부여해 주세요. 복제지연(장애)과 성능저하의 원인이 됩니다.
✔ Oracle은 ROWID로 테이블과 인덱스가 연결되어 있지만, MySQL은 Primary key로 연결돼 있어요.
• Partition
✔ 개별 파티션별로 파일이 생성되요
✔ Local Partition만 지원해요
✔ 파티션 키 컬럼이 반드시 PK에 포함되어야 해요.
• CHARACTER SET / COLLATION
✔ Table/Column별 CHARSET 설정이 가능해요
✔ UTF8(utf8mb3), UTF8MB4(권고)
15
뭐가 달라요?
▪ Column
• AUTO_INCREMENT
✔ 테이블종속, 정수형, 자동증가. PK, UK로 활용하세요.
✔ SERIAL = BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
• NULL
✔ 빈문자열 '' (Empty String) 과 NULL값은 달라요
✔ 인덱스 페이지에 값이 저장됨(인덱스 활용 가능)
✔ 정렬 시 선행 검색, 오라클은 후행 검색 되요
✔ NULL 여부를 위해서 1비트 추가 저장공간 소요
• 산술연산은 NULL, 그룹함수나 문자연결시에는 연산에서 제외
• COMPRESSED (Only MariaDB)
✔ 특정 컬럼만 압축이 가능해요(blob)
• Invisible ~, Generated ~ as ~,
✔ 빠르게 좋아지고 있어요
MariaDB [test]> select * from t1;
+------+------+------+
| id | no | nm |
+------+------+------+
| 1 | NULL | NULL |
| 2 | 100 | NULL |
| 3 | 200 | Lee |
+------+------+------+
3 rows in set (0.000 sec)
MariaDB [test]> select id, sum(no), min(nm) from t1;
+------+---------+---------+
| id | sum(no) | min(nm) |
+------+---------+---------+
| 1 | 300 | Lee |
+------+---------+---------+
1 row in set (0.000 sec)
MariaDB [test]> select id, sum(no), max(nm) from t1;
+------+---------+---------+
| id | sum(no) | max(nm) |
+------+---------+---------+
| 1 | 300 | Lee |
+------+---------+---------+
1 row in set (0.000 sec)
16
뭐가 달라요?
▪ Data Type
• 숫자형
✔ 정수형 세분화 지원(tinyint, smallint, mediumint, int, bigint)
✔ 부동소수점 값은 근사치로 반올림 처리에 유의 (FLOAT은 안쓰는 걸로!!)
• 문자열
✔ 가변길이는 1~2Bytes 추가 길이 필요해요
✔ 길이단위로 해석, 단 이진문자열은BYTE단위.
✔ UTF8 : 3BYTE, UTF8MB4 : 4BYTE
✔ 일반적으로 Character In-Senstive가 기본 Collation. (utf8mb4_0900_ai_ci , utf8mb4_unicode_ci )
✔ 대체로 데이터 값의 뒤 공백을 제거하고 비교하나, COLLATION 마다 차이가 있음으로 확인필요 (PAD 속성)
• 날짜형
✔ DATETIME : '1000-01-01 00:00:00.000000' ~ '9999-12-31 23:59:59.999999'
✔ TIMESTAMP: '1970-01-01 00:00:01.000000' ~ '2038-01-19 03:14:07.999999'
✔ TIME, YEAR
• JSON
✔ MySQL : RFC7159에 정의된 데이터유형 지원 ( JSON 객체)
✔ MariaDB : MySQL호환성을 위한 LONGTEXT (JSON 문자열)
• 미지원
✔ xml
17
뭐가 달라요?
▪ VIEW
• Logical Table
✔ not supported MATERIALIZED VIEW
▪ ROUTINES
✔ security_type DEFINER/INVOKER – EXECUTE/~
• PACKAGE (Only MariaDB)
✔ MariaDB는 지원해요.(SQL_MODE=ORACLE)
• PROCEDURE / FUNCTION
✔ AS 키워드가 없어요.
• TRIGGER
✔ DML_EVENT만 지원, DDL_EVENT/DATABASE_EVENT 미지원
✔ SQL문에 의한 테이블 변경시에만 활성화됨
• EVENT
✔ ORACLE - scheduler
18
뭐가 달라요?
▪ SEQUENCE (Only MariaDB)
✔ AUTO_INCREMENT 대안
✔ 실제로는 InnoDB Engine. (cf. Sequence Storage Engine – virtual dummy table)
• 사용법
✔ NEXT VALUE FOR sequence_name / NEXTVAL(sequence_name) / sequence_name.nextval
✔ PREVIOUS VALUE FOR sequence_name / LASTVAL(sequence_name) / sequence_name.currval
▪ Index
• Page 구조
✔ PRIMARY KEY : PK 컬럼 값들의 순으로 정렬된 테이블, PK 이름을 바꿀 수 없어요.
✔ SECONDARY KEY : PK 값이 숨어있어요. (ROWID 역할)
• Descending
✔ MySQL 8.0~, MariaDB 10.8~ 지원
✔ 이전 버전까지는 ASC로만 컬럼들 정렬해서 인덱스 생성
• FULL-TEXT Search
✔ NGRAM Parser
▪ DATABASE LINK
✔ 미지원
✔ federated (비추)
19
뭐가 달라요?
▪ Account
• user@host
✔ user가 접속하는 host까지가 계정정보
✔ 동일한 user라도 접속 host의 비번이 다를 수 있어요.
• password management
✔ Validation Plugin을 통해서 제어
✔ MySQL / MariaDB 다름
• Drop user
✔ 소유한 객체가 있어도 삭제가 되거든요.
✔ cascade 미지원
MariaDB [mysql]> show tables;
+---------------------------+
| Tables_in_mysql |
+---------------------------+
| column_stats |
| columns_priv |
| db |
| event |
| func |
| general_log |
| global_priv |
| gtid_slave_pos |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| index_stats |
| innodb_index_stats |
| innodb_table_stats |
| plugin |
| proc |
| procs_priv |
| proxies_priv |
| roles_mapping |
| servers |
| slow_log |
| table_stats |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| transaction_registry |
| user |
+---------------------------+
20
뭐가 달라요?
▪ Standard SQL
• MySQL/MariaDB
✔ vs ANSI-SQL92
✔ SELECT ~ INTO table 은 INSERT INTO table SELECT ~ 로 지원
✔ UPDATE t1 SET c1 = c1 +1, c2 = c1;
UPDATE t1 SET c2 = c1, c1 = c1 +1;
두 문장의 결과는 달라요.
✔ FOREIGN KEY로 부모테이블의 UNIQUE/NOT NULL 조건이 아닌 인덱싱 컬럼도 지원
✔ 지원하는 주석처리
/*! ~~ */ (구문분석 수행)
#~
-- ~ (-- 다음 공백 있음)
✔ || (OR), && (AND)로 해석, 문자열 연결은 CONCAT() 이용.
✔ TRIM()은 부분문자열 제거지원.(cf. Oracle – 단일문자 제거)
✔ LIMIT 절 (UPDATE ~ JOIN절의 경우는 LIMIT 사용불가)
✔ FROM절의 SUBQUERY내의 ORDER BY는 무시.
• SQL_MODE
✔ Strict Mode Disable 운영 시 느슨한 데이터 유효성 검사로 데이터 유실 될 수 있어요.
• Hint
✔ 주석을 이용한 힌트 사용시에도 SQL 구문 오류가 발생할 수 있어요
✔ 주석내의 코드에 대한 구문분석을 실행
select * from (
select id, nm, srv_yn, reti_dt
from t1
where rrno='23475296848'
order by srv_yn desc, reti_dt desc
limit 3
) A;
VS
select * from (
select id, nm, srv_yn, reti_dt
from t1
where rrno='23475296848'
order by srv_yn desc, reti_dt desc
) A
limit 3;
VS
select * from (
select id, nm, srv_yn, reti_dt
from t1
where rrno='23475296848'
) A
order by srv_yn desc, reti_dt desc
limit 3;
https://mariadb.com/kb/en/why-is-order-by-in-a-from-subquery-ignored/
Next Opensource Cloud Value
전환 가이드
22
전환 가이드
▪ DATA
• 스키마 전환
• 데이터 이행
• 데이터 변환
▪ SQL CODE
• ROUTINES 변환
• Application(SQL) 변환
Table Mapping
List 의 작성
To-Be 환경에
Table 생성
Column
Default값 수정
1 2 3 4
예외 처리
Schema구성
함수등 변경
데이터 이행
및 변경 적재
CDC 툴등 이용
ROUTINES 변환
SQL 변환
To-Be
Application
확인
23
전환 가이드
▪ 아키텍처
• 분산과 복제를 통한 구성 교체(from Shard to Shard Nothing)
✔ Service Sharding
✔ Master/Slaves Replication
✔ Parallel Replication Enable
✔ Semi-Sync Replication Enable (cf. RAC)
✔ Group Replication
• High Availability 구성
✔ MySQL : Galera Cluster, InnoDB Cluster, ProxySQL, MySQLRouter, MHA, Orchestrator
✔ MariaDB : Enterprise Cluster, ProxySQL, MHA, Orchestrator, Xpand
• 고려사항
✔ 안전성, 레퍼런스, 운영편의성, 기술지원
✔ PoC, Education, Upgrade
24
전환 가이드
▪ General
• DBMS
✔ Community : MySQL 8.0.31 이상, MariaDB 10.5.x, MariaDB 10.6.x(LTS)
✔ Commercial : Latest minor version in Any Major Version
(MariaDB Community는 2년마다 LTS version 배포)
✔ COLLATION : utf8mb4_general_ci ,
utf8mb4_bin,
utf8mb4_unicode_ci,
utf8mb4_unicode_520_ci 을 추천
한글 검색, Padding Space 등을 확인하세요
모든 스키마/테이블의 Collation은 통일.
empty string : https://bugs.mysql.com/bug.php?id=101311
한글검색 및 pad space : https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html
✔ InnoDB Storage engine을 사용하세요
✔ Query Cache(MariaDB) 비활성화 하세요 (query_cache_type=0)
✔ 격리수준 (transaction_isolation = READ-COMMITTED)을 확인하세요
✔ 반드시 SQL_MODE를 제어하세요.
STRICT_ALL_TABLES or STRICT_TRANS_TABLES 를 추가하세요.
데이터 유실을 방지 할 수 있어요.
mysql> select * from COLLATIONS where COLLATION_NAME
in ('utf8mb4_general_ci' , 'utf8mb4_bin', 'utf8mb4_unicode_ci', 'utf8mb4_unicode_520_ci','utf8mb4_0900_ai_ci');
+------------------------+--------------------+-----+------------+-------------+---------+---------------+
| COLLATION_NAME | CHARACTER_SET_NAME | ID | IS_DEFAULT | IS_COMPILED | SORTLEN | PAD_ATTRIBUTE |
+------------------------+--------------------+-----+------------+-------------+---------+---------------+
| utf8mb4_0900_ai_ci | utf8mb4 | 255 | Yes | Yes | 0 | NO PAD |
| utf8mb4_bin | utf8mb4 | 46 | | Yes | 1 | PAD SPACE |
| utf8mb4_general_ci | utf8mb4 | 45 | | Yes | 1 | PAD SPACE |
| utf8mb4_unicode_520_ci | utf8mb4 | 246 | | Yes | 8 | PAD SPACE |
| utf8mb4_unicode_ci | utf8mb4 | 224 | | Yes | 8 | PAD SPACE |
+------------------------+--------------------+-----+------------+-------------+---------+---------------+
25
전환 가이드
▪ General
• JDBC/Application
✔ 복제환경에 Router(L4, HAProxy, ProxySQL, Maxscale등) 사용 시
Connection은 반드시 Router를 통해서 DB에 접속 하세요.
Cluster가 깨지는 원인이 됩니다.
✔ 최신버전 JDBC Driver 사용하세요
jdbc : replication
jdbc : sequential
jdbc : loadbalance
✔ Connection Pool 의 timeout 설정을 확인하세요
idle timeout check
✔ Autocommit = true 로 Application Transaction Control 하세요.
Replica 환경에서 Transaction 분산에 유리(ex. Maxscale)
WAS(n)
WAS1
Maxscale/MySQL Router/ProxySQL
Write
Replication
#1 #3
#2
Read
Read
26
전환 가이드
▪ MODELING
✔ AS-IS 문자타입 길이를 확인하세요.
✔ 적절한 크기에 맞는 숫자타입(tinyint ~ bigint)을 선택하세요
정수형 타입 UNSIGNED ~ 권고
✔ float타입은 사용을 자제하세요
이행과정에서 데이터가 오염(반올림) 될 수 있음으로 DECIMAL(m,n)을 사용하세요
✔ 긴 문자열은 PK로 사용하지 마세요.
VARCHAR2(128) 등은 UNIQUE KEY로 전환하고,
AUTO_INCREMENT/SEQUENCE를 이용한 AK를 PK로 사용하세요
✔ 문자열 길이단위(varchar(10), 10개 문자, charset에 따라 byte는 다름)임으로 용량산정 시 주의하세요
✔ VARCHAR2(1000) 처럼 문자열 길이가 큰 경우는 TEXT를 사용하세요
✔ 날짜는 날짜타입(가능한 DATE, DATETIME)에 저장하세요
VARCHAR2(8) DATE
VARCHAR2(14) DATE, DATETIME
✔ 컬럼별로 다른 charset/collation을 사용하면 주의해야 합니다.
특히 명시적으로 제약조건/조인조건절에 사용하는 컬럼의 경우는
성능저하의 원인이 될 수 있습니다.
https://mariadb.com/kb/en/optimization-and-indexes/
https://mariadb.com/kb/en/optimizing-data-structure/
27
전환 가이드
▪ Tablespaces
• Table
✔ Primary Key가 없이 테이블을 생성할 수 없도록 제어하세요
MySQL : sql_require_primary_key (8.0.13 ~ )
MariaDB : innodb_force_primary_key(10.2 ~)
✔ 기본문자셋은 utf8mb4을 사용하세요
emoji 문자 등에 유용해요
✔ 모든 테이블/컬럼의 문자셋은 통일 하는게 좋습니다
제약조건/조인처리 등에서 성능저하가 발생할 수 있습니다
만약, 다르게 관리한다면 주의가 필요합니다.
✔ PK 컬럼은 AUTO_INCREMENT/SEQUENCE를 활용하세요
PK의 크기가 크면 IO면에서 성능저하가 발생합니다
✔ 대소문자 구분을 안 하도록 사용하세요
lower_case_table_name=1
✔ 테이블별로 다른 Storage Engine을 설정할 수 있어요
그렇지만 특별한 목적이 아니라면, InnoDB 를 사용하세요.
MariaDB [INFORMATION_SCHEMA]> SELECT * FROM SYSTEM_VARIABLES WHERE VARIABLE_NAME LIKE '%primary%'G
*************************** 1. row ***************************
VARIABLE_NAME: INNODB_FORCE_PRIMARY_KEY
SESSION_VALUE: NULL
GLOBAL_VALUE: OFF
GLOBAL_VALUE_ORIGIN: COMPILE-TIME
DEFAULT_VALUE: OFF
VARIABLE_SCOPE: GLOBAL
VARIABLE_TYPE: BOOLEAN
VARIABLE_COMMENT: Do not allow to create table without primary key (off by default)
NUMERIC_MIN_VALUE: NULL
NUMERIC_MAX_VALUE: NULL
NUMERIC_BLOCK_SIZE: NULL
ENUM_VALUE_LIST: OFF,ON
READ_ONLY: NO
COMMAND_LINE_ARGUMENT: OPTIONAL
28
전환 가이드
▪ Tablespaces
• Partition
✔ 파티션 사용은 가급적 지양하세요.
성능측면보다는 관리측면에서 유리합니다
데이터 크기가 100G이상 인 경우 검토하세요
✔ 파티션 키 컬럼은 반드시 Primary Key 에 포함되어야 해요
즉, 테이블의 PK가 바뀐다는 이야기며, 이는 Application의 SQL이 수정되어야 한다는 합니다
✔ 파티션 프루닝이 적용되는지 반드시 확인하세요.
이를 위해서는 SQL제약조건에 파티션 키 컬럼에 대한 제약조건이 있어야 합니다.
EXPLAIN EXTEND ~ (~ MySQL 5.6)
EXPLAN ~ (MySQL 5.7 ~)
EXPLAIN partitions ~ (MariaDB )
✔ 특히 날짜형 타입(DATE/DATETIME)은 파티션 프루닝을 지원하는 함수만 사용하세요
YEAR(), TO_DAYS(), TO_SECONDS()
✔ TRIGGER와 함께 파티션을 사용하지 마세요
BEFORE INSERT/UPDATE Trigger가 있는 파티션 테이블은 모든 파티션을 잠금수행합니다.
✔
Create Table: CREATE TABLE “dktnfkqkfqkfxk" (
"id" bigint(20) NOT NULL AUTO_INCREMENT,
"global_id" varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL,
"global_id_seq" varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL,
"log_unixtime" varchar(6) COLLATE utf8mb4_unicode_ci NOT NULL,
"mci_log_point" decimal(2,0) NOT NULL,
"log_year" varchar(4) COLLATE utf8mb4_unicode_ci NOT NULL,
"log_month" varchar(2) COLLATE utf8mb4_unicode_ci NOT NULL,
"log_day" varchar(2) COLLATE utf8mb4_unicode_ci NOT NULL,
"guid" varchar(63) COLLATE utf8mb4_unicode_ci NOT NULL,
"resource_cd" varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
"resource_nm" varchar(800) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
"mci_rst_info" varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
"chan_u" varchar(2) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
"recv_svc_c" varchar(12) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
"scr_id" varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
"rqst_resp_g" varchar(1) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
"sync_g" varchar(1) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
"msg_snd_g" varchar(1) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
"trxbrno" decimal(4,0) DEFAULT NULL,
"trx_trmno" decimal(4,0) DEFAULT NULL,
"op_keyno" varchar(3) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
"op_hwnno" varchar(8) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
"rst_yn" decimal(1,0) DEFAULT NULL,
"out_u" decimal(1,0) NOT NULL,
"registered_date" datetime NOT NULL,
PRIMARY KEY ("id","registered_date")
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
PARTITION BY RANGE (to_days("registered_date"))
(PARTITION "p20211101" VALUES LESS THAN (738460) ENGINE = InnoDB,
PARTITION "p20211102" VALUES LESS THAN (738461) ENGINE = InnoDB,
PARTITION "p20211103" VALUES LESS THAN (738462) ENGINE = InnoDB,
PARTITION "p20211104" VALUES LESS THAN (738463) ENGINE = InnoDB,
PARTITION "p20211105" VALUES LESS THAN (738464) ENGINE = InnoDB,
…
PARTITION "future" VALUES LESS THAN MAXVALUE ENGINE = InnoDB)
29
전환 가이드
▪ APPLICATION(SQL)
✔ 함수의 결과값이 다름으로 변경에 주의하세요.
문자열 길이 (oracle:length, mysql:char_length)
문자열 Bytes(oracle:lengthb, mysql:length)
로 함수의 리턴값이 달라요.
✔ tobe model에서 float타입은 사용을 자제하세요
✔ 날짜는 날짜타입(가능한 DATE, DATETIME)에 저장하세요
✔ 컬럼별로 다른 charset/collation을 사용하면 주의해야 합니다.
명시적으로 제약/조인 조건절에 사용하는 컬럼의 경우는
성능저하의 원인이 될 수 있습니다.
도대체 왜?
create table table1 (
id int,
nm1 varchar(10),
primary key(id)
) engine=innodb character set utf8;
질문) nm1은
10 음절을 의미할까요?
10 bytes를 의미할까요?
30
전환 가이드
• 데이터 타입 우선순위
 명시적 형변환, 묵시적 형변환
 우선순위
JSON> 날짜형 > 숫자형 > 문자형 > 바이너리형
json > datetime > date > decimal > double > float > bigint > int > … > varchar > …> binary
반드시 컬럼타입에 맞게 SQL작성
create table t_member (id int, jumin1 varchar(6), jumin2 varchar(7), primary key(id));
select * from t_member where jumin1=891212 ; ( CPU曰: 이거 너무하는 거 아니냐고 씨X )
mysql> explain select t1.* from t1 inner join t2 on t2.nm=t1.nm;
+----+-------------+-------+------------+-------+---------------+------+---------+------+---------+----------+--------------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+------+---------+------+---------+----------+--------------------------------------------+
| 1 | SIMPLE | t2 | NULL | index | nm | nm | 43 | NULL | 1 | 100.00 | Using index |
| 1 | SIMPLE | t1 | NULL | ALL | nm | NULL | NULL | NULL | 4988104 | 10.00 | Using where; Using join buffer (hash join) |
+----+-------------+-------+------------+-------+---------------+------+---------+------+---------+----------+--------------------------------------------+
mysql> explain select t1.* from t1 inner join t2 on convert(t2.nm using latin1)=t1.nm;
+----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-----------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-----------------------+
| 1 | SIMPLE | t2 | NULL | index | NULL | nm | 43 | NULL | 1 | 100.00 | Using index |
| 1 | SIMPLE | t1 | NULL | ref | nm | nm | 13 | func | 1 | 100.00 | Using index condition |
+----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-----------------------+
31
전환 가이드
▪ APPLICATION(SQL)
✔ ANSI SQL 문법으로 전환하세요.
테이블 간의 관계는 FROM절에 명시하여 WHERE절의 조건문과 분리한다
✔ (+) 연산을 OUTER JOIN 으로 전환하세요
LEFT OUTER JOIN ~
RIGHT OUTER JOIN ~
✔ FULL OUTER JOIN은 지원하지 않아요. OUTER JOIN을 활용하세요.
LEFT JOIN ~
UNION
OUTER JOIN ~
✔ INLINE VIEW(파생테이블)은 ALIAS를 부여해야 합니다.
~, (SELECT COL1 FROM T1) AS A1
✔ INTERSECT / MINUS
INTERSECT / EXCEPT 전환 하세요.
MariaDB 10.3 ~ , MySQL 8.0.31 ~ 부터 지원해요.
✔ CONNECT BY PRIOR
CTE (WITH~)를 이용하세요.
✔ MERGE ~
INSERT ~ ON DUPLICATE KEY UPDATE
32
전환 가이드
▪ APPLICATION(SQL)
✔ OPTIMIZER HINT와 INDEX HINT의 사용을 자제합니다.
HINT절에 대한 구문분석으로 오류가 발생할 수 있어요
✔ SQL_MODE=ORACLE은 개별 세션에서만 사용하세요. (Only MariaDB)
MySQL에서는 전부 프로시저나 어플리케이션으로 변환하세요.
MariaDB에서는 set session sql_mode=oracle; ~;로 이용하세요.
33
전환 가이드
▪ Data Type Mapping
Oracle MySQL
CHAR(1) 0|1
BIT(1)
CHAR
NUMBER(3, 0) [UNSIGNED] TINYINT
NUMBER(5, 0) [UNSIGNED] SMALLINT
NUMBER(7, 0) [UNSIGNED] MEDIUMINT
NUMBER(10, 0) [UNSIGNED] INT
NUMBER(19, 0) [UNSIGNED] BIGINT
FLOAT
DECIMAL
NUMERIC
REAL
DOUBLE
DECIMAL
CHAR
NCHAR
CHAR
VARCHAR
VARCHAR2
NVARCHAR
VARCHAR
TINYTEXT
TEXT
DATE
DATE
DATETIME
TIMESTAMP
BLOB,
RAW
MEDIUMBLOB
BLOB
VARBINARY
CLOB,
LONG RAW
TEXT
MEDIUMTEXT
LONGTEXT
34
전환 가이드
▪ Functions Mapping
No Oracle MySQL/MariaDB
1 ABS(num) Get the absolute value ABS(num)
2 ACOS(num) Get the arc cosine ACOS(num)
3 ADD_MONTHS(date, num) Add num months to date DATE_ADD(date, INTERVAL num MONTH)
4 ASCII(str) Get ASCII code of left-most char ASCII(str)
5 ASCIISTR(string) Get ASCII code version of string
6 ASIN(num) Get the arcsine ASIN(num)
7 ATAN(num) Get the arc tangent ATAN(num)
8 ATAN2(x, y) Get the arc tangent of x and y ATAN2(x, y)
9 BIN_TO_NUM(bit1, bit2, …) Convert bit vector to number CONV(BINARY(CONCAT(bit1, bit2,...),2,10)
10 BITAND(exp1, exp2) Perform bitwise AND (exp1 & exp2)
11 CEIL(num) Get the smallest following integer CEIL(num)
12 CHR(num) Get character from ASCII code CHAR(num)
13 COALESCE(exp1, exp2, …) Return first non-NULL expression COALESCE(exp1, exp2, …)
14 CONCAT(char1, char2) String concatenation CONCAT(char1, char2)
15 CONVERT(string, charset) Convert string to charset CONVERT(string USING charset)
16 COS(num) Get the cosine COS(num)
17 COSH(num) Get hyperbolic cosine (EXP(num) + EXP(-num)) / 2
18 CURRENT_DATE Get the current date NOW()
19 CURRENT_TIMESTAMP Get the current date and time NOW()
20 DECODE(exp, when, then, …) Evaluate conditions
CASE ~ : MySQL, MariaDB
DECODE_ORACLE(exp, when, then, …) : MariaDB
35
전환 가이드
▪ Functions Mapping
No Oracle MySQL/MariaDB
21 EXP(n) Raise e to the nth power EXP(n)
22 EXTRACT(YEAR FROM date) Extract year from date YEAR(date)
23 EXTRACT(MONTH FROM date) Extract month from date MONTH(date)
24 EXTRACT(DAY FROM date) Extract day from date DAY(date)
25 EXTRACT(HOUR FROM time) Extract hour from time HOUR(time)
26 EXTRACT(MINUTE FROM time) Extract minute from time MINUTE(time)
27 EXTRACT(SECOND FROM time) Extract second from time SECOND(time)
28 FLOOR(num) Get the largest preceding integer FLOOR(num)
29 GREATEST(exp, exp2, …) Get the maximum value in a set GREATEST(exp, exp2, …)
30 INITCAP(string) Capitalize words User Define Function
31
INSTR(str, substr)
Get position of substring
INSTR(str, substr)
INSTR(str, substr, pos) LOCATE(str, substr, pos)
INSTR(str, substr, pos, num) User Define Function
32 LAST_DAY(date) Get last day of the month LAST_DAY(date)
33 LEAST(exp, exp2, …) Get the minimum value in a set LEAST(exp, exp2, …)
34 LENGTH(string) Get length of string in chars CHAR_LENGTH(string)
35 LENGTHB(string) Get length of string in bytes LENGTH(string)
36 LN(num) Get natural logarithm of num LN(num)
37
LOCALTIMESTAMP
Get the current date and time
LOCALTIMESTAMP
LOCALTIMESTAMP([prec]) LOCALTIMESTAMP()
38 LOG(num1, num2) Get logarithm, base num1, of num2 LOG(num1, num2)
39 LOWER(string) Lowercase string LOWER(string)
40
LPAD(string, len)
Pad the left-side of string
LPAD(string, len, ' ')
LPAD(string, len, pad) LPAD(string, len, pad)
36
전환 가이드
▪ Functions Mapping
No Oracle MySQL/MariaDB
41
LTRIM(string) Remove leading spaces LTRIM(string)
LTRIM(string, set) Remove leading chars TRIM(LEADING set FROM string)
42 MONTHS_BETWEEN(date1, date2) Get number of months between date1 and date2 TIMESTAMPDIFF(MONTH, date1, date2)
43 MOD(dividend, divisor) Get remainder MOD(dividend, divisor)
44 NEXT_DAY Get the next date by day name NEXT_DAY user-defined function
45 NULLIF(exp1, exp2) Return NULL if exp1 = exp2 NULLIF(exp1, exp2)
46 NVL(exp, replacement) Replace NULL with the specified value
IFNULL(exp, replacement) : MySQL, MariaDB
NVL(exp, replacement) : MariaDB
47 NVL2(exp1, exp2, exp3) Return exp2 if exp1 is not NULL, otherwise exp3
IF (exp1 IS NOT NULL, exp2, exp3) : MySQL, MariaDB
NVL2(exp1, exp2, exp3) : MariaDB
48 POWER(value, n) Raise value to the nth power POWER(value, n)
49 REMAINDER(n1, n2) Get remainder (n1 - n2*ROUND(n1/n2))
50
REPLACE(str, search) Remove search-string REPLACE(str, search, '')
REPLACE(str, search, replace) Replace search-string REPLACE(str, search, replace)
51 ROUND(num, integer) Get rounded value ROUND(num, integer)
52
RPAD(string, len)
Pad the right-side of string
RPAD(string, len, ' ')
RPAD(string, len, pad) RPAD(string, len, pad)
53
RTRIM(string) Remove trailing spaces RTRIM(string)
RTRIM(string, set) Remove trailing chars TRIM(TRAILING set FROM string)
54 SIGN(exp) Get sign of exp SIGN(exp)
55 SIN(num) Get sine SIN(num)
56 SINH(num) Get hyperbolic sine (EXP(num) - EXP(-num)) / 2
57 SOUNDEX(string) Get 4-character sound code SOUNDEX(string)
58 SQRT(num) Get square root SQRT(num)
59 SUBSTR(string, pos, len) Get a substring of string SUBSTR(string, pos, len)
60 SYS_GUID() Get GUID, 32 characters without dashes REPLACE(UUID(), '-', '')
37
전환 가이드
▪ Functions Mapping
No Oracle MySQL/MariaDB
61 SYSDATE Get current date and time SYSDATE()
62 SYSTIMESTAMP Get current timestamp CURRENT_TIMESTAMP
63 TAN(num) Get tangent TAN(num)
64 TANH(num) Get hyperbolic tangent (EXP(2*num) - 1)/(EXP(2*num) + 1)
65
TO_CHAR(datetime, format) Convert datetime to string DATE_FORMAT(datetime, format)
TO_CHAR(number, format) Convert number to string FORMAT(number, decimal_digits)
66 TO_DATE(string, format) Convert string to datetime STR_TO_DATE(string, format)
67 TO_LOB(exp) Convert to LOB
68 TO_NCHAR(exp) Convert to NCHAR DATE_FORMAT(datetime, format)
69 TO_NCLOB(exp) Convert to NCLOB
70 TO_NUMBER(exp) Convert to NUMBER CAST(exp AS INTEGER)
71 TO_SINGLE_BYTE(exp) Convert to single-byte character
72 TO_TIMESTAMP(exp) Convert to TIMESTAMP TIMESTAMP(exp)
73 TRANSLATE(string, from, to) Replace characters REPLACE(string, from, to)
74 TRIM([type trim FROM] string) Remove characters TRIM([type trim FROM] string)
75
TRUNC(num)
Truncate num
TRUNCATE(num, 0)
TRUNC(num, num2) TRUNCATE(num, num2)
76 TRUNC(datetime) Truncate datetime DATE(datetime), DATE_FORMAT
77 UNISTR(string) Convert Unicode code points to chars CHAR(string USING UCS2)
78 UPPER(string) Uppercase string UPPER(string)
79 USER Get the current user USER()
80 USERENV('parameter') Get the current session information SHOW SESSION VARIABLES LIKE '%%'
38
전환 가이드
▪ Functions Mapping
No Oracle MySQL/MariaDB
81 VSIZE(exp) Get the size of exp in bytes
82 XMLAGG(exp) Get a aggregated XML document
83 XMLCAST(exp AS datatype) Convert exp to datatype
84 XMLCDATA(exp) Generate a CDATA section
85 XMLCOMMENT(exp) Generate an XML comment
86 XMLCONCAT(exp, exp2, …) Concatenate XML expressions
87 XMLDIFF(doc, doc2) Compare two XML documents
88 XMLELEMENT(NAME element) Get an XQuery element node
89 XMLFOREST(exp, exp2, …) Get a forest of XML expressions
90 XMLISVALID(exp) Check XML exp
91 XMLPARSE(DOCUMENT exp) Parse XML document
92 XMLPATCH(doc, doc2) Patch XML document
93 XMLPI(NAME identifier) Get XML processing instruction
94 XMLROOT(exp, VERSION exp2) Create a new XML value
95 XMLSEQUENCE(exp) Get a varray of the top-level nodes
96
XMLSERIALIZE(CONTENT exp
Get a serialized XML value
AS datatype)
97 XMLTRANSFORM(instance, exp) Transform XML document
39
전환 가이드
▪ Functions Mapping
No Oracle MySQL/MariaDB
98 REGEXP_INSTR(str,ptn) MySQL 8.x~, MariaDB 10.3~ REGEXP_INSTR(str,ptn)
99 REGEXP_LIKE(str,ptn) MySQL 8.x~, MariaDB 10.3~ REGEXP_LIKE(str,ptn)
100 REGEXP_REPLACE(str1,exp,str2) MySQL 8.x~, MariaDB 10.3~ REGEXP_REPLACE(str1,exp,str2)
101 REGEXP_SUBSTR(str,ptn) MySQL 8.x~, MariaDB 10.3~ REGEXP_SUBSTR(str,ptn)
102 REGEXP_COUNT(str,ptn)
FETCH FIRST n ROWS ~ LIMIT n
LISTAGG GROUP_CONCAT
ROWID
ROWNUM ROW_NUMBER() OVER()
Hierarchical Functions
Next Opensource Cloud Value
개발도구들
41
도구들
▪ SQL Dev-Tools
• MySQL Workbench
• SQLyog
• HeidiSQL
• DBeaver
• ETC
✔ Platform Compatibility
✔ AUTOCOMMIT
✔ MULTI CONNECTION SUPPORT
✔ INSTANCE MANAGEMENT
✔ ROUTINES DEVELOPMENT
✔ SQL Autocomplete
▪ Migration Tools
• AWS DMS
• Oracle Golden Gate
• Attunity Replicator
• DBConvert Studio
• SymmetricDS
• Apache NiFi
• Flyway
✔ Reliability
✔ Security
✔ Source-Target Supports
✔ Performances
✔ Prices
https://hevodata.com/learn/data-migration-tools/
Next Opensource Cloud Value
성능개선
43
성능개선
▪ SQL실행 속도가 느려요
• 실행계획 확인
✔ 이행되는 모든 SQL들에 대해서 실행계획을 확인하고 정리하세요
ASIS에서 수행했던 소요시간 등의 기록이 있다면 전후를 비교하는게 좋겠습니다.
✔ 프로시저 내부의 SQL문 하나하나 모두 확인하셔야 해요.
Slow Query에는 프로시저명만 확인이 되요.
• OS/NW 환경 확인
✔ 커널파라미터
✔ 대역폭
• 자원증설
✔ 병목현상에 따라 CPU, Memory, Disk등의 자원 할당을 증가 시키세요
Next Opensource Cloud Value
모니터링
45
모니터링
▪ mytop (innotop)
https://github.com/jzawodn/mytop
https://github.com/innotop/innotop
46
모니터링
▪ Grafana
https://grafana.com/grafana/dashboards/7362
47
모니터링
▪ PMM (Percona Monitoring and Management)
https://www.percona.com/software/database-tools/percona-monitoring-and-management
Q&A
감사합니다
Next Opensource Cloud Value
NeoClova
51
NeoClova
업 체 명 ㈜ 네오클로바 대 표 자 이 재 중
사 업 분 야 오픈소스 기반의 유지보수, 컨설팅 / 전반 Linux OS, WEB, WAS, DBMS 분야 기술 지원 및 분석 지원 서비스
주 소 서울시 강서구 양천로 583(염창동 240-21) 우림블루나인 B동 1206호
회 사 설 립 년 도 2011년 11월 7일 (해당부문 종사기간 : 10년 1개월)
인 원 22명 (기술인력 : 16명)
52
NeoClova
기업부설연구소
직접생산증명서
(정보시스템개발)
소프트웨어사업자 성과공유제인증기업 인재육성형중소기업
중소기업확인서
RedHat
RBP
MariaDB
PlatinumPartner
Percona
ResellerPartner
SUSE
GoldPartner
NutanixERA
ServicePartner
Microsoft
AzureMPN
DellEMC
T2Partner
Mantech
PaaSPartner
53
NeoClova
KT/KTDS LGCNS LG전자 하나은행 신한은행 하나카드 삼성카드
하나금융
티아이
SKPLANET INVEN SUPERCAT 다우오피스 티머니 투썸플레이스 티머니-온다 질병관리청
54
NeoClova
카카오 카카오뱅크 아산병원 KT알파 무역진흥공사 EBS 비상교육 동국시스템즈
대성산업 이베스트증권 누리플랙스 케이뱅크 포스코 성원애드피아 KB헬스케어
외100여개
고객사
55
NeoClova
금융 공공 방송/통신/IT 유통/제조

More Related Content

What's hot

MariaDB MaxScale
MariaDB MaxScaleMariaDB MaxScale
MariaDB MaxScaleMariaDB plc
 
Maxscale switchover, failover, and auto rejoin
Maxscale switchover, failover, and auto rejoinMaxscale switchover, failover, and auto rejoin
Maxscale switchover, failover, and auto rejoinWagner Bianchi
 
MariaDB 제품 소개
MariaDB 제품 소개MariaDB 제품 소개
MariaDB 제품 소개NeoClova
 
Maxscale_메뉴얼
Maxscale_메뉴얼Maxscale_메뉴얼
Maxscale_메뉴얼NeoClova
 
Proxysql use case scenarios fosdem17
Proxysql use case scenarios    fosdem17Proxysql use case scenarios    fosdem17
Proxysql use case scenarios fosdem17Alkin Tezuysal
 
[오픈소스컨설팅]Day #1 MySQL 엔진소개, 튜닝, 백업 및 복구, 업그레이드방법
[오픈소스컨설팅]Day #1 MySQL 엔진소개, 튜닝, 백업 및 복구, 업그레이드방법[오픈소스컨설팅]Day #1 MySQL 엔진소개, 튜닝, 백업 및 복구, 업그레이드방법
[오픈소스컨설팅]Day #1 MySQL 엔진소개, 튜닝, 백업 및 복구, 업그레이드방법Ji-Woong Choi
 
The Full MySQL and MariaDB Parallel Replication Tutorial
The Full MySQL and MariaDB Parallel Replication TutorialThe Full MySQL and MariaDB Parallel Replication Tutorial
The Full MySQL and MariaDB Parallel Replication TutorialJean-François Gagné
 
How to set up orchestrator to manage thousands of MySQL servers
How to set up orchestrator to manage thousands of MySQL serversHow to set up orchestrator to manage thousands of MySQL servers
How to set up orchestrator to manage thousands of MySQL serversSimon J Mudd
 
Maxscale 소개 1.1.1
Maxscale 소개 1.1.1Maxscale 소개 1.1.1
Maxscale 소개 1.1.1NeoClova
 
MaxScale이해와활용-2023.11
MaxScale이해와활용-2023.11MaxScale이해와활용-2023.11
MaxScale이해와활용-2023.11NeoClova
 
MySQL_SQL_Tunning_v0.1.3.docx
MySQL_SQL_Tunning_v0.1.3.docxMySQL_SQL_Tunning_v0.1.3.docx
MySQL_SQL_Tunning_v0.1.3.docxNeoClova
 
New features in ProxySQL 2.0 (updated to 2.0.9) by Rene Cannao (ProxySQL)
New features in ProxySQL 2.0 (updated to 2.0.9) by Rene Cannao (ProxySQL)New features in ProxySQL 2.0 (updated to 2.0.9) by Rene Cannao (ProxySQL)
New features in ProxySQL 2.0 (updated to 2.0.9) by Rene Cannao (ProxySQL)Altinity Ltd
 
MySQL8.0_performance_schema.pptx
MySQL8.0_performance_schema.pptxMySQL8.0_performance_schema.pptx
MySQL8.0_performance_schema.pptxNeoClova
 
MySQL InnoDB Cluster 소개
MySQL InnoDB Cluster 소개MySQL InnoDB Cluster 소개
MySQL InnoDB Cluster 소개rockplace
 
Keepalived+MaxScale+MariaDB_운영매뉴얼_1.0.docx
Keepalived+MaxScale+MariaDB_운영매뉴얼_1.0.docxKeepalived+MaxScale+MariaDB_운영매뉴얼_1.0.docx
Keepalived+MaxScale+MariaDB_운영매뉴얼_1.0.docxNeoClova
 
Almost Perfect Service Discovery and Failover with ProxySQL and Orchestrator
Almost Perfect Service Discovery and Failover with ProxySQL and OrchestratorAlmost Perfect Service Discovery and Failover with ProxySQL and Orchestrator
Almost Perfect Service Discovery and Failover with ProxySQL and OrchestratorJean-François Gagné
 
Disaster Recovery with MySQL InnoDB ClusterSet - What is it and how do I use it?
Disaster Recovery with MySQL InnoDB ClusterSet - What is it and how do I use it?Disaster Recovery with MySQL InnoDB ClusterSet - What is it and how do I use it?
Disaster Recovery with MySQL InnoDB ClusterSet - What is it and how do I use it?Miguel Araújo
 
[2018] MySQL 이중화 진화기
[2018] MySQL 이중화 진화기[2018] MySQL 이중화 진화기
[2018] MySQL 이중화 진화기NHN FORWARD
 
ProxySQL for MySQL
ProxySQL for MySQLProxySQL for MySQL
ProxySQL for MySQLMydbops
 
[135] 오픈소스 데이터베이스, 은행 서비스에 첫발을 내밀다.
[135] 오픈소스 데이터베이스, 은행 서비스에 첫발을 내밀다.[135] 오픈소스 데이터베이스, 은행 서비스에 첫발을 내밀다.
[135] 오픈소스 데이터베이스, 은행 서비스에 첫발을 내밀다.NAVER D2
 

What's hot (20)

MariaDB MaxScale
MariaDB MaxScaleMariaDB MaxScale
MariaDB MaxScale
 
Maxscale switchover, failover, and auto rejoin
Maxscale switchover, failover, and auto rejoinMaxscale switchover, failover, and auto rejoin
Maxscale switchover, failover, and auto rejoin
 
MariaDB 제품 소개
MariaDB 제품 소개MariaDB 제품 소개
MariaDB 제품 소개
 
Maxscale_메뉴얼
Maxscale_메뉴얼Maxscale_메뉴얼
Maxscale_메뉴얼
 
Proxysql use case scenarios fosdem17
Proxysql use case scenarios    fosdem17Proxysql use case scenarios    fosdem17
Proxysql use case scenarios fosdem17
 
[오픈소스컨설팅]Day #1 MySQL 엔진소개, 튜닝, 백업 및 복구, 업그레이드방법
[오픈소스컨설팅]Day #1 MySQL 엔진소개, 튜닝, 백업 및 복구, 업그레이드방법[오픈소스컨설팅]Day #1 MySQL 엔진소개, 튜닝, 백업 및 복구, 업그레이드방법
[오픈소스컨설팅]Day #1 MySQL 엔진소개, 튜닝, 백업 및 복구, 업그레이드방법
 
The Full MySQL and MariaDB Parallel Replication Tutorial
The Full MySQL and MariaDB Parallel Replication TutorialThe Full MySQL and MariaDB Parallel Replication Tutorial
The Full MySQL and MariaDB Parallel Replication Tutorial
 
How to set up orchestrator to manage thousands of MySQL servers
How to set up orchestrator to manage thousands of MySQL serversHow to set up orchestrator to manage thousands of MySQL servers
How to set up orchestrator to manage thousands of MySQL servers
 
Maxscale 소개 1.1.1
Maxscale 소개 1.1.1Maxscale 소개 1.1.1
Maxscale 소개 1.1.1
 
MaxScale이해와활용-2023.11
MaxScale이해와활용-2023.11MaxScale이해와활용-2023.11
MaxScale이해와활용-2023.11
 
MySQL_SQL_Tunning_v0.1.3.docx
MySQL_SQL_Tunning_v0.1.3.docxMySQL_SQL_Tunning_v0.1.3.docx
MySQL_SQL_Tunning_v0.1.3.docx
 
New features in ProxySQL 2.0 (updated to 2.0.9) by Rene Cannao (ProxySQL)
New features in ProxySQL 2.0 (updated to 2.0.9) by Rene Cannao (ProxySQL)New features in ProxySQL 2.0 (updated to 2.0.9) by Rene Cannao (ProxySQL)
New features in ProxySQL 2.0 (updated to 2.0.9) by Rene Cannao (ProxySQL)
 
MySQL8.0_performance_schema.pptx
MySQL8.0_performance_schema.pptxMySQL8.0_performance_schema.pptx
MySQL8.0_performance_schema.pptx
 
MySQL InnoDB Cluster 소개
MySQL InnoDB Cluster 소개MySQL InnoDB Cluster 소개
MySQL InnoDB Cluster 소개
 
Keepalived+MaxScale+MariaDB_운영매뉴얼_1.0.docx
Keepalived+MaxScale+MariaDB_운영매뉴얼_1.0.docxKeepalived+MaxScale+MariaDB_운영매뉴얼_1.0.docx
Keepalived+MaxScale+MariaDB_운영매뉴얼_1.0.docx
 
Almost Perfect Service Discovery and Failover with ProxySQL and Orchestrator
Almost Perfect Service Discovery and Failover with ProxySQL and OrchestratorAlmost Perfect Service Discovery and Failover with ProxySQL and Orchestrator
Almost Perfect Service Discovery and Failover with ProxySQL and Orchestrator
 
Disaster Recovery with MySQL InnoDB ClusterSet - What is it and how do I use it?
Disaster Recovery with MySQL InnoDB ClusterSet - What is it and how do I use it?Disaster Recovery with MySQL InnoDB ClusterSet - What is it and how do I use it?
Disaster Recovery with MySQL InnoDB ClusterSet - What is it and how do I use it?
 
[2018] MySQL 이중화 진화기
[2018] MySQL 이중화 진화기[2018] MySQL 이중화 진화기
[2018] MySQL 이중화 진화기
 
ProxySQL for MySQL
ProxySQL for MySQLProxySQL for MySQL
ProxySQL for MySQL
 
[135] 오픈소스 데이터베이스, 은행 서비스에 첫발을 내밀다.
[135] 오픈소스 데이터베이스, 은행 서비스에 첫발을 내밀다.[135] 오픈소스 데이터베이스, 은행 서비스에 첫발을 내밀다.
[135] 오픈소스 데이터베이스, 은행 서비스에 첫발을 내밀다.
 

Similar to MySQL_MariaDB로의_전환_기술요소-202212.pptx

[Pgday.Seoul 2020] SQL Tuning
[Pgday.Seoul 2020] SQL Tuning[Pgday.Seoul 2020] SQL Tuning
[Pgday.Seoul 2020] SQL TuningPgDay.Seoul
 
MariaDB Other Features
MariaDB Other FeaturesMariaDB Other Features
MariaDB Other FeaturesJongJin Lee
 
From MSSQL to MySQL
From MSSQL to MySQLFrom MSSQL to MySQL
From MSSQL to MySQLI Goo Lee
 
개발자도 알아야 하는 DBMS튜닝
개발자도 알아야 하는 DBMS튜닝개발자도 알아야 하는 DBMS튜닝
개발자도 알아야 하는 DBMS튜닝정해 이
 
데이타베이스 기본튜닝
데이타베이스 기본튜닝 데이타베이스 기본튜닝
데이타베이스 기본튜닝 Jinuk Bhak
 
Amazon aurora 2
Amazon aurora 2Amazon aurora 2
Amazon aurora 2EXEM
 
[223]rye, 샤딩을 지원하는 오픈소스 관계형 dbms
[223]rye, 샤딩을 지원하는 오픈소스 관계형 dbms[223]rye, 샤딩을 지원하는 오픈소스 관계형 dbms
[223]rye, 샤딩을 지원하는 오픈소스 관계형 dbmsNAVER D2
 
Vectorized processing in_a_nutshell_DeView2014
Vectorized processing in_a_nutshell_DeView2014Vectorized processing in_a_nutshell_DeView2014
Vectorized processing in_a_nutshell_DeView2014Gruter
 
[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3
[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3
[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3Seok-joon Yun
 
MySQL 실행계획
MySQL 실행계획MySQL 실행계획
MySQL 실행계획Wonjun Hwang
 
MySQL Performance Tuning (In Korean)
MySQL Performance Tuning (In Korean)MySQL Performance Tuning (In Korean)
MySQL Performance Tuning (In Korean)OracleMySQL
 
ecdevday8 웹개발자의 약한고리 SQL 뛰어넘기
ecdevday8 웹개발자의 약한고리 SQL 뛰어넘기ecdevday8 웹개발자의 약한고리 SQL 뛰어넘기
ecdevday8 웹개발자의 약한고리 SQL 뛰어넘기Kenu, GwangNam Heo
 
Migration to Azure Database for MySQL
Migration to Azure Database for MySQLMigration to Azure Database for MySQL
Migration to Azure Database for MySQLrockplace
 
[2013 CodeEngn Conference 09] wh1ant - various tricks for linux remote exploits
[2013 CodeEngn Conference 09] wh1ant - various tricks for linux remote exploits[2013 CodeEngn Conference 09] wh1ant - various tricks for linux remote exploits
[2013 CodeEngn Conference 09] wh1ant - various tricks for linux remote exploitsGangSeok Lee
 
MariaDB 마이그레이션 - 네오클로바
MariaDB 마이그레이션 - 네오클로바MariaDB 마이그레이션 - 네오클로바
MariaDB 마이그레이션 - 네오클로바NeoClova
 
하이퍼레저 패브릭 데이터 구조
하이퍼레저 패브릭 데이터 구조하이퍼레저 패브릭 데이터 구조
하이퍼레저 패브릭 데이터 구조Logpresso
 
[오라클교육/SQL교육/IT교육/실무중심교육학원추천_탑크리에듀]#4.SQL초보에서 Schema Objectes까지
[오라클교육/SQL교육/IT교육/실무중심교육학원추천_탑크리에듀]#4.SQL초보에서 Schema Objectes까지[오라클교육/SQL교육/IT교육/실무중심교육학원추천_탑크리에듀]#4.SQL초보에서 Schema Objectes까지
[오라클교육/SQL교육/IT교육/실무중심교육학원추천_탑크리에듀]#4.SQL초보에서 Schema Objectes까지탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Intro KaKao ADT (Almighty Data Transmitter)
Intro KaKao ADT (Almighty Data Transmitter)Intro KaKao ADT (Almighty Data Transmitter)
Intro KaKao ADT (Almighty Data Transmitter)I Goo Lee
 
Amazon Aurora 신규 서비스 알아보기::최유정::AWS Summit Seoul 2018
Amazon Aurora 신규 서비스 알아보기::최유정::AWS Summit Seoul 2018Amazon Aurora 신규 서비스 알아보기::최유정::AWS Summit Seoul 2018
Amazon Aurora 신규 서비스 알아보기::최유정::AWS Summit Seoul 2018Amazon Web Services Korea
 

Similar to MySQL_MariaDB로의_전환_기술요소-202212.pptx (20)

[Pgday.Seoul 2020] SQL Tuning
[Pgday.Seoul 2020] SQL Tuning[Pgday.Seoul 2020] SQL Tuning
[Pgday.Seoul 2020] SQL Tuning
 
Sql기초강좌2_SET AUTOTRACE_SQL교육
Sql기초강좌2_SET AUTOTRACE_SQL교육Sql기초강좌2_SET AUTOTRACE_SQL교육
Sql기초강좌2_SET AUTOTRACE_SQL교육
 
MariaDB Other Features
MariaDB Other FeaturesMariaDB Other Features
MariaDB Other Features
 
From MSSQL to MySQL
From MSSQL to MySQLFrom MSSQL to MySQL
From MSSQL to MySQL
 
개발자도 알아야 하는 DBMS튜닝
개발자도 알아야 하는 DBMS튜닝개발자도 알아야 하는 DBMS튜닝
개발자도 알아야 하는 DBMS튜닝
 
데이타베이스 기본튜닝
데이타베이스 기본튜닝 데이타베이스 기본튜닝
데이타베이스 기본튜닝
 
Amazon aurora 2
Amazon aurora 2Amazon aurora 2
Amazon aurora 2
 
[223]rye, 샤딩을 지원하는 오픈소스 관계형 dbms
[223]rye, 샤딩을 지원하는 오픈소스 관계형 dbms[223]rye, 샤딩을 지원하는 오픈소스 관계형 dbms
[223]rye, 샤딩을 지원하는 오픈소스 관계형 dbms
 
Vectorized processing in_a_nutshell_DeView2014
Vectorized processing in_a_nutshell_DeView2014Vectorized processing in_a_nutshell_DeView2014
Vectorized processing in_a_nutshell_DeView2014
 
[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3
[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3
[2015-06-26] Oracle 성능 최적화 및 품질 고도화 3
 
MySQL 실행계획
MySQL 실행계획MySQL 실행계획
MySQL 실행계획
 
MySQL Performance Tuning (In Korean)
MySQL Performance Tuning (In Korean)MySQL Performance Tuning (In Korean)
MySQL Performance Tuning (In Korean)
 
ecdevday8 웹개발자의 약한고리 SQL 뛰어넘기
ecdevday8 웹개발자의 약한고리 SQL 뛰어넘기ecdevday8 웹개발자의 약한고리 SQL 뛰어넘기
ecdevday8 웹개발자의 약한고리 SQL 뛰어넘기
 
Migration to Azure Database for MySQL
Migration to Azure Database for MySQLMigration to Azure Database for MySQL
Migration to Azure Database for MySQL
 
[2013 CodeEngn Conference 09] wh1ant - various tricks for linux remote exploits
[2013 CodeEngn Conference 09] wh1ant - various tricks for linux remote exploits[2013 CodeEngn Conference 09] wh1ant - various tricks for linux remote exploits
[2013 CodeEngn Conference 09] wh1ant - various tricks for linux remote exploits
 
MariaDB 마이그레이션 - 네오클로바
MariaDB 마이그레이션 - 네오클로바MariaDB 마이그레이션 - 네오클로바
MariaDB 마이그레이션 - 네오클로바
 
하이퍼레저 패브릭 데이터 구조
하이퍼레저 패브릭 데이터 구조하이퍼레저 패브릭 데이터 구조
하이퍼레저 패브릭 데이터 구조
 
[오라클교육/SQL교육/IT교육/실무중심교육학원추천_탑크리에듀]#4.SQL초보에서 Schema Objectes까지
[오라클교육/SQL교육/IT교육/실무중심교육학원추천_탑크리에듀]#4.SQL초보에서 Schema Objectes까지[오라클교육/SQL교육/IT교육/실무중심교육학원추천_탑크리에듀]#4.SQL초보에서 Schema Objectes까지
[오라클교육/SQL교육/IT교육/실무중심교육학원추천_탑크리에듀]#4.SQL초보에서 Schema Objectes까지
 
Intro KaKao ADT (Almighty Data Transmitter)
Intro KaKao ADT (Almighty Data Transmitter)Intro KaKao ADT (Almighty Data Transmitter)
Intro KaKao ADT (Almighty Data Transmitter)
 
Amazon Aurora 신규 서비스 알아보기::최유정::AWS Summit Seoul 2018
Amazon Aurora 신규 서비스 알아보기::최유정::AWS Summit Seoul 2018Amazon Aurora 신규 서비스 알아보기::최유정::AWS Summit Seoul 2018
Amazon Aurora 신규 서비스 알아보기::최유정::AWS Summit Seoul 2018
 

MySQL_MariaDB로의_전환_기술요소-202212.pptx

  • 1. Oracle to MySQL/MariaDB 전환 시 알아야 할 기술요소 (개발자 중심) 네오클로바 ▶ 2022. 11
  • 2. 2 목차 기준 내용 MySQL 5.7 ~ MariaDB 10.3 ~ - 고민할 것들 - 뭐가 달라요? - 전환가이드 - 도구들 - 성능개선 - 모니터링 - 관련내용은 당사의 의견임을 참고하세요
  • 3. Next Opensource Cloud Value 고민할것들
  • 4. 4 고민할것들 ▪ DB 운영 환경 – 자원할당, HA을 고려한 시스템구성 ▪ DB 내외부 연계방안 – DB간 연결, 접근제어, 데이터 암호화 등 ▪ DB 이행 규칙 – 스키마, 오브젝트, 데이터, SQL 등 전환규칙 ▪ DB 운영 안정화 방안 – 클라우드, 인적교육, 외부지원 ▪ DB(Opensource) 기술동향 – Release, Upgrade - 사례로 알아보는 오라클 마이그레이션 https://www.slideshare.net/neoclova/mariadb-249171970
  • 5. Next Opensource Cloud Value 고정관념
  • 6. 6 고정관념 • MySQL/MariaDB 는 공짜다? • 타 DBMS에 비해 성능이 떨어진다? • Oracle에서는 되던데, 왜 MySQL에서는 안돼요? • MySQL이라서 그런지 성능이 안나오는데요? • SQL튜닝은 DBA가 해야 할 일이다?
  • 7. Next Opensource Cloud Value 뭐가 달라요?
  • 9. 9 뭐가 달라요? ▪ 아키텍처 • Thread 방식이에요 ✔ Only mysqld process (cf. mysqld_safe) • 기본적으로 Single Core로만 SQL을 처리해요 ✔ 병렬(Parallel)처리를 지원하지 않아요. ✔ 일부 DDL 병렬처리 기능이 도입되고 있어요( MySQL 8.0.27 - innodb_ddl_threads ) • Nested Loop 방식의 Join을 사용해요 ✔ innodb_adaptive_hash_index (mysql enable, mariadb disable) • 다양한 스토리지 엔진을 지원해요 ✔ INNODB 대세( MVCC, #show engines; ) • 복제기능이 내장돼 있어요 ✔ Async Replication ( with plugins – semi-sync) ✔ 비동기임을 감안해서 HA 구성하세요. • Scale-Out > Scale-Up
  • 10. 10 뭐가 달라요? ▪ General • AUTOCOMMIT=TRUE ✔ 어플리케이션 CONNECTION 처리에 유의 ✔ 빈번한 autocommit의 변경은 성능저하 원인 • EXPLAIN PLAN ✔ 실행계획을 저장/재사용 하지 않아요. • QUERY (RESULTS) CACHE ✔ SQL 수행결과의 캐싱. ✔ 지원여부는 버전별로 차이가 있어요. (MySQL 5.7.20~ deprecated) • default ISOLATION LEVEL ✔ REPEATABLE-READ ✔ READ-COMMITTED (Oracle, SQLServer) • Community vs Commercial ✔ 지원하는 기능이 달라요.( storage engine ) ✔ MySQL vs MariaDB vs Percona Server for MySQL
  • 11. 11 뭐가 달라요? ▪ 스키마 • 스키마는 데이터베이스와 동의어로 취급해요 ✔ 인스턴스 > 데이터베이스 > 스키마 > 테이블 ✔ 인스턴스 > 데이터베이스(스키마) > 테이블 • 서로 다른 데이터베이스의 테이블 간에도 조인이 가능 ✔ 따라서 개념은 schema에 가까워요 • 소유자(owner) 개념은 없어요 • show databases , show schemas • system schema ✔ mysql ✔ information_schema ✔ performance_schema ✔ sys mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ mysql> show schemas; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+
  • 12. 12 뭐가 달라요? ▪ Tablespace (innodb) • System Tablespace ✔ ibdataN~ ✔ 하나이상의 파일로 구성 ✔ 8M단위로 자동확장. • Table당 Tablespace ✔ Table당 파일이 생성되요(innodb_file_per_table) ✔ 파티션시 개별 파티션별로 파일이 생성되요 ✔ 미리 늘려 놓을 수 없어요. 자동확장이 되요. • General Tablespace (Only MySQL) ✔ 오라클처럼 여러 테이블을 하나의 Tablespace에 저장할 수도 있어요 ✔ 인덱스를 별도 Tablespace에 분리할 수는 없어요 • Undo Tablespace • Temporary Tablespace
  • 13. 13 뭐가 달라요? ▪ Table • General ✔ 테이블별로 다른 스토리지 엔진을 사용할 수 있어요. ✔ 테이블별로 압축을 제어할 수 있어요. ✔ Page수준 암호화 지원, 플러그인. 컬럼 암호화 아님. ✔ 대소문자 구분 활성화/비활성 할 수 있어요. 초기화 시점에 적용가능 ✔ Table에 PK/UK로 AUTO_INCREMENT 컬럼을 1개 만들 수 있어요. ✔ PRIMARY KEY가 곧 테이블 이에요. ✔ 원격지 테이블/파일등에 연결할 수 있어요(federated , connect) ✔ 테이블을 삭제해도 권한이 취소되지 않아요(명시적인 REVOKE 필요) • InnoDB 제한( 16K page, row_format=DYNAMIC ) ✔ 최대 크기 : 64T ✔ 최대 컬럼 수 : 1017개 ✔ 최대 행 크기 : 65535 Bytes (기본 + 오버플로 페이지) ✔ 기본 페이지 : 8126 Bytes (255byte 이하 컬럼들 합) mysql [test]> show create table t1G *************************** 1. row *************************** Table: t1 Create Table: CREATE TABLE `t1` ( `id` int(11) NOT NULL, `nm` varchar(20) COLLATE utf8mb4_bin DEFAULT NULL, `rrno` varchar(13) COLLATE utf8mb4_bin NOT NULL, `srv_yn` varchar(1) COLLATE utf8mb4_bin NOT NULL, `reti_dt` varchar(8) COLLATE utf8mb4_bin NOT NULL, PRIMARY KEY (`id`), KEY `rrno` (`rrno`,`srv_yn`,`reti_dt`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin 1 row in set (0.001 sec) mysql [test]> show global variables like 'innodb_default_row_format'; +---------------------------+---------+ | Variable_name | Value | +---------------------------+---------+ | innodb_default_row_format | dynamic | +---------------------------+---------+ 1 row in set (0.001 sec)
  • 14. 14 뭐가 달라요? ▪ Table (중요) • Basic ✔ page size default 16K vs Oracle/MSSQL/PostgreSQL 8K (innodb_page_size) ✔ 바꿀 수 있으나 바꾸지 마세요. 득보다 위험요소가 많아요. ✔ 크기는 미리 늘려 놓을 수 없어요. 자동확장이 되요. ✔ 테이블명에 대소문자 구분을 해요. • Primary Key ✔ 테이블 생성시 무조건 PK는 부여해 주세요. 복제지연(장애)과 성능저하의 원인이 됩니다. ✔ Oracle은 ROWID로 테이블과 인덱스가 연결되어 있지만, MySQL은 Primary key로 연결돼 있어요. • Partition ✔ 개별 파티션별로 파일이 생성되요 ✔ Local Partition만 지원해요 ✔ 파티션 키 컬럼이 반드시 PK에 포함되어야 해요. • CHARACTER SET / COLLATION ✔ Table/Column별 CHARSET 설정이 가능해요 ✔ UTF8(utf8mb3), UTF8MB4(권고)
  • 15. 15 뭐가 달라요? ▪ Column • AUTO_INCREMENT ✔ 테이블종속, 정수형, 자동증가. PK, UK로 활용하세요. ✔ SERIAL = BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE • NULL ✔ 빈문자열 '' (Empty String) 과 NULL값은 달라요 ✔ 인덱스 페이지에 값이 저장됨(인덱스 활용 가능) ✔ 정렬 시 선행 검색, 오라클은 후행 검색 되요 ✔ NULL 여부를 위해서 1비트 추가 저장공간 소요 • 산술연산은 NULL, 그룹함수나 문자연결시에는 연산에서 제외 • COMPRESSED (Only MariaDB) ✔ 특정 컬럼만 압축이 가능해요(blob) • Invisible ~, Generated ~ as ~, ✔ 빠르게 좋아지고 있어요 MariaDB [test]> select * from t1; +------+------+------+ | id | no | nm | +------+------+------+ | 1 | NULL | NULL | | 2 | 100 | NULL | | 3 | 200 | Lee | +------+------+------+ 3 rows in set (0.000 sec) MariaDB [test]> select id, sum(no), min(nm) from t1; +------+---------+---------+ | id | sum(no) | min(nm) | +------+---------+---------+ | 1 | 300 | Lee | +------+---------+---------+ 1 row in set (0.000 sec) MariaDB [test]> select id, sum(no), max(nm) from t1; +------+---------+---------+ | id | sum(no) | max(nm) | +------+---------+---------+ | 1 | 300 | Lee | +------+---------+---------+ 1 row in set (0.000 sec)
  • 16. 16 뭐가 달라요? ▪ Data Type • 숫자형 ✔ 정수형 세분화 지원(tinyint, smallint, mediumint, int, bigint) ✔ 부동소수점 값은 근사치로 반올림 처리에 유의 (FLOAT은 안쓰는 걸로!!) • 문자열 ✔ 가변길이는 1~2Bytes 추가 길이 필요해요 ✔ 길이단위로 해석, 단 이진문자열은BYTE단위. ✔ UTF8 : 3BYTE, UTF8MB4 : 4BYTE ✔ 일반적으로 Character In-Senstive가 기본 Collation. (utf8mb4_0900_ai_ci , utf8mb4_unicode_ci ) ✔ 대체로 데이터 값의 뒤 공백을 제거하고 비교하나, COLLATION 마다 차이가 있음으로 확인필요 (PAD 속성) • 날짜형 ✔ DATETIME : '1000-01-01 00:00:00.000000' ~ '9999-12-31 23:59:59.999999' ✔ TIMESTAMP: '1970-01-01 00:00:01.000000' ~ '2038-01-19 03:14:07.999999' ✔ TIME, YEAR • JSON ✔ MySQL : RFC7159에 정의된 데이터유형 지원 ( JSON 객체) ✔ MariaDB : MySQL호환성을 위한 LONGTEXT (JSON 문자열) • 미지원 ✔ xml
  • 17. 17 뭐가 달라요? ▪ VIEW • Logical Table ✔ not supported MATERIALIZED VIEW ▪ ROUTINES ✔ security_type DEFINER/INVOKER – EXECUTE/~ • PACKAGE (Only MariaDB) ✔ MariaDB는 지원해요.(SQL_MODE=ORACLE) • PROCEDURE / FUNCTION ✔ AS 키워드가 없어요. • TRIGGER ✔ DML_EVENT만 지원, DDL_EVENT/DATABASE_EVENT 미지원 ✔ SQL문에 의한 테이블 변경시에만 활성화됨 • EVENT ✔ ORACLE - scheduler
  • 18. 18 뭐가 달라요? ▪ SEQUENCE (Only MariaDB) ✔ AUTO_INCREMENT 대안 ✔ 실제로는 InnoDB Engine. (cf. Sequence Storage Engine – virtual dummy table) • 사용법 ✔ NEXT VALUE FOR sequence_name / NEXTVAL(sequence_name) / sequence_name.nextval ✔ PREVIOUS VALUE FOR sequence_name / LASTVAL(sequence_name) / sequence_name.currval ▪ Index • Page 구조 ✔ PRIMARY KEY : PK 컬럼 값들의 순으로 정렬된 테이블, PK 이름을 바꿀 수 없어요. ✔ SECONDARY KEY : PK 값이 숨어있어요. (ROWID 역할) • Descending ✔ MySQL 8.0~, MariaDB 10.8~ 지원 ✔ 이전 버전까지는 ASC로만 컬럼들 정렬해서 인덱스 생성 • FULL-TEXT Search ✔ NGRAM Parser ▪ DATABASE LINK ✔ 미지원 ✔ federated (비추)
  • 19. 19 뭐가 달라요? ▪ Account • user@host ✔ user가 접속하는 host까지가 계정정보 ✔ 동일한 user라도 접속 host의 비번이 다를 수 있어요. • password management ✔ Validation Plugin을 통해서 제어 ✔ MySQL / MariaDB 다름 • Drop user ✔ 소유한 객체가 있어도 삭제가 되거든요. ✔ cascade 미지원 MariaDB [mysql]> show tables; +---------------------------+ | Tables_in_mysql | +---------------------------+ | column_stats | | columns_priv | | db | | event | | func | | general_log | | global_priv | | gtid_slave_pos | | help_category | | help_keyword | | help_relation | | help_topic | | index_stats | | innodb_index_stats | | innodb_table_stats | | plugin | | proc | | procs_priv | | proxies_priv | | roles_mapping | | servers | | slow_log | | table_stats | | tables_priv | | time_zone | | time_zone_leap_second | | time_zone_name | | time_zone_transition | | time_zone_transition_type | | transaction_registry | | user | +---------------------------+
  • 20. 20 뭐가 달라요? ▪ Standard SQL • MySQL/MariaDB ✔ vs ANSI-SQL92 ✔ SELECT ~ INTO table 은 INSERT INTO table SELECT ~ 로 지원 ✔ UPDATE t1 SET c1 = c1 +1, c2 = c1; UPDATE t1 SET c2 = c1, c1 = c1 +1; 두 문장의 결과는 달라요. ✔ FOREIGN KEY로 부모테이블의 UNIQUE/NOT NULL 조건이 아닌 인덱싱 컬럼도 지원 ✔ 지원하는 주석처리 /*! ~~ */ (구문분석 수행) #~ -- ~ (-- 다음 공백 있음) ✔ || (OR), && (AND)로 해석, 문자열 연결은 CONCAT() 이용. ✔ TRIM()은 부분문자열 제거지원.(cf. Oracle – 단일문자 제거) ✔ LIMIT 절 (UPDATE ~ JOIN절의 경우는 LIMIT 사용불가) ✔ FROM절의 SUBQUERY내의 ORDER BY는 무시. • SQL_MODE ✔ Strict Mode Disable 운영 시 느슨한 데이터 유효성 검사로 데이터 유실 될 수 있어요. • Hint ✔ 주석을 이용한 힌트 사용시에도 SQL 구문 오류가 발생할 수 있어요 ✔ 주석내의 코드에 대한 구문분석을 실행 select * from ( select id, nm, srv_yn, reti_dt from t1 where rrno='23475296848' order by srv_yn desc, reti_dt desc limit 3 ) A; VS select * from ( select id, nm, srv_yn, reti_dt from t1 where rrno='23475296848' order by srv_yn desc, reti_dt desc ) A limit 3; VS select * from ( select id, nm, srv_yn, reti_dt from t1 where rrno='23475296848' ) A order by srv_yn desc, reti_dt desc limit 3; https://mariadb.com/kb/en/why-is-order-by-in-a-from-subquery-ignored/
  • 21. Next Opensource Cloud Value 전환 가이드
  • 22. 22 전환 가이드 ▪ DATA • 스키마 전환 • 데이터 이행 • 데이터 변환 ▪ SQL CODE • ROUTINES 변환 • Application(SQL) 변환 Table Mapping List 의 작성 To-Be 환경에 Table 생성 Column Default값 수정 1 2 3 4 예외 처리 Schema구성 함수등 변경 데이터 이행 및 변경 적재 CDC 툴등 이용 ROUTINES 변환 SQL 변환 To-Be Application 확인
  • 23. 23 전환 가이드 ▪ 아키텍처 • 분산과 복제를 통한 구성 교체(from Shard to Shard Nothing) ✔ Service Sharding ✔ Master/Slaves Replication ✔ Parallel Replication Enable ✔ Semi-Sync Replication Enable (cf. RAC) ✔ Group Replication • High Availability 구성 ✔ MySQL : Galera Cluster, InnoDB Cluster, ProxySQL, MySQLRouter, MHA, Orchestrator ✔ MariaDB : Enterprise Cluster, ProxySQL, MHA, Orchestrator, Xpand • 고려사항 ✔ 안전성, 레퍼런스, 운영편의성, 기술지원 ✔ PoC, Education, Upgrade
  • 24. 24 전환 가이드 ▪ General • DBMS ✔ Community : MySQL 8.0.31 이상, MariaDB 10.5.x, MariaDB 10.6.x(LTS) ✔ Commercial : Latest minor version in Any Major Version (MariaDB Community는 2년마다 LTS version 배포) ✔ COLLATION : utf8mb4_general_ci , utf8mb4_bin, utf8mb4_unicode_ci, utf8mb4_unicode_520_ci 을 추천 한글 검색, Padding Space 등을 확인하세요 모든 스키마/테이블의 Collation은 통일. empty string : https://bugs.mysql.com/bug.php?id=101311 한글검색 및 pad space : https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html ✔ InnoDB Storage engine을 사용하세요 ✔ Query Cache(MariaDB) 비활성화 하세요 (query_cache_type=0) ✔ 격리수준 (transaction_isolation = READ-COMMITTED)을 확인하세요 ✔ 반드시 SQL_MODE를 제어하세요. STRICT_ALL_TABLES or STRICT_TRANS_TABLES 를 추가하세요. 데이터 유실을 방지 할 수 있어요. mysql> select * from COLLATIONS where COLLATION_NAME in ('utf8mb4_general_ci' , 'utf8mb4_bin', 'utf8mb4_unicode_ci', 'utf8mb4_unicode_520_ci','utf8mb4_0900_ai_ci'); +------------------------+--------------------+-----+------------+-------------+---------+---------------+ | COLLATION_NAME | CHARACTER_SET_NAME | ID | IS_DEFAULT | IS_COMPILED | SORTLEN | PAD_ATTRIBUTE | +------------------------+--------------------+-----+------------+-------------+---------+---------------+ | utf8mb4_0900_ai_ci | utf8mb4 | 255 | Yes | Yes | 0 | NO PAD | | utf8mb4_bin | utf8mb4 | 46 | | Yes | 1 | PAD SPACE | | utf8mb4_general_ci | utf8mb4 | 45 | | Yes | 1 | PAD SPACE | | utf8mb4_unicode_520_ci | utf8mb4 | 246 | | Yes | 8 | PAD SPACE | | utf8mb4_unicode_ci | utf8mb4 | 224 | | Yes | 8 | PAD SPACE | +------------------------+--------------------+-----+------------+-------------+---------+---------------+
  • 25. 25 전환 가이드 ▪ General • JDBC/Application ✔ 복제환경에 Router(L4, HAProxy, ProxySQL, Maxscale등) 사용 시 Connection은 반드시 Router를 통해서 DB에 접속 하세요. Cluster가 깨지는 원인이 됩니다. ✔ 최신버전 JDBC Driver 사용하세요 jdbc : replication jdbc : sequential jdbc : loadbalance ✔ Connection Pool 의 timeout 설정을 확인하세요 idle timeout check ✔ Autocommit = true 로 Application Transaction Control 하세요. Replica 환경에서 Transaction 분산에 유리(ex. Maxscale) WAS(n) WAS1 Maxscale/MySQL Router/ProxySQL Write Replication #1 #3 #2 Read Read
  • 26. 26 전환 가이드 ▪ MODELING ✔ AS-IS 문자타입 길이를 확인하세요. ✔ 적절한 크기에 맞는 숫자타입(tinyint ~ bigint)을 선택하세요 정수형 타입 UNSIGNED ~ 권고 ✔ float타입은 사용을 자제하세요 이행과정에서 데이터가 오염(반올림) 될 수 있음으로 DECIMAL(m,n)을 사용하세요 ✔ 긴 문자열은 PK로 사용하지 마세요. VARCHAR2(128) 등은 UNIQUE KEY로 전환하고, AUTO_INCREMENT/SEQUENCE를 이용한 AK를 PK로 사용하세요 ✔ 문자열 길이단위(varchar(10), 10개 문자, charset에 따라 byte는 다름)임으로 용량산정 시 주의하세요 ✔ VARCHAR2(1000) 처럼 문자열 길이가 큰 경우는 TEXT를 사용하세요 ✔ 날짜는 날짜타입(가능한 DATE, DATETIME)에 저장하세요 VARCHAR2(8) DATE VARCHAR2(14) DATE, DATETIME ✔ 컬럼별로 다른 charset/collation을 사용하면 주의해야 합니다. 특히 명시적으로 제약조건/조인조건절에 사용하는 컬럼의 경우는 성능저하의 원인이 될 수 있습니다. https://mariadb.com/kb/en/optimization-and-indexes/ https://mariadb.com/kb/en/optimizing-data-structure/
  • 27. 27 전환 가이드 ▪ Tablespaces • Table ✔ Primary Key가 없이 테이블을 생성할 수 없도록 제어하세요 MySQL : sql_require_primary_key (8.0.13 ~ ) MariaDB : innodb_force_primary_key(10.2 ~) ✔ 기본문자셋은 utf8mb4을 사용하세요 emoji 문자 등에 유용해요 ✔ 모든 테이블/컬럼의 문자셋은 통일 하는게 좋습니다 제약조건/조인처리 등에서 성능저하가 발생할 수 있습니다 만약, 다르게 관리한다면 주의가 필요합니다. ✔ PK 컬럼은 AUTO_INCREMENT/SEQUENCE를 활용하세요 PK의 크기가 크면 IO면에서 성능저하가 발생합니다 ✔ 대소문자 구분을 안 하도록 사용하세요 lower_case_table_name=1 ✔ 테이블별로 다른 Storage Engine을 설정할 수 있어요 그렇지만 특별한 목적이 아니라면, InnoDB 를 사용하세요. MariaDB [INFORMATION_SCHEMA]> SELECT * FROM SYSTEM_VARIABLES WHERE VARIABLE_NAME LIKE '%primary%'G *************************** 1. row *************************** VARIABLE_NAME: INNODB_FORCE_PRIMARY_KEY SESSION_VALUE: NULL GLOBAL_VALUE: OFF GLOBAL_VALUE_ORIGIN: COMPILE-TIME DEFAULT_VALUE: OFF VARIABLE_SCOPE: GLOBAL VARIABLE_TYPE: BOOLEAN VARIABLE_COMMENT: Do not allow to create table without primary key (off by default) NUMERIC_MIN_VALUE: NULL NUMERIC_MAX_VALUE: NULL NUMERIC_BLOCK_SIZE: NULL ENUM_VALUE_LIST: OFF,ON READ_ONLY: NO COMMAND_LINE_ARGUMENT: OPTIONAL
  • 28. 28 전환 가이드 ▪ Tablespaces • Partition ✔ 파티션 사용은 가급적 지양하세요. 성능측면보다는 관리측면에서 유리합니다 데이터 크기가 100G이상 인 경우 검토하세요 ✔ 파티션 키 컬럼은 반드시 Primary Key 에 포함되어야 해요 즉, 테이블의 PK가 바뀐다는 이야기며, 이는 Application의 SQL이 수정되어야 한다는 합니다 ✔ 파티션 프루닝이 적용되는지 반드시 확인하세요. 이를 위해서는 SQL제약조건에 파티션 키 컬럼에 대한 제약조건이 있어야 합니다. EXPLAIN EXTEND ~ (~ MySQL 5.6) EXPLAN ~ (MySQL 5.7 ~) EXPLAIN partitions ~ (MariaDB ) ✔ 특히 날짜형 타입(DATE/DATETIME)은 파티션 프루닝을 지원하는 함수만 사용하세요 YEAR(), TO_DAYS(), TO_SECONDS() ✔ TRIGGER와 함께 파티션을 사용하지 마세요 BEFORE INSERT/UPDATE Trigger가 있는 파티션 테이블은 모든 파티션을 잠금수행합니다. ✔ Create Table: CREATE TABLE “dktnfkqkfqkfxk" ( "id" bigint(20) NOT NULL AUTO_INCREMENT, "global_id" varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL, "global_id_seq" varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL, "log_unixtime" varchar(6) COLLATE utf8mb4_unicode_ci NOT NULL, "mci_log_point" decimal(2,0) NOT NULL, "log_year" varchar(4) COLLATE utf8mb4_unicode_ci NOT NULL, "log_month" varchar(2) COLLATE utf8mb4_unicode_ci NOT NULL, "log_day" varchar(2) COLLATE utf8mb4_unicode_ci NOT NULL, "guid" varchar(63) COLLATE utf8mb4_unicode_ci NOT NULL, "resource_cd" varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, "resource_nm" varchar(800) COLLATE utf8mb4_unicode_ci DEFAULT NULL, "mci_rst_info" varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL, "chan_u" varchar(2) COLLATE utf8mb4_unicode_ci DEFAULT NULL, "recv_svc_c" varchar(12) COLLATE utf8mb4_unicode_ci DEFAULT NULL, "scr_id" varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL, "rqst_resp_g" varchar(1) COLLATE utf8mb4_unicode_ci DEFAULT NULL, "sync_g" varchar(1) COLLATE utf8mb4_unicode_ci DEFAULT NULL, "msg_snd_g" varchar(1) COLLATE utf8mb4_unicode_ci DEFAULT NULL, "trxbrno" decimal(4,0) DEFAULT NULL, "trx_trmno" decimal(4,0) DEFAULT NULL, "op_keyno" varchar(3) COLLATE utf8mb4_unicode_ci DEFAULT NULL, "op_hwnno" varchar(8) COLLATE utf8mb4_unicode_ci DEFAULT NULL, "rst_yn" decimal(1,0) DEFAULT NULL, "out_u" decimal(1,0) NOT NULL, "registered_date" datetime NOT NULL, PRIMARY KEY ("id","registered_date") ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci PARTITION BY RANGE (to_days("registered_date")) (PARTITION "p20211101" VALUES LESS THAN (738460) ENGINE = InnoDB, PARTITION "p20211102" VALUES LESS THAN (738461) ENGINE = InnoDB, PARTITION "p20211103" VALUES LESS THAN (738462) ENGINE = InnoDB, PARTITION "p20211104" VALUES LESS THAN (738463) ENGINE = InnoDB, PARTITION "p20211105" VALUES LESS THAN (738464) ENGINE = InnoDB, … PARTITION "future" VALUES LESS THAN MAXVALUE ENGINE = InnoDB)
  • 29. 29 전환 가이드 ▪ APPLICATION(SQL) ✔ 함수의 결과값이 다름으로 변경에 주의하세요. 문자열 길이 (oracle:length, mysql:char_length) 문자열 Bytes(oracle:lengthb, mysql:length) 로 함수의 리턴값이 달라요. ✔ tobe model에서 float타입은 사용을 자제하세요 ✔ 날짜는 날짜타입(가능한 DATE, DATETIME)에 저장하세요 ✔ 컬럼별로 다른 charset/collation을 사용하면 주의해야 합니다. 명시적으로 제약/조인 조건절에 사용하는 컬럼의 경우는 성능저하의 원인이 될 수 있습니다. 도대체 왜? create table table1 ( id int, nm1 varchar(10), primary key(id) ) engine=innodb character set utf8; 질문) nm1은 10 음절을 의미할까요? 10 bytes를 의미할까요?
  • 30. 30 전환 가이드 • 데이터 타입 우선순위  명시적 형변환, 묵시적 형변환  우선순위 JSON> 날짜형 > 숫자형 > 문자형 > 바이너리형 json > datetime > date > decimal > double > float > bigint > int > … > varchar > …> binary 반드시 컬럼타입에 맞게 SQL작성 create table t_member (id int, jumin1 varchar(6), jumin2 varchar(7), primary key(id)); select * from t_member where jumin1=891212 ; ( CPU曰: 이거 너무하는 거 아니냐고 씨X ) mysql> explain select t1.* from t1 inner join t2 on t2.nm=t1.nm; +----+-------------+-------+------------+-------+---------------+------+---------+------+---------+----------+--------------------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+-------+---------------+------+---------+------+---------+----------+--------------------------------------------+ | 1 | SIMPLE | t2 | NULL | index | nm | nm | 43 | NULL | 1 | 100.00 | Using index | | 1 | SIMPLE | t1 | NULL | ALL | nm | NULL | NULL | NULL | 4988104 | 10.00 | Using where; Using join buffer (hash join) | +----+-------------+-------+------------+-------+---------------+------+---------+------+---------+----------+--------------------------------------------+ mysql> explain select t1.* from t1 inner join t2 on convert(t2.nm using latin1)=t1.nm; +----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-----------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-----------------------+ | 1 | SIMPLE | t2 | NULL | index | NULL | nm | 43 | NULL | 1 | 100.00 | Using index | | 1 | SIMPLE | t1 | NULL | ref | nm | nm | 13 | func | 1 | 100.00 | Using index condition | +----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-----------------------+
  • 31. 31 전환 가이드 ▪ APPLICATION(SQL) ✔ ANSI SQL 문법으로 전환하세요. 테이블 간의 관계는 FROM절에 명시하여 WHERE절의 조건문과 분리한다 ✔ (+) 연산을 OUTER JOIN 으로 전환하세요 LEFT OUTER JOIN ~ RIGHT OUTER JOIN ~ ✔ FULL OUTER JOIN은 지원하지 않아요. OUTER JOIN을 활용하세요. LEFT JOIN ~ UNION OUTER JOIN ~ ✔ INLINE VIEW(파생테이블)은 ALIAS를 부여해야 합니다. ~, (SELECT COL1 FROM T1) AS A1 ✔ INTERSECT / MINUS INTERSECT / EXCEPT 전환 하세요. MariaDB 10.3 ~ , MySQL 8.0.31 ~ 부터 지원해요. ✔ CONNECT BY PRIOR CTE (WITH~)를 이용하세요. ✔ MERGE ~ INSERT ~ ON DUPLICATE KEY UPDATE
  • 32. 32 전환 가이드 ▪ APPLICATION(SQL) ✔ OPTIMIZER HINT와 INDEX HINT의 사용을 자제합니다. HINT절에 대한 구문분석으로 오류가 발생할 수 있어요 ✔ SQL_MODE=ORACLE은 개별 세션에서만 사용하세요. (Only MariaDB) MySQL에서는 전부 프로시저나 어플리케이션으로 변환하세요. MariaDB에서는 set session sql_mode=oracle; ~;로 이용하세요.
  • 33. 33 전환 가이드 ▪ Data Type Mapping Oracle MySQL CHAR(1) 0|1 BIT(1) CHAR NUMBER(3, 0) [UNSIGNED] TINYINT NUMBER(5, 0) [UNSIGNED] SMALLINT NUMBER(7, 0) [UNSIGNED] MEDIUMINT NUMBER(10, 0) [UNSIGNED] INT NUMBER(19, 0) [UNSIGNED] BIGINT FLOAT DECIMAL NUMERIC REAL DOUBLE DECIMAL CHAR NCHAR CHAR VARCHAR VARCHAR2 NVARCHAR VARCHAR TINYTEXT TEXT DATE DATE DATETIME TIMESTAMP BLOB, RAW MEDIUMBLOB BLOB VARBINARY CLOB, LONG RAW TEXT MEDIUMTEXT LONGTEXT
  • 34. 34 전환 가이드 ▪ Functions Mapping No Oracle MySQL/MariaDB 1 ABS(num) Get the absolute value ABS(num) 2 ACOS(num) Get the arc cosine ACOS(num) 3 ADD_MONTHS(date, num) Add num months to date DATE_ADD(date, INTERVAL num MONTH) 4 ASCII(str) Get ASCII code of left-most char ASCII(str) 5 ASCIISTR(string) Get ASCII code version of string 6 ASIN(num) Get the arcsine ASIN(num) 7 ATAN(num) Get the arc tangent ATAN(num) 8 ATAN2(x, y) Get the arc tangent of x and y ATAN2(x, y) 9 BIN_TO_NUM(bit1, bit2, …) Convert bit vector to number CONV(BINARY(CONCAT(bit1, bit2,...),2,10) 10 BITAND(exp1, exp2) Perform bitwise AND (exp1 & exp2) 11 CEIL(num) Get the smallest following integer CEIL(num) 12 CHR(num) Get character from ASCII code CHAR(num) 13 COALESCE(exp1, exp2, …) Return first non-NULL expression COALESCE(exp1, exp2, …) 14 CONCAT(char1, char2) String concatenation CONCAT(char1, char2) 15 CONVERT(string, charset) Convert string to charset CONVERT(string USING charset) 16 COS(num) Get the cosine COS(num) 17 COSH(num) Get hyperbolic cosine (EXP(num) + EXP(-num)) / 2 18 CURRENT_DATE Get the current date NOW() 19 CURRENT_TIMESTAMP Get the current date and time NOW() 20 DECODE(exp, when, then, …) Evaluate conditions CASE ~ : MySQL, MariaDB DECODE_ORACLE(exp, when, then, …) : MariaDB
  • 35. 35 전환 가이드 ▪ Functions Mapping No Oracle MySQL/MariaDB 21 EXP(n) Raise e to the nth power EXP(n) 22 EXTRACT(YEAR FROM date) Extract year from date YEAR(date) 23 EXTRACT(MONTH FROM date) Extract month from date MONTH(date) 24 EXTRACT(DAY FROM date) Extract day from date DAY(date) 25 EXTRACT(HOUR FROM time) Extract hour from time HOUR(time) 26 EXTRACT(MINUTE FROM time) Extract minute from time MINUTE(time) 27 EXTRACT(SECOND FROM time) Extract second from time SECOND(time) 28 FLOOR(num) Get the largest preceding integer FLOOR(num) 29 GREATEST(exp, exp2, …) Get the maximum value in a set GREATEST(exp, exp2, …) 30 INITCAP(string) Capitalize words User Define Function 31 INSTR(str, substr) Get position of substring INSTR(str, substr) INSTR(str, substr, pos) LOCATE(str, substr, pos) INSTR(str, substr, pos, num) User Define Function 32 LAST_DAY(date) Get last day of the month LAST_DAY(date) 33 LEAST(exp, exp2, …) Get the minimum value in a set LEAST(exp, exp2, …) 34 LENGTH(string) Get length of string in chars CHAR_LENGTH(string) 35 LENGTHB(string) Get length of string in bytes LENGTH(string) 36 LN(num) Get natural logarithm of num LN(num) 37 LOCALTIMESTAMP Get the current date and time LOCALTIMESTAMP LOCALTIMESTAMP([prec]) LOCALTIMESTAMP() 38 LOG(num1, num2) Get logarithm, base num1, of num2 LOG(num1, num2) 39 LOWER(string) Lowercase string LOWER(string) 40 LPAD(string, len) Pad the left-side of string LPAD(string, len, ' ') LPAD(string, len, pad) LPAD(string, len, pad)
  • 36. 36 전환 가이드 ▪ Functions Mapping No Oracle MySQL/MariaDB 41 LTRIM(string) Remove leading spaces LTRIM(string) LTRIM(string, set) Remove leading chars TRIM(LEADING set FROM string) 42 MONTHS_BETWEEN(date1, date2) Get number of months between date1 and date2 TIMESTAMPDIFF(MONTH, date1, date2) 43 MOD(dividend, divisor) Get remainder MOD(dividend, divisor) 44 NEXT_DAY Get the next date by day name NEXT_DAY user-defined function 45 NULLIF(exp1, exp2) Return NULL if exp1 = exp2 NULLIF(exp1, exp2) 46 NVL(exp, replacement) Replace NULL with the specified value IFNULL(exp, replacement) : MySQL, MariaDB NVL(exp, replacement) : MariaDB 47 NVL2(exp1, exp2, exp3) Return exp2 if exp1 is not NULL, otherwise exp3 IF (exp1 IS NOT NULL, exp2, exp3) : MySQL, MariaDB NVL2(exp1, exp2, exp3) : MariaDB 48 POWER(value, n) Raise value to the nth power POWER(value, n) 49 REMAINDER(n1, n2) Get remainder (n1 - n2*ROUND(n1/n2)) 50 REPLACE(str, search) Remove search-string REPLACE(str, search, '') REPLACE(str, search, replace) Replace search-string REPLACE(str, search, replace) 51 ROUND(num, integer) Get rounded value ROUND(num, integer) 52 RPAD(string, len) Pad the right-side of string RPAD(string, len, ' ') RPAD(string, len, pad) RPAD(string, len, pad) 53 RTRIM(string) Remove trailing spaces RTRIM(string) RTRIM(string, set) Remove trailing chars TRIM(TRAILING set FROM string) 54 SIGN(exp) Get sign of exp SIGN(exp) 55 SIN(num) Get sine SIN(num) 56 SINH(num) Get hyperbolic sine (EXP(num) - EXP(-num)) / 2 57 SOUNDEX(string) Get 4-character sound code SOUNDEX(string) 58 SQRT(num) Get square root SQRT(num) 59 SUBSTR(string, pos, len) Get a substring of string SUBSTR(string, pos, len) 60 SYS_GUID() Get GUID, 32 characters without dashes REPLACE(UUID(), '-', '')
  • 37. 37 전환 가이드 ▪ Functions Mapping No Oracle MySQL/MariaDB 61 SYSDATE Get current date and time SYSDATE() 62 SYSTIMESTAMP Get current timestamp CURRENT_TIMESTAMP 63 TAN(num) Get tangent TAN(num) 64 TANH(num) Get hyperbolic tangent (EXP(2*num) - 1)/(EXP(2*num) + 1) 65 TO_CHAR(datetime, format) Convert datetime to string DATE_FORMAT(datetime, format) TO_CHAR(number, format) Convert number to string FORMAT(number, decimal_digits) 66 TO_DATE(string, format) Convert string to datetime STR_TO_DATE(string, format) 67 TO_LOB(exp) Convert to LOB 68 TO_NCHAR(exp) Convert to NCHAR DATE_FORMAT(datetime, format) 69 TO_NCLOB(exp) Convert to NCLOB 70 TO_NUMBER(exp) Convert to NUMBER CAST(exp AS INTEGER) 71 TO_SINGLE_BYTE(exp) Convert to single-byte character 72 TO_TIMESTAMP(exp) Convert to TIMESTAMP TIMESTAMP(exp) 73 TRANSLATE(string, from, to) Replace characters REPLACE(string, from, to) 74 TRIM([type trim FROM] string) Remove characters TRIM([type trim FROM] string) 75 TRUNC(num) Truncate num TRUNCATE(num, 0) TRUNC(num, num2) TRUNCATE(num, num2) 76 TRUNC(datetime) Truncate datetime DATE(datetime), DATE_FORMAT 77 UNISTR(string) Convert Unicode code points to chars CHAR(string USING UCS2) 78 UPPER(string) Uppercase string UPPER(string) 79 USER Get the current user USER() 80 USERENV('parameter') Get the current session information SHOW SESSION VARIABLES LIKE '%%'
  • 38. 38 전환 가이드 ▪ Functions Mapping No Oracle MySQL/MariaDB 81 VSIZE(exp) Get the size of exp in bytes 82 XMLAGG(exp) Get a aggregated XML document 83 XMLCAST(exp AS datatype) Convert exp to datatype 84 XMLCDATA(exp) Generate a CDATA section 85 XMLCOMMENT(exp) Generate an XML comment 86 XMLCONCAT(exp, exp2, …) Concatenate XML expressions 87 XMLDIFF(doc, doc2) Compare two XML documents 88 XMLELEMENT(NAME element) Get an XQuery element node 89 XMLFOREST(exp, exp2, …) Get a forest of XML expressions 90 XMLISVALID(exp) Check XML exp 91 XMLPARSE(DOCUMENT exp) Parse XML document 92 XMLPATCH(doc, doc2) Patch XML document 93 XMLPI(NAME identifier) Get XML processing instruction 94 XMLROOT(exp, VERSION exp2) Create a new XML value 95 XMLSEQUENCE(exp) Get a varray of the top-level nodes 96 XMLSERIALIZE(CONTENT exp Get a serialized XML value AS datatype) 97 XMLTRANSFORM(instance, exp) Transform XML document
  • 39. 39 전환 가이드 ▪ Functions Mapping No Oracle MySQL/MariaDB 98 REGEXP_INSTR(str,ptn) MySQL 8.x~, MariaDB 10.3~ REGEXP_INSTR(str,ptn) 99 REGEXP_LIKE(str,ptn) MySQL 8.x~, MariaDB 10.3~ REGEXP_LIKE(str,ptn) 100 REGEXP_REPLACE(str1,exp,str2) MySQL 8.x~, MariaDB 10.3~ REGEXP_REPLACE(str1,exp,str2) 101 REGEXP_SUBSTR(str,ptn) MySQL 8.x~, MariaDB 10.3~ REGEXP_SUBSTR(str,ptn) 102 REGEXP_COUNT(str,ptn) FETCH FIRST n ROWS ~ LIMIT n LISTAGG GROUP_CONCAT ROWID ROWNUM ROW_NUMBER() OVER() Hierarchical Functions
  • 40. Next Opensource Cloud Value 개발도구들
  • 41. 41 도구들 ▪ SQL Dev-Tools • MySQL Workbench • SQLyog • HeidiSQL • DBeaver • ETC ✔ Platform Compatibility ✔ AUTOCOMMIT ✔ MULTI CONNECTION SUPPORT ✔ INSTANCE MANAGEMENT ✔ ROUTINES DEVELOPMENT ✔ SQL Autocomplete ▪ Migration Tools • AWS DMS • Oracle Golden Gate • Attunity Replicator • DBConvert Studio • SymmetricDS • Apache NiFi • Flyway ✔ Reliability ✔ Security ✔ Source-Target Supports ✔ Performances ✔ Prices https://hevodata.com/learn/data-migration-tools/
  • 42. Next Opensource Cloud Value 성능개선
  • 43. 43 성능개선 ▪ SQL실행 속도가 느려요 • 실행계획 확인 ✔ 이행되는 모든 SQL들에 대해서 실행계획을 확인하고 정리하세요 ASIS에서 수행했던 소요시간 등의 기록이 있다면 전후를 비교하는게 좋겠습니다. ✔ 프로시저 내부의 SQL문 하나하나 모두 확인하셔야 해요. Slow Query에는 프로시저명만 확인이 되요. • OS/NW 환경 확인 ✔ 커널파라미터 ✔ 대역폭 • 자원증설 ✔ 병목현상에 따라 CPU, Memory, Disk등의 자원 할당을 증가 시키세요
  • 44. Next Opensource Cloud Value 모니터링
  • 47. 47 모니터링 ▪ PMM (Percona Monitoring and Management) https://www.percona.com/software/database-tools/percona-monitoring-and-management
  • 48. Q&A
  • 50. Next Opensource Cloud Value NeoClova
  • 51. 51 NeoClova 업 체 명 ㈜ 네오클로바 대 표 자 이 재 중 사 업 분 야 오픈소스 기반의 유지보수, 컨설팅 / 전반 Linux OS, WEB, WAS, DBMS 분야 기술 지원 및 분석 지원 서비스 주 소 서울시 강서구 양천로 583(염창동 240-21) 우림블루나인 B동 1206호 회 사 설 립 년 도 2011년 11월 7일 (해당부문 종사기간 : 10년 1개월) 인 원 22명 (기술인력 : 16명)
  • 53. 53 NeoClova KT/KTDS LGCNS LG전자 하나은행 신한은행 하나카드 삼성카드 하나금융 티아이 SKPLANET INVEN SUPERCAT 다우오피스 티머니 투썸플레이스 티머니-온다 질병관리청
  • 54. 54 NeoClova 카카오 카카오뱅크 아산병원 KT알파 무역진흥공사 EBS 비상교육 동국시스템즈 대성산업 이베스트증권 누리플랙스 케이뱅크 포스코 성원애드피아 KB헬스케어 외100여개 고객사

Editor's Notes

  1. https://www.slideshare.net/mysqlops/innodb-internal-9032556