Sous-sections

Chargement

Préparation

Il faut récupérer un fichier texte formaté d'une manière quelconque. J'ai récupéré un dump de MySQL dont les séparateurs sont des tabulations, et les délimiteurs sont absents.

Rappelons que par défaut le loader attend un saut de ligne entre deux enregistrements, des champs séparés par une virgule et délimités par des guillemets doubles.


Dataload

Puis on peut lancer le loader avec la syntaxe suivante:(voir 4.3)
loadercli -d base -u user,passwd -b commandfile

Fichier de commande:

// commentaire: on aurait pu lancer la création de table ici
// fichier: /home/jm/sapdb/etc/load_courriel.loader
// commencer par definir le format de l'input
// separateur tabulation (on tape une vraie tabulation, pas de delimiteur
// une ligne vide separe deux commandes
SET COMPRESSED '/   //'
//
DATALOAD TABLE JM.COURRIEL
msgid 1
fils_de 2
maildate 3
mailfrom 4
subject 5
body 6
INFILE '/home/jm/sapdb/data/courriel.txt'
Ce qui donnera en réalité la ligne de commande suivante:
loadercli -d mails -u jm,jm_passwd -b /home/jm/sapdb/etc/load_courriel.loader

Attention:il ne faut pas être connecté sous dbmcli sur la base au lancement de loadercli car ça le bloque.

J'ai eu un souci avec l'enregistrement 48. Je l'ai supprimé, détruit les entrées
de la table et relancé loadercli. Voici la fin du log de loadercli:
(/usr/local/sapdb/indep_data/wrk/loader.prt)

DATA LOAD TABLE "JM"."COURRIEL" successfully executed
// *
// M    Last transaction committed at input record 237
// *
// M    Sum of inserted records 237, sum of rejected records 0
// *
// M    Releasing user connection (USER: 'JM').

En fin de compte on aurait pu tout faire dans le même fichier, en plusieurs parties distinctes:

// courriel.ini.loader
// lodercli script de creation & chargement de table
CREATE TABLE courriel
(
	msgid VARCHAR(80) NOT NULL PRIMARY KEY CONSTRAINT ct_msgid CHECK msgid LIKE '<%>',
	fils_de VARCHAR(80) NOT NULL DEFAULT '<head>' CONSTRAINT ct_fils_de CHECK fils_de LIKE '<%>',
	maildate VARCHAR(40) NOT NULL,
	mailfrom VARCHAR(80) NOT NULL,
	subject VARCHAR(128) NOT NULL,
	body VARCHAR(7000) NOT NULL
)
//
SET COMPRESSED '/   //'
//
DATALOAD TABLE JM.COURRIEL
msgid 1
fils_de 2
maildate 3
mailfrom 4
subject 5
body 6
INFILE '/home/jm/sapdb/data/courriel.txt'
//
ALTER TABLE courriel FOREIGN KEY ct_fk_fils_de (fils_de) REFERENCES courriel (msgid)
    ON DELETE SET DEFAULT

Activer les logs et le backup auto des logs

On a mis en place la base, sa seule et unique table, mais pas de logs ni de backup ce qui compromet la pérennité de l'affaire.

Ça aurait pu ce faire au moment de l'installation dans le script appelé par dbmcli. On va le faire maintenant.2

dbmcli -d mails
dbmcli> user_logon dbm,dbm_passwd
dbmcli>medium_put data /home/databases/mails/datasave FILE DATA 0 8 YES
dbmcli>medium_put logauto /home/databases/mails/logautosave FILE AUTO
dbmcli>util_connect
dbmcli>backup_start data DATA
dbmcli>autolog_on

On a créé un support de nom data dans le fichier cité sous le protocole DATA, donc pas automatique.

D'ailleurs il ne peut y avoir qu'un backup AUTO par instance. Ici c'est le support auto pour les logs qui fait l'objet d'un backup auto. Puis on a lancé le backup et le backup automatique des logs.

En effet la log area ne peut être réécrite que si les logs ont été archivés: si elle est pleine et qu'il faut écrire des logs dedans la base s'arrête. D'où la nécessité d'archiver des logs, manuellement ou en mode auto, ou bien encore d'activer le mode overwrite de la Log Area (ce qui n'est pas la meilleure manière de faire pour une base en production).

Voilà des commandes pour faire des vérifications sur les backups. C'est pas lisible-lisible au point où j'en suis mais il faut se former.

dbmcli -d mails
dbmcli> user_logon dbm,dbm_passwd
dbmcli> service_connect
dbmcli> recover_check data DATA
dbmcli> service_release
dbmcli> util_connect
dbmcli> medium_label data
dbmcli> util_release
dbmcli> medium_get data    # infos sur le medium data
dbmcli> medium_getall      # infos sur tous les media

Et des commandes d'informations générales sur l'instance. D'après la doc ça devrait se lancer d'une session sql mais on y arrive tout simplement avec la commande info:

dbmcli -d mails -u dbm,dbm_passwd
dbmcli> info identifiant

Où identifiant peut-être ce qui est rendu par l'identifiant infos (avec un s).

Test de restauration

C'est le plus compliqué, j'ai l'impression, dans la gestion de ce sgbd...

Une différence entre SapDB et MaxDB: la sequence util_execute INIT CONFIG suivie de recover_start nomMedium DATA est remplacée par db_activate RECOVER. Bien sur le nom du medium doit avoir été paramétré auparavant avec un medium_put adéquat.

Copie d'instance

Il est possible de récupérer la configuration d'une instance, en utilisant une sauvegarde de données existante (la syntaxe du script est celle de SapDB):
db_create DATABASE dbm,dbm
medium_put nomMediumExistant pathMediumExistant FILE DATA 0 8 YES
recover_config nomMediumExistant
service_release
db_admin
util_connect dbm,dbm
util_execute INIT CONFIG
recover_start nomMediumExistant DATA
util_release
db_online

Sinon il faut recréer l'instance, la paramétrer jusqu'au INIT CONFIG et lancer la restauration comme vu précédemment.

Il ne faut pas oublier le medium_put avant toute séquence de récupération, que ce soit pour la récupération de configuration ou pour la recréation d'instance.

Récupération d'instance

On commence par détruire l'instance:

dbmcli on mails>db_offline
OK
dbmcli on mails>db_drop
OK

Et on la récupère:

dbmcli> db_admin
dbmcli> util_connect dbm,dbm
dbmcli> recover_start nomMediumData DATA
Vérifier que l'instance est prête à redémarrer (les informations sont consistantes) avec db_restartinfo. Si oui, il n'y a rien à récupérer dans les logs. Si non il faut récupérer les infos dans les logs, à partir du fichier dbm.knl de l'instance: le numéro de séquence du data backup (champ n^ 8) doit être compris entre les numéro de séquence (champs 8 et 9) du log backup qui correspond. Alors il sera possible de faire un:
recover_start logMediumName LOG 00N avec 00N étant le numéro du log qui va bien.
Puis utiliser le recover_replace si il reste des logs après le 00N:
recover_replace logMediumName /path/vers/fichierDeLog 00Ni avec 00Ni étant les numéros de log qui suivent le log utilisé pour la restauration. fichierDeLog est le nom du fichier qui a été donné lorsqu'on a fait le medium_put du medium de log (chez moi, par exemple: /home/databases/troupeau/logautosave)
Et on finit par un recover_ignore

Il est possible de récupérer des logs jusqu'à une certaine date avec:
recover_start logMediumName LOG UNTIL <date> <time>

Et normalement tout est bon.
Le tout est d'avoir un backup des données (medium data) à jour...Car les logs enregistrent les transactions et opérations et permettent de remonter mais toute donnée non sauvegardée est perdue. Pour avoir des sauvegardes des logs plus souvent il faut définir le paramètre LOG_SEGMENT_SIZE, car lorsqu'un segment est plein il est sauvegardé, en mode auto. Par défaut, c'est à dire si le paramètre n'a pas été défini à la création, il est d'un tiers de la log area, donc chez moi 341 pages (des pages sapdb de 8096 octets, pas des pages linux) ce qui fera un backup des logs tous les 2.7 Mo environ.

Attention: La restauration supprime l'autolog. Il faut refaire le backup et relancer l'autolog (autolog_on). Vous le vérifierez avec un autolog_show en console dbmcli.

Un lien pour de la doc sur les backups-restore

Dumping des tables en fichier ascii pour dataload

Il y a possibilité d'obtenir un dump des tables en format ascii avec loadercli, fichiers qui pourraient être utilisés pour recharger des tables. Voici deux exemples de fichiers de commandes pour loadercli qui permettent d'obtenir un dump partiel ou total de la base. Il y a plein d'autres options pour ces commandes du loader.

Pour une table, en une seule passe, obtenir les données et le catalogue de création:

USE USER JM JMPASSWD
//
DATAEXTRACT FOR DATALOAD TABLE JM.ADRESSES
	OUTFILE '/home/databases/backups/CONTACTS.ADRESSES.command'
	OUTFILE '/home/databases/backups/CONTACTS.ADRESSES.data'

Pour toute la base, on va obtenir un fichier de définitions de la structure de la base: tables, users, droits, procédures...avec les commandes suivantes:

Le fichier de description est ascii, le fichier de données est binaire.

USE USER DBA DBAPASSWD
//
DBEXTRACT CATALOG OUTSTREAM FILE '/home/jm/sapdb/data/CONTACTS/dbextract.command'
		  DATA OUTSTREAM FILE '/home/jm/sapdb/data/CONTACTS/dbextract.data' PAGES

On lance le script avec, comme d'habitude, loadercli -d nomBase -b script.

Transaction et verrouillage

On est dans du transactionnel dès qu'on a ouvert une une session:
dbmcli> sql_execute SELECT * from domain.connectparameters
Par défaut on est en Isolation Level 1. Lors d'un INSERT un verrou exclusif est posé sur le rang d'insertion.

Les requêtes peuvent être paramétrées en modifiant le niveau d'isolation par un "lock option" Le parametre TIMEOUT sert à préciser la durée maximale d'inctivité entre deux instructions SQL de la session. Par défaut 900 secondes. Si il est mis à 0, l'activité de la session n'est pas surveilée, et c'est mauvais pour les autres transactions en cours.

Le verrouillage peut être modifié par un "lock statement"...

dbmcli> sql_execute LOCK TABLE courriel IN EXCLUSIVE MODE
dbmcli> sql_execute SELECT lockmode, lockstate from domain.locks WHERE tablename = 'COURRIEL'

ou bien par une "lock option" dans le select:

dbmcli> sql_execute SELECT subject, body FROM courriel WHERE subject like '%Masq%' /
WITH LOCK (NOWAIT) ISOLATION LEVEL 15

Étant donné que la probabilité de deadlock évolue avec la puissance de 4 du nombre d'objets verrouillés, on peut dire que verrouiller une table n'est pas forcément une bonne option.

paramètre REQUEST_TIMEOUT: par défaut 5000 secondes: C'est la durée maximale en attente d'un verrou déjà pris.

Bref, pour vérifier le transactionnel, faite une insertion et terminez par COMMIT WORK. Un petit SELECT ensuite pour vérifier l'insertion.
Puis faites en une autre en terminant par un ROLLBACK WORK et même vérification, et une autre en terminant avec un ROLLBACK WORK RELEASE suivi d'une opération quelconque en SQLMODE et vous verrez les différences entre ces différentes manips.

Mise à jour vers une version SapDB

La version 7.4.3.25 vient de sortir donc j'ai mis à jour, manière de voir comment on fait...

Ça n'est pas compliqué: comme pour l'installation on détarre l'archive et on va dans le dossier créé. Là j'ai essayé ./SDBUPD sans succès, donc je me suis replié vers ./SDBINST en mettant à jour d'abord le serveur (profile 0), puis une nouvelle fois pour mettre à jour le pilote ODBC. Il n'y avait pas grand enjeu à cette mise à jour, mais un backup complet serait recommandé avant d'opérer.

La seule chose c'est qu'il m'a fallu relancer un: load_systab -u dba,dba_passwd -ud domain_passwd pour que les tables systèmes soient accessibles (ce ne fut pas nécessaire pour la mise à jour de la 7.4.3.25 vers la 7.4.3.27).


Mise à jour vers une version MaxDB

Procéder comme au point précédent: détarrage de l'archive (archive de binaires) et lancement de SDBINST

L'installation est découpée en profils: j'ai commencé par Runtime, puis Scripts Interface, puis Server, puis Web Tools.

Tout va bien, enfin si l'installation se déroule bien, sauf que....j'ai eu des soucis de reconnexion à mes instances (ERR_USRFAIL). Donc j'ai du modifier quelques droits, car, sous MaxDB, les administrateur et groupe administrateur sont maintenant sdb et sdba.

J'ai modifié les droits et propriétaires des volumes (data et log), ainsi que des backups.

J'ai surtout du modifier les propriétaires et droits des fichiers <indep_data>/config/nomBase*, comme un strace -f me l'a démontré. Mais il faut également modifier les droits sur <indep_data>/wrk/nomBase/*

chown sdb,sdba /usr/local/indep_data/config/TROUPEAU*
chmod 660 /usr/local/indep_data/config/TROUPEAU*

Après avoir créé une table, je n'ai pas pu faire un DROP TABLE. Une analyse de knldiag et knldiag.err montrait un problème sur le fichier <indep_data>/config/Registry1.dcom. Il a fallu modifier les droits d'accès sur ce fichier puis lancer un LOAD_SYSTAB pour que tout rentre dans l'ordre.

remarque:Il faut le load_systab après toute mise à jour:

dbmcli -d database -u dbm,dbmpasswd
dbmcli on database> load_systab -u dba,dbapasswd -ud domainpasswd



Notes

... maintenant.2
On ne fait toujours pas de log mirroring, il faudra tester
jean-michel OLTRA 2004-07-06