Drupal - Utiliser une autre base de données pour certaines tables

Les raisons peuvent être diverses, mais parfois on veut que certaines tables soient dans une base de données spécifique au lieu de la principale. 

Dans mon cas c'est lors d'un déploiement « bleu / vert ». 

J'ai deux bases de données : prod_a et prod_b, la prod_a est la base active. 

Voici le processus de mise en prod simplifié

  1. La base de données de staging est copiée sur la base de prod non active : prod_b.
  2. Une copie de certaines tables (watchdog, inscrits_newsletter...) et faite depuis la base prod_a vers prod_b.
  3. Bascule entre les deux base de prod, la prod_b devient la base active et la prod_a ne sert plus.

dans les faits, cela fonctionne, mais l'étape 2 peut-être longue. Pour gagner du temps on peut mettre les tables qui ne doivent pas être écrasées sur une troisième base que l'on appellera prod_common.

voici la définition classique d'une base de données drupal :

 $databases['default']['default'] = [
  'database' => 'prod',
  'username' => 'user',
  'password' => 'password',
  'prefix' => '',
  'host' => '',
  'port' => '3306',
  'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
  'driver' => 'mysql',
];

nous allons définir maintenant une seconde base prod_common 

 $databases['default']['common'] = [
  'database' => 'prod_common',
  'username' => 'user',
  'password' => 'password',
  'prefix' => '',
  'host' => '',
  'port' => '3306',
  'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
  'driver' => 'mysql',
];

Notez bien le changement de clé dans le nom de la base :  $databases['default']['common']

Maintenant pour spécifier quelles tables doivent être dans quel schema, nous allons utiliser l'attribut prefix de notre définition, voici la version complète : 

 $databases['default']['default'] = [
  'database' => 'prod',
  'username' => 'user',
  'password' => 'password',
  'prefix' => [
    'default' => '', // par défaut, tout doit être dans le schéma par défaut
    'watchdog' => 'prod_common.', // la table watchdog va elle dans la base prod_common (attention au point)
    'inscrits_newsletter' => 'prod_common.', // idem pour la table inscrits_newsletter
  ],
  'host' => '',
  'port' => '3306',
  'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
  'driver' => 'mysql',
];

// Je duplique la définition de ma base prod en modifiant uniquement le nom de la base de données
$databases['default']['common'] = $databases['default']['default'];
$databases['default']['common']['database'] = 'prod_common';

Et voila, pour les deux tables spécifiées, drupal ira chercher et enregistrer les informations sur la base prod_common.

Contenus en rapport

Drupal - Nouveau module : Database Dashboard

Il y a quelques semaines, souci rencontré sur un projet client avec une base de données qui grossissait de manière anormale. Ne gérant pas l'hébergement pour ce projet, je n'ai eu aucune alerte, avant que le site plante car le serveur de base de données n'avait plus d'espace disque disponible.

Quelques requêtes plus tard nous avons pu identifier les tables fautives et donc les causes.

Commentaires

Bonjour,

Merci pour cet exemple mais en testant je n'arrive pas à le faire fonctionner.

Dès que je met un tableau au niveau du prefix le site ne fonctionne plus, de ce que je comprends de la doc c'est maintenant déprécié en Drupal 10 ?

https://www.drupal.org/project/drupal/issues/3124382

Effectivement cela ne semble plus marcher avec drupal 10, c'est bien dommage. 

Je dois bientôt porter un site d9 en d10 qui a cette fonctionnalité, je mettrai ici les alternatives que j'ai trouvées.

Ajouter un commentaire

Ne sera pas publié
CAPTCHA
Désolé, pour ça, mais c'est le seul moyen pour éviter le spam...