

# PostgreSQL から Aurora DSQL への移行
<a name="working-with-postgresql-compatibility-migration-guide"></a>

Aurora DSQL は [PostgreSQL と互換性がある](working-with-postgresql-compatibility.md)ように設計されており、ACID トランザクション、セカンダリインデックス、結合、標準 DML オペレーションなどのコアリレーショナル機能をサポートしています。既存の PostgreSQL アプリケーションのほとんどは、最小限の変更で Aurora DSQL に移行できます。

このセクションでは、フレームワークの互換性、移行パターン、アーキテクチャ上の考慮事項など、アプリケーションを Aurora DSQL に移行するための実用的なガイダンスを提供します。

## フレームワークと ORM の互換性
<a name="dsql-framework-compatibility"></a>

 Aurora DSQL は標準の PostgreSQL ワイヤプロトコルを使用して、PostgreSQL ドライバーおよびフレームワークとの互換性を確保します。最も一般的な ORM は、最小限の変更または変更なしで Aurora DSQL で動作します。リファレンス実装と利用可能な ORM 統合については、「[Aurora DSQL アダプターとダイアレクト](aws-sdks.md#aurora-dsql-adapters)」を参照してください。

## 一般的な移行パターン
<a name="working-with-postgresql-compatibility-migration-considerations"></a>

 PostgreSQL から Aurora DSQL に移行する場合、一部の機能の動作が異なったり、代替構文が使用されたりすることがあります。このセクションでは、一般的な移行シナリオに関するガイダンスを提供します。

### DDL オペレーションの代替方法
<a name="dsql-ddl-alternatives"></a>

Aurora DSQL は、従来の PostgreSQL DDL オペレーションに代わる最新の操作を提供します。

**インデックスの作成**  
ノンブロッキングインデックスの作成には、`CREATE INDEX` の代わりに `CREATE INDEX ASYNC` を使用します。  
**ベネフィット:** 大規模なテーブルでのダウンタイムなしでインデックスを作成できます。

**データの削除**  
`TRUNCATE` ではなく `DELETE FROM table_name` を使用します。  
**代替方法:** テーブルの完全な再作成には、`DROP TABLE` に続いて `CREATE TABLE` を使用します。

**システム設定**  
Aurora DSQL は完全に管理されているため、設定はワークロードパターンに基づいて自動的に処理されます。AWS マネジメントコンソールまたは API を使用して、クラスター設定を管理します。  
**ベネフィット:** データベースのチューニングやパラメータ管理は必要ありません。

### スキーマ設計パターン
<a name="dsql-schema-design-patterns"></a>

Aurora DSQL との互換性のために、以下の一般的な PostgreSQL パターンを適応させます。

**参照整合性パターン**  
Aurora DSQL はテーブルの関係と `JOIN` オペレーションをサポートしています。参照整合性を保つには、アプリケーションレイヤーに検証を実装します。この設計は、アプリケーションレイヤーの検証により柔軟性が向上し、カスケードオペレーションによるパフォーマンスのボトルネックを回避する最新の分散データベースパターンと一致しています。  
**パターン:** 一貫した命名規則、検証ロジック、トランザクション境界を使用して、アプリケーションレイヤーに参照整合性チェックを実装します。多くの大規模なアプリケーションでは、エラー処理とパフォーマンスをより適切に制御するためにこのアプローチが好まれます。

**一時的なデータ処理**  
一時テーブルの代わりに、CTE、サブクエリ、またはクリーンアップロジックを備えた通常のテーブルを使用します。  
**代替方法:** セッション固有の名前を持つテーブルを作成し、アプリケーション内でクリーンアップします。

## アーキテクチャの違いを理解する
<a name="working-with-postgresql-compatibility-architectural-differences"></a>

Aurora DSQL の分散サーバーレスアーキテクチャは、いくつかの点で従来の PostgreSQL と意図的に異なります。これらの違いにより、Aurora DSQL の主なベネフィットであるシンプルさとスケールが実現されます。

### 簡素化されたデータベースモデル
<a name="dsql-simplified-database-model"></a>

**クラスターごとに単一のデータベース**  
Aurora DSQL には、クラスターごとに `postgres` という名前の組み込みデータベースが 1 つ用意されています。  
**移行のヒント:** アプリケーションで複数のデータベースを使用する場合は、論理的に分離するために個別の Aurora DSQL クラスターを作成するか、単一のクラスター内でスキーマを使用します。

**一時テーブルはありません**  
 一時的なデータ処理には、共通テーブル式 (CTE) とサブクエリを使用する必要があります。これにより、複雑なクエリの柔軟な代替手段が提供されます。  
 **代替方法:** 一時的な結果セットには `WITH` 句を使用した CTE を使用するか、セッション固有のデータ用に一意の名前を持つ通常のテーブルを使用します。

**Automatic Storage Management**  
Aurora DSQL により、テーブルスペースと手動のストレージ管理が不要になります。ストレージは、データパターンに基づいて自動的にスケーリングおよび最適化されます。  
**ベネフィット:** ディスク容量のモニタリング、ストレージ割り当ての計画、テーブルスペース設定の管理を行う必要がありません。

### 最新のアプリケーションパターン
<a name="dsql-modern-application-patterns"></a>

Aurora DSQL は、メンテナンス性とパフォーマンスを向上させる最新のアプリケーション開発パターンを奨励します。

**データベーストリガーではなくアプリケーションレベルのロジック**  
トリガーのような機能を実現するには、アプリケーションレイヤーにイベント駆動型ロジックを実装します。  
**移行戦略:** トリガーロジックをアプリケーションコードに移動し、EventBridge などの AWS のサービスでイベント駆動型アーキテクチャを使用するか、アプリケーションのログ記録を使用して監査証跡を実装します。

**データ処理用の SQL 関数**  
Aurora DSQL は SQL ベースの関数をサポートしていますが、PL/pgSQL などの手続き型言語はサポートしていません。  
**代替方法:** データ変換に SQL 関数を使用するか、複雑なロジックをアプリケーションレイヤーまたは AWS Lambda 関数に移動します。

**悲観的ロックではなく最適化されたオプティミスティック同時実行制御**  
Aurora DSQL は、従来のデータベースロックメカニズムとは異なるロックフリーアプローチであるオプティミスティック同時実行制御 (OCC) を使用します。Aurora DSQL では、他のトランザクションをブロックするロックを取得する代わりに、トランザクションをブロックせずに続行し、コミット時に競合を検出できます。これにより、デッドロックが解消され、遅いトランザクションが他のオペレーションをブロックすることがなくなります。  
**主な違い:** 競合が発生すると、Aurora DSQL はトランザクションをロックまで待機させるのではなく、シリアル化エラーを返します。これには、従来のデータベースでのロックタイムアウトの処理と同様に、アプリケーションで再試行ロジックを実装する必要がありますが、ブロッキング待機が発生するのではなく、競合はすぐに解決されます。  
**設計パターン:** 再試行メカニズムを使用してべき等トランザクションロジックを実装します。ランダムなプライマリキーを使用し、キー範囲全体に更新を分散することで、競合を最小限に抑えるスキーマを設計します。詳細については、「[Aurora DSQL での同時実行制御](working-with-concurrency-control.md)」を参照してください。

### 運用の簡素化
<a name="dsql-operational-simplifications"></a>

Aurora DSQL は、従来のデータベースメンテナンスタスクの多くを排除し、運用上のオーバーヘッドを削減します。

**手動メンテナンスは不要**  
Aurora DSQL は、ストレージの最適化、統計収集、パフォーマンス調整を自動的に管理します。`VACUUM` のような従来のメンテナンスコマンドはシステムによって処理されます。  
**ベネフィット:** データベースのメンテナンスウィンドウ、バキュームスケジュール、システムパラメータの調整が不要になります。

**自動パーティショニングとスケーリング**  
Aurora DSQL は、アクセスパターンに基づいてデータを自動的にパーティション化して分散します。最適なディストリビューションのために、UUID またはアプリケーション生成 ID を使用します。  
**移行のヒント:** 手動パーティショニングロジックを削除し、Aurora DSQL でデータ分散を処理できるようにします。最適なディストリビューションのために、UUID またはアプリケーション生成 ID を使用します。アプリケーションで連続した識別子が必要な場合は、「[シーケンスと ID 列](sequences-identity-columns.md)」を参照してください。

## PostgreSQL 互換性に関する Aurora DSQL の考慮事項
<a name="working-with-postgresql-compatibility-unsupported-limitations"></a>

Aurora DSQL には、分散アーキテクチャ、サーバーレスオペレーション、自動スケーリングを可能にするセルフマネージド PostgreSQL とは異なる機能サポートがあります。ほとんどのアプリケーションは、これらの違いを変更せずにそのまま動作します。

一般的な考慮事項については、「[Amazon Aurora DSQL の使用に関する考慮事項](considerations.md)」を参照してください。クォータと制限については、「[Amazon Aurora DSQL のクラスタークォータとデータベース制限](CHAP_quotas.md)」を参照してください。
+ Aurora DSQL は、クラスターごとに `postgres` という名前の単一の組み込みデータベースを使用します。論理的に分離するには、個別の Aurora DSQL クラスターを作成するか、単一のクラスター内でスキーマを使用します。
+ `postgres` データベースは UTF-8 文字エンコードを使用しており、幅広い国際文字サポートを提供します。
+ データベースは `C` のみを使用します。
+ Aurora DSQL はシステムのタイムゾーンに `UTC` を使用します。Postgres は、タイムゾーンに対応したすべての日付と時刻を内部的に UTC に保存します。`TimeZone` 設定パラメータを設定して、クライアントへの表示方法を変換し、サーバーが内部的に UTC に変換するために使用するクライアント入力のデフォルトとして機能させることができます。
+ トランザクション分離レベルは PostgreSQL `Repeatable Read` で固定されています。
+ トランザクションには次の制約があります。
  + DDL オペレーションと DML オペレーションには個別のトランザクションが必要です
  + トランザクションに含めることができる DDL ステートメントは 1 つのみです。
  + トランザクションは、セカンダリインデックスの数に関係なく、3,000 行まで変更できます。
  + 3,000 行の制限は、すべての DML ステートメント (`INSERT`、`UPDATE`、`DELETE`) に適用されます。
+ データベース接続は 1 時間後にタイムアウトします。
+ Aurora DSQL は、スキーマレベルの許可を通じてアクセス許可を管理します。管理者ユーザーは `CREATE SCHEMA` を使用してスキーマを作成し、`GRANT USAGE ON SCHEMA` を使用してアクセス権を付与します。管理者ユーザーはパブリックスキーマ内のオブジェクトを管理しますが、管理者以外のユーザーはユーザーが作成したスキーマ内にオブジェクトを作成して、所有権の境界を明確にします。詳細については、「[データベースで SQL を使用するためのデータベースロールの許可](using-database-and-iam-roles.md#using-database-and-iam-roles-custom-database-roles-sql)」を参照してください。

## 移行に関してサポートが必要ですか。
<a name="dsql-migration-feedback-link"></a>

移行に不可欠であるにもかかわらず、Aurora DSQL で現在サポートされていない機能に遭遇した場合、「[Amazon Aurora DSQL に関するフィードバックの提供](providing-feedback.md)」を参照して AWS とフィードバックを共有する方法を確認してください。