※本記事は、Bogapurapu laxmi krishna Raoによる”Simple migration from Oracle multimedia to secure-file blob data type“を翻訳したものです。


 

April 7, 2021
 

Oracle Database 19cのリリースではOracle Multimediaデータ型へのサポートが終了していますので、19c以降のリリースでこのデータ型を扱う方法についてガイダンスをお伝えしたいと思います。

オラクルでは、マルチメディア・コンテンツをSecureFiles LOBに格納し、APEX Multimedia Extension(AME)などサード・パーティ製品を使用することをお勧めしています。詳細は、『Desupport of Oracle Multimedia Component in Oracle 19c』(Doc ID 2555923.1)のドキュメントでシェアしています。

現在、Oracle Multimediaデータ型を使用していて、Oracle Database 19cへのアップグレードを計画されている場合は、既存のマルチメディア・コンテンツをSecureFiles LOBに移行する必要があります。

それでは、移行を行う方法をいくつか見ていきましょう。

 

解決策1:同じ表で列を更新する

プロセスの概要:

  • 既存の表のバックアップを取る
  • BLOB データ型と securefile の新しい列を追加する
  • ORDIMAGE 列のデータを BLOB列に更新する
  • 表の古い列に unused と設定する
  • 新しい列の名前をもとの列名に変更する
  • 古い列名を削除する

 

この例で使用するオブジェクト:

マルチメディア・データ型がある表

image_table/image_table_bkp

マルチメディア・データ型が格納された列    

IMAGE

SECUREFiles LOBデータ型が格納された列

image_BLOB

 

表のバックアップ: 既存の表のバックアップをとる(任意)。バックアップを取得してデータを保護することを推奨

create table image_table_bkp as select * from image_table;

 

新しい列を追加することで、既存のマルチメディア列を新しい列に置き換える: SECUREFILE を保持するための IMAGE_BLOB 列を作成する

SQL> ALTER TABLE image_table ADD (image_Blob BLOB) LOB(image_Blob) STORE AS SECUREFILE (tablespace multi_sf);

Table altered.

SQL> desc image_table

Name                                      Null?    Type

—————————————– ——– —————————-

ID                                                 NUMBER

IMAGE                                              PUBLIC.ORDIMAGE

IMAGE_BLOB                                         BLOB

 

新しい列を古い列データで更新する: 

SQL> UPDATE IMAGE_TABLE I set I.IMAGE_BLOB=I.IMAGE.SOURCE.LOCALDATA;

2 rows updated.

SQL> commit;

Commit complete.

 

 

古い列に UNUSED とマークする: 

SQL> alter table image_table SET UNUSED (IMAGE);

Table altered.

SQL> desc image_table

Name                                      Null?    Type

—————————————– ——– —————————-

ID                                                 NUMBER

IMAGE_BLOB                                         BLOB

 

 

新しい列の名前を古い列名に変える: 

SQL> alter table image_table rename column IMAGE_BLOB to image;

Table altered.

SQL> desc image_table

Name                                      Null?    Type

—————————————– ——– —————————-

ID                                                 NUMBER

IMAGE                                              BLOB

 

古い列を削除する:

SQL> alter table image_table DROP UNUSED COLUMNS CHECKPOINT 250;

Table altered.

SQL> desc image_table

Name                                      Null?    Type

—————————————– ——– —————————-

ID                                                 NUMBER

IMAGE                                              BLOB

 

 

表のデータをチェックする:

SQL>  exec check_space_secfile(‘IMAGE_TABLE’,’MULTI_SF’);

Segment Blocks = 2072,  Bytes = 16973824

Used Blocks = 895,  Bytes = 7331840

Expired Blocks = 1102,  Bytes = 9027584

Unexpired Blocks = 0,  Bytes = 0

=============================================

PL/SQL procedure successfully completed.

 

 

 

解決策2:新しい表に移行する

プロセスの概要:

  • image_table に似た image_table_blob 表を作成する。ただし、列のデータ型は ORDIMAGE データ型ではなく BLOB とすること
  • image_table のデータを image_table_blob に挿入する

 

この例で使用するオブジェクト:

マルチメディア・データ型がある表

image_table_bkp

マルチメディア・データ型が格納された列

IMAGE

マルチメディア・データ型がある表

image_table_bLOB

SECUREfiles LOB データ型が格納された列

image

 

元の表:

SQL> select owner,table_name,column_name,DATA_TYPE from dba_tab_columns where table_name like ‘IMAGE_TABLE_BKP’;

OWNER                TABLE_NAME           COLUMN_NAME          DATA_TYPE

——————– ——————– ——————– ——————–

MULTI_SF             IMAGE_TABLE_BKP      IMAGE                ORDIMAGE

MULTI_SF             IMAGE_TABLE_BKP      ID                   NUMBER

 

 

バックアップ表を作成する: 

create table image_table_blob (ID NUMBER,IMAGE BLOB) LOB(IMAGE) STORE AS SECUREFILE (tablespace multi_sf);

 

SQL> select owner,table_name,column_name,DATA_TYPE from dba_tab_columns where table_name like ‘IMAGE_TABLE_BLOB’;

 

OWNER                TABLE_NAME           COLUMN_NAME          DATA_TYPE

——————– ——————– ——————– ——————–

MULTI_SF             IMAGE_TABLE_BLOB     ID                   NUMBER

MULTI_SF             IMAGE_TABLE_BLOB     IMAGE                BLOB

 

 

新しいデータを表に挿入する: 

insert into image_table_blob select I.ID,I.IMAGE.SOURCE.LOCALDATA  from image_table I;

 

新しい表のデータをクロスチェックする:

SQL> exec check_space_secfile(‘IMAGE_TABLE_BLOB’,’MULTI_SF’);

Segment Blocks = 2072,  Bytes = 16973824

Used Blocks = 895,  Bytes = 7331840

Expired Blocks = 1102,  Bytes = 9027584

Unexpired Blocks = 0,  Bytes = 0

=============================================

PL/SQL procedure successfully completed.

 

 

データを検証し、移行が成功したかどうかをチェックする

古い表を削除して、新しい表の名前を古い表の名前に変えてもいいですし、新しい表明をそのまま使っても構いません。

DROP TABLE image_table;

RENAME IMAGE_TABLE_BLOB to image_table;

次回のブログでは、 APEX Multimedia Extention を使ってイメージのサイズ変更操作を実行する方法を取り上げます。

 

参考資料:

https://support.oracle.com/knowledge/Oracle%20Database%20Products/2555923_1.html