web-dev-qa-db-fra.com

Comment renommer rapidement une base de données MySQL (changer le nom du schéma)?

Le manuel MySQL à l'adresse MySQL couvre cela.

Habituellement, je vole juste la base de données et la réimporter avec un nouveau nom. Ce n'est pas une option pour les très grandes bases de données. Apparemment, RENAME {DATABASE | SCHEMA} db_name TO new_db_name;fait de mauvaises choses, n’existe que dans quelques versions et est une mauvaise idée en général .

Cela doit fonctionner avec InnoDB , qui stocke les choses très différemment de MyISAM .

896
deadprogrammer

Pour InnoDB, ceci semble fonctionner: créez la nouvelle base de données vide, puis renommez chaque table, tour à tour, dans la nouvelle base de données:

RENAME TABLE old_db.table TO new_db.table;

Vous devrez ensuite ajuster les autorisations.

Pour les scripts dans un shell, vous pouvez utiliser l’une des méthodes suivantes:

mysql -u username -ppassword old_db -sNe 'show tables' | while read table; \ 
    do mysql -u username -ppassword -sNe "rename table old_db.$table to new_db.$table"; done

Ou

for table in `mysql -u root -ppassword -s -N -e "use old_db;show tables from old_db;"`; do mysql -u root -ppassword -s -N -e "use old_db;rename table old_db.$table to new_db.$table;"; done;

Remarques:

  • Il n'y a pas d'espace entre l'option -p et le mot de passe. Si votre base de données n'a pas de mot de passe, supprimez la partie -u username -ppassword.
  • Si une table a un déclencheur, elle ne peut pas être déplacée vers une autre base de données en utilisant la méthode ci-dessus (cela entraînerait une erreur Trigger in wrong schema.). Si tel est le cas, utilisez une méthode traditionnelle pour cloner une base de données, puis supprimez l'ancienne:

    mysqldump old_db | mysql new_db

  • Si vous avez des procédures stockées, vous pouvez les copier ensuite:

    mysqldump -R old_db | mysql new_db

780
Thorsten

Utilisez ces quelques commandes simples:

mysqldump -u username -p -v olddatabase > olddbdump.sql
mysqladmin -u username -p create newdatabase
mysql -u username -p newdatabase < olddbdump.sql

Ou, pour réduire les E/S, utilisez ce qui suit comme suggéré par @Pablo Marin-Garcia:

mysqladmin -u username -p create newdatabase
mysqldump -u username -v olddatabase -p | mysql -u username -p -D newdatabase
422
hendrasaputra

Je pense que la solution est plus simple et a été suggérée par certains développeurs. phpMyAdmin a une opération pour cela.

Dans phpMyAdmin, sélectionnez la base de données que vous souhaitez sélectionner. Dans les onglets il y en a un qui s'appelle Opérations, allez à la section renommer. C'est tout.

Comme beaucoup l'ont suggéré, il crée une nouvelle base de données avec le nouveau nom, vide toutes les tables de l'ancienne base de données dans la nouvelle base de données et supprime l'ancienne.

Enter image description here

198
raphie

Vous pouvez utiliser SQL pour générer un script SQL afin de transférer chaque table de votre base de données source vers la base de données de destination.

Vous devez créer la base de données de destination avant d'exécuter le script généré à partir de la commande.

Vous pouvez utiliser l’un ou l’autre de ces deux scripts (j’avais suggéré à l’origine le premier et quelqu'un a "amélioré" ma réponse en utilisant GROUP_CONCAT. Faites votre choix, mais je préfère l’original):

SELECT CONCAT('RENAME TABLE $1.', table_name, ' TO $2.', table_name, '; ')
FROM information_schema.TABLES 
WHERE table_schema='$1';

ou

SELECT GROUP_CONCAT('RENAME TABLE $1.', table_name, ' TO $2.', table_name SEPARATOR '; ')
FROM information_schema.TABLES 
WHERE table_schema='$1';

(1 $ et 2 $ sont respectivement la source et la cible)

Cela générera une commande SQL que vous devrez ensuite exécuter.

Notez que GROUP_CONCAT a une limite de longueur par défaut qui peut être dépassée pour les bases de données contenant un grand nombre de tables. Vous pouvez modifier cette limite en exécutant SET SESSION group_concat_max_len = 100000000; (ou un autre grand nombre).

100
ErichBSchulz

Émulation de la commande RENAME DATABASE manquante dans MySQL:

  1. Créer une nouvelle base de données
  2. Créez les requêtes de renommer avec:

    SELECT CONCAT('RENAME TABLE ',table_schema,'.',table_name,
        ' TO ','new_schema.',table_name,';')
    FROM information_schema.TABLES
    WHERE table_schema LIKE 'old_schema';
    
  3. Exécuter cette sortie

  4. Supprimer l'ancienne base de données

Il a été extrait de émulation de la commande manquante RENAME DATABASE dans MySQL.

35
Marciano

Trois options:

  1. Créez la nouvelle base de données, arrêtez le serveur, déplacez les fichiers d'un dossier de base de données à l'autre et redémarrez le serveur. Notez que cela ne fonctionnera que si TOUTES vos tables sont en MyISAM.

  2. Créez la nouvelle base de données, utilisez les instructions CREATE TABLE ... LIKE, puis utilisez les instructions INSERT ... SELECT * FROM.

  3. Utilisez mysqldump et rechargez avec ce fichier.

24
longneck

La manière simple

Accédez au répertoire de la base de données:

cd /var/lib/mysql/

Arrêtez MySQL ... C'est important!

/etc/init.d/mysql stop

D'accord, cette méthode ne fonctionne pas pour InnoDB ou BDB-Databases.

Renommer la base de données:

mv old-name new-name

... ou la table ...

cd database/

mv old-name.frm new-name.frm

mv old-name.MYD new-name.MYD

mv old-name.MYI new-name.MYI

Redémarrez MySQL

/etc/init.d/mysql start

Terminé...

OK, cette méthode ne fonctionne pas avec les bases de données InnoDB ou BDB. Dans ce cas, vous devez vider la base de données et la réimporter.

24
DeeCee

Vous pouvez utiliser ce script shell:

Référence: Comment renommer une base de données MySQL?

#!/bin/bash
set -e # terminate execution on command failure

mysqlconn="mysql -u root -proot"
olddb=$1
newdb=$2
$mysqlconn -e "CREATE DATABASE $newdb"
params=$($mysqlconn -N -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES \
                           WHERE table_schema='$olddb'")
for name in $params; do
      $mysqlconn -e "RENAME TABLE $olddb.$name to $newdb.$name";
done;
$mysqlconn -e "DROP DATABASE $olddb"

Ça marche:

$ sh rename_database.sh oldname newname
20
Grijesh Chauhan

Je viens de trouver une façon très agréable de le faire, je travaille avec MyISAM et InnoDB, et je vais très vite:

RENAME TABLE old_db.table TO new_db.table;

Je ne me souviens pas où je l'ai lu, mais le mérite revient à quelqu'un d'autre, pas à moi.

19
Amr Mostafa

C'est ce que j'utilise:

$ mysqldump -u root -p olddb >~/olddb.sql
$ mysql -u root -p
mysql> create database newdb;
mysql> use newdb
mysql> source ~/olddb.sql
mysql> drop database olddb;
15
eaykin

Le moyen le plus simple de procéder à un complet renommer (y compris en supprimant l'ancienne base de données à la fin, de sorte qu'il s'agisse d'un renommage plutôt que d'une copie) :

mysqladmin -uroot -pmypassword create newdbname
mysqldump -uroot -pmypassword --routines olddbname | mysql -uroot -pmypassword newdbname
mysqladmin -uroot -pmypassword drop olddbname

Étapes:

  1. Copiez les lignes dans le bloc-notes.
  2. Remplacez toutes les références à "olddbname", "newdbname", "mypassword" (+ éventuellement "root") par vos équivalents.
  3. Exécutez-les un par un sur la ligne de commande (en entrant "y" à l'invite).
15
Steve Chambers

Pour le moment, MySQL ne prend pas en charge le changement de nom d'une base de données via son interface de commande, mais vous pouvez renommer la base de données si vous avez accès au répertoire dans lequel MySQL stocke ses bases de données. Pour les installations MySQL par défaut, cela se trouve généralement dans le répertoire Data du répertoire dans lequel MySQL a été installé. Localisez le nom de la base de données que vous souhaitez renommer dans le répertoire Data et renommez-le. Renommer le répertoire peut cependant entraîner des problèmes d'autorisations. Savoir.

Note: Vous devez arrêter MySQL avant de pouvoir renommer la base de données.

Je recommanderais de créer une nouvelle base de données (en utilisant le nom de votre choix) et d'exporter/importer les données dont vous avez besoin, de l'ancien au nouveau. Assez simple.

14
bryanpearson

Lorsque vous renommez une base de données dans PHPMyAdmin, un dump est créé, puis supprimé et recréé la base de données avec le nouveau nom.

13
UnkwnTech

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 simple, 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 permettant de relier ensemble les commandes ci-dessus pour gagner de la place, mais cela ne fera pas gagner du temps.

Pour remédier à de telles situations, il existe une autre méthode rapide pour renommer les schémas. Toutefois, vous devez faire preuve de prudence.

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 changer le nom d’une table ou son schéma n’est qu’un changement de métadonnées. Voici l'approche procédurale pour renommer:

Créez le nouveau schéma de base de données avec le nom souhaité. Renommez les tables de l’ancien schéma en nouveau schéma à l’aide de 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 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. Cette opération est effectuée à l'aide des indicateurs -E, -R (en plus de -t -d qui désactive les déclencheurs) à la commande mysqldump. Une fois que les déclencheurs sont 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 la table information_schema.TABLES.

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

) 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) Supprimez les déclencheurs des 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 GRANTS pour les utilisateurs de sorte qu'ils correspondent au nom de schéma correct. Ceux-ci pourraient être corrigés avec un simple UPDATE sur les tables mysql.columns_priv, mysql.procs_priv, mysql.tables_priv, mysql.db mettant à jour le nom old_schema en new_schema et appelant "privilèges Flush;". 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 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 "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
12
Sathish D

Pour ceux qui utilisent Mac, Sequel Pro a une option Renommer la base de données dans le menu Base de données. http://www.sequelpro.com/

12
Duke

La plupart des réponses ici sont fausses pour l'une des deux raisons suivantes:

  1. Vous ne pouvez pas utiliser simplement RENAME TABLE, car il peut y avoir des vues et des déclencheurs. S'il y a des déclencheurs, RENAME TABLE échoue
  2. Vous ne pouvez pas utiliser mysqldump si vous voulez "rapidement" (comme demandé dans la question) renommer une base de données volumineuse

Percona a publié un article sur son blog: https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/

et script posté (réalisé?) par Simon R Jones qui fait ce qui est suggéré dans ce post. J'ai corrigé un bug que j'ai trouvé dans le script. Tu peux le voir ici:

https://Gist.github.com/ryantm/76944318b0473ff25993ef2a7186213d

En voici une copie:

#!/bin/bash
# Copyright 2013 Percona LLC and/or its affiliates
# @see https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/
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 "SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name = '$2'" -sss`
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

Enregistrez-le dans un fichier appelé rename_db et créez le script avec chmod +x rename_db, puis utilisez-le comme ./rename_db localhost old_db new_db.

9
ryantm

Il est possible de renommer toutes les tables d'une base de données afin de les placer sous une autre base de données sans avoir à effectuer une sauvegarde et une restauration complètes.

 DROP PROCEDURE IS EXISTS mysql.rename_db; 
 DELIMITER || 
 CREATE PROCEDURE mysql.rename_db (IN old_db VARCHAR (100), IN new_db VARCHAR (100)) 
 BEGIN 
 SELECT CONCAT ('CREATE DATABASE', new_db, ';') `# créer une nouvelle base de données`; 
 SELECT CONCAT ('RENAME TABLE`', old_db, '`.`', nom_table, '' TO '', new_db, '`.`', nom_table, ''; ')' # alter table` FROM information_schema.tables WHERE table_schema = old_db; 
 SELECT CONCAT ('DROP DATABASE' , old_db, ''; ')' # drop old database`; 
 END || 
 DELIMITER; 
 
 $ time mysql -uroot -e "call mysql .rename_db ('db1', 'db2'); " | mysql -uroot 

Cependant, tous les déclencheurs de la base de données cible ne seront pas satisfaits. Vous devrez d'abord les supprimer, puis les recréer après le changement de nom.

 mysql -uroot -e "appelle mysql.rename_db ('test', 'blah2');" | mysql -uroot 
 ERREUR 1435 (HY000) à la ligne 4: Déclencher dans un schéma incorrect 
9
TodoInTX

Pas :

  1. Hit http: // localhost/phpmyadmin /
  2. Sélectionnez votre base de données
  3. Cliquez sur l'onglet Opérations
  4. Il y aura un onglet "Renommer la base de données en". Ajoutez un nouveau nom et cochez Ajuster les privilèges.
  5. Cliquez sur Go.

enter image description here

8
Shubham Jain

Voici un fichier de commandes que j'ai écrit pour l'automatiser à partir de la ligne de commande, mais pour Windows/MS-DOS.

La syntaxe est la suivante: rename_mysqldb base de données newdatabase -u [utilisateur] -p [mot de passe]

:: ***************************************************************************
:: FILE: RENAME_MYSQLDB.BAT
:: ***************************************************************************
:: DESCRIPTION
:: This is a Windows /MS-DOS batch file that automates renaming a MySQL database 
:: by using MySQLDump, MySQLAdmin, and MySQL to perform the required tasks.
:: The MySQL\bin folder needs to be in your environment path or the working directory.
::
:: WARNING: The script will delete the original database, but only if it successfully
:: created the new copy. However, read the disclaimer below before using.
::
:: DISCLAIMER
:: This script is provided without any express or implied warranties whatsoever.
:: The user must assume the risk of using the script.
::
:: You are free to use, modify, and distribute this script without exception.
:: ***************************************************************************

:INITIALIZE
@ECHO OFF
IF [%2]==[] GOTO HELP
IF [%3]==[] (SET RDB_ARGS=--user=root) ELSE (SET RDB_ARGS=%3 %4 %5 %6 %7 %8 %9)
SET RDB_OLDDB=%1
SET RDB_NEWDB=%2
SET RDB_DUMPFILE=%RDB_OLDDB%_dump.sql
GOTO START

:START
SET RDB_STEP=1
ECHO Dumping "%RDB_OLDDB%"...
mysqldump %RDB_ARGS% %RDB_OLDDB% > %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=2
ECHO Creating database "%RDB_NEWDB%"...
mysqladmin %RDB_ARGS% create %RDB_NEWDB%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=3
ECHO Loading dump into "%RDB_NEWDB%"...
mysql %RDB_ARGS% %RDB_NEWDB% < %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=4
ECHO Dropping database "%RDB_OLDDB%"...
mysqladmin %RDB_ARGS% drop %RDB_OLDDB% --force
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=5
ECHO Deleting dump...
DEL %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
ECHO Renamed database "%RDB_OLDDB%" to "%RDB_NEWDB%".
GOTO END

:ERROR_ABORT
IF %RDB_STEP% GEQ 3 mysqladmin %RDB_ARGS% drop %NEWDB% --force
IF %RDB_STEP% GEQ 1 IF EXIST %RDB_DUMPFILE% DEL %RDB_DUMPFILE%
ECHO Unable to rename database "%RDB_OLDDB%" to "%RDB_NEWDB%".
GOTO END

:HELP
ECHO Renames a MySQL database.
ECHO Usage: %0 database new_database [OPTIONS]
ECHO Options: Any valid options shared by MySQL, MySQLAdmin and MySQLDump.
ECHO          --user=root is used if no options are specified.
GOTO END    

:END
SET RDB_OLDDB=
SET RDB_NEWDB=
SET RDB_ARGS=
SET RDB_DUMP=
SET RDB_STEP=
7
Johnny

La procédure stockée de TodoInTX n'a ​​pas fonctionné pour moi. Voici mon coup de poignard:

 - procédure stockée rename_db: Renommez une base de données avec mon moyen de copie de table. 
 - Mises en garde: 
 - Bloque toute base de données existante portant le même nom que le 'nouveau' nom de la base de données. 
 - copie SEULEMENT les tables; les procédures stockées et les autres objets de base de données ne sont pas copiés. 
 - Tomer Altman ([email protected]) 
 
 délimiteur //
DROP PROCÉDURE SI EXISTE rename_db; 
 CREATE PROCEDURE rename_db (IN old_db VARCHAR (100), IN new_db VARCHAR (100)) 
 BEGIN 
 DÉCLARER table_actuelle VARCHAR (100); 
 DÉCLARER terminé INT DEFAULT 0; 
 DECLARE old_tables CURSOR FOR sélectionnez nom_table dans information_schema.tables où schéma_schema = old_db; 
 DECLARE CONTINUEZ HANDLER FOR NOT FOUND SET done = 1; 
 
. SET @output = CONCAT ('DROP SCHEMA IF EXISTS', new_db, ';'); 
 PREPAREZ-VOUS DEPUIS @output; 
 EXECUTE stmt; 
 
 SET @output = CONCAT ('CREATE SCHEMA WITH NOT EXISTS', new_db, ';'); 
 PRÉPAREZ la gestion à partir de la sortie; 
 EXÉCUTER la commande; 
 
 OPEN old_tables; 
 REPEAT 
 FETCH old_tables INTO current_table; 
 SI CE n'est pas fait ALORS 
 SET @output = CONCAT ('alter table', old_db, '.', Current_table, 'renommer', new_db, '.', Current_table, ';'); 
 PRÉPAREZ-VOUS À PARTIR DE LA SORTIE; 
 EXÉCUTEZ stmt; 
 
 END SI; 
 JUSQU'À terminé END REPEAT; CLOSE old_tables; 
 
 END //
 Délimiteur; 
7
user757945

Pour votre commodité, voici un petit script shell qui doit être exécuté avec deux paramètres: nom_base et nouveau nom_base.

Vous devrez peut-être ajouter des paramètres de connexion aux lignes mysql si vous n'utilisez pas le fichier .my.cnf dans votre répertoire home. S'il vous plaît faire une sauvegarde avant d'exécuter ce script.


#!/usr/bin/env bash

mysql -e "CREATE DATABASE $2 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;"
for i in $(mysql -Ns $1 -e "show tables");do
    echo "$1.$i -> $2.$i"
    mysql -e "rename TABLE $1.$i to $2.$i"
done
mysql -e "DROP DATABASE $1"
6
gerrit damen

I pose une question sur Server Fault essayant de réduire les temps d'arrêt lors de la restauration de bases de données très volumineuses à l'aide du proxy MySQL. Je n’ai eu aucun succès, mais j’ai finalement compris que je voulais utiliser la fonctionnalité RENAME DATABASE, car la sauvegarde/importation n’était pas une option en raison de la taille de notre base de données.

Il existe une fonctionnalité RENAME TABLE intégrée à MySQL. J'ai donc fini par écrire un simple script Python pour faire le travail à ma place. J'ai posté sur GitHub au cas où cela pourrait être utile à d'autres.

6
cclark

La méthode la plus simple consiste à utiliser le logiciel HeidiSQL. C'est gratuit et open source. Il fonctionne sous Windows et sous Linux avec Wine (exécute des applications Windows sous Linux, BSD, Solaris et Mac OS X).

Pour télécharger HeidiSQL, allez à http://www.heidisql.com/download.php .

Pour télécharger Wine, goto http://www.winehq.org/ .

Pour renommer une base de données dans HeidiSQL, cliquez avec le bouton droit de la souris sur le nom de la base de données et sélectionnez "Modifier". Puis entrez un nouveau nom et appuyez sur 'OK'.

C'est si simple.

5
Fathah Rehman P

Voici un moyen rapide de générer un script SQL renommé, si vous devez déplacer plusieurs tables.

SELECT DISTINCT CONCAT('RENAME TABLE ', t.table_schema,'.', t.table_name, ' TO ',     
t.table_schema, "_archive", '.', t.table_name, ';' ) as Rename_SQL 
FROM information_schema.tables t
WHERE table_schema='your_db_name' ;
4
yantaq

Il semble que personne ne l’a mentionné, mais voici un autre moyen:

create database NewDatabaseName like OldDatabaseName;

puis pour chaque table faire:

create NewDatabaseName.tablename like OldDatabaseName.tablename;
insert into NewDataBaseName.tablename select * from OldDatabaseName.tablename;

alors, si vous voulez,

drop database OldDatabaseName;

Cette approche aurait l’avantage de faire l’ensemble du transfert sur le serveur avec un trafic réseau quasi nul, donc elle ira beaucoup plus vite qu’une sauvegarde/restauration.

Si vous avez des procédures/vues/etc stockées, vous pouvez également les transférer.

4
Tuncay Göncüoğlu

Pour les utilisateurs de Mac, vous pouvez utiliser Sequel Pro (gratuit), qui offre simplement la possibilité de renommer des bases de données. Bien qu'il ne supprime pas l'ancienne base de données.

une fois que vous avez ouvert le DB correspondant, cliquez simplement sur: Database -> Rename database...

4
Roee Gavirel

Dans l’administrateur MySQL, procédez comme suit:

  1. Sous Catalogues, créez un nouveau schéma de base de données.
  2. Accédez à Sauvegarde et créez une sauvegarde de l'ancien schéma.
  3. Exécuter la sauvegarde.
  4. Allez à Restaurer et ouvrez le fichier créé à l'étape 3.
  5. Sélectionnez 'Another Schema' sous Target Schema et sélectionnez le nouveau schéma de base de données.
  6. Démarrer la restauration.
  7. Vérifiez le nouveau schéma et, s'il semble bon, supprimez l'ancien.
3
Tom

dans phpmyadmin vous pouvez facilement renommer la base de données

select database 

  goto operations tab

  in that rename Database to :

  type your new database name and click go

demander de supprimer l'ancienne table et de recharger les données de la table, cliquez sur OK dans les deux cas

Votre base de données est renommée

3
murtaza.webdev

Si vous utilisez phpMyAdmin , vous pouvez accéder à l'onglet "Opérations" une fois que vous avez sélectionné la base de données que vous souhaitez renommer. Ensuite, allez à la dernière section "Copier la base de données vers" (ou quelque chose comme ça), donnez un nom et sélectionnez les options ci-dessous. Dans ce cas, je suppose que vous devez cocher les cases "structure et données" et "créer la base de données avant la copie", puis appuyer sur le bouton "Aller" de cette section.

Au fait, j'utilise phpMyAdmin en espagnol, je ne suis donc pas sûr du nom des sections en anglais.

3
ecruz

Voici un extrait de code Bash d'une ligne permettant de déplacer toutes les tables d'un schéma à un autre:

history -d $((HISTCMD-1)) && mysql -udb_user -p'db_password' -Dold_schema -ABNnqre'SHOW TABLES;' | sed -e's/.*/RENAME TABLE old_schema.`&` TO new_schema.`&`;/' | mysql -udb_user -p'db_password' -Dnew_schema

La commande history au début garantit simplement que les commandes MySQL contenant des mots de passe ne sont pas enregistrées dans l'historique Shell.

Assurez-vous que db_user dispose des autorisations de lecture/écriture/suppression sur l'ancien schéma et des autorisations de lecture/écriture/création sur le nouveau schéma.

3
coffeefiend

Je l'ai fait de cette façon: Faites une sauvegarde de votre base de données existante. Il vous donnera un db.Zip.tmp puis dans la commande Invite écrire après

"C:\Fichiers de programme (x86)\MySQL\Serveur MySQL 5.6\bin\mysql.exe" -h localhost -u racine -p [mot de passe] [nouveau nom de la base de données] <"C:\Backups\db.Zip.tmp "

3
Samra

ALTER DATABASE est la solution proposée par MySQL et _RENAME DATABASE_ est supprimé.

De syntaxe de 13.1.32 RENAME DATABASE:

_RENAME {DATABASE | SCHEMA} db_name TO new_db_name;
_

Cette instruction a été ajoutée dans MySQL 5.1.7, mais elle s’est avérée dangereuse et a été supprimée dans MySQL 5.1.23.

3
xelber

Vous pouvez le faire de deux manières.

  1. RENAME TABLE old_db.nom_table TO new_db.nom_table;
  2. Aller aux opérations-> vous pouvez voir l'onglet Options de la table. vous pouvez éditer le nom de la table ici.
2
jeeva

Voici le script de traitement par lots que j'ai écrit pour renommer une base de données sous Windows:

@echo off
set olddb=olddbname
set newdb=newdbname
SET count=1
SET act=mysql -uroot -e "select table_name from information_schema.tables where table_schema='%olddb%'"
mysql -uroot -e "create database %newdb%"
echo %act%
 FOR /f "tokens=*" %%G IN ('%act%') DO (
  REM echo %count%:%%G
  echo mysql -uroot -e "RENAME TABLE %olddb%.%%G to %newdb%.%%G"
  mysql -uroot -e "RENAME TABLE %olddb%.%%G to %newdb%.%%G"
  set /a count+=1
 )
mysql -uroot -e "drop database %olddb%"
2
Nadav Benedek

Cela fonctionne pour toutes les bases de données et en renommant chaque table avec maatkit mysql toolkit

Utilisez mk-find pour imprimer et renommer chaque table. Le page de manuel a beaucoup plus d'options et d'exemples

mk-find --dblike OLD_DATABASE --print --exec "RENAME TABLE %D.%N TO NEW_DATABASE.%N"

Si vous avez installé maatkit ( ce qui est très facile ), c'est la manière la plus simple de le faire.

2

Dans le cas où vous démarrez à partir d'un fichier de vidage avec plusieurs bases de données, vous pouvez effectuer un sed sur le vidage:

sed -i -- "s|old_name_database1|new_name_database1|g" my_dump.sql
sed -i -- "s|old_name_database2|new_name_database2|g" my_dump.sql
...

Puis importez votre dump. Assurez-vous simplement qu'il n'y aura pas de conflit de noms.

1
RotS

Ni la solution de TodoInTx ni la solution adaptée de user757945 ne fonctionnaient pour moi sur MySQL 5.5.16, voici donc ma version adaptée:

DELIMITER //
DROP PROCEDURE IF EXISTS `rename_database`;
CREATE PROCEDURE `rename_database` (IN `old_name` VARCHAR(20), IN `new_name` VARCHAR(20))
BEGIN
  DECLARE `current_table_name` VARCHAR(20);
  DECLARE `done` INT DEFAULT 0;
  DECLARE `table_name_cursor` CURSOR FOR SELECT `table_name` FROM `information_schema`.`tables` WHERE (`table_schema` = `old_name`);
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET `done` = 1;

  SET @sql_string = CONCAT('CREATE DATABASE IF NOT EXISTS `', `new_name` , '`;');
  PREPARE `statement` FROM @sql_string;
  EXECUTE `statement`;
  DEALLOCATE PREPARE `statement`;

  OPEN `table_name_cursor`;
  REPEAT
    FETCH `table_name_cursor` INTO `current_table_name`;
    IF NOT `done` THEN

      SET @sql_string = CONCAT('RENAME TABLE `', `old_name`, '`.`', `current_table_name`, '` TO `', `new_name`, '`.`', `current_table_name`, '`;');
      PREPARE `statement` FROM @sql_string;
      EXECUTE `statement`;
      DEALLOCATE PREPARE `statement`;

    END IF;
  UNTIL `done` END REPEAT;
  CLOSE `table_name_cursor`;

  SET @sql_string =  CONCAT('DROP DATABASE `', `old_name`, '`;');
  PREPARE `statement` FROM @sql_string;
  EXECUTE `statement`;
  DEALLOCATE PREPARE `statement`;
END//
DELIMITER ;

J'espère que ça aide quelqu'un qui est dans ma situation! Remarque: @sql_string s'attardera ensuite dans la session. Je n'ai pas pu écrire cette fonction sans l'utiliser.

1
Milosz

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, etc.

  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. Restaurez le fichier SQL modifié

1
Adarsha

Si vous utilisez des vues hiérarchiques (des vues extrayant des données d'autres vues), l'importation de la sortie brute de mysqldump risque de ne pas fonctionner car mysqldump ne se soucie pas de l'ordre correct des vues. Pour cette raison, je script écrit qui réordonne les vues pour corriger l'ordre à la volée.

Ça ressemble à ça:

#!/usr/bin/env Perl

use List::MoreUtils 'first_index'; #apt package liblist-moreutils-Perl
use strict;
use warnings;


my $views_sql;

while (<>) {
    $views_sql .= $_ if $views_sql or index($_, 'Final view structure') != -1;
    print $_ if !$views_sql;
}

my @views_regex_result = ($views_sql =~ /(\-\- Final view structure.+?\n\-\-\n\n.+?\n\n)/msg);
my @views = (join("", @views_regex_result) =~ /\-\- Final view structure for view `(.+?)`/g);
my $new_views_section = "";
while (@views) {
    foreach my $view (@views_regex_result) {
        my $view_body = ($view =~ /\/\*.+?VIEW .+ AS (select .+)\*\/;/g )[0];
        my $found = 0;
        foreach my $view (@views) {
            if ($view_body =~ /(from|join)[ \(]+`$view`/) {
                $found = $view;
                last;
            }
        }
        if (!$found) {
            print $view;
            my $name_of_view_which_was_not_found = ($view =~ /\-\- Final view structure for view `(.+?)`/g)[0];
            my $index = first_index { $_ eq $name_of_view_which_was_not_found } @views;
            if ($index != -1) {
                splice(@views, $index, 1);
                splice(@views_regex_result, $index, 1);
            }
        }
    }
}

Usage:
mysqldump -u username -v olddatabase -p | ./mysqldump_view_reorder.pl | mysql -u username -p -D newdatabase

1
gadelat

Vous allez me tirer dessus pour ça, et très probablement ça ne marchera pas à chaque fois, et bien sûr, c'est contre toute logique bla bla ... Mais ce que je viens d'essayer c'est ... ARRÊTEZ le moteur MySQL, connectez-vous en tant que root et simplement renommé la base de données au niveau du système de fichiers ....

Je suis sur OSX, et seulement changé le cas, de bedbf à BEDBF. À ma grande surprise, ça a marché...

Je ne le recommanderais pas sur une base de données de production. Je viens d'essayer cela comme une expérience ...

Bonne chance de toute façon :-)

0
Lawrence

J'ai posté ceci Comment puis-je changer le nom de la base de données en utilisant MySQL? aujourd'hui après des jours de grattage à la tête et d'arrachage de poils. La solution est assez simple: exportez un schéma dans un fichier .sql, ouvrez-le et modifiez le nom de la base de données/schéma dans la section sql CREAT TABLE située en haut. Il existe trois instances ou plus et peuvent ne pas figurer en haut de la page si des schémas multibles sont enregistrés dans le fichier. Il est possible d’éditer toute la base de données de cette façon, mais je pense que dans le cas de grandes bases de données, il pourrait être très pénible de suivre toutes les occurrences d’une propriété de table ou d’un index.

0
E.R.Rider

I) .Il n’existe aucun moyen de modifier directement le nom d’un DB existant, mais vous pouvez atteindre votre objectif en procédant comme suit: - 1). Créer newdb. 2) Utilisez newdb. 3) create table nom_table (sélectionnez * à partir de olddb.nom_table);

En procédant ci-dessus, copiez les données de la table de olddb et insérez-les dans la table newdb. Donnez le même nom de la table.

II). RENAME TABLE old_db.nom_table TO new_db.nom_table;

0
rajesh