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 :
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 et3
pour ASE 12.5SQLTransformation
quoted_identifier
àon
. Pour ce dernier paramètre, son équivalent dans le fichierodbc.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
danssysservers
du serveur ASE avec la commandesp_addserver
: le paramètreservice_class
doit être dans ce casdirect_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 et3
pour ASE 12.5SQLTransformation
quoted_identifier
àon
. Pour ce dernier paramètre, son équivalent dans le fichierodbc.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
danssysservers
du serveur ASE avec la commandesp_addserver
: le paramètreservice_class
doit être dans ce casdirect_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