Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » MobiLink - 服务器管理 » 使用 MobiLink 服务器技术 » MobiLink 基于文件的下载 » 基于文件的下载示例

 

快照示例

此示例将实现基于文件的下载以便进行快照同步。它将建立基于文件的下载所要求的三个数据库,然后演示如何下载数据。所提供的示例既可以只用于阅读,也通过剪切和粘贴文本来运行该示例。

为示例创建数据库

以下命令将创建示例中使用的三个数据库:统一数据库、远程数据库和文件定义数据库。

dbinit scons.db
dbinit sremote.db
dbinit sfdef.db

以下命令将启动这三个数据库,并创建 MobiLink 连接到统一数据库时使用的数据源名。

dbeng11 -n sfdef_eng sfdef.db
dbeng11 -n scons_eng scons.db
dbeng11 -n sremote_eng sremote.db
dbdsn -y -w fbd_demo -c "eng=scons_eng;dbf=scons.db;uid=DBA;
   pwd=sql;astart=off;astop=off"

打开 Interactive SQL,连接到 scons.db,并运行 MobiLink 安装脚本。例如:

read "c:\Program Files\SQL Anywhere 11\MobiLink\setup\syncsa.sql"

启动 MobiLink 服务器:

start mlsrv11 -v+ -c "dsn=fbd_demo" -zu+ -ot scons.txt
建立快照示例统一数据库

在此示例中,统一数据库包含一个名为 T1 的表。连接到统一数据库后,您可以运行以下 SQL 来创建表 T1:

CREATE TABLE T1 (
 pk INTEGER PRIMARY KEY,
 c1 INTEGER
);

以下代码将创建一个名为 filebased 的脚本版本,并为该脚本版本创建一个下载脚本。

CALL ml_add_table_script( 'filebased',
  'T1', 'download_cursor',
  'SELECT pk, c1 FROM T1' );

以下代码将创建一个名为 normal 的脚本版本,并为该脚本版本创建上载和下载脚本。

CALL ml_add_table_script ( 'normal', 'T1',
  'upload_insert',
  'INSERT INTO T1 VALUES ({ml r.pk}, {ml r.c1})');

CALL ml_add_table_script( 'normal', 'T1', 
  'upload_update', 
  'UPDATE T1 SET c1 = {ml r.c1} WHERE pk = {ml r.pk} ' );

CALL ml_add_table_script( 'normal', 'T1', 
 'upload_delete', 
 'DELETE FROM T1 WHERE pk = {ml r.pk}' );

CALL ml_add_table_script( 'normal', 'T1',
  'download_cursor',
  'SELECT pk, c1 FROM T1' );

COMMIT;

以下命令将创建存储过程 begin_pub,并指定 begin_pub 为 "normal" 和 "filebased" 脚本版本的 begin_publication 脚本:

CREATE PROCEDURE begin_pub ( 
       INOUT generation_num integer,
       IN    username       varchar(128),
       IN    pubname        varchar(128) )
BEGIN
   SET generation_num=1;
END;

CALL ml_add_connection_script(
  'filebased',
  'begin_publication',
  '{ call begin_pub(
      {ml s.generation_number},
      {ml s.username},
      {ml s.publication_name} ) }' );

CALL ml_add_connection_script( 'normal',
  'begin_publication',
  '{ call begin_pub(
      {ml s.generation_number},
      {ml s.username},
      {ml s.publication_name} ) }' );
创建快照示例远程数据库

在此示例中,远程数据库也包含一个名为 T1 的表。连接到远程数据库并运行下列 SQL 以创建表 T1、一个名为 P1 的发布和一个名为 U1 的用户。该 SQL 语句还会为 U1 创建 P1 的预订。

CREATE TABLE T1 (
 pk INTEGER PRIMARY KEY,
 c1 INTEGER
);

CREATE PUBLICATION P1 (
    TABLE T1
);

CREATE SYNCHRONIZATION USER U1;

CREATE SYNCHRONIZATION SUBSCRIPTION
TO P1
FOR U1;

以下代码将创建 sp_hook_dbmlsync_validate_download_file 挂接,以在远程数据库中实现用户定义的校验逻辑:

CREATE PROCEDURE sp_hook_dbmlsync_validate_download_file()
BEGIN
    DECLARE udata varchar(256);
SELECT value
    INTO udata
    FROM #hook_dict
    WHERE name = 'user data';
    IF udata <> 'ok' THEN
    UPDATE #hook_dict
    SET value = 'FALSE'
    WHERE name = 'apply file';
    END IF;
END
创建快照示例文件定义数据库

在使用基于文件的下载的 MobiLink 系统中,需要文件定义数据库。此数据库与基于文件的下载所更新的远程数据库具有相同的模式,且不包含任何数据或状态信息。文件定义数据库仅用于定义即将包含在下载文件中的数据的结构。一个文件定义数据库可用于多个远程数据库组,每个组都由其自己的 MobiLink 组用户名定义。

以下代码将为此示例定义文件定义数据库。它将创建一个与远程数据库相同的模式,还将创建:

  • 一个名为 P1 的发布,以发布表 T1 的所有行。文件定义数据库和远程数据库必须使用相同的发布名称。

  • 一个名为 G1 的 MobiLink 用户。此用户代表即将在基于文件的下载中更新的所有远程数据库。

  • 一个发布的预订。

您必须先连接到 sfdef.db 然后才能运行此代码。

CREATE TABLE T1 (
 pk INTEGER PRIMARY KEY,
 c1 INTEGER
);

CREATE PUBLICATION P1 (
    TABLE T1
);

CREATE SYNCHRONIZATION USER G1;

CREATE SYNCHRONIZATION SUBSCRIPTION
TO P1
FOR G1;
为初始同步做准备

要对新的远程数据库进行准备以便应用下载文件,您需要执行常规同步或使用 dbmlsync -bg 选项创建下载文件。此示例说明如何通过执行常规同步来初始化新的远程数据库。

您可以使用先前创建的名为 normal 的脚本版本对远程数据库进行初始同步:

dbmlsync -c "uid=DBA;pwd=sql;eng=sremote_eng;
  dbf=sremote.db" -v+ -e "sv=normal"
演示快照示例基于文件的下载

连接到统一数据库,并插入一些由基于文件的下载进行同步的数据(例如以下数据):

INSERT INTO T1 VALUES( 1, 1 );
INSERT INTO T1 VALUES( 2, 4 );
INSERT INTO T1 VALUES( 3, 9 );
COMMIT;

以下命令必须在具有文件定义数据库的计算机上运行。此命令执行以下操作:

  • dbmlsync -bc 选项将创建下载文件,并将其命名为 file1.df

  • -be 选项将把字符串 "OK" 纳入将要由 sp_dbmlsync_validate_download_file 挂接访问的下载文件。

dbmlsync -c 
   "uid=DBA;pwd=sql;eng=sfdef_eng;dbf=sfdef.db"
   -v+ -e "sv=filebased" -bc file1.df -be ok -ot fdef.txt

要应用该下载文件,可在远程数据库上使用 -ba 选项运行 dbmlsync,并提供要应用的下载文件的名称:

dbmlsync -c "uid=DBA;pwd=sql;eng=sremote_eng;
   dbf=sremote.db" -v+ -ba file1.df -ot remote.txt

现在已将更改应用到远程数据库。打开 Interactive SQL,连接到远程数据库,然后运行以下 SQL 语句,检查远程数据库中是否有这些数据:

SELECT * FROM T1
清理快照示例

以下命令停止所有三个数据库服务器并消除文件。

del file1.df
mlstop -h -w
dbstop -y -c "eng=sfdef_eng; uid=DBA; pwd=sql"
dbstop -y -c "eng=scons_eng; uid=DBA; pwd=sql"
dbstop -y -c "eng=sremote_eng; uid=DBA; pwd=sql"
dberase -y sfdef.db
dberase -y scons.db
dberase -y sremote.db