はじめに
こんにちは!ゆうきです🤗
これまで「ひとりでできるもん」シリーズなどを執筆しています。
関連シリーズ記事が充実していますのであわせてご覧くださいね。
今回はヒアドキュメントを扱う方法をご紹介したいと思います🍀
本記事では、実機操作を通して情報処理技術の理解を深めることを目的としており、
皆様の環境での動作を保証するものではありません。👀
ヒアドキュメントについて
ヒアドキュメントをご存知でしょうか。
スクリプトやプログラムの中に文字列を記述しておいて
実行時に利用するのがヒアドキュメントです。
今回ご紹介する演習では、
シェルスクリプトにSQL文を記載しておいて
実行時にSQL*Plusにその文字列を渡して実行します。
とっても便利なので、要チェックです🤗
サンプルスクリプト
今回ヒアドキュメントの動作を確認するために使うスクリプトを紹介します。
一旦内容を全部お見せしてから個別に説明します。
ファイル名は任意で大丈夫です。
db_copy.sh
#!/bin/sh sqlplus -s / as sysdba <<'EOF' select host_name, instance_name, status from v$instance; shutdown immediate quit EOF ls -ld /opt/oracle/base/oradata/ORCL* echo == START DELETE BK == rm -rf /opt/oracle/base/oradata/ORCL_bk echo == END DELETE BK == ls -ld /opt/oracle/base/oradata/ORCL* echo == START COPY == cp -ipR /opt/oracle/base/oradata/ORCL /opt/oracle/base/oradata/ORCL_bk echo == END COPY == ls -ld /opt/oracle/base/oradata/ORCL* sqlplus -s / as sysdba <<'EOF' startup select host_name, instance_name, status from v$instance; quit EOF exit
ヒアドキュメント箇所
どの部分がヒアドキュメントに該当するかわかりましたでしょうか。
そうです、「sqlplus」に続く部分がシェルスクリプトの中にSQL文を記載していますね。
①
sqlplus -s / as sysdba <<'EOF' -- SQL文 EOF
このヒアドキュメントの書き方には別の方法もあり、以下のようなパターンもあります。
②
sqlplus -s / as sysdba <<EOF -- SQL文 EOF
①と②の違いは、
「<<」の後に続く「EOF」がシングルクォートでくくられているかどうかですね。
①のスクリプトは、いつも見ているSQL文と何ら変わらない書き方をしています。
ところが、②のスクリプトでは、
SQL*Plusに渡す文字列を、渡す前に環境変数を値に置き替えてから実行されます(シェルスクリプト部分と同様)。
select host_name, instance_name, status from v$instance;
↑この部分が「$instance」環境変数として認識されます。
つまり、「$instance」と記載している環境変数部分は内容が代入されていない状態なので、SQL*Plusには、
select host_name, instance_name, status from v;
このSQL文を実行してくださいと命令している状態ということです。
検証用に作った環境には、「v」という名前のテーブルが無いと思いますので、
テーブルが見つからない旨のメッセージが表示されることになります。
これを解決するために、環境変数を利用しない部分では「$」の前に「\」を追記し「v\$instance;」と記述します。
環境変数が使えることを利用して、
シェルスクリプトに工夫を凝らして環境変数を組み込んだSQL文を実行することができます。
環境変数の利用以外にも、CSV形式で出力したり、
いろいろ工夫ができると思いますのでこちらの記事もあわせてご覧ください。
スクリプト実行は便利ですが、単に機能を知っているだけでは効果を発揮しません🍀
実際に手を動かして作ってみたり、サンプルを書き換える力をつけてエンジニアライフを豊かにしてくださいね🤗
ファイルのコピー
サンプルスクリプトでは、
データベースを停止してから
データベース関連のファイルをコピーして
データベースを起動する一連の動作を記述しています。
ファイルのコピーでは、あらかじめバックアップ先ディレクトリを
削除処理してからコピーを実行します。
ls -ld /opt/oracle/base/oradata/ORCL* rm -rf /opt/oracle/base/oradata/ORCL_bk ls -ld /opt/oracle/base/oradata/ORCL* cp -ipR /opt/oracle/base/oradata/ORCL /opt/oracle/base/oradata/ORCL_bk ls -ld /opt/oracle/base/oradata/ORCL*
ただし、先にバックアップ先ディレクトリを削除しているので、
コピー終了までの間は、バックアップが存在しない状態になってしまいます。
ディスクに余裕がある場合は、バックアップ先ディレクトリをリネームして
コピー終了後にリネームしたディレクトリを削除する処理のほうが安全になります。
実際に動作している様子
スクリプトの大まかな作り方はこちらの記事をあわせてご覧ください
コピー&ペーストの部分は前述したスクリプトの貼り付けに読みかえてくださいね。
実際に動かしてみると、正常に動作した場合以下のような出力になります。
[oracle@localhost ~]$ ./db_copy.sh HOST_NAME -------------------------------------------------------------------------------- INSTANCE_NAME ------------------------------------------------ STATUS ------------------------------------ localhost.localdomain orcl OPEN Database closed. Database dismounted. ORACLE instance shut down. drwxr-x---. 2 oracle oinstall 4096 12月 9 16:51 /opt/oracle/base/oradata/ORCL drwxr-x---. 2 oracle oinstall 4096 12月 9 16:51 /opt/oracle/base/oradata/ORCL_bk == START DELETE BK == == END DELETE BK == drwxr-x---. 2 oracle oinstall 4096 12月 9 16:51 /opt/oracle/base/oradata/ORCL == START COPY == == END COPY == drwxr-x---. 2 oracle oinstall 4096 12月 9 16:51 /opt/oracle/base/oradata/ORCL drwxr-x---. 2 oracle oinstall 4096 12月 9 16:51 /opt/oracle/base/oradata/ORCL_bk ORACLE instance started. Total System Global Area 838858176 bytes Fixed Size 8902080 bytes Variable Size 599785472 bytes Database Buffers 226492416 bytes Redo Buffers 3678208 bytes Database mounted. Database opened. HOST_NAME -------------------------------------------------------------------------------- INSTANCE_NAME ------------------------------------------------ STATUS ------------------------------------ localhost.localdomain orcl OPEN [oracle@localhost ~]$
おわりに
ヒアドキュメントについてご紹介しましたが、
他の記事で解説している内容を織り交ぜながらとなりました。
一つ一つの記事でご紹介している内容単体はあまり活用する機会がなかったとしても、
このように組み合わせて応用をきかせることで
活用機会が増し、大きな力を発揮できる知識も少なくありません。
この記事をご覧いただいたあなたも、
自分が持っている知識と組み合わせてどう活用できるかな?と考えながら読んでいただけると
有意義な情報収集になるのではないでしょうか。
今回の記事がよかったなと思ったら、
ぜひ「ひとりでできるもん」シリーズもあわせてご覧くださいね。
同じようなテイストで執筆されている記事をご覧いただけます。
いつもシリーズをご覧くださっている方もありがとうございます🤗
投稿者プロフィール
- Oracle Cloud2024年12月5日OCI ブロック・ボリュームのパフォーマンスについて検証してみた!
- 23ai2024年12月4日【Oracle 23ai 新機能】True Cacheを紹介・導入してみました
- Oracle Cloud2024年12月3日プライベートDNSで名前解決してみた!
- Oracle Cloud2024年11月28日OCIのMySQLでレプリケーションを使用してみました!