前の記事で 、同僚のDmitry Vasilievが PostgreSQLとMySQLの統合を構成する方法と、いくつかのクエリをより効率的に実行する方法を説明しました。
この記事では、Linuxを実行しているPostgreSQLをMS SQL Serverに接続する構成について説明します。 各テーブルの構造を説明せずに、特定のMS SQL ServerデータベーススキーマのすべてのテーブルをPostgreSQLにインポートする方法と同様に。
tds_fdwをインストールして構成する
Tds_fdwは、 PostgreSQLとMS SQL Serverを統合するために使用されます。 このモジュールは、 TDS (Tabular Data Stream)プロトコルを介してデータベースと通信します。 TDSは、MS SQL ServerやSybase SQL ServerなどのDBMSで使用されます。
tds_fdwをビルドしてインストールする前に、 FreeTDSライブラリをインストールする必要があります。 Ubuntuの場合、これらはfreetds-devおよびfreetds-commonパッケージです。
sudo apt-get install freetds-dev freetds-common
次に、tds_fdwをダウンロードしてビルドします(アセンブリには、インストールされたPostgreSQLとPATH環境変数のpg_configも必要です)。
git clone https://github.com/tds-fdw/tds_fdw.git cd tds_fdw make USE_PGXS=1 install
tds_fdwを使用する前に、FreeTDSを構成する必要があります。 MS SQL Serverに接続するためのFreeTDSの構成は、/ etc / freetds / freetds.confファイルを使用して実行されます。 たとえば、次のコンテンツを追加します。
[mssql01] host = 192.168.0.1 port = 1433 tds version = 7.1 instance = MSSQL01
これで、PostgreSQLに必要なオブジェクトを作成できます。
-- CREATE EXTENSION tds_fdw; -- CREATE SERVER sql01 FOREIGN DATA WRAPPER tds_fdw OPTIONS (servername 'mssql01', database 'test_sql01', msg_handler 'notice'); -- CREATE USER MAPPING FOR pguser SERVER sql01 OPTIONS (username 'msuser', password 'userpass');
ここで、mssql01はfreetds.conf内のサーバーの名前、pguserはPostgreSQLユーザー、msuserはMS SQL Serverユーザーです。
その後、MS SQL ServerテーブルごとにPostgreSQLで外部テーブルを作成できます。 ただし、代わりにIMPORT FOREIGN SCHEMA
コマンドを使用できます。
MS SQL Serverを使用したテーブル定義のインポート
IMPORT FOREIGN SCHEMA
チームはPostgreSQL 9.5で実装されました。 oracle_fdw、mysql_fdwなどのサードパーティデータラッパーは、そのサポートを実装しました。 しかし、tds_fdwのサポートはありませんでした。
私たちのプロジェクトの1つでは、tds_fdwにもこのチームのサポートが必要でした。 チームを実装し、 プルリクエストを作成しました。 その日、開発者は喜んでそれを受け取りました。 その前に、彼らはPythonに実装されているテスト用のスクリプトを数時間で修正しました。 テストはPostgreSQL 9.2、9.3、9.4、および9.5で実行されます。 ただし、 IMPORT FOREIGN SCHEMA
コマンドはバージョン9.5でのみ追加されました。
これで、次のコマンドを実行できます。
IMPORT FOREIGN SCHEMA msschema01 FROM SERVER sql01 INTO pgschema01 OPTIONS (import_default 'true');
スキームmsschema01およびpgschema01はすでに存在している必要があります。 このコマンドは次のオプションを受け入れます。
- import_default-テーブル列を記述するときにDEFAULT式を追加するかどうか(デフォルト、false)。
- import_not_null-テーブル列を記述するときにNOT NULL制約を追加するかどうか(デフォルト、true)。
テーブル列の説明をインポートする場合、次のタイプマッピングが使用されます。
タイプMS SQL Server | PostgreSQLタイプ |
---|---|
少し 小さい tinyint | 小さい |
int | 整数 |
ビッグ | ビッグ |
10進数(p [、s]) | 10進数(p [、s]) |
数値(p [、s]) | 数値(p [、s]) |
お金 小銭 | お金 |
浮く float(n)、ここで25 <= n <= 53 | 倍精度 |
本当の float(n)、1 <= n <= 24 | 本当の |
日付 | 日付 |
日時 datetime2 小さい | タイムゾーンなしのタイムスタンプ |
日時オフセット | タイムゾーン付きのタイムスタンプ |
時間 | 時間 |
char(n) nchar(n) | char(n) |
varchar(n) nvarchar(n) | varchar(n) |
varchar(MAX) テキスト ntext | テキスト |
バイナリ varbinary 画像 rowversion タイムスタンプ | バイテア |
xml | xml |
したがって、tds_fdwを使用したデータ移行がはるかに簡単になり、各テーブルを個別にインポートする必要がなくなりました。
ご清聴ありがとうございました!
UPDATE型マッピングテーブルが更新されました。 現在、MS SQL Serverのrowversionおよびtimestampタイプは、PostgreSQLのbyteaタイプに対応しています( commitを参照)。
参照資料
- ダウンロードtds_fdw
- 外部データラッパーのドキュメント (en)
- 外部データラッパーのドキュメント (en)
- サードパーティのデータラッパーのリスト