[Oracle]ASMのV$表をDB側にコピーする

ASMのV$表をDB側にコピーしたときのメモ

こちらの記事の検証で実施したときのメモ。クエリ確認用のため、見かけ上のコピー。(X$表やら付随するオブジェクトなどは考慮していない)

V$の抽出

ASMではData PumpやDBMS_METADATA.GET_DDLが使えないので、sqlplus のdescコマンドでテーブル定義をファイルに出力する。ちなみにsqlcliのDDLコマンド、CATSコマンドなども使えなかった。

su - grid
sqlplus / as sysasm
set echo off
spool /tmp/asm_tables.tmp
desc V$ASM_ALIAS
desc V$ASM_DISKGROUP
desc V$ASM_FILE
exit

DESCRIBEの出力結果をCREATE TABLE文に整形する

sedで加工。ポイントはzオプションで行をまたいだ置換を行う。多少泥臭いけどこれでいける。

cat /tmp/asm_tables.tmp | sed -e '$d' -e '/\(^ Name\|^ -\)/d' -e 's/^SQL>//g' \
-e 's/ desc \(.*\)$/create table \1 (/g' -e 's/^$/);/g' \
| sed -ze 's/\()\|[A-Z]\)\n \([A-Z]\)/\1,\n \2/g' | tee /tmp/asm_tables.sql

データのエクスポート

import文にして出力してくれるsqlcli(sqlコマンド)のset format insertを使用しselectをかける。

gridのORACLE_HOMEにはsqlコマンドが入ってないのでDBのホーム上のものを使う。

/u01/app/oracle/product/19.0.0/dbhome_1/bin/sql / as sysasm
set feedback off
set sqlformat insert
alter session set NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
alter session set NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH24:MI:SS.FF';
spool /tmp/asm_data.sql
select * from V$ASM_ALIAS;
select * from V$ASM_DISKGROUP;
select * from V$ASM_FILE;
exit

整形する

timestamp型のカラムでto_timestamp関数の日付書式がnullになってしまうようなのでここだけ修正。

こんな感じになってしまう。
Insert into <途中省略> ,to_timestamp('2022-03-26 13:01:22','null'),to_timestamp('2022-03-26 13:00:00','null'),'U','rw-rw-rw-',0,0,0,0,'COLD','COLD',0,0,0,0,0,0,0,0,0,0,'N',0,0,0);

sedで修正。シングルクォートのエスケープはシングルクォートで行う。

sed -i 's/''null''/''YYYY-MM-DD HH24:MI:SS''/g' /tmp/asm_data.sql

データベースへロードする

sqlplusでPDBに接続して作成したsqlファイルを順番に流す。

su - oracle
sqlplus TEST/TEST@PDB01
@/tmp/asm_tables.sql
@/tmp/asm_data.sql
commit;

1件のコメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

コメントする