カピバラ好きなエンジニアブログ

ITのこととか趣味のカメラのことなどを赴くままに書いていきます。カピバラの可愛さこそ至高。

EmbulkでSQLServerからSQLServerに追加されたデータのみ出力してみた

前回はSQLServerの追加したデータのみをCSVに出力しましたが、今回はSQLServerにInsertします。
ついでに前回は追加データの判定をするカラムを主キーのみに設定していましたが、今回は主キーに設定されていない日付カラムを指定して実施していきます。

SQLServerに出力する場合は、以下のプラグインを使用します。
github.com

実施作業

プラグインインストール

最初に必要なプラグインを以下のコマンドでインストールします。

embulk gem install embulk-output-sqlserver

インストールが正常終了したら、以下のコマンドでインストールできていることを確認します。

embulk gem list

f:id:live-your-life-dd18:20200315010606p:plain

テストデータ作成

連携するテストデータを作成します。
f:id:live-your-life-dd18:20200315010917p:plain

データ連携先テーブル準備

EmbulkでSQLServerに連携する場合、テーブル名まで具体的に指定する必要があります。
そのため事前に連携先のDBとテーブルが作成されていないといけないので、事前に空のテーブルを作成しておきます。
※今回のやり方であれば、多少手間は増えますがバックアップから連携先DBをリストアするのでも問題ないと思います
f:id:live-your-life-dd18:20200315011740p:plain

Embulkの設定ファイル作成

Embulkの実行に必要な設定ファイルを作成します。
※ファイル内に設定する接続情報は、それぞれ事前に接続ができることを確認しておきます
※パスワードは検証用に簡単なものを設定しています

in:
  type: sqlserver
  driver_path: C:\drivers\sqljdbc_7.2\jpn\mssql-jdbc-7.2.2.jre8.jar
  host: EC2AMAZ-L2BKFDH
  user: dbuser
  password: "dbuser"
  database: TESTDB
  schema: dbo
  table: Employee
  incremental: true
  incremental_columns:
    - RegDate
out:
  type: sqlserver
  driver_path: C:\drivers\sqljdbc_7.2\jpn\mssql-jdbc-7.2.2.jre8.jar
  host: EC2AMAZ-JGN0VFT
  user: dbuser
  password: dbuser
  database: TESTDB
  schema: dbo
  table: Employee
  mode: insert_direct

ここで特筆するのは以下の2つです。
①incremental_columnsパラメータに日付カラムを指定
②insert modeパラメータは直接Insertする値を設定

insertするにはいくつか設定値がありますが、今回は中間テーブルを作成しない「insert_direct」を設定します。
※「insert」を設定すると実行前に中間テーブルを作成するため、処理時間や容量への影響が少なからず発生します
※その場合中間テーブルは処理の最後に削除されます
f:id:live-your-life-dd18:20200315012718p:plain

guessコマンド実行

以下のコマンドで設定ファイルを作成します。

embulk guess .\try1\sqlserver_incremental_to_sqlserver.yml -o config_inc_to_sqlserver.yml

f:id:live-your-life-dd18:20200315013529p:plain

出力されたファイルは以下です。
f:id:live-your-life-dd18:20200315013709p:plain

runコマンド実行(初回実行)

設定ファイルの作成ができたら、rumコマンドでEmbulkで実行します。

embulk run .\config_inc_to_sqlserver.yml -c embulk_sql_inc_sqlserver.diff.yaml

初回実行なので、INSERT INTOで全件が追加されているログが出力されていることが確認できます。
f:id:live-your-life-dd18:20200315014503p:plain

データ確認(初回実行)

データを転送した先のDBでSelect文を実行して、想定通りデータが取得できることを確認します。
f:id:live-your-life-dd18:20200315014904p:plain

追加データ作成

SQLで50件ほど追加でデータを作成します。
※日付は一意ではなくて、敢えて全部同じ日付を設定しています。
f:id:live-your-life-dd18:20200315015335p:plain

runコマンド実行(2回目実行)

再度runコマンドを実行し、増分データのみを取得するようにSQLが発行されていることを、出力されたメッセージから確認できます。
f:id:live-your-life-dd18:20200315015839p:plain

データ確認(初回実行)

転送先で再度Selectを実行して、データが追加されていることを確認できました。
※重複追加もされていないことも確認できました。
f:id:live-your-life-dd18:20200315020833p:plain

感想及び所感

主キー以外をカラムに設定しても問題なく実行できることがわかりました。(まぁ内部ではただSQLを実行しているだけなので、当たり前といえば当たり前ですが)

incremental_columnsカラムには複数設定ができるので、例えば主キーが複数ある場合やデータを特定カラムでソートして連携したい場合でも対応できると思います。