Oracle から Cloud SQL for MySQL への移行: データ型、ユーザー、テーブル

このドキュメントは、Oracle® 11g/12c データベースから Cloud SQL for MySQL バージョン 5.7 の第 2 世代インスタンスへの移行を計画し、実施する際に必要な情報とガイダンスを提供するシリーズの一つです。このシリーズは次のパートから構成されています。

データ型

MySQL で提供しているデータ型は、Oracle で提供しているデータ型と完全に同等か、類似しています。次の表に、よく使用される MySQL のデータ型を記載します。その下の表では、Oracle のプリミティブ データ型とそれに対応する MySQL のデータ型を比較します(対応するデータ型が 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
ゼロ以上の値を持つことができる文字列オブジェクト。それぞれの値は、テーブルの作成時に指定された許可される値のリストから選択する必要があります。
数値
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'
- TIME 型は時刻(24 時間未満)を表すだけでなく、経過時間または 2 つのイベント間の時間間隔(24 時間を超える場合も、負の値の場合もあります)を表すためにも使用できるため、時間部分はかなり大きい値になることがあります。
YEAR
- YEAR。年の値を表すために使用する 1 バイトの YEAR 型。
- 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)
可変長の UTF-8 文字列。最大サイズ:
4,000 バイト
○
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
バイナリ ファイルへのポインタ。最大サイズは 4 GB です。 ×
VARCHAR(255)
CLOB
ファイルサイズが最大 4 GB バイトまでの文字ラージ オブジェクト ×
LONGTEXT
BLOB
最大 4 GB までのバイナリラージ オブジェクト。 ○
BLOB
NCLOB
最大ファイルサイズが 4 GB の可変長の Unicode 文字列。 ×
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)を OBJECT TYPES と呼んでいます。オブジェクト型の管理には PL/SQL が使用されます。ユーザー定義型では、組み込みの Oracle データ型リストに含まれるデータ型を拡張してアプリケーション専用の複雑なデータ型を作成できます。

次に、Oracle の UDT の例を示します。

SQL> CREATE OR REPLACE TYPE EMP_PHONE_NUM AS OBJECT (
     PHONE_NUM VARCHAR2(11));

変換に関する注記

MySQL では専用の定義型を作成することはできません。

ユーザーとテーブル

このセクションでは、ユーザーを作成して権限を割り当てる方法と、Oracle テーブルを Cloud SQL for MySQL テーブルに変換する必要性について説明します。

ユーザーの作成と権限

Oracle データベース ユーザー アカウント(Oracle での「ユーザー」と「スキーマ」は同じです)は認証とデータベース セッションへの接続に使用できますが、承認アクセスについては、特定のデータベース オブジェクト / 権限に対してエンドユーザーごとに設定されます。

通常、データベース ユーザーには次の 2 種類があります。

  • 管理者: データベース インスタンス、ユーザー、リソースを管理します。
  • ユーザー アカウント: アプリケーションなどの論理オペレーションを提供します。

管理者は、ユーザー アカウントとアプリケーション ユーザー アカウントにデータベース オブジェクトへのアクセス権限を付与します。Oracle データベース権限は、特定のオペレーション(セッションの作成や接続など)または特定のデータベース オブジェクト(特定のテーブルに対する SELECT や特定のストアド プロシージャの EXECUTE など)に対してユーザーに付与されます。

変換に関する考慮事項

  • MySQL の CREATE USER 構文は Oracle とは異なるため、そのまま移行することはできません。MySQL と Oracle のデータベースではユーザー アーキテクチャも異なります。
  • 管理者は MySQL のユーザーを作成する際に、ユーザーがデータベースへのアクセスで使用する接続先サーバーを指定しなければなりません。サーバーは特定の IP アドレスまたは DNS で指定できます。ワイルドカードの % 記号を使用してすべてのソースからの接続を許可することもできます。
  • MySQL ユーザー名は、ユーザーの名前とそのユーザーの接続元サーバーの 2 つの部分からなります。そのため、名前は同じでも、クライアント アドレス(IP / DNS)として別のサーバーから接続するユーザーを作成できます。
  • ユーザーが作成された後、そのユーザーに、特定のデータベースまたはスキーマに含まれるデータベース オブジェクトに対する権限を付与できます。
  • Cloud SQL for MySQL で許可されている権限に応じて追加権限をユーザーに付与することもできます(たとえば、root ユーザーには SUPER 権限と FILE 権限を除くすべての権限が割り当てられます)。Oracle ユーザーは専用のテーブルスペースに関連付けることができますが、この機能は MySQL には関係しません。

テーブル

Oracle のテーブルは多数の要素からなります。たとえば、列のデータ型、テーブル制約、インデックス、パーティション、Oracle 独自のテーブル機能などの要素です。Cloud SQL for MySQL データベースのテーブルに正常に移行するには、すべての Oracle テーブル要素を MySQL テーブルに変換する必要があります。要素の中にはそのまま移行できるものや、わずかな変更ですむものがありますが、完全に変更しなければならない要素もあります。

移行の観点では、PL/SQL を MySQL に変換するにはより多くの作業が必要になりますが、Oracle テーブルから MySQL テーブルへの変換は、将来的にパフォーマンスとデータサイズに影響を及ぼす非常に重要な段階です。

Oracle テーブルと MySQL テーブルの主な違いと関連機能は次のとおりです。これらの違いについては、このシリーズの残りのパートで説明します。

  • 大文字と小文字の区別(テーブル名と列名)
  • テーブル作成の構文
  • テーブルとインデックスのメタデータ
  • 制約のサポート
  • データ型のサポートと制限事項
  • インデックス
  • パーティションとパーティション管理
  • テーブルとインデックスのメンテナンス
  • 一時テーブル
  • ビュー
  • 表示列と非表示列(Oracle 12c)
  • テーブルと列の文字セット