이 문서는 2세대 인스턴스인 MySQL용 Cloud SQL 버전 5.7로의 Oracle® 11g/12c 데이터베이스 마이그레이션 계획 및 수행과 관련된 주요 정보 및 안내를 제공하는 시리즈의 일부입니다. 이 시리즈는 다음 문서로 구성되어 있습니다.
- Oracle 사용자를 MySQL용 Cloud SQL로 마이그레이션: 용어 및 기능
- Oracle 사용자를 MySQL용 Cloud SQL로 마이그레이션: 데이터 유형, 사용자, 테이블(이 문서)
- Oracle 사용자를 MySQL용 Cloud SQL로 마이그레이션: 쿼리, 저장 프로시저, 함수, 트리거
- Oracle 사용자를 MySQL용 Cloud SQL로 마이그레이션: 보안, 작업, 모니터링, 로깅
데이터 유형
MySQL은 Oracle 제공 데이터 유형과 완전히 동일하거나 유사한 여러 데이터 유형을 제공합니다. 다음 표에서는 가장 일반적인 MySQL 데이터 유형과 함께 Oracle 기본 데이터 유형과 해당 MySQL 데이터 유형을 비교해서 보여줍니다. 지원되지 않는 데이터 유형이 있으면 대체 데이터 유형이 표시됩니다. MySQL 5.7 데이터베이스에는 전체 행에 대한 65,535바이트 제한이 적용됩니다(사용된 문자 집합에 따라 다름).
MySQL 5.7 기본 데이터 유형
MySQL 데이터 유형 계열 | MySQL 데이터 유형 이름 | 데이터 유형 사양 |
---|---|---|
문자열/ 문자 |
CHAR(n) |
정확히 n 자를 저장합니다. |
VARCHAR(n) |
최대 n 자까지 가변 문자 수를 저장합니다. |
|
BINARY |
정확히 n 바이트를 저장합니다. |
|
VARBINARY(n) |
최대 n 바이트까지 가변 문자 수를 저장합니다. |
|
BLOB |
가변 데이터 양을 저장할 수 있는 바이너리 대형 객체입니다. | |
TEXT |
문자 수 상한을 지정할 필요가 없는 VARCHAR 의 특정 변형입니다. |
|
ENUM |
테이블이 생성될 때 열 사양에 명시적으로 열거된 허용 값 목록에서 선택한 값이 포함된 문자열 객체입니다. | |
SET |
0개 이상의 값을 포함할 수 있는 문자열 객체입니다. 각 객체는 테이블 생성 시 지정된 허용 값 목록에서 선택되어야 합니다. | |
숫자 | INT |
최솟값은 -2147483648이고 최댓값은 2147483647입니다. |
INTEGER |
최솟값은 -2147483648이고 최댓값은 2147483647입니다. | |
TINYINT |
최솟값은 -128이고 최댓값은 127입니다. | |
SMALLINT |
최솟값은 -32768이고 최댓값은 32767입니다. | |
MEDIUMINT |
최솟값은 -8388608이고 최댓값은 8388607입니다. | |
BIGINT |
최솟값은 -2^63이고 최댓값은 2^63-1입니다. | |
DECIMAL(p,s) |
전체 자릿수가 p 이고 소수점 자릿수가 s 인 값을 저장할 수 있습니다. |
|
NUMERIC(p,s) |
전체 자릿수가 p 이고 소수점 자릿수가 s 인 값을 저장할 수 있습니다. |
|
FLOAT(m,d) |
전체 자릿수 m 까지 값을 저장할 수 있으며, 전체 자릿수 d 의 일부는 소수점 이후 자릿수를 포함할 수 있습니다. |
|
DOUBLE(m,d) |
전체 자릿수 m 까지 값을 저장할 수 있으며, 전체 자릿수 d 의 일부는 소수점 이후 자릿수를 포함할 수 있습니다. |
|
BIT(m) |
m 비트 값을 저장합니다. 가능한 m 범위는 1~64입니다. |
|
날짜 및 시간 | DATE |
- 시간 부분 없이 날짜 부분만 있는 값입니다. - 'YYYY-MM-DD' 형식으로 DATE 값을 검색하고 표시합니다.- 지원되는 범위는 '1000-01-01' ~'9999-12-31' 입니다. |
DATETIME |
- 날짜 및 시간 부분이 모두 포함된 값입니다. - 'YYYY-MM-DD HH:MM:SS' 형식으로 DATETIME 값을 검색하고 표시합니다.- 지원되는 범위는 '1000-01-01 00:00:00' ~'9999- 12-31 23:59:59' 입니다. |
|
TIMESTAMP |
- 날짜 및 시간 부분이 모두 포함된 값입니다. - TIMESTAMP 의 범위는 '1970-01-01
00:00:01' UTC~ '2038-01-19 03:14:07' UTC입니다. |
|
TIME |
- 가능한 값 범위는 '-838:59:59' ~'838:59:59' 입니다.- 하루 중 시간(24시간 미만이어야 함)을 나타내고, 두 이벤트 사이에 경과된 시간 또는 시간 간격(24시간을 초과하거나 음수일 수도 있음)을 나타내기 위해 TIME 유형이 사용될 수 있기 때문에 시간 부분이 커질 수 있습니다. |
|
YEAR |
- 연도 값을 나타내기 위해 사용되는 YEAR 1바이트 유형입니다.- YEAR 또는 YEAR(n) 으로 선언될 수 있으며, n 문자의 표시 너비를 갖습니다. |
|
JSON | JSON |
데이터 유형으로 사용되는 텍스트 JSON 데이터입니다. |
공간(도형) |
GEOMETRY |
이 표의 나머지 부분에서 데이터 모델을 사용할 때 지정할 열 유형입니다. |
POINT |
(x,y) 값입니다. |
|
LINESTRING |
행(pt1, pt2) 입니다. |
|
POLYGON |
실제로 폐쇄된 경로로 표시되는 일련의 점입니다. | |
MULTIPOINT |
POINT 값의 컬렉션입니다. |
|
MULTI-LINESTRING |
LINE 값의 컬렉션입니다. |
|
MULTIPOLYGON |
POLYGON 값의 컬렉션입니다. |
|
GEOMETRY-COLLECTION |
도형 데이터 유형의 컬렉션입니다. | |
논리 | BOOLEAN |
- true 또는 false 값을 포함합니다. - TRUE , '1' , 1 과 같은 값을 true로 사용합니다.- 스토리지에서 1바이트를 사용하며 NULL 을 저장할 수 있습니다. |
Oracle 및 MySQL 간 데이터 유형 변환
Oracle 데이터 유형 계열 | Oracle 데이터 유형 이름 | Oracle 데이터 유형 사양 | MySQL 및 Oracle 간 변환 가능 여부 | MySQL 해당/대체 |
---|---|---|---|---|
문자열/ 문자 |
CHAR(n) |
최대 크기는 2,000바이트입니다. | 예 | CHAR(n) |
CHARACTER(n) |
최대 크기는 2,000바이트입니다. | 예 | CHARACTER(n) |
|
NCHAR(n) |
최대 크기는 2,000바이트입니다. | 예 | NCHAR(n) |
|
VARCHAR(n) |
최대 크기는 2,000바이트입니다. | 예 | VARCHAR(n) |
|
NCHAR VARYING(n) |
4,000바이트의 가변 길이 UTF-8 문자열 최대 크기입니다. |
예 | NCHAR VARYING(n) |
|
VARCHAR2(n) 11g |
최대 크기는 4,000바이트(PL/SQL의 경우 32KB)입니다. | 아니요 | VARCHAR(n) |
|
VARCHAR2(n) 12g |
최대 크기는 32,767바이트 MAX_STRING_SIZE=EXTENDED 입니다. |
아니요 | VARCHAR(n) |
|
NVARCHAR2(n) |
최대 크기는 4,000바이트입니다. | 아니요 | VARCHAR(n) |
|
LONG |
최대 크기는 2GB입니다. | 예 | LONG |
|
RAW(n) |
최대 크기는 2,000바이트입니다. | 아니요 | VARBINARY(n) |
|
LONG RAW |
최대 크기는 2GB입니다. | 아니요 | LONGTEXT |
|
숫자 | NUMBER |
부동 소수점 수입니다. | 아니요 | NUMERIC/DECIMAL(p,s) |
숫자 | NUMBER |
부동 소수점 수입니다. | 아니요 | NUMERIC/DECIMAL(p,s) |
NUMBER(*) |
부동 소수점 수입니다. | 아니요 | DOUBLE |
|
NUMERIC(p,s) |
가능한 정밀도 범위는 1~38입니다. | 예 | NUMERIC(p,s) |
|
FLOAT(p) |
부동 소수점 수입니다. | 예 | FLOAT(p) |
|
DEC(p,s) |
고정 소수점 수입니다. | 예 | DEC(p,s) |
|
DECIMAL(p,s) |
고정 소수점 수입니다. | 예 | DECIMAL(p,s) |
|
INT |
38자릿수 정수입니다. | 예 | INT |
|
INTEGER |
38자릿수 정수입니다. | 예 | INTEGER |
|
SMALLINT |
38자릿수 정수입니다. | 예 | SMALLINT |
|
REAL |
부동 소수점 수입니다. | 예 | REAL |
|
DOUBLE PRECISION |
부동 소수점 수입니다. | 예 | DOUBLE PRECISION |
|
날짜 및 시간 | DATE |
날짜 및 시간 데이터(연도, 월, 일, 시간, 분, 초)를 저장합니다. | 예 | DATE |
TIMESTAMP(p) |
분할 부분이 포함된 날짜 및 시간입니다. | 예 | TIMESTAMP |
|
TIMESTAMP(p) WITH TIME ZONE |
분할 부분과 시간대가 포함된 날짜 및 시간입니다. | 아니요 | DATETIME(n) |
|
INTERVAL YEAR(p) TO MONTH |
날짜 간격입니다. | 아니요 | VARCHAR(n) |
|
INTERVAL DAY(p) TO SECOND(s) |
날짜 및 시간 간격입니다. | 아니요 | VARCHAR(n) |
|
논리 | BOOLEAN |
TRUE , FALSE , NULL 값 데이터베이스 테이블 열에 할당될 수 없습니다. |
예 | BOOLEAN |
XML | XMLTYPE |
XML 데이터입니다. | 아니요 | LONGTEXT |
LOB | BFILE |
최대 크기가 4GB인 바이너리 파일에 대한 포인터입니다. | 아니요 | VARCHAR(255) |
CLOB |
최대 파일 크기가 4GB인 문자 대형 객체입니다. | 아니요 | LONGTEXT |
|
BLOB |
최대 크기가 4GB인 바이너리 대형 객체입니다. | 예 | BLOB |
|
NCLOB |
최대 파일 크기가 4GB인 가변 길이 유니코드 문자열입니다. | 아니요 | LONGTEXT |
|
ROWID | ROWID |
물리적 행 주소입니다. | 아니요 | CHAR(n) |
UROWID(n) |
논리 행 주소의 범용 행 ID입니다. | 아니요 | VARCHAR(n) |
|
공간 | SDO_GEOMETRY |
공간 객체의 도형 설명입니다. | 아니요 | N/A |
SDO_TOPO_GEOMETRY |
토폴로지 도형을 설명합니다. | 아니요 | N/A |
|
SDO_GEORASTER |
래스터 그리드 또는 이미지 객체가 단일 행에 저장됩니다. | 아니요 | N/A |
|
미디어 유형 | ORDDicom |
오디오 데이터의 저장 및 관리를 지원합니다. | 아니요 | N/A |
ORDDicom |
Digital Imaging and Communications in Medicine(DICOM)의 저장 및 관리를 지원합니다. | 아니요 | N/A |
|
ORDDoc |
모든 유형의 미디어 유형의 저장 및 관리를 지원합니다. | 아니요 | N/A |
|
ORDImage |
이미지 데이터의 저장 및 관리를 지원합니다. | 아니요 | N/A |
|
ORDVideo |
비디오 데이터의 저장 및 관리를 지원합니다. | 아니요 | N/A |
사용자 정의 유형
Oracle은 사용자 정의 유형(UDT)을 PL/SQL을 사용하여 관리되는 OBJECT TYPES
로 표시합니다. 사용자 정의 유형을 사용하면 기본 제공되는 Oracle 데이터 유형 목록을 기준으로 하고 이로부터 확장되는 애플리케이션 전용의 복합 데이터 유형을 사용자가 만들 수 있습니다.
다음은 Oracle의 UDT 예시입니다.
SQL> CREATE OR REPLACE TYPE EMP_PHONE_NUM AS OBJECT (
PHONE_NUM VARCHAR2(11));
변환 메모
MySQL에서는 사용자가 전용 정의된 유형을 만들 수 없습니다.
사용자 및 테이블
이 섹션에서는 사용자를 만들고 사용자에게 권한을 할당하고, Oracle 테이블을 MySQL용 Cloud SQL 테이블로 변환해야 하는 이유를 설명합니다.
사용자 만들기 및 권한
Oracle 데이터베이스 사용자 계정(Oracle '사용자' 및 '스키마' 동일)을 사용하여 인증을 수행하고 데이터베이스 세션에 연결할 수 있습니다. 승인 액세스는 특정 데이터베이스 객체 및 권한에 대해 각 사용자의 개별 수준에서 설정됩니다.
일반적으로 데이터베이스 사용자는 두 가지 유형이 있습니다.
- 관리자: 데이터베이스 인스턴스, 사용자, 리소스를 관리합니다.
- 사용자 계정: 애플리케이션과 같은 논리적 작업을 수행합니다.
관리자는 데이터베이스 객체에 액세스할 수 있도록 사용자 및 애플리케이션 사용자 계정에 권한을 부여합니다. Oracle 데이터베이스 권한은 특정 작업(예: 세션 만들기/연결) 또는 특정 데이터베이스 객체(예: 특정 테이블의 SELECT
도는 특정 저장 프로시저의 EXECUTE
)에 대해 사용자에게 부여됩니다.
변환 고려사항
- MySQL
CREATE USER
구문은 Oracle 구문과 다르며, 있는 그대로 마이그레이션될 수 없습니다. 또한 두 데이터베이스 모두 사용자 아키텍처가 서로 다릅니다. - 관리자가 MySQL에서 사용자를 만들 때는 사용자가 데이터베이스 액세스를 위해 연결해야 할 서버를 지정해야 합니다. 서버는 특정 IP 주소 또는 DNS일 수 있습니다. 와일드 카드 % 기호를 사용하여 모든 소스로부터 연결이 허용됩니다.
- MySQL 사용자 이름은 사용자 연결이 허용된 서버와 사용자 이름의 두 부분으로 구성되기 때문에, 동일한 이름을 사용하더라도 클라이언트 주소(IP/DNS)와 다른 서버로부터 사용자를 생성할 수 있습니다.
- 사용자가 생성된 다음에는 특정 데이터베이스 또는 스키마에 포함된 데이터베이스 객체에 대한 권한을 부여할 수 있습니다.
- 또한 MySQL용 Cloud SQL 허용 권한에 따라 사용자에게 추가 권한을 부여할 수도 있습니다(예: 루트 사용자는
SUPER
및FILE
권한을 제외한 모든 권한을 보유함). Oracle 사용자는 전용 테이블 공간에 연결될 수 있지만 MySQL에서는 이 기능이 지원되지 않습니다.
테이블
Oracle 테이블은 열 데이터 유형, 테이블 제약조건, 색인, 파티션, Oracle 테이블 고유 기능 등과 같은 여러 요소로부터 생성됩니다. MySQL용 Cloud SQL 데이터베이스 테이블로 성공적으로 마이그레이션하려면 모든 Oracle 테이블 요소를 MySQL 테이블로 변환해야 합니다. 일부 요소는 수정 사항이 없거나 사소한 수정 사항만 포함된 상태로 지원되며, 다른 요소는 완전히 수정되어야 합니다.
Oracle 테이블을 MySQL 테이블로 변환하는 것이 중요도가 높은 핵심 단계이고 성능 및 데이터 크기에 대한 추가적인 영향을 주기 때문에 마이그레이션 측면에서 볼 때 PL/SQL을 MySQL로 변환하기 위해서는 더 많은 노력이 필요합니다.
다음은 Oracle 및 MySQL 테이블과 관련 기능 사이의 중요 차이점입니다. 이러한 차이점에 대해서는 이 시리즈의 남은 부분에서 설명합니다.
- 대소문자 구분(테이블 및 열 이름)
- 테이블 구문 만들기
- 테이블 및 색인 메타데이터
- 제약조건 지원
- 데이터 유형 지원 및 제한 사항
- 색인
- 파티션 및 파티션 관리
- 테이블 및 색인 유지 관리
- 임시 테이블
- 조회수
- 표시 가능 열 및 표시 불가능 열(Oracle 12c)
- 테이블 및 열 문자 집합