このページは、以下の英語ページの抄訳です。最新の情報については、
英語ページを参照してください。
(HANA との同期は HANA SPS10 より HANA RDSync として HANA 側に Mobile Link サーバーの機能が実装されました。)
:!: このページに直接来られた方は、パート 1 のチュートリアルからスタートしてください。
ステップ 6. HANA にテーブルを1つ作る
Hello World テーブルの HANA 版は下のとおりです:
- "%SQLANY16%\bin64\dbisql" -c "DSN=breckcarterHANA; USER=DBA; PASSWORD=HappyHANA1;" -hana
- CREATE COLUMN TABLE hello_world (
- pkey BIGINT NOT NULL,
- data_1 VARCHAR ( 20 ) DEFAULT '' NOT NULL,
- data_2 VARCHAR ( 20 ) DEFAULT '' NOT NULL,
- PRIMARY KEY ( pkey ) );
HANA データベースの "レガシーデータ" を表す単一のロー INSERT は下のとおりです。例えば、Mobile Link 同期がスタートする前に存在するデータなど。
- INSERT INTO hello_world VALUES ( 1, 'HANA', 'row' );
- COMMIT;
- SELECT * FROM hello_world ORDER BY pkey;
OUTPUT:
PKEY DATA_1 DATA_2
------------------- -------------------- --------------------
1 HANA row
SQL Anywhere から HANA へのアップロードのみを呼び出す同期プランの場合は、HANA アプリケーションテーブルへのスキーマ変更は必要ありません。
:!: 例外: Mobile Link は、同期の際、ローにマッチするようプライマリキー値を使用します。そのため、HANA テーブルにプライマリキーがない場合、または、ローを挿入した後にプライマリキーを更新するようなアプリケーションの場合、この記事では説明しませんが、やらなければいけないことが出てきます。
しかしながら、双方向にデータ同期したい場合には (SQL Anywhere とHANA 間をアップロード/ダウンロード)、追加で、HANA 側にカスタムのスキーマオブジェクトが必要となります。Mobile Link は、統合データベースを実行するソフトウェアとアームズ・レングスの関係を持ちます(この場合は、HANA)。特に、Mobile Link はHANA のトランザクションログへのアクセスを持ちません。そのため、ローが挿入・更新・削除されても、どのローがSQL Anywhere にダウンロードされたかということをトラッキングするためにそれを使用することはできません。
Mobile Link に、どのローが挿入され、または更新されたかを知らせる方法の1つに、各HANA のテーブルにTIMESTAMP のカラムを追加し、カラム値を保つコードを書く方法があります。しかし、このコードを HANA データベースないのに書くのは簡単ではありません。そして、これはアプリケーション内に置くのも危険なコードです(もし忘れたら?)... 他にも... そして...余分なカラムはローが削除された場合には、助けにはなりません。...なぜならば、ローがないからです。
一般的で、効果的な方法は、同期される各 HANA テーブルに小さな「シャドウテーブル」を作成する方法です。それぞれのシャドウテーブルは、リアルテーブルの相応するローが挿入、更新、削除された時を明確にする他のカラムにプラスして、リアルテーブルと同じプライマリキーを持ちます。シャドウテーブルは2つ必要です。1つは削除されたロー用、もう1つは、挿入・更新されたロー用です。
- CREATE TABLE hello_world_deleted (
- pkey BIGINT NOT NULL,
- deleted_timestamp TIMESTAMP NOT NULL,
- PRIMARY KEY ( pkey ) );
- CREATE TABLE hello_world_upserted (
- pkey BIGINT NOT NULL,
- upserted_timestamp TIMESTAMP NOT NULL,
- PRIMARY KEY ( pkey ) );
- INSERT INTO hello_world_upserted
- SELECT hello_world.pkey,
- CURRENT_TIMESTAMP
- FROM hello_world
- LEFT OUTER JOIN hello_world_upserted
- ON hello_world.pkey = hello_world_upserted.pkey
- WHERE hello_world_upserted.pkey IS NULL;
- COMMIT;
- SELECT * FROM hello_world_upserted ORDER BY pkey;
OUTPUT:
PKEY UPSERTED_TIMESTAMP
------------------- ---------------------
1 2014-03-28 12:09:07.4
上記の INSERT 文は、HANA上で実行され、シャドウテーブルの一つに、最初の同期でダウンロードするべきすでに存在するローを追加します。LEFT OUTER JOIN と WHERE 句は、シャドウテーブルが空の場合は必要ありませんが、何らかの理由で部分的に埋まっている場合には、ギャップを埋めようと INSERT を実施させようとします。
「upsert」という単語は、「更新または挿入」を意味します。または、より具体的に言うと、「できる場合にはローを挿入し、すでに存在する場合にはローを更新します」。Mobile Link は、HANA から SQL Anywhere にダウンロードされたローの取扱いに upsert のオペレーションを使用します。これは、ダウンロードされたローが、SQL Anywhere に挿入または更新されるべきかどうかは、Mobile Link には伝える必要がないことを意味しています。これはつまり、どちらにも、1つのシャドウテーブルのみが必要だということを意味しています:hello_world_upserted.
Tip: upsert のオペレーションは、単にMobile Link に実装された1つの機能というだけではありません。これは、自身のコードの中で使用できる実際のSQL 構文です。HANA では、UPSERT 文を使用することができます。そして、SQL Anywhere では、INSERT ON EXISTING UPDATE としてコード化されています。
下は、2 つのシャドウテーブルを自動的に保つために使用する3 つのトリガーです。
- CREATE TRIGGER hello_world_insert AFTER INSERT ON hello_world
- REFERENCING NEW ROW AS inserted_row FOR EACH ROW
- BEGIN
- INSERT INTO hello_world_upserted VALUES ( :inserted_row.pkey, CURRENT_TIMESTAMP );
- DELETE FROM hello_world_deleted WHERE pkey = :inserted_row.pkey;
- END;
- CREATE TRIGGER hello_world_update AFTER UPDATE ON hello_world
- REFERENCING NEW ROW AS updated_row FOR EACH ROW
- BEGIN
- UPDATE hello_world_upserted
- SET upserted_timestamp = CURRENT_TIMESTAMP
- WHERE pkey = :updated_row.pkey;
- END;
- CREATE TRIGGER hello_world_delete BEFORE DELETE ON hello_world
- REFERENCING OLD ROW AS deleted_row FOR EACH ROW
- BEGIN
- DELETE FROM hello_world_upserted WHERE pkey = :deleted_row.pkey;
- INSERT INTO hello_world_deleted VALUES ( :deleted_row.pkey, CURRENT_TIMESTAMP );
- END;
Tip: HANA のストアドプロシージャーとトリガーをコード化する場合、これをシンプルにキープすれば、幸せな生活をおくれるでしょう。SQL Anywhere で使用するだろう全機能を期待してはいけません。例えば、INSTEAD_OF トリガーのようなものはありません。そして CASE WHEN INSERTING ... WHEN UPDATING ... WHEN DELETING をトリガーの中にコード化することができます。また、 きれいな印刷物 (= The HANA SQL ヘルプ) を読むことが重要です。「文レベルのトリガーのサポートはローストアテーブルでのみ」というような重要情報が掲載されています。カラムストアテーブルは、最初にHANA を使う大きな理由です。だから、この記事のトリガーは全て FOR EACH ROW にコード化されています。
驚くことがもう 1 つあります。「トリガーが定義されているテーブルである主題のテーブルへのアクセスは、トリガーのボディ内では許されていません。これはつまり、トリガーがあるテーブルへの挿入・更新・削除・リプレース・選択のいずれも許されていないということを意味します」。英語では、これは、hello_world 自身のトリガー内で、UPDATE hello_world をコード化することはできないことを意味します。このルール、そして HANA トリガー内の REFERENCING 変数はリードオンリーというルールが、hello_world_deleted だけでなく、hello_world_upserted シャドウテーブルが存在する理由です。さもなくば、upserted_timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP カラムが、hello_world table に追加されてしまいます。そして、BEFORE UPDATE トリガーが、値を保つために使用されてしまいます。
ステップ 7. Mobile Link オブジェクトを HANA にセットアップする。
Mobile Link サーバーでは、「システムオブジェクト」の全 sackload をHANA データベースに作成する必要があります。テーブル、ビュー、シーケンス、プロシージャー、「ml_なんとか」と名づけられたもの全て、は全てSQL Anywhere 16 で提供される単一のSQL スクリプトで提供されます。
C:\Program Files\SQL Anywhere 16\MobiLink\Setup\synchana.sql
- create table ml_ldap_server (
- ldsrv_id integer not null,
- ldsrv_name varchar( 128 ) not null unique,
- search_url varchar( 1024 ) not null,
- ... and so on
下は、HANA データベースに対して synchana.sql を実行する(ISQL GUI を起動するものとは対照的に) バッチ ISQL コマンドです。
- "%SQLANY16%\bin64\dbisql"^
- -c "DSN=breckcarterHANA; USER=DBA; PASSWORD=HappyHANA1;"^
- -hana^
- READ ENCODING Cp1252 "C:\Program Files\SQL Anywhere 16\MobiLink\Setup\synchana.sql"
下のような問題に直面した場合には、SQL Anywhere 16 ビルドNo.1761 以降のものをダウンロードして、synchana.sql ファイルの修正版を入手する必要があります:
Alas (悲しいかな)、 synchana.sql は 2 回実行する設計になっていません:
synchana.sql を再度実行する最も簡単な方法は、最初に全てをドロップしてからスタートする方法です。そして、それを最も簡単に実行する方法は、 DROP USER DBA CASCADE です。以下を参照してください:
ISQL GUI を SYSTEM ユーザー ID でスタートします。
- "%SQLANY16%\bin64\dbisql" -c "DSN=breckcarterHANA; USER=SYSTEM; PASSWORD=manager;" -hana
- DROP USER DBA CASCADE;
- CREATE USER DBA PASSWORD SqlHappy1;
- GRANT CREATE ANY ON SCHEMA SYSTEM TO DBA WITH GRANT OPTION;
- GRANT ALTER ON SCHEMA SYSTEM TO DBA WITH GRANT OPTION;
- GRANT DROP ON SCHEMA SYSTEM TO DBA WITH GRANT OPTION;
- GRANT EXECUTE ON SCHEMA SYSTEM TO DBA WITH GRANT OPTION;
- GRANT SELECT ON SCHEMA SYSTEM TO DBA WITH GRANT OPTION;
- GRANT INSERT ON SCHEMA SYSTEM TO DBA WITH GRANT OPTION;
- GRANT UPDATE ON SCHEMA SYSTEM TO DBA WITH GRANT OPTION;
- GRANT DELETE ON SCHEMA SYSTEM TO DBA WITH GRANT OPTION;
- GRANT INDEX ON SCHEMA SYSTEM TO DBA WITH GRANT OPTION;
- GRANT CATALOG READ TO DBA WITH ADMIN OPTION;
ISQL GUI を DBA ユーザー ID でスタートします。
- "%SQLANY16%\bin64\dbisql" -c "DSN=breckcarterHANA; USER=DBA; PASSWORD=SqlHappy1;" -hana
- ALTER USER DBA PASSWORD HappyHANA1;
synchana.sql を再度実行します。
- "%SQLANY16%\bin64\dbisql"^
- -c "DSN=breckcarterHANA; USER=DBA; PASSWORD=HappyHANA1;"^
- -hana^
- READ ENCODING Cp1252 "C:\Program Files\SQL Anywhere 16\MobiLink\Setup\synchana.sq
synchana.sql がうまくいけば、下のようになります:
これで、Mobile Link システムオブジェクトを HANA へロードします。次に hello_world テーブルのためにユーザーが書いた Mobile Link スクリプトが来ます。
:!: 注意: もし、Sybase Central のMobile Link プロジェクトや、関連同期ウィザードに慣れていると、HANA がまだサポートされていないことを知ってがっかりされるかもしれません。
ランタイムの Mobile Link クライアントとサーバー自体は、HANA と機能します。ただ、GUI の開発ツールがまだキャッチアップできていないだけです。このことから、この記事ではオールドスクール的な方法で、Mobile Link のスクリプトを手書きでやっています。これは、それほど難しいものではなく、ただ、長々としたものです。しかし、Hello World のようなシンプルなものであれば、長々としたものにはなりません。
Tip: これは、HANA データベースにみえるダミーのSQL Anywhere データベースを作成し、これをMobile Link 同期ウィザードにスクリプトを生成するよう促しています。驚くことではありませんが、悲しいことに、これでは、うまくいきません... もしうまく機能するのであれば、ウィザードでHANA をすでにサポートしています。 :smile:
以下の「CALL ml_add_table_script」 構文のペアは、Mobile Link のイベントハンドリング SQLスクリプトを含む、文字列の削除と挿入のオペレーションを行います。Mobile Link サーバーは、後ほど、同期の最中にこれらのスクリプトを読み、実行します:
- upload_insert スクリプトは、SQL Anywhere からアップロードされた新しいそれぞれのローのためにHANA で実行されます。
- upload_update スクリプトは、アップロードされた、それぞれの既存のローに実行されます。
- upload_delete スクリプトは、HANA から削除されるローのハンドリングに使用されます。
- download_cursor スクリプトは、SQL Anywhere に送られるべき新しく、更新されたローを含むダウンロードストリームのその部分を構築するのに使用されます。(INNER JOIN や WHERE 句におけるシャドウテーブルシャドウテーブルの使用に気をつけてください。)
- download_delete_cursor は、削除する必要のある全ローのプライマリキーを含むダウンロードストリームのその部分で構築するために使用されます。(リアルテーブルでは、ローは存在しないため、シャドウテーブルは、このSELECT で使用されることに注意してください。)
繰り返しますが: 以下の「CALL ml_add_table_script」文は、今、HANAで、HANA データベース内にSQL スクリプトを格納するために、実行してください。 後で、同期の最中に、これらのスクリプトはMobile Link サーバーによって読まれ、HANA データベースで実行されます。
- "%SQLANY16%\bin64\dbisql" -c "DSN=breckcarterHANA; USER=DBA; PASSWORD=HappyHANA1;"
- CALL ml_add_table_script ( 'v1', 'hello_world', 'upload_insert', '' );
- CALL ml_add_table_script ( 'v1', 'hello_world', 'upload_insert', '
- INSERT INTO hello_world
- ( pkey,
- data_1,
- data_2 )
- VALUES ( {ml r.pkey},
- {ml r.data_1},
- {ml r.data_2} )' );
- CALL ml_add_table_script ( 'v1', 'hello_world', 'upload_update', '' );
- CALL ml_add_table_script ( 'v1', 'hello_world', 'upload_update', '
- UPDATE hello_world
- SET data_1 = {ml r.data_1},
- data_2 = {ml r.data_2}
- WHERE pkey = {ml r.pkey}' );
- CALL ml_add_table_script ( 'v1', 'hello_world', 'upload_delete', '' );
- CALL ml_add_table_script ( 'v1', 'hello_world', 'upload_delete', '
- DELETE FROM hello_world
- WHERE pkey = {ml r.pkey}' );
- CALL ml_add_table_script ( 'v1', 'hello_world', 'download_cursor', '' );
- CALL ml_add_table_script ( 'v1', 'hello_world', 'download_cursor', '
- SELECT hello_world.pkey,
- hello_world.data_1,
- hello_world.data_2
- FROM hello_world
- INNER JOIN hello_world_upserted
- ON hello_world_upserted.pkey
- = hello_world.pkey
- WHERE hello_world_upserted.upserted_timestamp
- >= {ml s.last_table_download}' );
- CALL ml_add_table_script ( 'v1', 'hello_world', 'download_delete_cursor', '' );
- CALL ml_add_table_script ( 'v1', 'hello_world', 'download_delete_cursor', '
- SELECT pkey
- FROM hello_world_deleted
- WHERE hello_world_deleted.deleted_timestamp
- >= {ml s.last_table_download}' );
- COMMIT;
Tip: HANA の CALL ml_add_table_script 文で、NULL を 4 番目の引数としてパスしないでください。かわりに空のストリングをパスしてください。
Tip: HANA では、マルチラインの /* comments */ をコード化しないでください。
Tip: COMMIT を忘れないようにしてください。これは HANA だけのことではなく、皆さんがどの DBMS でも Mobile Link を使用する際に間違われやすいことです: 「この変更をしたのに、どうしてまだ同じことになっているのでしょうか?」 確かに、「Commit after every statement」を ISQL - Tools - Options... - SAP HANA - Execution タブでチェックして、自動コミットをオンにしたかもしれません。または、「Commit on exit or disconnect」がデフォルトでチェックされているという事実を信用しているかもしれません。しかし、最初のものはISQL で間違った更新を実行した後は、ROLLBACK はできないことを意味し、次のものを使用するというのは、... 単に... 怖いことです。実際、「Commit on exit or disconnect」のチェックを外すことは、良い考えだとは思います。自分の運命をどの程度自分でコントロールしたいかによります。
:!: PS: マニュアルでは、「HANA がチェーンモードで動く」とははっきりとは言っていませんが、実際はそうです。
:!: 注意: これらのスクリプトを実行するために USER=DBA を選ぶと、HANA データベース内の全 Mobile Link システムオブジェクトを「誰が所有するか」を決定することになります。そして、これは、(前の Tip で説明したように) HANA への接続に Mobile Link サーバーが UID=DBA を使用することも決定することになります。
ステップ 8. SQL Anywhere データベースを作成する
以下は、「remo」と呼ばれる新しい SQL Anywhere 16 データベースをローカルコンピューターに作成するコマンドです。
- "%SQLANY16%\bin64\dbinit.exe" "C:\data\remo\remo.db"
- PAUSE
データベースをスタートするコマンドは下のとおりです。これは、dbeng16 データベースエンジンの起動に dbspawn ユーティリティーを使用します。そして、-o オプションで SQL Anywhere に対して、「console log」診断メッセージをどこに格納するのかを伝えます。
- "%SQLANY16%\bin64\dbspawn.exe"^
- -f "%SQLANY16%\bin64\dbeng16.exe"^
- -o "C:\data\remo\dbeng16_log_remo.txt"^
- "C:\data\remo\remo.db"
- PAUSE
システムトレイのオレンジの稲妻のアイコンをクリックすると、リアルタイムで診断メッセージが表示されます。
ステップ 9. ISQL 経由で SQL Anywhere データベースに接続する
SQL Anywhere データベースでISQLのセッションをスタートする方法は下のとおりです。
- "%SQLANY16%\bin64\dbisql" -c "SERVER=remo; DBN=remo; UID=DBA; PWD=sql;"
ステップ 10. SQL Anywhere にマッチングテーブルを作成する
下は、Hello World テーブルのSQL Anywhere 版です。
- CREATE TABLE hello_world (
- pkey BIGINT NOT NULL DEFAULT GLOBAL AUTOINCREMENT ( 1000000000 ),
- data_1 VARCHAR ( 10 ) DEFAULT '' NOT NULL,
- data_2 VARCHAR ( 10 ) DEFAULT '' NOT NULL,
- PRIMARY KEY ( pkey ) );
DEFAULT GLOBAL AUTOINCREMENT 句で、ローを挿入する際に SQL Anywhere に分割された値を生成するように伝えます。その時、バーチャルに、異なるデータベースに挿入されたローが HANA にアップロードされる際にプライマリキーが衝突する可能性を取り除く処理をします。
シャドーテーブルまたは関連するトリガーで SQL Anywhere サイドに含まれるものはありません。なぜならば、これらは、ローが HANA で変更された場合の記録が目的だからです。
ステップ 11. SQL Anywhere に Mobile Link オブジェクトを設定する
- SET OPTION PUBLIC.GLOBAL_DATABASE_ID = '1';
- CREATE USER REMOTE_DBA IDENTIFIED BY SQL;
- GRANT ROLE SYS_RUN_REPLICATION_ROLE TO REMOTE_DBA
- WITH NO SYSTEM PRIVILEGE INHERITANCE;
- CREATE PUBLICATION p1 (
- TABLE hello_world (
- pkey,
- data_1,
- data_2 ) );
- CREATE SYNCHRONIZATION USER "1" TYPE tcpip;
- CREATE SYNCHRONIZATION SUBSCRIPTION TO p1 FOR "1";
これに関する詳細、そして SQL 文については、マニュアルの以下のページをご参照ください。
http://dcx.sap.com/index.html#sa160/ja/dbreference/sql-statements-a-d.html
同期が「始まる」と (CREATE SYNCHRONIZATION SUBSCRIPTION 文が実行されます。SQL Anywhere は、次の同期のために記録の変更を開始します。以下は、このような変更、次の(最初の)同期でHANA に送信される hello_world における新しいローの1つです。
- INSERT INTO hello_world ( data_1 ) VALUES ( 'How are' );
- COMMIT;
- SELECT * FROM hello_world ORDER BY pkey;
OUTPUT:
pkey data_1 data_2
-------------------- ---------- ----------
1000000001 How are
この pkey 値 1000000001 のストーリーは以下のとおりです。
- 最初に、CREATE TABLE ... DEFAULT GLOBAL AUTOINCREMENT 分割サイズ1000000000 は、その値の1 から 1,000,000,000 までは「partition number zero」のために、とっておくように伝えました。
- 2番目に、GLOBAL_DATABASE_ID = '1' オプション設定が、このデータベースは1,000,000,001 から 2,000,000,000 を実行する「partition number one」を持っていると伝えました。
- 他の SQL Anywhere データベースが、異なる(そしてグローバルでユニークな) GLOBAL_DATABASE_ID 値、例えば、2,000,000,001 から 3,000,000,000 のための pkey 値「2」などがアサインされる必要があります。
- それ以上のデータベースにも、たくさんの余地があります。なぜならば、BIGINT データタイプは、科学用語でも「たくさん」と言われる 9,223,372,036,854,775,807 までデータを持つことができるからです。 :smile:
- 各々全ての SQL Anywhere データベースも、このデータベースが、GLOBAL_DATABASE_ID にマッチするように選択された「1」のような、グローバルでユニークな CREATE SYNCHRONIZATION USER 値を持つ必要があります。
これは、SQL Anywhere と Mobile Link が管理者にとってどれだけ簡単かどうかということは関係ありません。データベースが1000というのは、重要で、管理者は、データベースIDや同期ユーザー1, 2, 3, をマッチングさせるような得られるだけの支援を必要とします。
- HANA には、GLOBAL AUTOINCREMENT はありませんが、これは問題ありません。HANA に挿入されるローは、CREATE SEQUENCE START WITH 1 を使用して「partition number zero」 プライマリキー値 1、2、3、を効果的に入手することができます。
- GLOBAL AUTOINCREMENT を使用する必要がある時にいつもこれをルックアップしなければならない場合でも、問題はありません。あなたは一人ではありません。 :smile:
ステップ 12. Mobile Link サーバーをローカルコンピューターでスタートする
下は、ローカルコンピューター上の Mobile Link サーバーをスタートさせる6 つのラインのコマンドファイルです。他の 30 のREM コメントは、興味深いmlsrv16 オプションの「虎の巻」です。
- REM -c ... for ODBC connection to consolidated database
- REM -dl puts diagnostic messages on screen
- REM -e specifies where to put uploaded log text data from remote dbmlsync runs
- REM -o ... where to put MobiLink console log text data
- REM -os ... renames and starts new MobiLink server log text data file
- REM -ppv 60 print (log) periodic monitor values every 60 seconds
- REM -vcefhikmnopqrRstuU all options (some redundancy)
- REM -vcefhkmnopstuU logs everything except data and remote ID
- REM -v+ Turn on all logging options that increase verbosity.
- REM -vc Show scripts.
- REM -ve Show system event scripts.
- REM -vf Show first-read errors.
- REM -vh Show the remote schema.
- REM -vi Show uploaded column values.
- REM -vk Show cache growth and shrinkage.
- REM -vm Show the duration of each synch phase.
- REM -vn Show row-count summaries.
- REM -vo Show SQL passthrough activity.
- REM -vp Show progress offsets.
- REM -vq Show downloaded column values.
- REM -vr Show uploaded and downloaded column values.
- REM -vR Show remote ID in each message.
- REM -vs Show script names.
- REM -vt Show the translated SQL scripts.
- REM -vu Show undefined table scripts.
- REM -vU Show user name in each message.
- REM -x tcpip(port=2439) port for clients (default shown)
- REM -zp ignore some apparent timestamp differences.
- REM -zu+ bypasses authentication
- REM -zwd suppress specific warning messages
- "%SQLANY16%\bin64\mlsrv16.exe"^
- -c "DSN=breckcarterHANA; UID=DBA; PWD=HappyHANA1;"^
- -o "C:\data\remo\mlsrv16_log_cons.txt"^
- -os 10M^
- -vcefhkmnopstuU^
- -zu+
- -c オプションは、mlsrv16.exe に、ODBC 経由でどうHANAに接続するのか伝えます。
:!: 注意: Mobile Link サーバーを HANA に接続するための文字列 -c string は、USER=DBA; PASSWORD=HappyHANA1 よりも、オールドスクール パラメーターである UID=DBA; PWD=HappyHANA1 を使用します。
- -o mlsrv16_log_cons.txt オプションは、mlsrv16.exe がどこに診断情報を書き込むのかを特定します。
- -os 10M オプションで、mlsrv16.exe に、これのサイズが10M に到達し、新しいファイルをスタートする場合に、mlsrv16_log_cons.txt の名前を変更するように伝えます。
Tip: 本番用の全ての Mobile Link のセットアップで、その Mobile Link サーバーのために -o とand -os のどちらも特定する必要があります。Mobile Link サーバーから出される診断のアウトプットが、同期の問題が発生した場合にみる最初のものになります。どのソフトウェアを使用していても関係ありません。データを何百、何千のデータベースに配布している場合、いずれ問題になります。
- -vcefhkmnopstuU オプションは、-v+ よりもより冗長です。そして、多くの診断情報を得ることは、とても重要なことです。そして、「多くの」とは、決して誇張ではありません。それゆえに、 -os 10Mなのです。にもかかわらず、この情報は、本番環境であっても、....重要です....。議論の余地はあるとしても間違いなく、....同期の問題を診断する場合には、これは本番環境でより重要になります。Mobile Link は、中央管理するよう設計されています。そして、これは、-o ファイルが役立つように、多くの注意が払われていることを意味します。... だからこれを使用しましょう!
- -zu+ オプションは、セキュリティ環境によっては、使用しないショートカットかもしれません。これは、Mobile Link サーバーに対して、Mobile Link クライアントが同期のために接続する場合に、わざわざ認証で悩む必要がないことを伝えます。
Mobile Link サーバーが HANA に接続できない場合に、何が起こるのかというのが下です。CloudShare 環境で、タイムアウトになるのに似ています。
ハッピーにも、HANA に接続した場合に、MobiLink サーバーがどうなるかが下です。そして、そこにいて、同期リクエストを待つだけの状態です。
ステップ 13. ローカルコンピューターから Mobile Link 同期を実行する
以下は、同期を実行するために、MobiLink クライアントの dbmlsync をローカルのコンピューターでスタートするための Windows コマンドファイルです。
- REM -ap ... parameter string sent to authenticate_parameters script
- REM -c ... remote database connection string
- REM -d drop other connections which have conflicting locks
- REM -dl puts diagnostic messages on console
- REM -e adr= MobiLink server address
- REM -e lt= LockTables, default ON
- REM -e sa= SendDownloadACK, default OFF
- REM -e st= SendTriggers, default OFF
- REM -e sv= ScriptVersion, default default
- REM -e uo= upload only, default OFF
- REM -k close window when done
- REM -n publication name
- REM -o ... where to put dbmlsync console messages
- REM -os ... renames and starts new MobiLink client log text data file
- REM -vcpnorsu logs everything
- REM -vnosu logs everything except data, -c string and password
- REM -x rename the transaction log to yymmddxx.LOG and restart it
- REM Options specified via -e take precedence over options in the database.
- "%SQLANY16%\bin64\dbmlsync.exe"^
- -c "SERVER=remo; DBN=remo; UID=REMOTE_DBA; PWD=SQL;"^
- -e "adr='host=localhost';sv=v1"^
- -o "C:\data\remo\dbmlsync_log_remo.txt"^
- -os 10M^
- -vnosu^
- -x
- -c オプションで、limited-privilege user id とともに password-in-the-clear を使用して SQL Anywhere にどのようにして接続するのかをdbmlsync.exe に対して伝えます。
- -e オプションで、「拡張オプション」の二重(三重?) にネストされセミコロンで制限された文字列を提供します。
- outer adr='...' と inner host=localhost オプションで、options telling dbmlsync.exe に Mobile Link サーバーをどこで見つけるかを伝え、
- 続く outer sv=v1 オプションで、Mobile Link スクリプトが、以前に設定されている場合に使用されたスクリプトバージョン v1 を特定します。
- -o dbmlsync_log_remo.txt オプションで、dbmlsync.exe はどこに診断情報を書き込むべきなのかを特定します。
- -os 10M オプションは、サイズが 10M に到達した場合には、dbmlsync.exe に、dbmlsync_log_remo.txt の名前を変更し、新しいファイルをスタートするように伝えます。
- -vnosu オプションは、診断情報の冗長レベルを設定します。通常、問題を診断しようとする場合に最初にみるのはクライアントサイドではありませんが、助けになることが時々あります。
- -x オプションは、dbmlsync.exe に SQL Anywhere のトランザクションログファイルの成長を同期毎にこれの名前を変更し、再スタートすることでコントロールするように伝えます。この記事では、お見せしませんが、-x を使用した時に起こる小さな、小さなログファイルの激増をコントロールするために、delete_old_logs データベースオプションも使用することができます。
下は、同期が失敗した時にどうなるかを示しています。例えば、Mobile Link サーバーが動いていないような時です。
下は、Mobile Link クライアントの観点から、同期が成功した時のものです。
ステップ 14. HANA と SQL Anywhere の同期結果を表示する
最初の同期が、仮定したとおりに実行されたことを証明するのが以下です。
- pkey = 1 ローが、HANA からダウンロードされ、SQL Anywhere で挿入されました。そして
- pkey = 1000000001 ローが、SQL Anywhere からアップロードされ、HANA で挿入されました。
- SELECT * FROM hello_world ORDER BY pkey;
-- On HANA...
PKEY DATA_1 DATA_2
------------------- -------------------- --------------------
1 HANA row
1000000001 How are
-- On SQL Anywhere...
pkey data_1 data_2
-------------------- ---------- ----------
1 HANA row
1000000001 How are
全て完了です! (しかし、少し待ってください!)
Hello World データベースのコンテクストでは、もう2回の同期ともう2つのローが「システムテスティング」として適しています。... なので、
- 各データベースに、ローを1つアップデートし、dbmlsync.exe を再度実行して、HANA と SQL Anywhere をもう一度合意させます。それから、
- 各データベースに新しいローを挿入して、再度 dbmlsync.exe を実行します...
-- Before synch #2, on HANA...
UPDATE hello_world SET data_2 = 'There!' WHERE pkey = 1;
COMMIT;
SELECT * FROM hello_world ORDER BY pkey;
PKEY DATA_1 DATA_2
---------- -------------------- --------------------
1 HANA There!
1000000001 How are
-- Before synch #2, on SQL Anywhere...
UPDATE hello_world SET data_2 = 'you?' WHERE pkey = 1000000001;
COMMIT;
SELECT * FROM hello_world ORDER BY pkey;
pkey data_1 data_2
---------- ---------- ----------
1 HANA row
1000000001 How are you?
---------------------------------------------------------------------
-- Run synch #2.
---------------------------------------------------------------------
-- After synch #2, on HANA...
PKEY DATA_1 DATA_2
---------- -------------------- --------------------
1 HANA There!
1000000001 How are you?
-- After synch #2, on SQL Anywhere...
pkey data_1 data_2
---------- ---------- ----------
1 HANA There!
1000000001 How are you?
---------------------------------------------------------------------
-- Before synch #3, on HANA...
INSERT INTO hello_world ( pkey, data_1, data_2 ) VALUES ( 2, 'second', 'row' );
COMMIT;
PKEY DATA_1 DATA_2
---------- -------------------- --------------------
1 HANA There!
2 second row
1000000001 How are you?
-- Before synch #3, on SQL Anywhere...
INSERT INTO hello_world ( data_1, data_2 ) VALUES ( 'one', 'more row' );
COMMIT;
pkey data_1 data_2
---------- ---------- ----------
1 HANA There!
1000000001 How are you?
1000000002 one more row
---------------------------------------------------------------------
-- Run synch #3.
---------------------------------------------------------------------
-- After synch #3, on HANA...
PKEY DATA_1 DATA_2
---------- -------------------- --------------------
1 HANA There!
2 second row
1000000001 How are you?
1000000002 one more row
-- After synch #3, on SQL Anywhere...
pkey data_1 data_2
---------- ---------- ----------
1 HANA There!
2 second row
1000000001 How are you?
1000000002 one more row
:!: 間違いに気づいたでしょうか? いいえ、Mobile Link ではありません。同期に関しては全てうまくいきました。間違いは、data_1 と data_2 に対して文字列の最大の長さが異なって宣言されたということです。HANA の VARCHAR ( 20 ) vs VARCHAR ( 10 ) です。Mobile Link の長所の1つは、マイナーなスキーマの違いは、不満を述べることなく処理できることです (カスタムのコードを書いて、1つのデータベース上の正規化した(複数の)テーブル v.s. もう一方上の正規化していないもの、などの巨大な違いを扱うこともできます)。しかしながら、アプリケーションの設計上の観点では、このような間違いは、大惨事に陥ることになることがよくあります。そのため、統合とリモートのデータベースのスキーマを注意深く比較し、違いが受け入れられるものかどうか確認することが重要です。
まとめ
これで終了です。この記事では非常に多くのステップと多くの Tips を説明しましたが、SQL Anywhere と HANA を同期させるためのMobile Link の設定は
簡単です。
「さらに調べなければいけない」という可能性のある例外を除けば、もう何も残っていません。特に、この記事では、シンプルなものさえスキップしていません。つまり、実際の作業よりも、読む方が時間がかかるということです。
実際、全てのステップを最初に実施した後の、2回目、3回目は、数分しかかかりません。お約束したとおり、時間泥棒はありません。クラッシュもありません。多くの新しいツールチェーンでは、これは非常に驚くべきこと、注目に値することだと思います。
===
SAP SQL Anywhere に関する詳細情報は、<英語> を参照してください。
上記のコミュニティーに掲載されている技術情報は、順次
SQL Anywhere 日本語コミュニティに掲載しています。
SQL Anywhere の日本語記事をリスト形式で表示するには、「sql anywhere japan」のタグをクリックしてください。
SQL Anywhere に関してはまずは
こちらをご参照ください。無期限でご利用いただける無償の Developers Edition もこちらからダウンロードが可能です。
SQL Anywhere に関して技術的な質問のある方はコミュニティに登録し、
「+ Actions」から「Ask a Question」機能をご利用ください。
Language には「Japanese」、
Primary Tag には「SQL Anywhere」、
Additional tag には「SAP SQL Anywhere」、
User Tagに「sql anywhere japanese question」
を選択してください。
不具合につきましては、サポート契約者様専用の問い合わせ方法にてお問い合わせください。
======================
ご購入に関するお問い合わせ
こちらよりお問い合わせください。