1

大規模なデータ セットを持つ顧客が数人いて、アップグレード手順中にさまざまなテーブルのスキーマを変更する必要があります (いくつかの列を追加し、他の名前を変更し、時々データ型を変更しますが、それはまれです)。

以前は、新しいスキーマで一時テーブルを使用してから、元のスキーマを削除して一時テーブルの名前を変更していましたが、ALTER table ...代わりに使用することで劇的にスピードアップしたいと考えています。

私の質問は、どのようなデータの整合性とエラー処理の問題を考慮する必要があるかということです。テーブルへのすべての変更をトランザクションに含める必要がありますか (そうであれば、どのように?)、それとも DBMS は ALTER 操作に対して原子性と整合性を保証しますか?

アップグレードを開始する前にデータをバックアップすることを強くお勧めします。

SQLServer 2005 と Oracle をターゲットにする必要がありますが、異なるアプローチが必要な場合は、明らかに条件付きコードを追加できます。

4

4 に答える 4

3

Oracle のみのコメント:

  • テーブルの変更は DDL であるため、トランザクションの概念は適用されません。すべての DDL ステートメントは、操作中にテーブルをロックし、成功または失敗します。

  • 列の追加 (null 可能!) または既存の列の名前変更は比較的軽量なプロセスであり、テーブル ロックを取得できる場合は問題が発生することはありません。

  • 制約 (NOT NULL またはその他のより複雑なチェック制約) を追加/変更する場合、ENABLE NOVALIDATE 句を制約 DDL に追加しない限り、Oracle は既存のデータをチェックして制約を検証します。既存のデータの検証は、大きなテーブルの場合、時間のかかるプロセスになる可能性があります。

  • アップグレードを SQL*Plus スクリプトとして実行するスクリプトを作成している場合は、"whenever sqlerror exit sql.sqlcode" ディレクティブを使用して最初の失敗時にスクリプトを中止し、部分的に実装されているかどうかを確認することで、多くの頭痛の種から解放されます。アップグレードが容易になります。

  • トランザクションを制御できない、またはトランザクションを見逃す余裕がない稼働中のシステムでアップグレードを実行する必要がある場合は、Oracle DBMS_REDEFINITION パッケージの使用を検討してください。これにより、一時テーブルの一時的な構成が自動的に作成され、テーブルの再定義中に進行中のトランザクションをキャプチャするトリガーが作成されます。 「背景」で。警告 - このオプションには多くの作業と急な学習曲線が必要です。

于 2009-06-15T12:20:03.730 に答える
1

SQL Serverを使用している場合、ddlステートメントはトランザクションであるため、トランザクションでラップします(ただし、これはOracleには当てはまらないと思います)。

アップグレードを、特定の機能に対応する個々のパッチに分割します。適用されたパッチはdatabase_patch_historyテーブルに表示され、適用されたパッチとそれらをロールバックする方法を簡単に確認できます。

あなたが言うように、始める前にバックアップを取ることが重要です。

于 2009-06-15T09:45:08.877 に答える
1

私は過去にこのような変更を行う必要があり、常にデータの損失について非常に妄想的でした. そのリスクを軽減するために、私はスキーマとデータでターゲット データベースを可能な限り厳密にミラーリングした「サンドボックス」データベースに対して、常に大量のテストを行ってきました。アプリケーションの他の領域と同様に、ロールアウトする前にプロセスを可能な限りテストしてください。

于 2009-06-15T12:39:09.427 に答える
0

たとえば、VARCHAR を INT に変更するなど、列のデータ型を大幅に変更すると、DBMS がパニックになり、おそらくそのデータが失われます。幸いなことに、最近の DBMS は、データを失わずに一部のデータ型変換を行うのに十分なほどインテリジェントですが、変更を行うときにデータ型を損傷するリスクを冒したくはありません。

列の名前を変更してデータを失うべきではありません。また、新しい列を追加しても失われることはありません。データを移動するときは、注意が必要です。

まず、スキーマとデータの両方のテーブル全体をバックアップします。これにより、すぐに以前のスキーマにロールバックできます。第二に、あなたが行おうとしている変更を見て、それらがどれほど劇的なものであるかを見てください - 何を変更する必要があるかを正確に把握してみてください. データ型変換を行う場合は、最初にそのデータを 3 つの列、外部キー (ID または行を見つけることができるもの)、古いデータ、および新しい列を持つ中間テーブルにプッシュします。次に、古いデータを新しい列に直接プッシュするか、アプリケーション レベルで変換します。

すべてが正しいタイプになり、すべてが成功したら、ALTER ステートメントを実行して、データベースを再作成します。論理的な思考プロセスが必要なだけです。

于 2009-06-15T09:55:31.660 に答える