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

Logo

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.

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 :

DirectConnect Server - Services - Access

Configuration

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
…
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
$SYBASE/interfaces
##-----------------------------------------------
## 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

Arrêt - relance du serveur DirectConnect

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.

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.

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

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:

  • création d’une connexion ODBC vers le serveur MSSQL dans le fichier odbc.ini.
  • paramétrage du service vers ce serveur MSSQL.
  • référencement du service dans le fichier interfaces.
  • configuration du service DirectConnect vers MSSQL Server dans le serveur ASE.
  • création de la table proxy dans le serveur ASE.

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 :

$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

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. :

  • CSPColumnODBCVersion = 2 pour ASE 12 et 3 pour ASE 12.5
  • SQLTransformation
  • quoted_identifier à on. Pour ce dernier paramètre, son équivalent dans le fichier odbc.ini doit également être positionné ( QuotedID = yes )
$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

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és pour le service sont les mêmes que pour la déclaration du serveur DCMSERVER

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

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 :

  • appliquer le paramètre serveur 'remote access' à 1 pour le serveur ASE.
  • référencer le service SERVICE_1 dans sysservers du serveur ASE avec la commande sp_addserver : le paramètre service_class doit être dans ce cas direct_connect
  • appliquer une correspondance entre un login local du serveur ASE et un login distant du serveur MSSQL avec la procédure stockée sp_addexternlogin.
isql -S ASE

exec sp_configure 'remote  access',1
go
exec sp_addserver SERVICE_1, direct_connect
go
exec sp_addexternlogin SERVICE_1, local_login, remote_login, remote_passwd
go

À 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
go

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

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.

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 :

$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

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. :

  • CSPColumnODBCVersion = 2 pour ASE 12 et 3 pour ASE 12.5
  • SQLTransformation
  • quoted_identifier à on. Pour ce dernier paramètre, son équivalent dans le fichier odbc.ini doit également être positionné ( QuotedID = yes )
$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

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és pour le service sont les mêmes que pour la déclaration du serveur DCMSERVER

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

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 :

  • appliquer le paramètre serveur 'remote access' à 1 pour le serveur ASE.
  • référencer le service SERVICE_1 dans sysservers du serveur ASE avec la commande sp_addserver : le paramètre service_class doit être dans ce cas direct_connect
  • appliquer une correspondance entre un login local du serveur ASE et un login distant du serveur MSSQL avec la procédure stockée sp_addexternlogin.
isql -S ASE

exec sp_configure 'remote  access',1
go
exec sp_addserver SERVICE_1, direct_connect
go
exec sp_addexternlogin SERVICE_1, local_login, remote_login, remote_passwd
go

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 -P******** -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 -P******** -i hds_msss_udds.sql
isql -SRSSD_SERVER -DRSSD_DB -Ulogin -P********-i hds_clt_ase_to_msss.sql
isql -SRSSD_SERVER -DRSSD_DB -Ulogin -P******** -i hds_msss_funcstrings.sql

L’étape suivante consiste à créer la connexion 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
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… :

Replication Defintion (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

Souscription

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

Il ne reste 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