Pasar al contenido principal

Múltiples bases de datos en una sola instancia en Drupal 9

En ocasiones queremos alojar varios sitios con su propia base de datos en un mismo servidor web. Esto puede ser útil cuando la capacidad de almacenamiento no está aprovechada al máximo, por lo que al usar una sola instancia podemos reducir costes. También  para aumentar la eficiencia o simplemente por comodidad, como por ejemplo si tenemos una base de datos de clientes y queremos tenerla disponible desde la página web. Otra situación en la que nos puede resultar útil es en las migraciones de Drupal, cuando la fuente de datos proviene de otra plataforma como Wordpress, Drupal 7, Joomla etc. y necesitamos hacer la migración con la misma instancia de base de datos por limitaciones del proveedor web.

 

Antes de ponernos manos a la obra, es importante tener en cuenta  las limitaciones de espacio para no alcanzar el límite contratado. Se recomienda que una vez terminadas las migraciones, eliminemos la base de datos que ha sido migrada y dejar solo la nueva para evitar un tamaño excesivo. Si se hace un uso responsable y los índices, la limpieza periódica de logs y el mantenimiento de la base de datos son buenos, no debería afectar al tiempo de respuesta. La velocidad dependerá mucho del servidor, los procesadores, la memoria contratada y el tipo de discos, por lo que es necesario contemplar todos los escenarios y los recursos disponibles.

Cómo

  • Cargamos la futura base de datos prefijada en una instancia vacía:
    drush sql-cli < my_database.sql
  • Alteramos las tablas para que tengan un prefijo y las volcamos en un fichero:
    drush sql-query "SELECT Concat('ALTER TABLE \`', TABLE_NAME, '\` RENAME TO \`prefix_', TABLE_NAME, '\`;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'db_name';" > /tmp/prefix_db.sql
  • Borramos la instancia actual de la base de datos y cargamos la base de datos principal (sin prefijo):
    drush sql-drop -y
    cat main_database.sql | drush sql-cli
  • Cargamos la base de datos con prefijo en la misma instancia que la base de datos "principal". Mantendrá las tablas de la base de datos principal y creará nuevas tablas con el prefijo.
    drush sql-cli < tmp/prefix_db.sql
  • Es posible consultar la base de datos prefijada sin definir la conexión en settings.local.php:
    use Drupal\Core\Database\Database;
    
    // Connection info from default database.
    $connection_info = Database::getConnectionInfo();
    
    // Setup the prefix.
    $connection_info[$key]['prefix'][$key] = '_prefix';
    // It is necessary to define the driver.
    $connection_info[$key]['driver'] = 'mysql';
    
    // Create connection.
    Database::addConnectionInfo('migrate_d8', 'migrate_d8', $connection_info[$key]);
    $connection = Database::getConnection('migrate_d8', 'migrate_d8');
    
    // Query to the new connection.
    $query = $connection->select('node', 'nd');
    $query->addField('nd', 'nid');
    $query->range(0, 2);
    $result = $query->execute();
    
    print_r($result->fetchAll());
    
  • Ejemplo de cómo configurar la conexión del prefijo en settings.local.php:
    $databases['db_with_prefix']['default'] = [
      'prefix' => 'prefix_',
      'driver' => 'mysql',
      'database' => 'db',
      'username' => 'db',
      'password' => 'db',
      'host' => 'db',
      'port' => '3306',
    ];
    
  • Ejemplo de consulta a la base de datos con prefijo:
    
    $connection = Database::getConnection('db_with_prefix', 'default');
    $query = $connection->select('node', 'nd');
    $query->addField('nd', 'nid');
    $query->range(0, 2);
    $result = $query->execute();
    print_r($result->fetchAll());
Image
Eduardo Morales Alberti

Eduardo Morales

Senior Drupal developer