Spostare tutto il database di Drupal o solo una parte

  • 5 Ago 2014
  • mysql, Drupal

Migrare un sito sviluppato con Drupal in linea di massima è molto semplice. Basta copiare i file, migrare il database, modificare il file di configurazione settings.php et voilà. Pero se c'è più di un sito o altri domini o sottodomini, tutti dentro lo stessa database migrare solo uno di questi può essere un pò più complicato.

In questo caso, avendo tutte le tabelle di ogni sito dentro lo stessa database si dovrà prendere solo quelle con il prefisso impostato oppure tutte quelle senza nessun prefisso (indicato nel parametro prefix dentro il file settings.php).

Dump di tutte le tabelle con un determinato prefisso

Se il prefisso fosse sito1_ esseguire il seguente comando per avere l'elenco di tutte le tabelle in un file.

mysql -N information_schema -e "select table_name from tables where table_schema = 'databasename' and table_name like 'sito1_%'" > tables.txt

Poi, esseguire mysqldump indicando il file creato prima.

mysqldump dbname `cat tables.txt` > dump_file.sql

Dump delle tabelle senza prefisso

Siccome le tabelle di Drupal sono tante (dipendono dal numero di moduli installati in ogni sito) è più semplice fare un backup dell'intero database e poi cancellare tutte le tabelle presenti con il prefisso

mysqldump database_originale > database_originale_backup.sql
mysql -e "CREATE DATABASE nuova_database"
mysql nuova_database < database_originale_backup.sql

Cancellare le tabelle con il prefisso crm_

SET SESSION group_concat_max_len = 1000000;
SET @schema = 'nuova_database';
SET @pattern = 'crm_%';
SET @droplike = null;

SELECT 
  CONCAT('DROP TABLE ',GROUP_CONCAT(CONCAT(@schema,'.',table_name)),';') INTO @droplike 
FROM 
  information_schema.tables 
WHERE 
  @schema = database() AND 
  table_name LIKE @pattern AND 
  TABLE_SCHEMA = @schema;

PREPARE stmt FROM @droplike;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;