[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件のコメント