Question

Le manuel MySQL sur MySQL couvre cela.

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

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

Était-ce utile?

La solution

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;

Notes:

  • 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 à l'aide de la méthode ci-dessus (cela entraînerait une erreur de déclencheur dans un schéma incorrect ). 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 ultérieurement:

    mysqldump -R old_db | mysql new_db

Autres conseils

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 les éléments suivants, 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

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.

Entrez la description de l'image ici>

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 scripts (j'avais suggéré à l'origine le premier et quelqu'un qui avait "amélioré" ma réponse afin d'utiliser 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)

Ceci 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).

É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 changement de nom 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

Cela provient de la Emulation de la commande manquante RENAME DATABASE dans MySQL .

Trois options:

  1. Créez la nouvelle base de données, fermez 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.

Le moyen le plus 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.

Je viens de découvrir un très bon moyen de le faire, fonctionne avec MyISAM et InnoDB et est très rapide:

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 que moi.

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"

Cela fonctionne:

$ sh rename_database.sh oldname newname

Voici 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;

La manière la plus simple de procéder à un renommage complet (y compris en supprimant l'ancienne base de données à la fin afin 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 "racine") avec vos équivalents.
  3. Exécutez les commandes un par un sur la ligne de commande (en entrant "y" à l'invite).

MySQL ne prend pas en charge le changement de nom d'une base de données via son interface de commande pour le moment, 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é. Recherchez 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. Soyez conscient.

Remarque: vous devez arrêter MySQL avant de pouvoir renommer la base de données

.

Je vous 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'ancienne à la nouvelle. Assez simple.

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.

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

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).

À partir 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 du temps et de l’espace. Que se passe-t-il si le schéma dépasse <<> 100 Go? ? Il existe des méthodes permettant de lier les commandes ci-dessus pour économiser de l'espace, 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 attention lorsque vous le faites.

Méthode 2: MySQL offre une très bonne fonctionnalité pour renommer des tables, qui fonctionne même dans 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 la modification du nom ou du schéma d’une table 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, à l'aide de MySQL & # 8220; RENAME TABLE & # 8221; commander. Supprimez l'ancien schéma de base de données. S'il existe des vues, des déclencheurs, des fonctions et des procédures stockées dans le schéma, ceux-ci devront également être recréés . MySQL & # 8217; s & # 8220; RENAME TABLE & # 8221; échoue s'il existe des déclencheurs sur les tables. Pour remédier à cela, nous pouvons procéder comme suit:

1) Sauvegardez les déclencheurs, les événements et les routines stockées dans un fichier séparé. Cette opération est effectuée à l'aide des indicateurs -E, -R (en plus de -t -d qui affiche les déclencheurs) dans 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 contenant uniquement & # 8220; BASE & # 8221; les tables. 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';

3) Videz les vues dans un fichier de sortie. Les vues peuvent être trouvées à l'aide d'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 l'ancien schéma.

mysql> DROP TRIGGER <trigger_name>;
...

5) Restaurez les fichiers de vidage ci-dessus une fois tous les fichiers & # 8220; Base & # 8221; les tables trouvées à l'étape 2 sont 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

Inconvénients des méthodes ci-dessus: il se peut que nous devions mettre à jour les subventions pour les utilisateurs de sorte qu'elles correspondent au nom de schéma correct. Celles-ci pourraient être corrigées avec un simple message 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 en appelant les privilèges Flush; # 8221 ;. Bien que & # 8220; méthode 2 & # 8243; Cela semble un peu plus compliqué que la & # 8220; méthode 1 & # 8243 ;, cela 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.

L’équipe DBA de Percona Remote a écrit un script intitulé & # 8220; Rename_db & # 8221; cela fonctionne de la manière suivante:

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

Pour illustrer l'utilisation de ce script, utilisez un exemple de schéma & # 8220; emp & # 8221 ;, créé des déclencheurs de test et des routines stockées 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, par opposition à 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 constater ci-dessus, le schéma de base de données & # 8220; emp & # 8221; a été renommé & # 8220; emp_test & # 8221; en moins d'une seconde. Enfin, il s'agit du script de Percona utilisé ci-dessus pour la & # 8220; méthode 2 & # 8243;.

#!/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

Il est possible de renommer toutes les tables d'une base de données afin de les placer dans une autre base de données sans effectuer de vidage ni de restauration complets.

DROP PROCEDURE IF 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, ';') `# create new database`;
SELECT CONCAT('RENAME TABLE `', old_db, '`.`', table_name, '` TO `', new_db, '`.`', table_name, '`;') `# 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, 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 "call mysql.rename_db('test', 'blah2');" | mysql -uroot
ERROR 1435 (HY000) at line 4: Trigger in wrong schema

La plupart des réponses fournies 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 grande base de données

Percona publie un article sur son blog: https://www.percona.com/blog/ 2013/12/24 / renommer-base de données-schéma-mysql /

et le 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. Vous pouvez le voir ici:

https://gist.github.com/ryantm/76944318b0473ff0993ef0a7186213d

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 nommé rename_db et rendez le script exécutable avec chmod + x rename_db , puis utilisez-le comme ./ rename_db localhost old_db new_db

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

Syntaxe: rename_mysqldb database 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=

La procédure stockée de TodoInTX ne fonctionnait pas vraiment pour moi. Voici mon coup de poignard:

-- stored procedure rename_db: Rename a database my means of table copying.
-- Caveats: 
-- Will clobber any existing database with the same name as the 'new' database name.
-- ONLY copies tables; stored procedures and other database objects are not copied.
-- Tomer Altman (taltman@ai.sri.com)

delimiter //
DROP PROCEDURE IF EXISTS rename_db;
CREATE PROCEDURE rename_db(IN old_db VARCHAR(100), IN new_db VARCHAR(100))
BEGIN
    DECLARE current_table VARCHAR(100);
    DECLARE done INT DEFAULT 0;
    DECLARE old_tables CURSOR FOR select table_name from information_schema.tables where table_schema = old_db;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    SET @output = CONCAT('DROP SCHEMA IF EXISTS ', new_db, ';'); 
    PREPARE stmt FROM @output;
    EXECUTE stmt;

    SET @output = CONCAT('CREATE SCHEMA IF NOT EXISTS ', new_db, ';');
    PREPARE stmt FROM @output;
    EXECUTE stmt;

    OPEN old_tables;
    REPEAT
        FETCH old_tables INTO current_table;
        IF NOT done THEN
        SET @output = CONCAT('alter table ', old_db, '.', current_table, ' rename ', new_db, '.', current_table, ';');
        PREPARE stmt FROM @output;
        EXECUTE stmt;

        END IF;
    UNTIL done END REPEAT;

    CLOSE old_tables;

END//
delimiter ;

Étapes:

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

 entrez la description de l'image ici

Je a posé une question sur Server Fault afin d'éviter les temps morts 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 ce que je voulais, c’était 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 écrit un script Python simple pour faire le travail à ma place. J'ai posté sur GitHub au cas où cela pourrait être utile à d'autres.

Pour votre commodité, vous trouverez ci-dessous 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. Faites 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"

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écuter des applications Windows sur Linux, BSD, Solaris et Mac & OS X).

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

Pour télécharger Wine, accédez à 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.

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' ;

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 d’effectuer le transfert complet sur un serveur avec un trafic réseau presque nul. Elle sera donc beaucoup plus rapide qu’une sauvegarde / restauration.

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

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 la base de données correspondante, cliquez simplement sur: Base de données - > Renommer la base de données ...

Sous MySQL, procédez comme suit:

  1. Sous Catalogues, créez un nouveau schéma de base de données.
  2. Allez dans 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. Schéma et sélectionnez la nouvelle base de données schéma.
  6. Démarrer la restauration.
  7. Vérifiez le nouveau schéma et, s'il y a lieu bien, supprimez l'ancien.

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

Votre base de données est renommée

Si vous utilisez phpMyAdmin , vous pouvez accéder aux " opérations " une fois que vous avez sélectionné la base de données que vous souhaitez renommer. Accédez ensuite à 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 sélectionner "structure et données". et " créer une base de données avant de copier " cases à cocher et, enfin, appuyez sur la touche & go; go " bouton dans cette section.

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

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 les mots de passe ne sont pas enregistrées dans l'historique du shell.

Assurez-vous que utilisateur_bd 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top