MySQLデータベースからAutonomous AI Databaseへのアプリケーションの移行
SQL文をMySQLからOracle SQLに移行し、Autonomous AI Databaseで文を実行できます。
MySQL文のOracle SQLへの変換
MySQLで記述されたSQL文をOracle SQLに変換し、変換された文をAutonomous AI Databaseで実行できます。
DBMS_CLOUD_MIGRATION.MIGRATE_SQLを使用して、MySQL文をOracle SQLに変換します。DBMS_CLOUD_MIGRATION.MIGRATE_SQLにはプロシージャおよびファンクションのバリアントがあります。
MIGRATE_SQLプロシージャを使用したOracle SQLへのMySQL文の移行
次の例では、MySQLで記述されたSQL文を入力として受け入れ、その文をOracle SQLに変換し、変換されたSQL文をoutput_sql_resultに割り当てて、結果を出力します。
SET SERVEROUTPUT ON
declare output_sql_result CLOB;
BEGIN
DBMS_CLOUD_MIGRATION.MIGRATE_SQL(
original_sql => 'CREATE TABLE movie (movie_id INT, title VARCHAR(255));',
output_sql => output_sql_result,
source_db => 'MYSQL');
DBMS_OUTPUT.PUT_LINE (output_sql_result);
END;
/
OUTPUT
--------------------------------------------------------------
CREATE TABLE movie (movie_id NUMBER(10), title VARCHAR2(255));original_sqlパラメータは、MySQL文を指定します。
output_sqlパラメータは、変換されたSQLを格納します。
source_dbパラメータは、データベース名としてMySQLを指定します。
詳細は、「MIGRATE_SQLプロシージャおよびファンクション」を参照してください。
MIGRATE_SQLファンクションを使用したOracle SQLへのMySQL文の移行
次の例は、SELECT文内のDBMS_CLOUD_MIGRATION.MIGRATE_SQLファンクションを示しています。ファンクション入力はMySQLステートメントで、ファンクションは変換されたステートメントをOracle SQLで返します。
SELECT DBMS_CLOUD_MIGRATION.MIGRATE_SQL(
'CREATE TABLE movie (film_id INT, title VARCHAR(255));','MYSQL') AS output FROM DUAL;
OUTPUT
------------------------------------------------------------------------------
create table cars (brand VARCHAR2(255), model VARCHAR2(255);詳細は、「MIGRATE_SQLプロシージャおよびファンクション」を参照してください。
DBMS_CLOUD_MIGRATION.MIGRATE_SQLの実行に関するノート:
-
入力SQL文がOracle SQLでサポートされていない場合、変換中にエラーが発生することがあります。詳細は、Limitations for Migration and Translation of MySQL Statements to Oracle SQLを参照してください。
-
DBMS_CLOUD_MIGRATION.MIGRATE_SQLサブプログラムでは、1つのSQL文のみを入力として受け入れます。したがって、コールごとに変換できるSQL文は1つのみです。
Autonomous AI DatabaseでのMySQL文の実行
自律型AIデータベースでMySQL文を対話形式で変換および実行できます。
ENABLE_TRANSLATIONプロシージャを使用して、MySQLで記述されたSQL文のリアルタイム変換を有効にします。セッションで変換を有効にすると、MySQLステートメントは自動的に Oracle SQLステートメントとして変換および実行され、結果を確認できます。
たとえば、ENABLE_TRANSLATIONを実行して翻訳を有効にした後、セッションで対話的に次の操作を実行できます。
-
表を作成します。たとえば、表
MOVIEおよびINVENTORYを作成します。 -
データを表に挿入します。
-
表を問い合せます。
-
表に対して結合操作を実行します。たとえば、表に対して左外部結合を実行できます。
MySQLを使用して変換を有効にし、コマンドを実行するには:
-
SQLクライアントを使用してAutonomous AI Databaseに接続します。
詳細は、Autonomous AI Databaseへの接続を参照してください。
ノート
ノート:DBMS_CLOUD_MIGRATION.ENABLE_TRANSLATIONは、データベース・アクションではサポートされておらず、Oracle APEXサービスではサポートされていません。 -
DBMS_CLOUD_MIGRATION.ENABLE_TRANSLATIONを実行して、セッションでリアルタイムSQL変換を有効にします。MySQLから変換するには、MYSQLパラメータを使用します。BEGIN DBMS_CLOUD_MIGRATION.ENABLE_TRANSLATION('MYSQL'); END; /次の問合せを使用して、セッションのSQL翻訳言語を確認します。
SELECT SYS_CONTEXT('USERENV','SQL_TRANSLATION_PROFILE_NAME') FROM DUAL;詳細は、ENABLE_TRANSLATIONプロシージャを参照してください。
-
MySQL文を入力します。たとえば:
CREATE TABLE movie (film_id int, title varchar(255)); Table MOVIE created.これにより、MySQL
CREATE TABLEステートメントが自動的に変換および実行されます。DESCコマンドを使用して確認できます。次に例を示します。DESC movie; Name Null? Type ------- ----- ------------- FILM_ID NUMBER(38) TITLE VARCHAR2(255)MOVIE表が作成され、各列のデータ型がOracleデータ型に自動的に変換されます。入力SQL文がサポートされていない場合、変換中にエラーが発生することがあります。詳細は、Limitations for Migration and Translation of MySQL Statements to Oracle SQLを参照してください。
-
MOVIE表にデータを挿入します。次に例を示します。INSERT INTO movie (film_id, title) VALUES (123, 'Tangled'); 1 row inserted. INSERT INTO movie (film_id, title) VALUES (234, 'Frozen'); 1 row inserted.MOVIE表を問い合せて、データの挿入を確認します。次に例を示します。SELECT * FROM movie; FILM_ID TITLE -------- --------- 123 Tangled 234 Frozen -
INVENTORY表を作成します。CREATE TABLE inventory (film_id int, inventory_id int); Table INVENTORY created.このステップは、
DESCコマンドを使用して確認できます。次に例を示します。DESC inventory; Name Null? Type ------- ----- ------------- FILM_ID NUMBER(38) INVENTORY_ID NUMBER(38)INVENTORY表が作成され、各列のデータ型がOracleデータ型に自動的に変換されます。 -
INVENTORY表にデータを挿入します。次に例を示します。INSERT INTO inventory(film_id, inventory_id) VALUES (123, 223); 1 row inserted. INSERT INTO inventory(film_id, inventory_id) VALUES (234, 334); 1 row inserted.INVENTORYを問い合せて、データの挿入を確認します。次に例を示します。SELECT * FROM inventory; FILM_ID INVENTORY_ID -------- ------------- 123 223 234 334 -
表
MOVIEおよびINVENTORYで左外部結合を実行します。SELECT m.film_id, m.title, inventory_id FROM movie AS m LEFT JOIN inventory ON inventory.film_id = m.film_id; FILM_ID TITLE INVENTORY_ID ---------- ---------- ------------ 234 Frozen 334 123 Tangled 223この例では、
movie表およびinventory表に対してLEFT OUTER JOINを実行します。FROM句の表別名のASキーワードは、Oracle SQLではサポートされていません。問合せは、最初にOracle SQLに変換されてから、セッションで実行されます。 -
DBMS_CLOUD_MIGRATION.DISABLE_TRANSLATIONプロシージャを使用して、セッションのリアルタイムSQL言語変換を無効にします。BEGIN DBMS_CLOUD_MIGRATION.DISABLE_TRANSLATION; END; /セッションに対してSQL言語変換が有効になっていない場合は、エラーが返されます。
「DISABLE_TRANSLATIONプロシージャ」を参照してください
V$MAPPED_SQLビューを問い合せて、メモリー内でOracle SQL文に変換およびマップされるMySQL文をリストできます。
たとえば:
SELECT v.*
FROM v$mapped_sql v, dba_objects o
WHERE v.sql_translation_profile_id = o.object_id
AND o.object_name = 'MYSQL'
AND o.object_type = 'TRANSLATION PROFILE';詳細は、V$MAPPED_SQLを参照してください。
Oracle SQLへのMySQLファイルの移行
MySQL文を含むファイルをOracle SQL文を含むファイルに移行できます。
DBMS_CLOUD_MIGRATION.MIGRATE_FILEプロシージャは、オブジェクト・ストレージのMySQLファイル内のSQL文を変換し、Oracle SQLを含む新しいファイルを生成します。
前提条件として、.sql拡張子を持つ1つ以上のMySQLファイルをオブジェクト・ストレージ上の場所にアップロードします。次の例では、Object Storageにアップロードされるファイルmysqltest.sqlを使用します。詳細は、オブジェクト・ストレージへのデータの挿入を参照してください。
MySQLファイルをOracle SQLに移行するには:
-
Autonomous AI Databaseインスタンスに接続します。
詳細は、Autonomous AI Databaseへの接続を参照してください。
-
リソース・プリンシパルを使用するか、資格証明オブジェクトを作成して、クラウド・オブジェクト・ストレージへのアクセスを構成します。
このステップでは、移行するファイルを配置するクラウド・オブジェクト・ストレージにアクセスできます:
-
リソース・プリンシパルを使用してクラウド・オブジェクト・ストレージにアクセスします:
リソース・プリンシパルを使用してOracle Cloud Infrastructure Object Storageにアクセスするためのポリシーとロールを定義します。詳細は、リソース・プリンシパルを使用したOracle Cloud InfrastructureリソースへのアクセスおよびDBMS_CLOUDでのリソース・プリンシパルの使用を参照してください。
ファイルが別のベンダーのクラウド・オブジェクト・ストレージにある場合は、リソースにアクセスするための適切なポリシーおよびロールを定義します。詳細は、リソースにアクセスするためのポリシーとロールの構成を参照してください。
-
クラウド・オブジェクト・ストレージにアクセスするための資格証明を作成します:
資格証明を作成してクラウド・オブジェクト・ストレージにアクセスできます。
たとえば:
BEGIN DBMS_CLOUD.CREATE_CREDENTIAL ( credential_name => 'OBJ_STORE_CRED', username => 'user1@example.com', password => 'password' ); END; /詳細は、「CREATE_CREDENTIALプロシージャ」を参照してください。
-
-
オプションで、オブジェクト・ストレージ内のファイルをリストできます。たとえば:
VAR function_list CLOB; SELECT object_name FROM DBMS_CLOUD.LIST_OBJECTS (credential_name => 'OCI$RESOURCE_PRINCIPAL', location_uri => 'https://objectstorage.region.oraclecloud.com/n/namespace/b/bucket/o/files'); OBJECT_NAME --------------------- mysqltest.sqlまたは、リソース・プリンシパルのかわりに資格証明
OCI$RESOURCE_PRINCIPALを作成する場合は、credential_nameパラメータに資格証明名を指定します。詳細は、LIST_OBJECTSファンクションを参照してください。
-
DBMS_CLOUD_MIGRATION.MIGRATE_FILEを実行して、MySQLファイルをOracle SQLに移行します。BEGIN DBMS_CLOUD_MIGRATION.MIGRATE_FILE ( credential_name => 'OCI$RESOURCE_PRINCIPAL', location_uri => 'https://objectstorage.region.oraclecloud.com/n/namespace/b/bucket/o/files/mysqltest.sql', source_db => 'MYSQL' ); END; /credential_nameパラメータは、クラウド・オブジェクト・ストレージURIにアクセスするための資格証明を指定します。DBMS_CLOUD_MIGRATION.MIGRATE_FILEを実行するユーザーには、オブジェクト・ストレージURIへのアクセスに使用される資格証明オブジェクトに対するEXECUTE権限が必要です。つまり、credential_nameパラメータで指定する資格証明です。リソース・プリンシパルのかわりに資格証明を使用する場合は、credential_nameパラメータで資格証明名を指定します。location_uriパラメータでは、ソース・ファイルのURIを指定します。URIの形式は、使用中のクラウド・オブジェクト・ストレージ・サービスによって異なります。詳細は、「DBMS_CLOUD URIフォーマット」を参照してください。source_dbパラメータは、データベース言語としてMySQLを指定します。値MYSQLを使用して、MySQLファイルをOracle SQLに変換します。このコマンドを実行すると、MySQLファイル
mysqltest.sqlがOracle SQLに変換され、original_filename_oracle.sqlという名前の新しいファイルが生成されます。この例では、入力ファイル
mysqltest.sqlを指定してDBMS_CLOUD_MIGRATION.MIGRATE_FILEを実行すると、mysqltest_oracle.sqlが生成されます。変換ステップの後、プロシージャはmysqltest_oracle.sqlをオブジェクト・ストレージにアップロードします。オプションで、
target_uriパラメータを使用して、翻訳済ファイルがアップロードされる場所を指定します。このパラメータのデフォルト値はNULLです。つまり、翻訳されたファイルは、location_uriパラメータで指定された場所と同じ場所にアップロードされます。詳細は、MIGRATE_FILEプロシージャを参照してください。
-
出力ファイルが生成されたことを確認します。
SELECT object_name FROM DBMS_CLOUD.LIST_OBJECTS ( credential_name => 'OCI$RESOURCE_PRINCIPAL', location_uri => 'https://objectstorage.region.oraclecloud.com/n/namespace/b/bucket/o/files'); OBJECT_NAME --------------------- mysqltest.sql mysqltest_oracle.sqlまたは、リソース・プリンシパルのかわりに資格証明
OCI$RESOURCE_PRINCIPALを作成する場合は、credential_nameパラメータに資格証明名を指定します。詳細は、LIST_OBJECTSファンクションを参照してください。
次の問合せを実行して、mysqltest_oracle.sqlファイルの内容を表示します。
SELECT UTL_RAW.CAST_TO_VARCHAR2 (DBMS_CLOUD.GET_OBJECT(
credential_name => 'OCI$RESOURCE_PRINCIPAL',
object_uri => 'https://objectstorage.region.oraclecloud.com/n/namespace/b/bucket/o/files'))
FROM dual;
UTL_RAW.CAST_TO_VARCHAR2(DBMS_CLOUD.GET_OBJECT(CREDENTIAL_NAME=>'CRED1',OBJECT_U
--------------------------------------------------------------------------------
DROP TABLE movie;
DROP TABLE inventory;
CREATE TABLE movie (film_id NUMBER(10), title VARCHAR2(255));
INSERT INTO movie (film_id, title) VALUES (123, 'Tangled');
INSERT INTO movie (film_id, title) VALUES (234, 'Frozen');
CREATE TABLE movie (film_id NUMBER(10), inventory_id NUMBER(10));
INSERT INTO movie (film_id, inventory_id) VALUES (123, 223);
INSERT INTO inventory (film_id, inventory_id) VALUES (234, 334);
SELECT * FROM movie;または、リソース・プリンシパルのかわりに資格証明OCI$RESOURCE_PRINCIPALを作成する場合は、credential_nameパラメータに資格証明名を指定します。
詳細は、「GET_OBJECTプロシージャおよびファンクション」を参照してください。
MySQL文のOracle SQLへの移行および変換に関する制限事項
この項では、SQL文をMySQLからOracle SQLに移行する際の制限事項の概要を示します。
MySQLデータベース・フレーバからOracle SQLに移行する場合、次の制限事項に注意してください。
-
ユーザー定義グローバル変数:
@var_name形式を使用して宣言されたMySQLユーザー定義グローバル変数は、Oracle SQLへの変換時にサポートされません。 -
引用符付き識別子:
var_nameなどのバックティック(`)で囲まれたMySQL識別子は、Oracle SQLへの変換時にはサポートされません。引用符がないか、二重引用符で囲まれている識別子のみがサポートされます。 -
デリミタ:
-
ファンクションおよびプロシージャでは、
$$および//デリミタのみがサポートされています。 -
SQL文の場合、
;デリミタのみがサポートされます。
-
次のMySQL関数のリストはサポートされていません。
-
ADDTIME(datetime, time) -
AES_DECRYPT(crypt_str, key_str) -
AES_ENCRYPT(str, key_str) -
BIN(num) -
CONV(num, from_base, to_base) -
CONVERT_TZ(datetime, from, to) -
CRC32(exp) -
DATE_ADD(date, interval)