https://kora1492.tistory.com/88
[DB] Oracle DB에서 MariaDB 로 데이터 이관하기
Oracle -> Maria DB 로 전환 1) 비용( 비용절감, 비상 경영 등의 이유로 가장 큰 이유가 비용) SaaS 로 기존 솔루션을 전환하려고 할 때 검토 사항 중 오픈소스를 통한 비용 절감 아래의 표(AWS RDS 기준)를
kora1492.tistory.com
DB 를 Oracle DB 에서 MariaDB로 이관하고 나서,
SQL Mapper(Mabatis) 를 쓰고 있는 쪽에서 에러가 발생하여 구문을 MariaDB 문법에 맞춰서 적용하기.
Syntax Error 메시지를 보고 문법에 맞추어 변경이 필요로 함
* 실행계획 확인(Explain) 시, 이전 글에서 INDEX 등을 이관하지 않아 성능 이슈 확인
변경관련 Tool : SQLines / ChatGpt
버전 : mariaDB 1.8.0 Version 사용 (운영 중인 프로젝트의 JDK 버전의 호환 확인)
목차
1. DECODE() 함수는 MariaDB에서 지원되지 않음.
2. TO_CHAR
3. NVL
4. START WITH connect by prior - 계층 쿼리
5. rownum
6. 함수 생성 시 에러 발생
7. 대소문자 구분
8. NULL, 빈 문자열(Empty String) 차이
쿼리 성능 개선 관련
인덱스 생성: 쿼리에서 자주 사용되는 컬럼에 인덱스를 생성하여 검색속도를 높입니다.
서브쿼리 최소화: 서브쿼리는 성능 저하의 주범 중 하나입니다. 서브쿼리가 사용된 부분을 조인으로 변경하거나, 필요한 부분만 추출하는 방법으로 최소화할 수 있습니다.
필요한 컬럼만 선택: SELECT 절에서 SELECT * 대신에 필요한 컬럼만 선택하여 조회합니다.
조인 최적화: 쿼리에서 자주 사용되는 조인을 최적화합니다.
대용량 데이터 처리: 조회 데이터가 매우 많을 경우, 데이터를 일정량씩 나누어 처리하거나, 인덱싱을 통해 처리속도를 높입니다.
1. DECODE() 함수는 MariaDB에서 지원되지 않음.
오라클에선 자주 볼 수 있는 DECODE() 가 에러가 발생
IFNULL() 혹은 인자가 많은 경우 COALESCE, CASE문 으로 해결함
-- 오라클
DECODE(C.MESSAGE, NULL, A.MESSAGE, C.MESSAGE)
-- MariaDB
IFNULL(C.MESSAGE, A.MESSAGE) AS MESSAGE
COALESCE(col1, col2, col3)
2. TO_CHAR
-- Oracle
TO_CHAR(MAX(UPD_DTM),'yyyyMMddhh24miss')
-- MariaDB
DATE_FORMAT(MAX(UPD_DTM),'%Y%m%d%H%i%s')
3. NVL
IFNULL() 함수를 통해서 변경
4. START WITH connect by prior - 계층 쿼리
WITH RECURSIVE 구문을 통해 변경
변경 시 계층적으로 조회되는 구문을 UNION ALL 할 때의 JOIN 조건으로 설정
WITH RECURSIVE CTE AS (
SELECT id, p_id
FROM table
WHERE id = 0
UNION ALL
SELECT id, p_id form table a
JOIN ON CTE.p_id = a.id
)
5. rownum
Oracle의 ROWNUM은 검색된 데이터 세트의 행 번호를 반환
LIMIT 및 OFFSET을 사용하여 범위 설정 가능함.
-- Oracle
SELECT *
FROM (
SELECT column1, column2, ROWNUM AS rnum
FROM some_table
WHERE ROWNUM <= 10
)
WHERE rnum >= 5;
-- MariaDB
SELECT column1, column2
FROM some_table
LIMIT 10 OFFSET 4;
@ROWNUM:=@ROWNUM+1
SELECT
@rownum:=@rownum+1 -- 조회 결과에 행 번호
FROM some_table
WHERE (@rownum:=0)=0; -- 초기화
6. 함수 생성 시 에러 발생
RDS - 연결 상태에서
: Access denied; you need (at least one of) the SUPER privilege(s) for this operation 메시지 발생 시 변경
https://soye0n.tistory.com/271
[AWS RDS] Access denied; you need (at least one of) the SUPER privilege(s) for this operation
오류 1227을 해결하려면 log_bin_trust_function_creators의 파라미터 그룹 값을 1로 변경합니다. 이 조건을 완화하고 모든 객체의 가져오기를 허용하려면 RDS 사용자 지정 파라미터 그룹을 통해 global log_bin
soye0n.tistory.com
7. 대소문자 구분
마리아DB
: lower_case_table_names 설정에 따라 대소문자를 구분함.
- lower_case_table_names=0 : 대/소문자 구분
- lower_case_table_names=1 : 대소문자 구분하지 않음(모두 소문자로 인식함)
: 설정을 변경하는 거나, Query 문자를 모두 소문자/대문자로 일치하게 변경
8. NULL, 빈 문자열(Empty String) 차이
오라클
: 빈 문자열 '' 인 경우에도 NULL 과 동일하게 처리됨.
마리아DB
: NULL 과 빈 문자열을 구분함.
-> IF, CASE, NULLIF 등을 이용해서 '' 인 경우 NULL 이 되도록 변경해야 함.
IF(expr1 = '', NULL)
'프로그래밍' 카테고리의 다른 글
[Spring] 스프링 MVC 1편 백엔드 웹 개발 핵심 (2) (0) | 2023.04.24 |
---|---|
[Docker] 따라하며 배우는 도커 - 직접 도커 이미지를 만들어 보기 (2) (0) | 2023.04.21 |
[DB] Oracle DB에서 MariaDB 로 데이터 이관하기 (0) | 2023.04.17 |
[크론탭] Crontab 명령어 정리 (0) | 2023.04.14 |
[SpringBoot+Vue.js] 정리 (5) 기본 기능 완료 (0) | 2023.04.11 |