目的
毎回create tablespace文を1から作るのは面倒なので、create tablespace文の可変部分のみを変数として指定するスクリプトを作成しました。
検証環境等で複数の表領域を作成するときに使用すると便利です。
create_tbs.sql
set ver off echo off feed off
create tablespace &1 datafile '&2' size &3;
exit
<置き換え変数の用途>
&1:表領域名
&2:データファイルのフルパスファイル名
&3:データファイルのサイズ以降の情報(サイズの指定以外は省略可)
実行例
[oracle@test ~]$ sqlplus -s / as sysdba @create_tbs.sql test $ORACLE_BASE/oradata/test/test.dbf '1m reuse autoextend on'
[oracle@test ~]$
[oracle@test ~]$ sqlplus -s / as sysdba
select tablespace_name from dba_tablespaces;
TABLESPACE_NAME
------------------------------
SYSTEM
SYSAUX
UNDOTBS1
TEMP
USERS
TEST <==追加された
SMALL
BIG
8行が選択されました。
応用
シェルスクリプトの使用
シェルスクリプトを使用すれば、リストファイルに記載した表領域をまとめて作成することができます。
用意する資材
1.create_tbs.sh ・・・メインシェル。dbf.lstを読み込み、create_tbs.sqlとselect_tbs.sqlに引数として渡す。
2.create_tbs.sql・・・表領域作成SQL
3.select_tbs.sql・・・表領域作成状況の確認SQL
4.dbf.lst ・・・作成する表領域一覧
create_tbs.sh
# !/bin/bash
echo "表領域の作成を開始します。"
ERR_CNT=0
while read LINE
do
# 各種変数
TBS=`echo $LINE | cut -d " " -f 1`
FILE=`echo $LINE | cut -d " " -f 2`
# 既存データ重複判定
CNT1=`sqlplus -s / as sysdba @select_tbs.sql $TBS $FILE`
if [ $CNT1 -ge 1 ]; then
echo -e "表領域名またはデータファイル名が重複しています。\n表領域:$TBS\nデータファイル:$FILE)"
ERR_CNT=`expr $ERR_CNT + 1`
else
#表領域作成
sqlplus -s / as sysdba @create_tbs.sql $LINE
CNT2=`sqlplus -s / as sysdba @select_tbs.sql $TBS $FILE`
#表領域作成後の状態判定
if [ $CNT2 -eq 1 ]; then
echo "表領域:$TBSを作成しました。(データファイル:$FILE)"
else
echo "表領域:$TBSの作成に失敗しました。(データファイル:$FILE)"
ERR_CNT=`expr $ERR_CNT + 1`
fi
fi
done < $1
# シェル自体の状態判定
if [ $ERR_CNT -eq 0 ] ;
then
echo "すべての表領域が正常に作成されました。"
exit_code=0
else
echo "作成に失敗した表領域があります。"
exit_code=1
fi
exit $exit_code
<実行方法>
./create_tbs.sh [リストファイル(dbf.lst)]
create_tbs.sql
(既出のため省略)
select_tbs.sql
set lines 100 pages 1000 echo off feed off ver off head off
select count(1) from dba_data_files where tablespace_name = lower('&1') or tablespace_name = upper('&&1') or file_name='&2';
exit
<実行方法>
select_tbs.sql [表領域名] [データファイルのフルパスファイル名]
dbf.lst
test1 /u01/app/oracle/oradata/test/test1.dbf '1m reuse'
test2 /u01/app/oracle/oradata/test/test2.dbf '1m reuse'
test3 /u01/app/oracle/oradata/test/test3.dbf '1m reuse'
<ファイルフォーマット>
[表領域名] [データファイルのフルパスファイル名] '[サイズ以降の項目(サイズは必須)]'
実行例
[oracle@test ~]$ . create_tbs.sh dbf.lst
表領域の作成を開始します。
表領域:test1を作成しました。(データファイル:/u01/app/oracle/oradata/test/test1.dbf)
表領域:test2を作成しました。(データファイル:/u01/app/oracle/oradata/test/test2.dbf)
表領域:test3を作成しました。(データファイル:/u01/app/oracle/oradata/test/test3.dbf)
すべての表領域が正常に作成されました。