用脚本按顺序执行初始化 DB 的 SQL 文件 – AlfredZhao

用脚本按顺序执行初始化 DB 的 SQL 文件 – AlfredZhao


ソフトウェアをインストールするとき、データベースを初期化するには、多くの場合、複数の実行が必要になります。 .sql ファイルであり、番号順に指定する必要があります。手動で 1 つずつ実行すると時間がかかり、リークが発生しやすくなります。著者はここで、カプセル化のアイデアを共有しています。まずマスター制御スクリプトを生成し、次にそれをデータベースに与えてすぐに実行します。

01 |まずディレクトリ内のファイルを確認します

通常、複数の初期化ディレクトリがあります .sqlファイル名には、次のように先頭に数字が付きます。

$ ls -lrth
total 92K
-rw-r--r-- 1 oracle oinstall 2.1K Oct 15 17:35 999-security-context.md
-rw-r--r-- 1 oracle oinstall  825 Oct 15 17:35 400-rdf-network.sql
-rw-r--r-- 1 oracle oinstall 8.9K Oct 15 17:35 310-rdf-ontology.sql
-rw-r--r-- 1 oracle oinstall  46K Oct 15 17:35 300-data.sql
-rw-r--r-- 1 oracle oinstall 3.3K Oct 15 17:35 200-changes.sql
-rw-r--r-- 1 oracle oinstall  13K Oct 15 17:35 100-dbobjects.sql

数値プレフィックスは実行順序の基礎となります。から 100 到着 400 それらを一つずつ実行するだけです。

02 |マスター制御スクリプトを生成する

中心となるアプローチは、ループを使用してそれぞれをループすることです。 .sql 一つ作ってください run_all.sqlエラー終了、エコー、タイミングなどの設定を追加します。


    echo "-- ========================================"
    echo "-- Auto-generated Oracle Deployment Script"
    echo "-- ========================================"
    echo "WHENEVER SQLERROR EXIT SQL.CODE;"
    echo "SET ECHO ON;"
    echo "SET TIMING ON;"
    echo ""

    # 获取所有 sql,按版本号排序,并排除 run_all.sql 自身
    for f in $(printf '%s\n' *.sql  > run_all.sql

生成後、これらを入力します .sql ファイルが置かれているディレクトリ (@@ 現在の作業ディレクトリを基準にして解決されます)、対応するアクセス許可を持つデータベース ユーザーに接続して、実行します。 run_all.sql。スクリプトが設定されています WHENEVER SQLERROR EXIT SQL.CODEエラーを報告するステートメントはすぐに終了します。現時点では、失敗したスクリプトを再実行する前に、トラブルシューティングを行って修復する必要があります。運用環境で使用する前に、テスト環境で検証することをお勧めします。

03 |なぜこれが機能するのか

鍵は次の 2 点にあります。

  • sort -V バージョン番号で並べ替え、100、200、300 このような数値接頭辞は自然に整列することができ、文字列のソートのずれは発生しません。
  • grep -v '^run_all\.sql$' 正確なカリング run_all.sql 自体。生成された対象ファイルも同じディレクトリにあるため、除外しないと繰り返し生成中に再度リストに書き込まれ、自己参照が発生します。

このようにして、生成コマンドを何度実行しても、制御スクリプトにはビジネスのみが含まれます。 .sql ファイルはそれ自体を参照しません。ただし、スクリプトを繰り返し実行できることは保証されません。初期化 SQL が冪等でない場合、繰り返し実行するとデータの重複やエラー報告が発生する可能性があります。実稼働環境でスクリプトを実行する前に、スクリプトをバックアップして冪等性を確認する必要があります。


私に従ってAIと一緒に成長してください~



Source link

Leave a Reply

Your email address will not be published. Required fields are marked *