※本記事は、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_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
