Réplication de Sybase ASE vers MS SQL Server avec Sybase Direct Connect 12.6


1- Introduction

Cet article décrit la mise en œuvre d'une réplication d'un serveur Sybase Adaptive Server Enterprise vers MS SQL Server avec Enterprise DirectConnect for Microsoft SQL Server (produit Sybase).

Il s'agit d'une interface effectuant en particulier toutes les tâches de communication et de conversion vers le moteur distant.

L'installation se fait depuis l'installer Sybase en choisissant l'installation personnalisée Direct Connect.

Le répertoire d'installation est indépendant des distributions Sybase déjà présentes : dans le contexte de cet article EDCA for MS SQL Server 12.6 est installé dans le répertoire /Software/sybase/ecda-12.6.

2- EDCA (Enterprise Direct Connect Access) - Notions

L'open Client ECDA est un open client composé de 3 éléments : le serveur, les « service libraries » et les « access services » que l'on peut décrire comme suit :

3- Configuration

3-1- Création d'un serveur DirectConnect DC

La création d'un serveur Direct Connect s'effectue avec l'aide du binaire AddServer situé dans le répertoire /Software/sybase/ecda-12.6/DC-12_6/bin. Il prend 2 paramètres, le nom du serveur et le port à utiliser.

Pour la bonne exécution des commandes suivantes, il est nécessaire de définir l'environnement de travail :

#> cd /Software/sybase/ecda-12.6/DC-12_6
#> . DC_SYBASE.sh

AddServer créé une arborescence du nom du serveur passé en paramètre contenant les fichiers de configuration générique, et ajoute une entrée dans le fichier interfaces correspondant.

Exemple

#> cd /Software/sybase/ecda-12.6/DC-12_6
#> bin/AddServer DCMSERVER 1234
...
#> sybase@GAIA>find DCMSERVER
DCMSERVER
DCMSERVER/cfg
DCMSERVER/cfg/snrf.tbl
DCMSERVER/cfg/admin.cfg
DCMSERVER/cfg/server.cfg
DCMSERVER/cfg/dcany.cfg
DCMSERVER/log
DCMSERVER/log/DCMSERVER.log
DCMSERVER/log/DCMSERVER.trc
DCMSERVER/log/srv.log


#> tail -10 $SYBASE/interface
##-----------------------------------------------
## Server - DCMSERVER
## [Server added by AddServer utility]
## [Mon May 15 15:45:15 MEST 2006]
##-----------------------------------------------
DCMSERVER
     master   tcp ether GAIA 1234
     query    tcp ether GAIA 1234

3-2- Arrêt - relance du serveur

Pour démarrer le serveur :

#>. /Software/sybase/ecda-12.6/DC-12_6/ DC_SYBASE.sh
nohup $SYBASE/$SYBASE_ECON/bin/DCStart -SDCMSERVER &

Pour stopper le serveur :

#>. /Software/sybase/ecda-12.6/DC-12_6/ DC_SYBASE.sh
$SYBASE/$SYBASE_ECON/bin/stopsrvr -SDCMSERVER -Usa -P

Une normalisation est en cours de mise en place.

3-3- Configuration d'une source de données

La description d'une base de données MS SQL Server s'effectue par l'intermédiaire du fichier odbc.ini situé dans le répertoire $SYBASE/$SYBASE_ECON. Ce fichier odbc.ini est également référencé par la variable $ODBCINI déclarée dans le shell DC_SYBASE.sh

Déclarer une base de données distante MSSQL consiste à y indiquer l'IP de la machine, le port utilisé et quelques paramètres, de la manière suivante, le tout encapsulé dans une section nommée :

[ODBC_for_TARGETDATABASE]
Driver=/Software/sybase/ecda-12.6/DC-12_6/lib/MVmsss20.so
QuotedId=Yes
Database=database_name
Address=10.128.208.108,1433
;;
;; Optional Failover options
;;
LoadBalancing=0
AlternateServers=
ConnectionRetryCount=0
ConnectionRetryDelay=3

L'option QuoteId à Yes est indispensable dans le cadre d'un usage proxy depuis un ASE ou par Replication Server.

3-4- Configuration d'un service

La déclaration d'un service est réalisée dans le fichier dcany.cfg, fichier qui se situe dans le répertoire cfg du Serveur Direct Connect créé à l'étape précédente : /Software/sybase/ecda-12.6/DC-12_6/DCMSERVER/cfg/dcany.cfg.

Le fichier dcany.cfg a le format générique ci-dessous :

[Service library]
[Service Name]
{Sub-section}
{ACS Required}
ConnectionSpec1=odbcentry

Exemple :

[Service Library]
{Logging}
LogSvcLibStatistics=0
{Client Interaction}
SvclibDescription=Access Service Library for ODBC.
[db_distante]
{Catalog Stored Procedures}
CSPColumnODBCVersion=2
{Target Interaction}
ReturnNativeError=yes
SQLTransformation=sybase
{Client Interaction}
TransactionMode=long
EnableAtStartup=yes
{ACS Required}
ConnectionSpec1=ODBC_for_TARGETDATABASE

4- Mise en œuvre : table proxy

Dans le plan d'action qui suit, on se propose d'attaquer une table dans un serveur MSSQL Server depuis un serveur Adaptive Server Enterprise, il s'agit dans ce contexte de la mise en œuvre d'une table proxy SQL Server depuis un serveur ASE.

Pour cela 5 étapes:

4-1- Création de la connexion ODBC

Pour créer la connexion ODBC, le fichier odbc.ini de Sybase Direct Connect ($ODBCINI) est mis à jour en spécifiant obligatoirement le driver pour MSSQL (MVmsss20.so), la base de données (Database) et l'adresse (IP, Port) dans une nouvelle section ODBC :

#> vi $ODBCINI
[TARGETDATABASE]
Driver=/Software/sybase/ecda-12.6/DC-12_6/lib/MVmsss20.so
QuotedId=Yes
Database=database_name
Address=10.128.208.108,1433
;;
;; Optional Failover options
;;
LoadBalancing=0
AlternateServers=
ConnectionRetryCount=0
ConnectionRetryDelay=3

4-2- Paramétrage du service

Le service décrivant l'accès à la base de données MSSQL Server au travers du Serveur DirectConnect DCMSERVER doit être déclaré dans le fichier dcany.cfg du DirectConnect. Cette opération nécessite le redémarrage du serveur DirectConnect DCMSERVER.

Dans l'exemple ci-dessous, le service en question est appelé SERVICE_1 .

La valeur de ConnectionSpec1 doit correspondre exactement à l'entrée du fichier odbc.ini.

Tous les paramètres listés en gras dans cet exemple sont indispensables. :

#> vi $SYBASE/$SYBASE_ECON/DCMSERVER/cfg/dcany.cfg
[Service Library]
{Logging}
LogSvcLibStatistics=0
{Client Interaction}
SvclibDescription=Access Service Library for ODBC.
[SERVICE_1]
{Catalog Stored Procedures}
CSPColumnODBCVersion=2
{Target Interaction}
Allocate=connect
ReturnNativeError=yes
SQLTransformation=sybase
{Client Interaction}
quoted_identifier=on
TransactionMode=long
EnableAtStartup=yes
{ACS Required}
ConnectionSpec1=TARGETDATABASE

4-3- Ajout du service dans le fichier interfaces

Cette étape est la clé du lien entre le serveur Direct Connect DCMServer et la base distante décrite par le service. Le nom du service doit être référencé dans le fichier interfaces et doit correspondre exactement au nom du service déclaré dans le fichier dcany.cfg décrivant la base cible.

La machine et le port indiqué pour le service sont les mêmes que pour la déclaration du serveur DCMSERVER

#> vi $SYBASE/interfaces
SERVICE_1
   master tli tcp GAIA 1234
   query tcp ether GAIA 1234

4-4- Configurer l'ASE

Afin que le serveur Sybase ASE puisse accéder à la base de données MSSQL Server décrite par le service SERVICE_1, 3 étapes nécessaires :

#> isql -S ASE
exec sp_configure 'remote  access',1
exec sp_addserver SERVICE_1, direct_connect
exec sp_addexternlogin SERVICE_1, local_login, remote_login,remote_passwd

A ce stade, on est capable de vérifier le bon fonctionnement de la connexion au service SERVICE_1 avec la commande connect to :

#> isql -S ASE
connect to SERVICE_1

4-5- Créer une table proxy

On considère que la table distante TABLE est créée dans le serveur MSSQL et accessible par l'utilisateur défini précédemment avec la commande sp_addexternlogin, les tables proxy peuvent alors être créées avec la commande sp_addobjectdef et testées en sélection :

#> isql -S ASE
exec sp_addobjectdef TABLE, 'SERVICE_1.dabatase.dbo.TABLE', 'table'
go
create existing table TABLE (
   a  int not null,
   b  varchar(50) null
)
lock allpages
on 'default'
go

5- Mise en œuvre : réplication

Dans le plan d'action qui suit, on se propose de mettre en œuvre une réplication d'un serveur Sybase ASE vers un serveur MSSQL à travers DirectConnect. Les étapes préparatoires sont strictement identiques au scénario des tables proxy sauf pour la description du service.

5-1- Créer une connexion ODBC

Pour créer la connexion ODBC, le fichier odbc.ini de Sybase Direct Connect ($ODBCINI) est mis à jour en spécifiant obligatoirement le driver pour MSSQL (MVmsss20.so), la base de données (Database) et l'adresse (IP, Port) dans une nouvelle section ODBC :

#> vi $ODBCINI
[TARGETDATABASE]
Driver=/Software/sybase/ecda-12.6/DC-12_6/lib/MVmsss20.so
QuotedId=Yes
Database=database_name
Address=10.128.208.108,1433
;;
;; Optional Failover options
;;
LoadBalancing=0
AlternateServers=
ConnectionRetryCount=0
ConnectionRetryDelay=3

5-2- Paramétrage du service

Le service décrivant l'accès à la base de données MSSQL Server au travers du Serveur DirectConnect DCMSERVER doit être déclaré dans le fichier dcany.cfg du DirectConnect. Cette opération nécessite le redémarrage du serveur DirectConnect DCMSERVER.

Dans l'exemple ci-dessous, le service en question est appelé SERVICE_1 .

La valeur de ConnectionSpec1 doit correspondre exactement à l'entrée du fichier odbc.ini.

Tous les paramètres listés en gras dans cet exemple sont indispensables. :

#> vi $SYBASE/$SYBASE_ECON/DCMSERVER/cfg/dcany.cfg
[Service Library]
{Logging}
LogSvcLibStatistics=0
{Client Interaction}
SvclibDescription=Access Service Library for ODBC.
[SERVICE_1]
{Catalog Stored Procedures}
CSPColumnODBCVersion=2
{Target Interaction}
TargetDecimalSeparator=.
Allocate=connect
ReturnNativeError=yes
SQLTransformation=passthrough
{Client Interaction}
quoted_identifier=on
TransactionMode=long
EnableAtStartup=yes
{ACS Required}
ConnectionSpec1=TARGETDATABASE

5-3- Ajout du service dans le fichier interfaces

Cette étape est la clé du lien entre le serveur Direct Connect DCMServer et la base distante décrite par le service. Le nom du service doit être référencé dans le fichier interfaces et doit correspondre exactement au nom du service déclaré dans le fichier dcany.cfg décrivant la base cible.

La machine et le port indiqué pour le service sont les mêmes que pour la déclaration du serveur DCMSERVER

#> vi $SYBASE/interfaces
SERVICE_1
   master tli tcp GAIA 1234
   query tcp ether GAIA 1234

5-4- Configurer le serveur Sybase ASE

Afin que le serveur Sybase ASE puisse accéder à la base de données MSSQL Server décrite par le service SERVICE_1, 3 étapes nécessaires :

#> isql -S ASE
exec sp_configure 'remote  access',1
exec sp_addserver SERVICE_1, direct_connect
exec sp_addexternlogin SERVICE_1, local_login, remote_login,remote_passwd

5-5- Configuration de la replication

L'arborescence Sybase Replication Server 12.6 fournit des scripts, que l'on peut exécuter par isql, en utilisant le serveur DCM. Il sont localisés dans $SYBASE/REP-12_6/scripts

Sur la base répliquée MSSQL, il est nécessaire de créer les objets de replication tel que rs_lastcommit .

#> cd $SYBASE/REP-12_6/scripts
#> isql -SSERVICE_1 -Urem_login -Prem_pwd -i hds_msss_setup_for_replicate.sql

La base RSSD (Replication Server System Database) doit également être mise à niveau pour la prise en charge de MSSQL Server via DirectConnect dans le système de réplication. Cette mise à niveau créé la string function rs_msss_function_class, les définitions de types de données et de translations etc… 3 scripts SQL doivent être exécutés dans la base RSSD : hds_msss_udds.sql, hds_clt_ase_to_msss.sql et hds_msss_funcstrings.sql.

#> cd $SYBASE/REP-12_6/scripts
#> isql -SRSSD_SERVER -DRSSD_DB -Ulogin -Ppwd -i hds_msss_udds.sql
#> isql -SRSSD_SERVER -DRSSD_DB -Ulogin -Ppwd -i hds_clt_ase_to_msss.sql
#> isql -SRSSD_SERVER -DRSSD_DB -Ulogin -Ppwd -i hds_msss_funcstrings.sql

L'étape suivante consiste à créer la connection vers la base cible SERVICE_1. Cela s'effectue par personnalisation du script hds_msss_connection_sample.sql.

#> cp hds_msss_connection_sample.sql hds_msss_connection_SERVICE_1.sql
#> vi hds_msss_connection_SERVICE_1.sql
/** Configure the Connection to Microsoft SQLServer
** NOTE: The "rs_maint_user" defined in this connection must have
** UPDATE authority to the rs_lastcommit table in SQLServer. */

create connection to SERVICE_1.database
  set error class rs_sqlserver_error_class
  set function string class rs_msss_function_class
  set username database_maint
  set password database_maint_password
  --with log transfer off
go

Les étapes suivantes sont alors classiques et identiques aux procédures habituelles : création des définitions de réplication, des souscriptions etc… :

Repdef :

create replication definition repdef_rst_axabeat_dect2
  with primary at L_DEC_T2_ASE.l_idee
  with all tables named rst_axabeat
  (
     "date"       datetime,
     "val"        int
  )
  primary key (date,val)
go

Subscription

create subscription sub_rst_axabeat_SERVICE_1
  for repdef_rst_axabeat_dect2
  with replicate at SERVICE_1.database
  without materialization
go

Il ne demeure plus qu'à tester avec les commandes classiques suspend connection to … et resume connection to … au sein de Replication Server :

suspend connection to SERVICE_1.database
go
resume connection to SERVICE_1.database
go

Annexe

Historique

Version Date Commentaires
1.0 07/2006 Version initiale

Liens

Sybase Books OnLine Replication Server 12.6
Sybase Books OnLine Enterprise Connect Data Access 12.6