# Résumé

Ce document explique aux administrateurs de bases de données les différents aspects à cerner lors de l'administration d'une base de données inconnue. Ce document est aussi utile aux administrateurs qui ne connaissent qu'un des logiciels présentés, afin de connaître les commandes équivalentes.
Sont présentés ici MySQL 5.1, PostgreSQL 8.1 et Oracle 10g installés sur une Debian Etch.

# Introduction

On présentera ici trois systèmes différents de gestion de base de données :
* MySQL 5.1, base de données libre très utilisée par les hébergeurs web pour ses bonnes performances et dont la version 5 comble les principaux manques (trigger, procédures stockées...). MySQL a la particularité de fournir plusieurs moteurs de bases de données (InnoDB, MyIsam, Berkeley DB...), qui ne fournissent pas les mêmes fonctionnalités ni les mêmes performances, afin de s'adapter au besoin. Par exemple, le moteur ARCHIVE est optimisé pour stocker et fournir des informations, mais il n'est pas possible de mettre à jour une ligne dans une table.
* PostgreSQL 8.1 est la base de données qui offre le plus de fonctionnalités en logiciel libre.
* Oracle 10g

# Conseils préliminaires

Voici quelques conseils qui permettent de gagner du temps lors de la découverte et la maintenance d'une base de données :
* Demander s'il y a une fiche technique du serveur sur un partage de fichiers ou sur un wiki.
* Interroger les personnes qui travaillent sur ce serveur pour savoir s'il y a des recommandations en plus par rapport à la documentation au cas où elle ne serait pas à jour.
* Créer ou mettre à jour la documentation du serveur.
* Lire la documentation officielle de la base de données et regarder les commentaires :
      * (français) MySQL 5.0 | anglais MySQL 5.1
      * (français) PostgreSQL 8.1.5
      * (anglais) Oracle

# Détermination du système d'exploitation

* Unix : cat /etc/issue
** Linux:
*** Debian: on trouve ce fichier /etc/debian_version qui contient la version de Debian.
*** Redhat: /etc/redhat_release
Pour la suite du document, on considère que la base de données fonctionne sur Debian, mais la quasi totalité des explications dans la suite fonctionne avec les autres distributions Linux. Il sera indiqué quand la commande est spécifique à Debian.

# Détermination de l'environnement

Pour connaître le(s) processeur(s) :
Les partitions swap utilisées :
La quantité de RAM disponible/utilisée :
La configuration réseau :

# Services en cours de fonctionnement

Toutes les commandes sont à exécuter en root.

## Pour connaître la liste des démons au démarrage de l'ordinateur :

Regarder le nom du logiciel de démarrage dans la liste des processus, c'est celui dont le PID vaut 1.
* Si vous obtenez init :
** Regarder le chiffre entre derrière init, puis taper : # ls /etc/rc[chiffre].d/
Par exemple si le chiffre est 2 :
de manière générique :
* Si vous obtenez initng, il faut taper :
pour obtenir la liste des démons démarrés.

# Les logiciels installés | La façon dont ils sont installés

Il est possible d'installer de deux manières différentes un logiciel dans une distribution Linux. Soit avec un paquetage soit avec les sources. L'intérêt du paquetage, c'est qu'il est beaucoup plus facile à installer et à mettre à jour que les sources. Par contre, plus de personnalisations du logiciel sont possibles grâce à une installation à partir des sources.
Dans Debian, pour gérer les paquetages, on utilise le logiciel aptitude. Il permet d'installer, désinstaller et mettre à jour l'ensemble des logiciels présents sur le serveur. Dans le menu d'aptitude il est possible de rechercher un paquetage.
Si le paquetage de la base de données n'est pas installé, alors il est installé avec les sources. La plupart du temps, les logiciels installés à partir des sources se situent dans /usr/local/bin.
La façon dont est installé le logiciel détermine la procédure des mises à jour.

## Pour visualiser l'état de fonctionnement de la base de données
#### MySQL

Exemple de résultat pour une base en cours de fonctionnement :

#### PostgreSQL

Exemple de résultat pour une base en cours de fonctionnement :

#### Oracle

On identifie la liste des instances Oracle en cours de fonctionnement avec la commande:
* ps -ef | grep pmon
(Le processus PMON, Process Monitor, étant unique à chaque instance, et identifiant le SID de la base concernée)

## Comment démarrer/arrêter/redémarrer une base de données
#### MySQL

* Avec init
   * Dans le cas d'une base de données classique :
   * Dans le cas d'un nœud de cluster :
   * Dans le cas d'un médiateur de cluster :
* Avec initng

#### PostgreSQL

* Avec init
Dans le cas d'une base de données :
* Avec initng

#### Oracle

* Avec init
Dans le cas d'une base de données :
* Avec initng

# Les fichiers de configuration
#### MySQL

Tous les fichiers se trouvent dans le dossier /etc/mysql :
* debian.cnf : fichier de configuration généré automatiquement par Debian, contient le login de l'utilisateur système Debian dans MySQL ainsi que son mot de passe. Cet utilisateur permet à Debian de faire la maintenance des bases de MySQL.
Exemple :
* debian-log-rotate.conf : Définit la quantité de fichiers de logs à stocker.
Exemple :
* debian-start : Script qui contient la liste des opérations de maintenance à effectuer lors du démarrage de MySQL.
Exemple :
* my.cnf : Tous les paramètres de configuration de MySQL comme les ports/sockets d'écoute, les interfaces réseaux autorisées, le tuning de la base, l'emplacement des logs et des fichiers de base de données... Enfin, ce fichier définit si le serveur MySQL est un nœud de cluster ou un le maître du cluster. Les commentaires dans ce fichier sont assez détaillés.
Exemple :

#### PostgreSQL

Les fichiers de configuration se trouvent dans /usr/local/pgsql/data ou /etc/postgresql/8.1/main/. PostegreSQL possède 3 fichiers de configuration:
* pg_hba.conf : fichier de configuration pour l'authentification des utilisateurs. Ce fichier est une suite d'enregistrements.
Les lignes vides sont ignorées. Chaque ligne est structurée d'une des manières suivantes:
* pg_ident.conf: fichier de configuration utilisé si l'on veut effectuer une authentification automatique avec le login utilisé lors du lancement de l'OS.
Exemple :
* postgresql.conf : principal fichier de configuration. Toutes les informations propres au SGBD sont stockées dans ce fichier.

#### Oracle

Par défaut, le fichier de configuration se trouve dans ${ORACLE_HOME}/dbs/ et se nomme en général init%ORACLE_SID%.ora
%ORACLE_SID% est le nom de l'instance d'oracle utilisée
Il contient en général tous les paramètres dont a besoin la base. Exemple

# Localisation physique des données

* Déterminer la localisation dans l'arborescence système des bases de données à partir du fichier de configuration. Par exemple pour MySQL, il se situe dans /var/lib/mysql
* Taper :
pour connaître le point de montage des partitions.
Exemple :
* Si le fichier du périphérique commence par /dev/md, alors il s'agit d'une partition en RAID software. Pour connaître la localisation physique des fichiers, il faut regarder le fichier : /etc/mdadm/mdadm.conf
Exemple :
Dans cet exemple, on peut voir que /dev/md0 est un RAID réparti entre deux partitions, hda1 et hdd1. L'adresse de l'administrateur à avertir en cas de défaillance d'une des deux partitions est également indiqué.
* La commande :
affiche l'espace disponible pour chaque partition
Exemple :
Cette commande :
affiche des informations précises sur la taille de chaque fichier.

# Interfaces de connexion à la base de données

Il est possible de gérer une base de données par différents moyens : Web, interface graphique, et ligne de commande. Il faut donc identifier les différentes méthodes possibles pour gérer la base de données.

## Web
#### MySQL

* PhpMyAdmin est l'interface web la plus utilisée pour gérer une base de données MySQL.

#### PostgreSQL

* PhpPgAdmin

#### Oracle

* isql*plus
* sql*Plus
* SQLPlus Worksheet

## Applications graphique
#### Pour tous les serveurs de base de données

* Kexi - Outil KDE
* OpenOffice.org Base - Intégré à la suite bureautique OpenOffice.org 2 et ultérieur. Permet de générer des schémas de la base de données.
* LibreOffice Base - Intégré à la suite bureautique LibreOffice. Permet de générer des schémas de la base de données.

#### MySQL

* MySQL Administrator

#### PostgreSQL

* pgAdmin

#### Oracle

* Tora
* Oracle Enterprise Manager

## Ligne de commande
#### Oracle
# Analyse interne de la base de données

On va maintenant déterminer les composantes internes de la base de données. Pour cela, on dispose d'une liste de commandes, très souvent en SQL. Voilà également quelques commandes utiles pour un administrateur de base de données.

## Généralités
#### MySQL

Pour auditer un serveur MySQL, la commande SHOW permet d'afficher la plupart des informations utiles. (Documentation détaillée)

## Utilisateurs - rôles - droits
#### MySQL

(Documentation détaillée)
* Liste des utilisateurs
* Créer un utilisateur (Documentation détaillée)
* Supprimer un utilisateur (Documentation détaillée)

#### PostgreSQL

L'authentification dans PostgreSQL se fait via les rôles ou via les utilisateurs.
* Liste des rôles:
* Créer un rôle: (Documentation détaillée)
* Supprimer un rôle: (Documentation détaillée)
* liste des utilisateurs
* Création d'un utilisateur (Documentation détaillée)
* Effacer un utilisateur
* modifier un utilisateur

#### Oracle

* Les Utilisateurs
** Afficher les utilisateurs
   * Créer un utilisateur
   * Supprimer un utilisateur
   * Modifier un utilisateur
* Les rôles et les privilèges
** Afficher les rôles
   * Créer un rôle
   * Attribuer un privilège/un rôle
   * Supprimer un rôle

## Les bases de données
#### MySQL

* Liste des bases de données :

#### PostgreSQL

* Liste des bases de données: (Plus d'infos)

#### Oracle
## Tables
#### MySQL

* Liste des tables

#### PostgreSQL

* liste des tables: (Plus d'infos)

#### Oracle

* liste des tables:

## Schéma des relations entre les tables

Il est possible de générer un schéma des relations entre les différentes tables grâce à OpenOffice Base ou LibreOffice Base.

#### MySQL

Attention, il faut utiliser le moteur InnoDB pour pouvoir ajouter des clés étrangères.
* Lister les clés étrangères

#### PostgreSQL

* Liste des clefs étrangères:

#### Oracle

* Liste des clés étrangères de l'utilisateur connecté

## Charge de la base de données

Connaître la charge moyenne d'une base de données permet d'anticiper la montée en charge et la migration de la base de données vers un nouveau serveur ou un cluster de serveurs. Le logiciel Nagios fournit une interface web afin d'afficher un état détaillé du serveur. Il permet également d'envoyer une alerte mail ou SMS à l'administrateur système en cas de panne ou de saturation du serveur.

#### MySQL

* MySQLAR est un logiciel qui génère des courbes à partir de l'activité du serveur MySQL, très utile pour auditer des engorgements dans le temps. (Site officiel | Démonstration)
* Cette commande :
permet de connaitre la charge du serveur MySQL. Exemple de résultat :

#### Oracle

En version 10g, via la DBConsole.
Sinon, interroger la vue V$SESSION_WAIT, qui renseigne en temps réel des sessions en attentes.
Event: correspond à l'evénement P1, P2, et P3 correspondent aux spécifications de l'event (exemple: db file sequential read: P1: file #, P2: block #)
Néanmoins le suivi de l'activité d'une instance Oracle est complexe, et requiert l'utilisation d'outil type PERFSTAT pour avoir des informations concrétes.

## Triggers

Pour afficher les différents triggers définis dans la base de données :

#### PostgreSQL

* liste des triggers : (Plus d'infos)

#### Oracle
## Procédures stockées

Permet d'afficher la liste des procédures stockées.

#### MySQL

(Documentation sur les procédures stockées)

#### PostgreSQL

Ou utilise la métacommande \df, si on connait le schéma on peut faire \df schema.*, par exemple \df public.* donne toutes les fonctions crée dans ce schéma, qui est celui affecté par défaut à utilisateur. On pourrait tout aussi bien faire \df public.ab* pour avoir toutes les fonctions commençant par ab. Avec \df+ on obtient aussi les commentaires (CREATE COMMENT) sur la fonction

#### Oracle

Pour selectionner la liste des procédures stockées:
Pour afficher le contenu d'une procédure stockée:
On peut aussi utiliser les vues dba_objects et dba_source

## Logs

Les logs sont des fichiers textes qui contiennent tout ce qui se passe dans le logiciel. Ces fichiers sont importants pour détecter et localiser une panne.
Les logs des distributions linux sont dans le dossier : /var/log Le fichier de log le plus important est : /var/log/syslog

#### MySQL

* /var/log/mysql.log contient toutes les erreurs autour du serveur MySQL. C'est le premier fichier à regarder quand le serveur MySQL ne démarre pas.
Il est possible d'activer des logs pour sauvegarder toutes les requêtes, les modifications dans les tables ou pour identifier les requêtes les plus lentes. (Détails sur les types de logs)

#### PostgreSQL

Lors de la création d'une base , elle est configuré avec un archivage minimum (un certain nombre de fichiers de taille fixe sont utilisés pour l'archivage) Cet archivage n'est pas suffisant pour pouvoir restaurer des sauvegardes à chaud, il faut un archivage de type WAL, qui n'écrase pas les log les plus anciens.
Pour configurer un archivage WAL: Dans le fichier postgresql.conf, recherchez le paramètre archive_command et donnez lui la valeur suivante:
Sous certaines plateformes, la commande cp -i écrase les fichiers déjà existants, ce qui est contraire à la logique d'un archivage WAL. Si vous rencontrez des problèmes, il faut rajouter un test dans la commande:

#### Oracle

On distingue deux types de "logs" avec Oracle: - les fichiers "redo logs", qui assurent l'intégrité de la base - les fichiers textes statuant de l'état de la base
* Pour avoir des fichiers "redo log" actifs, la base doit être en mode ARCHIVELOG. Pour connaître le mode d'archivage:
    Pour activer le mode ARCHIVELOG, il faut arrêter la base
    puis modifier le fichier init<SID>.ora
* Les fichiers de log sont également écrits dans le fichier init<SID>.ora
Exemple :
On trouvera les fichiers de "log" texte en cherchant les paramètres :
Sachant que :
* bdump: processus systèmes
* udump: processus "user": client
* cdump: fautes de segmentations (bugs)

# Suivi de sécurité

Il est primordial de suivre les alertes à propos de failles de sécurité qui peuvent être détectés dans l'ensemble des logiciels présents sur le serveur.
Heureusement, avec la plupart des distributions linux, dont Debian, le suivi de sécurité est réalisé pour tous les logiciels contenus dans la distribution.
Il suffit de s'abonner à la liste de diffusion debian-security-announce.
à chaque alerte de sécurité, un mail est envoyé à tous les abonnés pour signaler le problème.
Si l'alerte de sécurité concerne un logiciel présent sur le serveur, il faut le mettre à jour grâce aux commandes :
Bien entendu, il faut que les logiciels installés soient des paquetages debian officiels, sinon cette politique de sécurité est défaillante.

#### Oracle

Debian n'effectue pas de suivi de sécurité pour Oracle, car c'est un logiciel propriétaire. Il faut donc mettre en place une procédure de sécurité spécifique pour Oracle.
Il est impératif, pour un système en production, d'avoir un support valide auprès d'Oracle.
Le site WEB de la base de connaissances est http://metalink.oracle.com

# Sauvegardes

Un serveur de base de données doit être obligatoirement sauvegardé car un serveur sera obligatoirement en panne un jour. Il est donc important de mettre en place une politique de sauvegardes et de les effectuer régulièrement. Une multitude de méthodes sont possibles pour sauvegarder un serveur. La plus courante est de posséder un serveur de sauvegardes qui automatise et centralise toutes les sauvegardes de l'entreprise, puis de stocker sur bande magnétique ou DVD-R. BackupPC est un logiciel très utilisé pour sauvegarder un ensemble d'ordinateurs, car il possède une interface web afin de lancer des sauvegardes ou de restaurer des fichiers.

#### MySQL

* à chaud :
La procédure recommandée pour sauvegarder est :
Ceci génère un fichier SQL de la base de données qui est facile à compresser et à sauvegarder. (Documentation détaillée)
* à froid :
    Sauvegarder le dossier où MySQL stocke ses bases de données. (Généralement /var/lib/mysql)

#### PostgreSQL

Les sauvegardes peuvent se faire de trois manières :
* SQL DUMP:
Faire un SQL DUMP signifie créer un fichier texte contenant une suite de requetes SQL permettant de pouvoir reconstruire toute la base de données. Dans PostgreSQL, nous disposons de la commande pg_dump qui s'utilise de la manière suivante.
* Une sauvegarde au niveau du système de fichier:
Cette sauvegarde se fait elle aussi a froid, et elle consiste simplement en un archivage de toutes les données de la base à sauvegarder. On peut utiliser une commande comme celle ci:
* Une sauvegarde à chaud:
Les sauvegardes à chaud se font alors que la base est en exploitation. Pour pouvoir faire des restaurations correctes, il est nécessaire que la base dispose d'un système d'archivage WAL. Cela permet de faire du point-in-time recovery (PITR): On peut récupérer l'état de la base à n'importe quel instant, du moment qu'il y ait eu un backup de fait
Créer la sauvegarde de la base : Apres s'être assuré que l'archivage WAL fonctionne, loggez vous en administrateur, et lancez la commande :
Ensuite, effectuez une sauvegarde avec la commande cpio ou tar, comme dans la sauvergarde au niveau du système de fichier.
Et après cette derniere effectuée, reloggez vous en administarteur et lancer la requete :

#### Oracle

Il existe plusieurs façons d'effectuer la sauvegarde d'une base de données.
* Sauvegarde à froid
Il s'agit de faire une sauvegarde de la base dans un état donné.
   * Formatage de texte sous SQL*Plus
   * Écrire les données dans un script sql
   * Arrêter la base
   * Effectuer la sauvegarde à proprement parler
   * Redémarrer la base
    Sauvegarde à chaud
Il s'agit de sauvegarder des données alors que la base est en marche. Il est nécessaire que le mode ARCHIVELOG soit activé.
   * Il faut tout d'abord identifier le tablespace qui va être sauvegardé.
   * Ensuite il faut mettre le tablespace hors ligne
Exemple :
   * Sauvegarder le fichier concerné (un simple copier/coller)
   * Enfin, remettre le tablespace en ligne
Exemple :

# Restauration
#### MySQL

Si la sauvegarde a été effectuée à chaud :
Sinon : Arrêter le serveur, et copier la sauvegarde dans le dossier de travail MySQL, puis démarrer le serveur.

#### PostgreSQL

La restauration s'effectue de différente manière, suivante le type de sauvegarde utilisée.
* SQL DUMP
Pour récupérer la base de données, il faut utiliser la commande suivante :
* Sauvegarde au niveau du système de fichier
Il suffit de lancer la commande:
* point-in-time recovery (PITR), restauration d'une sauvegarde à chaud
Après avoir fermé la base de données et restauré le fichier de sauvegarde comme pour une sauvegarde à froid, créez un fichier de configuration pour la restauration dans le répertoire data. Appelez ce fichier recovery.conf et dans ce fichier insérez la commande suivante :

#### Oracle

* Si la sauvegarde a été effectuée à chaud, utiliser la commande 'recover' après avoir éventuellement remis des fichiers sauvegardés
* Si la sauvegarde a été effectuée à froid, recopier tous les fichiers de la sauvegarde dans la base après l'avoir au préalable arrêtée.

## Mise à jour

Pour mettre à jour le serveur de base de données, s'il est installé en paquetage, il suffit de faire :
Sinon, bon courage :-)

## Suivi des bugs

Quand on rencontre un problème inexplicable avec un logiciel, le bon réflexe est de faire un tour sur le rapporteur de bugs du projet. Il ne faut pas hésiter à rapporter un bug lorsque on en trouve un, car sinon il a moins de chance d'être corrigé.

### MySQL

Le gestionnaire de bugs de MySQL.

### PostgreSQL

* Rapporter les bugs :
Lorsque vous rencontrez un bug dans PostgreSQL, vous pouvez le rapporter à l'organisme qui s'occupe des mises à jour de PostgreSQL. Pour cela, il vous suffit d'envoyer un rapport sur le bug à l'adresse suivante : <pgsql-bugs@postgresql.org> Il est demandé de faire un bref descriptif du bug en tant que sujet du mail.

### Oracle

On utilise le site du support Oracle: http://metalink.oracle.com