web-dev-qa-db-fra.com

Renommer la base de données MySQL

J'ai créé une base de données avec le nom hrms. Maintenant, je dois changer le nom de la base de données en sunhrm. Mais, il est désactivé dans MySQL Workbench. Puis-je le faire sur le serveur Linux lui-même?

102
Dhileepan

Je ne pense pas que tu peux faire ça. Je pense que vous aurez besoin de vider cette base de données, de créer celle qui vient d'être nommée, puis d'importer la copie. 

S'il s'agit d'un système en direct, vous devrez le supprimer. Si vous ne pouvez pas le faire, vous devrez configurer la réplication de cette base de données vers la nouvelle.

Si vous voulez voir les commandes pour faire cela, @jan a les détails .

59
New Alexandria

Si vous devez le faire depuis la ligne de commande, copiez, adaptez et collez cet extrait:

mysql -e "CREATE DATABASE \`new_database\`;"
for table in `mysql -B -N -e "SHOW TABLES;" old_database`
do 
  mysql -e "RENAME TABLE \`old_database\`.\`$table\` to \`new_database\`.\`$table\`"
done
mysql -e "DROP DATABASE \`old_database\`;"
68
jan

Il est possible de copier une base de données via la commande mysqldump sans enregistrer le dump dans un fichier:

  1. mysql -u root -p -e "create database my_new_database"
  2. mysqldump -u root -p original_database | mysql -u root -p my_new_database
  3. mysql -u root -p -e "drop database original_database"
33
Hryhorii Hrebiniuk

Vous pouvez créer une nouvelle base de données exactement comme celle qui existait auparavant, puis supprimer l'ancienne base de données lorsque vous avez terminé. Utilisez l'outil mysqldump pour créer une sauvegarde .sql de la base de données via mysqldump orig_db > orig_db.sql ou, si vous devez utiliser un nom d'utilisateur et un mot de passe, exécutez mysqldump -u root -p orig_db > orig_db.sql. orig_db est le nom de la base de données que vous souhaitez "renommer", root serait l'utilisateur que vous vous connectez et orig_db.sql était le fichier créé contenant la sauvegarde. Maintenant, créez une nouvelle base de données vide avec le nom que vous voulez pour la base de données. Par exemple, mysql -u root -p -e "create database new_db". Une fois que c'est fait, lancez mysql -u root -p new_db < orig_db.sql. new_db existe maintenant comme une copie parfaite de orig_db. Vous pouvez ensuite supprimer la base de données d'origine car vous l'avez maintenant dans la nouvelle base de données avec le nom de base de données souhaité.

Les étapes courtes et rapides sans toutes les explications ci-dessus sont les suivantes:

  1. mysqldump -u root -p original_database > original_database.sql
  2. mysql -u root -p -e "create database my_new_database"
  3. mysql -u root -p my_new_database < original_database.sql
  4. mysql -u root -p -e drop database originl_database

J'espère que cela vous aidera et qu'il s'agit d'un moyen fiable de le faire sans utiliser une méthode ad hoc qui corrompra vos données et créera des incohérences.

32
jetole

Vous pouvez le faire par instruction RENAME pour chaque table de votre "current_db" après avoir créé le nouveau schéma "other_db".

RENAME TABLE current_db.tbl_name TO other_db.tbl_name

Source Renommer la syntaxe de la table

21
Cristian Porta

Eh bien il y a 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 beaucoup de temps et d’espace. Que se passe-t-il si le schéma est supérieur à 100 Go? Il existe des méthodes où vous pouvez relier les commandes ci-dessus pour économiser de l'espace, mais cela ne vous fera pas gagner du temps.

Pour remédier à de telles situations, il existe une autre méthode rapide pour renommer schémas, cependant, certaines précautions doivent être prises en le faisant.

Méthode 2: MySQL possède une très bonne fonctionnalité pour renommer des tables qui fonctionnent même sur différents schémas. Cette opération de changement de nom est atomique et personne d'autre ne peut accéder à la table pendant qu'elle est renommée. Cela prend 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 renommer:

  1. Créez le nouveau schéma de base de données avec le nom souhaité.
  2. Renommez les tables de l’ancien schéma en nouveau schéma à l’aide de la commande “RENAME TABLE” de MySQL.
  3. Supprimez l'ancien schéma de base de données.

S'il y a views, triggers, functions, stored procedures dans le schéma, ceux-ci devront également être recréés. «RENAME TABLE» de MySQL échoue s’il existe des déclencheurs dans les tables. Pour remédier à cela, nous pouvons faire les choses suivantes:

1)Dump the triggers, events and stored routines in a separate file. Ceci est fait en utilisant les indicateurs -E, -R (en plus de -t -d qui Vide les déclencheurs) à la commande mysqldump. Une fois que les déclencheurs sont déchargés, nous devrons les supprimer du schéma pour RENAME TABLE commande au travail.

  $ mysqldump <old_schema_name> -d -t -R -E > stored_routines_triggers_events.out

2) Génère une liste de tables «BASE» uniquement. Ceux-ci peuvent être trouvés en utilisant un requête sur la table information_schema.TABLES.

 mysql> select TABLE_NAME from information_schema.tables where 
    table_schema='<old_schema_name>' and TABLE_TYPE='BASE TABLE';

3) Vide les vues dans un fichier de sortie. Les vues peuvent être trouvées en utilisant une requête sur la même table information_schema.TABLES.

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) Supprime les déclencheurs sur les tables actuelles de old_schema.

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

Intrication dans les méthodes ci-dessus: Il se peut que nous devions mettre à jour la GRANTS pour les utilisateurs, de sorte qu’ils correspondent au nom de schéma correct. Ceux-ci pourraient être corrigés avec une table UPDATE simple sur les tables mysql.columns_priv, mysql.procs_priv, mysql.tables_priv, mysql.db mettant à jour le old_schema name en new_schema et appelant “Privilèges de vidage;” . Bien que "method 2" semble un peu plus compliqué que le "method 1", c'est totalement scriptable. Un simple script bash permettant d'exécuter les étapes ci-dessus dans un ordre approprié peut vous aider à gagner du temps et de l'argent tout en renommant les schémas de base de données la prochaine fois.

L’équipe DBA de Percona Remote a écrit un script appelé «rename_db» qui fonctionne comme suit:

[root@dba~]# /tmp/rename_db
rename_db <server> <database> <new_database>

Pour illustrer l'utilisation de ce script, nous avons utilisé un exemple de schéma «emp», créé des déclencheurs de test et stocké des routines sur ce schéma. Nous allons essayer de renommer le schéma de base de données à l'aide du script, ce qui prend quelques secondes, contrairement à la méthode fastidieuse de sauvegarde/restauration.

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 «method 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
11
Sathish D

En bref non. On pense généralement qu'il est trop dangereux de renommer une base de données. MySQL a eu cette fonctionnalité pendant un moment, mais elle a été supprimée. Vous feriez mieux d'utiliser le plan de travail pour exporter le schéma et les données vers SQL, puis de modifier le nom CREATE DATABASE avant de l'exécuter/de l'importer.

4
Luke Wyatt

Pour les utilisateurs mysql impatients (comme moi), la solution est la suivante:

/etc/init.d/mysql stop
mv /var/lib/mysql/old_database /var/lib/mysql/new_database 
/etc/init.d/mysql start
3
user1972813

J'ai utilisé la méthode suivante pour renommer la base de données

  1. faire une sauvegarde du fichier en utilisant mysqldump ou n'importe quel outil de base de données, par exemple heidiSQL, administrateur mysql

  2. Ouvrez le fichier de sauvegarde (par exemple, backupfile.sql) dans un éditeur de texte.

  3. Rechercher et remplacer le nom de la base de données et enregistrer le fichier.

  4. Restaurer le fichier SQL édité

2
Adarsha

Si votre base de données ne contient que des tables MyISAM (do not utilisez cette méthode si vous avez des tables InnoDB):

  1. arrêter le serveur MySQL
  2. allez dans le répertoire mysql data et renommez le répertoire de la base de données (Remarque: les caractères non-alpha doivent être codés de manière spéciale)
  3. redémarrer le serveur
  4. ajustez les privilèges si nécessaire (accordez l'accès au nouveau nom de la base de données)

Vous pouvez scripter le tout en une seule commande, de sorte que le temps d'indisponibilité ne soit que d'une seconde ou deux.

2
rustyx

Commencez par sauvegarder l’ancienne base de données appelée HRMS et éditez le fichier de script en remplaçant Word HRMS par SUNHRM. Après cette étape, importez le fichier de base de données dans le mysql

0
Dhileepan

Un autre moyen de renommer la base de données ou de prendre une image de la base de données consiste à utiliser l'option de reverse engineering dans l'onglet base de données. Il créera un diagramme ERR pour la base de données. Renommez le schéma ici.

après cela, allez dans le menu Fichier et allez à exporter et transférer la base de données.

Ensuite, vous pouvez importer la base de données.

0
Benny