본문 바로가기

개발공부/Database

MSSQL -> MySQL 데이터 마이그레이션- 2.데이터 분석

데이터 분석(Assessment and Analysis) 단계


🔍 1. 데이터베이스 구조 분석

1-1. 테이블 구조 확인

  • 테이블 개수, 컬럼 타입, 제약 조건(FK, PK), 인덱스를 파악해야 합니다.
  • MSSQL 쿼리 예제:
-- 테이블 리스트 조회
SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE';

-- 테이블 컬럼 상세 조회
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'dbo';

 

주요 분석 포인트:

  • 테이블 개수: 데이터 볼륨 파악.
  • 컬럼 타입: MySQL과 호환성 확인.
  • NULL 값 처리: MySQL은 NOT NULL이 기본 옵션.

1-2. 제약 조건(Constraints) 및 인덱스 분석

  • 외래 키(FK), 기본 키(PK), 고유 키(Unique), 인덱스를 파악해야 합니다.

MSSQL 쿼리 예제:

-- 제약 조건 조회
SELECT TABLE_NAME, CONSTRAINT_NAME, CONSTRAINT_TYPE
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS;

-- 인덱스 조회
SELECT t.name AS TableName, i.name AS IndexName, i.type_desc AS IndexType, c.name AS ColumnName
FROM sys.indexes i
INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
INNER JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
INNER JOIN sys.tables t ON i.object_id = t.object_id
WHERE i.is_primary_key = 0 AND i.is_unique = 0;

분석 포인트:

  • MySQL은 FULLTEXT와 SPATIAL 인덱스를 지원하지만, MSSQL과 인덱스 동작이 다를 수 있음.
  • 클러스터형 인덱스(MSSQL) → 프라이머리 키 인덱스(MySQL).

📊 2. 데이터 양 및 성능 분석

2-1. 데이터 크기 파악

  • 데이터 크기에 따라 마이그레이션 전략을 다르게 가져가야 합니다.

MSSQL 쿼리 예제:

-- 전체 데이터베이스 크기 확인
EXEC sp_spaceused;

-- 테이블별 데이터 크기 확인
SELECT t.name AS TableName, p.rows AS RowCounts, SUM(a.total_pages) * 8 / 1024 AS TotalSizeMB
FROM sys.tables t
INNER JOIN sys.indexes i ON t.object_id = i.object_id
INNER JOIN sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id
INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id
GROUP BY t.name, p.rows
ORDER BY TotalSizeMB DESC;

분석 포인트:

  • 테이블별 데이터 볼륨 파악.
  • 대용량 테이블은 배치 마이그레이션 고려.

2-2. 성능 병목 분석

  • 성능 저하를 방지하기 위해 인덱스 최적화 필요.

MSSQL 성능 분석 쿼리:

-- 느린 쿼리 분석
SELECT TOP 10 qs.sql_handle, qs.execution_count, qs.total_worker_time, qs.total_logical_reads,
qs.total_physical_reads, qs.total_elapsed_time, t.text AS query_text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle)
ORDER BY qs.total_elapsed_time DESC;

분석 포인트:

  • MySQL은 쿼리 옵티마이저가 다르므로 JOIN 최적화 필요.

⚖️ 3. 데이터 타입 호환성 분석

AWS SCT를 사용하면 기본 매핑이 가능하지만, 일부는 수동으로 수정해야 합니다.

MSSQL 타입 MySQL 타입 비고

INT INT 동일
BIGINT BIGINT 동일
SMALLINT SMALLINT 동일
TINYINT TINYINT 동일
DECIMAL(p,s) DECIMAL(p,s) 동일
FLOAT/REAL FLOAT 동일
DATETIME/DATETIME2 DATETIME 동일
SMALLDATETIME DATETIME 시간 오차 확인 필요
DATE DATE 동일
TIME TIME 동일
CHAR(n) CHAR(n) 동일
NCHAR(n) CHAR(n) 유니코드 여부 확인 필요
VARCHAR(n) VARCHAR(n) 동일
NVARCHAR(n) VARCHAR(n) 유니코드 데이터 마이그레이션 확인
TEXT TEXT 동일
UNIQUEIDENTIFIER CHAR(36) UUID 형태로 변환 필요
BIT TINYINT(1) 0/1 변환 필요

주요 주의사항:

  • MSSQL의 NVARCHAR → MySQL의 VARCHAR로 변환 시 유니코드가 손실되지 않도록 utf8mb4 인코딩 설정 필요.
  • DATETIME2: MySQL DATETIME으로 변환되나, 정밀도 차이 주의.

🚨 4. SQL 객체 분석(Stored Procedures, Triggers, Functions)

MSSQL의 T-SQL 구문은 MySQL에서 작동하지 않으므로 반드시 수정해야 합니다.

4-1. 저장 프로시저(Stored Procedure)

-- MSSQL 프로시저 조회
SELECT name, type_desc, create_date
FROM sys.procedures;

변환 예시:

  • MSSQL의 GETDATE() → MySQL의 NOW().
  • MSSQL의 TOP n → MySQL의 LIMIT n.

4-2. 트리거(Trigger)

-- MSSQL 트리거 조회
SELECT name, parent_class_desc, create_date
FROM sys.triggers;

변환 예시:

  • MSSQL은 AFTER INSERT 대신 MySQL은 AFTER INSERT ON table_name 사용.
  • MySQL은 INSTEAD OF 트리거 미지원.

4-3. 함수(Functions)

-- 사용자 정의 함수 조회
SELECT name, type_desc
FROM sys.objects
WHERE type IN ('FN', 'IF', 'TF');

변환 예시:

  • MSSQL LEN() → MySQL CHAR_LENGTH()로 변경.
  • MSSQL ISNULL() → MySQL IFNULL()로 변경.

🛑 5. 데이터 품질 분석(Data Quality Assessment)

5-1. 중복 데이터 확인

-- 특정 컬럼 중복 체크
SELECT column_name, COUNT(*)
FROM table_name
GROUP BY column_name
HAVING COUNT(*) > 1;

5-2. NULL 데이터 확인

-- NULL 값 카운트
SELECT column_name, COUNT(*)
FROM table_name
WHERE column_name IS NULL;

🔧 6. AWS SCT를 활용한 분석 및 변환 시뮬레이션

6-1. AWS SCT 설치 및 연결

  1. AWS SCT 다운로드: AWS SCT
  2. 프로젝트 생성: 소스(MSSQL)과 타겟(MySQL) 연결.
  3. 스키마 분석: 자동 변환 후 Incompatible Objects Report 확인.
  4. SQL 코드 변경: 수동 수정 가이드 제공.

🎯 마지막 체크포인트

  1. 데이터 타입 불일치 여부 확인.
  2. 테이블 관계도 및 제약 조건 파악.
  3. SQL 객체(T-SQL → MySQL SQL) 수동 변환 리스트 확보.
  4. AWS SCT를 통한 시뮬레이션 실행 및 오류 분석.

이제 데이터 분석이 완료되면, 데이터 매핑 및 변환 단계로 넘어갈 준비가 끝났습니다! 🚀