Eh bien, il existe 2 méthodes:
Méthode 1: Une méthode bien connue pour renommer le schéma de base de données consiste à vider le schéma à l'aide de Mysqldump et à le restaurer dans un autre schéma, puis à supprimer l'ancien schéma (si nécessaire).
De Shell
mysqldump emp > emp.out
mysql -e "CREATE DATABASE employees;"
mysql employees < emp.out
mysql -e "DROP DATABASE emp;"
Bien que la méthode ci-dessus soit facile, elle prend du temps et de l'espace. Et si le schéma est supérieur à 100 Go? Il existe des méthodes où vous pouvez diriger les commandes ci-dessus ensemble pour économiser de l'espace, mais cela ne fera pas gagner de temps.
Pour remédier à de telles situations, il existe une autre méthode rapide pour renommer les schémas, cependant, une certaine prudence doit être prise lors de cette opération.
Méthode 2: MySQL a une très bonne fonctionnalité pour renommer des tables qui fonctionne même sur différents schémas. Cette opération de renommage est atomique et personne d'autre ne peut accéder à la table pendant qu'elle est renommée. Cela prend un peu de temps car le changement du nom d'une table ou de son schéma n'est qu'un changement de métadonnées. Voici l'approche procédurale pour effectuer le changement de nom:
Créez le nouveau schéma de base de données avec le nom souhaité. Renommez les tables de l'ancien schéma au nouveau schéma, en utilisant la commande «RENAME TABLE» de MySQL. Supprimez l'ancien schéma de base de données.
If there are views, triggers, functions, stored procedures in the schema, those will need to be recreated too
. «RENAME TABLE» de MySQL échoue s'il existe des déclencheurs sur les tables. Pour y remédier, nous pouvons procéder comme suit:
1) Dump the triggers, events and stored routines in a separate file.
Cela se fait en utilisant les drapeaux -E, -R (en plus de -t -d qui vide les déclencheurs) à la commande mysqldump. Une fois les déclencheurs vidés, nous devrons les supprimer du schéma pour que la commande RENAME TABLE fonctionne.
$ mysqldump <old_schema_name> -d -t -R -E > stored_routines_triggers_events.out
2) Générez une liste de tables «BASE» uniquement. Ceux-ci peuvent être trouvés en utilisant une requête sur information_schema.TABLES
table.
mysql> select TABLE_NAME from information_schema.tables where
table_schema='<old_schema_name>' and TABLE_TYPE='BASE TABLE';
3) Videz les vues dans un fichier de sortie. Les vues peuvent être trouvées en utilisant une requête sur la même information_schema.TABLES
table.
mysql> select TABLE_NAME from information_schema.tables where
table_schema='<old_schema_name>' and TABLE_TYPE='VIEW';
$ mysqldump <database> <view1> <view2> … > views.out
4) Déposez les déclencheurs sur les tables en cours dans l'ancien_schéma.
mysql> DROP TRIGGER <trigger_name>;
...
5) Restaurez les fichiers de vidage ci-dessus une fois que toutes les tables «Base» trouvées à l'étape # 2 ont été renommées.
mysql> RENAME TABLE <old_schema>.table_name TO <new_schema>.table_name;
...
$ mysql <new_schema> < views.out
$ mysql <new_schema> < stored_routines_triggers_events.out
Intricités avec les méthodes ci-dessus: Il se peut que nous devions mettre à jour les SUBVENTIONS pour les utilisateurs afin qu'ils correspondent au nom de schéma correct. Ceux-ci pourraient être corrigés avec une simple MISE À JOUR sur mysql.columns_priv, mysql.procs_priv, mysql.tables_priv, les tables mysql.db mettant à jour le nom old_schema en new_schema et appelant «Privilèges de vidage;». Bien que la «méthode 2» semble un peu plus compliquée que la «méthode 1», elle est totalement scriptable. Un simple script bash pour exécuter les étapes ci-dessus dans le bon ordre peut vous aider à économiser de l'espace et du temps tout en renommant les schémas de base de données la prochaine fois.
L'équipe Percona Remote DBA a écrit un script appelé «rename_db» qui fonctionne de la manière suivante:
[root@dba~]# /tmp/rename_db
rename_db <server> <database> <new_database>
Pour démontrer l'utilisation de ce script, utilisé un exemple de schéma «emp», créé des déclencheurs de test, des routines stockées sur ce schéma. Essaiera de renommer le schéma de la base de données à l'aide du script, ce qui prend quelques secondes à terminer, contrairement à la méthode de vidage / restauration longue.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| emp |
| mysql |
| performance_schema |
| test |
+--------------------+
[root@dba ~]# time /tmp/rename_db localhost emp emp_test
create database emp_test DEFAULT CHARACTER SET latin1
drop trigger salary_trigger
rename table emp.__emp_new to emp_test.__emp_new
rename table emp._emp_new to emp_test._emp_new
rename table emp.departments to emp_test.departments
rename table emp.dept to emp_test.dept
rename table emp.dept_emp to emp_test.dept_emp
rename table emp.dept_manager to emp_test.dept_manager
rename table emp.emp to emp_test.emp
rename table emp.employees to emp_test.employees
rename table emp.salaries_temp to emp_test.salaries_temp
rename table emp.titles to emp_test.titles
loading views
loading triggers, routines and events
Dropping database emp
real 0m0.643s
user 0m0.053s
sys 0m0.131s
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| emp_test |
| mysql |
| performance_schema |
| test |
+--------------------+
Comme vous pouvez le voir dans la sortie ci-dessus, le schéma de base de données «emp» a été renommé «emp_test» en moins d'une seconde. Enfin, il s'agit du script de Percona utilisé ci-dessus pour la «méthode 2».
#!/bin/bash
# Copyright 2013 Percona LLC and/or its affiliates
set -e
if [ -z "$3" ]; then
echo "rename_db <server> <database> <new_database>"
exit 1
fi
db_exists=`mysql -h $1 -e "show databases like '$3'" -sss`
if [ -n "$db_exists" ]; then
echo "ERROR: New database already exists $3"
exit 1
fi
TIMESTAMP=`date +%s`
character_set=`mysql -h $1 -e "show create database $2\G" -sss | grep ^Create | awk -F'CHARACTER SET ' '{print $2}' | awk '{print $1}'`
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
STATUS=$?
if [ "$STATUS" != 0 ] || [ -z "$TABLES" ]; then
echo "Error retrieving tables from $2"
exit 1
fi
echo "create database $3 DEFAULT CHARACTER SET $character_set"
mysql -h $1 -e "create database $3 DEFAULT CHARACTER SET $character_set"
TRIGGERS=`mysql -h $1 $2 -e "show triggers\G" | grep Trigger: | awk '{print $2}'`
VIEWS=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='VIEW'" -sss`
if [ -n "$VIEWS" ]; then
mysqldump -h $1 $2 $VIEWS > /tmp/${2}_views${TIMESTAMP}.dump
fi
mysqldump -h $1 $2 -d -t -R -E > /tmp/${2}_triggers${TIMESTAMP}.dump
for TRIGGER in $TRIGGERS; do
echo "drop trigger $TRIGGER"
mysql -h $1 $2 -e "drop trigger $TRIGGER"
done
for TABLE in $TABLES; do
echo "rename table $2.$TABLE to $3.$TABLE"
mysql -h $1 $2 -e "SET FOREIGN_KEY_CHECKS=0; rename table $2.$TABLE to $3.$TABLE"
done
if [ -n "$VIEWS" ]; then
echo "loading views"
mysql -h $1 $3 < /tmp/${2}_views${TIMESTAMP}.dump
fi
echo "loading triggers, routines and events"
mysql -h $1 $3 < /tmp/${2}_triggers${TIMESTAMP}.dump
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
if [ -z "$TABLES" ]; then
echo "Dropping database $2"
mysql -h $1 $2 -e "drop database $2"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.columns_priv where db='$2'" -sss` -gt 0 ]; then
COLUMNS_PRIV=" UPDATE mysql.columns_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.procs_priv where db='$2'" -sss` -gt 0 ]; then
PROCS_PRIV=" UPDATE mysql.procs_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.tables_priv where db='$2'" -sss` -gt 0 ]; then
TABLES_PRIV=" UPDATE mysql.tables_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.db where db='$2'" -sss` -gt 0 ]; then
DB_PRIV=" UPDATE mysql.db set db='$3' WHERE db='$2';"
fi
if [ -n "$COLUMNS_PRIV" ] || [ -n "$PROCS_PRIV" ] || [ -n "$TABLES_PRIV" ] || [ -n "$DB_PRIV" ]; then
echo "IF YOU WANT TO RENAME the GRANTS YOU NEED TO RUN ALL OUTPUT BELOW:"
if [ -n "$COLUMNS_PRIV" ]; then echo "$COLUMNS_PRIV"; fi
if [ -n "$PROCS_PRIV" ]; then echo "$PROCS_PRIV"; fi
if [ -n "$TABLES_PRIV" ]; then echo "$TABLES_PRIV"; fi
if [ -n "$DB_PRIV" ]; then echo "$DB_PRIV"; fi
echo " flush privileges;"
fi