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

manuel MySQL à MySQL couvre ce.

D'habitude, je jette la base de données et je la réimporte 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'existent que dans une poignée de versions, et est une mauvaise idée .

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

818
demandé sur speeday125 2008-09-16 01:22:00

30 réponses

pour InnoDB, ce qui suit semble fonctionner: créer la nouvelle base de données vide, puis renommer chaque table à son tour dans la nouvelle base de données:

RENAME TABLE old_db.table TO new_db.table;

vous devrez ajuster les permissions après cela.

pour les scripts dans un shell, vous pouvez utiliser l'un des suivants:

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, supprimer la partie -u username -ppassword .

aussi, si vous avez des procédures stockées, vous pouvez les copier après:

mysqldump -R old_db | mysql new_db
703
répondu Benoit Duffez 2016-08-25 14:57:12

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 entrées/sorties utiliser 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
397
répondu hendrasaputra 2015-11-09 11:48:04

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

de phpMyAdmin, sélectionnez la base de données que vous voulez sélectionner. Dans les onglets il y en a un appelé opérations, allez dans la section Renommer. C'est tout.

il fait, comme beaucoup l'ont suggéré, créer une nouvelle base de données avec le nouveau nom, vider toutes les tables de l'ancienne base de données dans la nouvelle base de données et laisser tomber l'ancienne base de données.

Enter image description here

190
répondu raphie 2015-11-09 12:07:24

vous pouvez utiliser SQL pour générer un script SQL pour transférer chaque table dans 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é par la commande.

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

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

ou

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

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

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

noter que GROUP_CONCAT a une limite de longueur par défaut qui peut être dépassée pour les bases de données avec un grand nombre de tableaux. Vous pouvez modifier cette limite en lançant SET SESSION group_concat_max_len = 100000000; (ou un autre grand nombre).

93
répondu ErichBSchulz 2018-02-24 03:19:46

Trois options:

  1. " créer la nouvelle base de données, faire tomber le serveur, déplacer les fichiers d'un dossier de base de données à l'autre, et redémarrer le serveur. Notez que cela ne fonctionnera que si toutes vos tables sont MyISAM.

  2. créer la nouvelle base de données, Utiliser créer la TABLE ... Comme des déclarations, puis utiliser INSERT ... Sélectionnez * dans les énoncés.

  3. utiliser mysqldump et recharger avec ce fichier.

24
répondu longneck 2015-11-09 11:45:32

La méthode simple

changement au répertoire de la base de données:

cd /var/lib/mysql/

arrêt MySQL... C'est important!

/etc/init.d/mysql stop

Ok, cette voie ne fonctionne pas pour InnoDB ou BDB-bases de données.

Renommer la base de données:

mv old-name new-name

...ou sur 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émarrer MySQL

/etc/init.d/mysql start

fait...

OK, cette façon 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.

23
répondu DeeCee 2015-11-09 11:47:18

émule la commande manquante RENAME DATABASE dans MySQL:

  1. créer une nouvelle base de données
  2. créez les requêtes renommées 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 que la sortie de

  4. Supprimer l'ancienne base de données

Il a été tiré de Émulant Le Manque de RENOMMER Commande de BASE de données dans MySQL .

21
répondu Marciano 2015-11-09 12:12:35

ce n'est que récemment que je suis tombé sur une très belle façon 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 crédit va à quelqu'un d'autre pas moi.

20
répondu Amr Mostafa 2010-05-07 13:15:27

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;
16
répondu eaykin 2010-10-28 15:01:12

MySQL ne supporte pas le renommage 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, c'est généralement dans le répertoire de données du répertoire où MySQL a été installé. Localisez le nom de la base de données que vous voulez renommer sous le répertoire de données et renommez-le. Renommer le répertoire pourrait causer certains problèmes d'autorisations. Être conscient.

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

je recommande de créer une nouvelle base de données (en utilisant le nom que vous voulez) et d'exporter/importer les données dont vous avez besoin de l'ancien au nouveau. Assez simple.

14
répondu bryanpearson 2008-09-15 21:26:07

la manière la plus simple et infaillible de faire un complète renommer (y compris laisser tomber l'ancienne base de données à la fin de sorte qu'il est un renommer plutôt qu'une copie) :

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

Suit:

  1. Copiez les lignes dans le bloc-notes.
  2. remplacer toutes les références à "olddbname", "newdbname", "mypassword" (+optionnellement "root") par vos équivalents.
  3. exécute un par un sur la ligne de commande (en entrant "y" lorsqu'on lui demande).
14
répondu Steve Chambers 2017-05-16 09:38:22

quand vous renommez une base de données dans PHPMyAdmin il crée un dump, puis tombe et recrée la base de données avec le nouveau nom.

13
répondu UnkwnTech 2008-09-15 21:24:15

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=
newdb=
$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
13
répondu Grijesh Chauhan 2018-04-09 15:59:54

pour ceux qui sont des utilisateurs Mac, Sequel Pro a une option Renommer la base de données dans le menu base de données. http://www.sequelpro.com/

12
répondu Duke 2012-11-30 01:06:26

il y a 2 méthodes:

Méthode 1: une méthode bien connue pour renommer le schéma de base de données est en déchargeant le schéma en utilisant Mysqldump et le restaurer dans un autre schéma, puis en abandonnant 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 plus qu'un 100GB? Il y a des méthodes où vous pouvez Piper les commandes ci-dessus ensemble 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, mais il faut faire attention en le faisant.

Méthode 2: MySQL a une très bonne fonctionnalité pour renommer les tables qui fonctionne même à travers différents schémas. Cette opération de renommage est atomique et personne d'autre ne peut accéder à la table tout en étant renommé. 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 à faire le renommage:

créer le nouveau schéma de base de données avec le nom désiré. Renommer les tables de l'ancien schéma en nouveau schéma, en utilisant la commande "RENAME TABLE" de MySQL. Laisse tomber 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 . La "table de renommage" de MySQL échoue s'il existe des déclencheurs sur les tables. Pour remédier à cela, nous pouvons faire l'

1) Dump the triggers, events and stored routines in a separate file. ceci fait en utilisant les options-E, -R (en plus de-t-d qui renvoie les triggers) à la commande mysqldump. Une fois les déclencheurs jetés, nous devrons les laisser tomber du schéma, pour que la commande Renommer TABLE fonctionne.

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

2) générez une liste de tableaux "de BASE" seulement. 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) balancez 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 sur les tables courantes de l'old_schema.

mysql> DROP TRIGGER <trigger_name>;
...

5) restaurer les fichiers de dump ci-dessus une fois que toutes les tables "de Base" de 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

Complexités avec les méthodes ci-dessus : nous pouvons avoir besoin de mettre à jour les subventions pour les utilisateurs afin qu'ils correspondent au nom de schéma correct. Ceux-ci pourraient être corrigés par une simple mise à jour sur mysql.columns_priv, mysql.procs_priv, mysql.tables_priv, mysql.db tables mettant à jour le nom old_schema en new_schema et appelant " Flush privileges;". Bien que la" méthode 2 "semble un peu plus compliquée que la" méthode 1", c'est totalement scriptable. Un script bash simple pour effectuer les étapes ci-dessus dans l'ordre approprié, peut vous aider à sauver espace et temps tout en renommant les schémas de base de données la prochaine fois.

L'équipe DBA distante de Percona 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, a utilisé un exemple de schéma" emp", a créé des déclencheurs de test, routines stockées sur ce schéma. Va essayer de renommer le schéma de la base de données en utilisant le script, ce qui prend quelques secondes à compléter par opposition à temps de dump / restore méthode.

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é en" emp_test " en moins d'une seconde. Enfin, C'est le script de Percona qui est utilisé ci-dessus pour la "méthode 2".

#!/bin/bash
# Copyright 2013 Percona LLC and/or its affiliates
set -e
if [ -z "" ]; then
    echo "rename_db <server> <database> <new_database>"
    exit 1
fi
db_exists=`mysql -h  -e "show databases like ''" -sss`
if [ -n "$db_exists" ]; then
    echo "ERROR: New database already exists "
    exit 1
fi
TIMESTAMP=`date +%s`
character_set=`mysql -h  -e "show create database \G" -sss | grep ^Create | awk -F'CHARACTER SET ' '{print }' | awk '{print }'`
TABLES=`mysql -h  -e "select TABLE_NAME from information_schema.tables where table_schema='' and TABLE_TYPE='BASE TABLE'" -sss`
STATUS=$?
if [ "$STATUS" != 0 ] || [ -z "$TABLES" ]; then
    echo "Error retrieving tables from "
    exit 1
fi
echo "create database  DEFAULT CHARACTER SET $character_set"
mysql -h  -e "create database  DEFAULT CHARACTER SET $character_set"
TRIGGERS=`mysql -h   -e "show triggers\G" | grep Trigger: | awk '{print }'`
VIEWS=`mysql -h  -e "select TABLE_NAME from information_schema.tables where table_schema='' and TABLE_TYPE='VIEW'" -sss`
if [ -n "$VIEWS" ]; then
    mysqldump -h   $VIEWS > /tmp/_views${TIMESTAMP}.dump
fi
mysqldump -h   -d -t -R -E > /tmp/_triggers${TIMESTAMP}.dump
for TRIGGER in $TRIGGERS; do
    echo "drop trigger $TRIGGER"
    mysql -h   -e "drop trigger $TRIGGER"
done
for TABLE in $TABLES; do
    echo "rename table .$TABLE to .$TABLE"
    mysql -h   -e "SET FOREIGN_KEY_CHECKS=0; rename table .$TABLE to .$TABLE"
done
if [ -n "$VIEWS" ]; then
    echo "loading views"
    mysql -h   < /tmp/_views${TIMESTAMP}.dump
fi
echo "loading triggers, routines and events"
mysql -h   < /tmp/_triggers${TIMESTAMP}.dump
TABLES=`mysql -h  -e "select TABLE_NAME from information_schema.tables where table_schema='' and TABLE_TYPE='BASE TABLE'" -sss`
if [ -z "$TABLES" ]; then
    echo "Dropping database "
    mysql -h   -e "drop database "
fi
if [ `mysql -h  -e "select count(*) from mysql.columns_priv where db=''" -sss` -gt 0 ]; then
    COLUMNS_PRIV="    UPDATE mysql.columns_priv set db='' WHERE db='';"
fi
if [ `mysql -h  -e "select count(*) from mysql.procs_priv where db=''" -sss` -gt 0 ]; then
    PROCS_PRIV="    UPDATE mysql.procs_priv set db='' WHERE db='';"
fi
if [ `mysql -h  -e "select count(*) from mysql.tables_priv where db=''" -sss` -gt 0 ]; then
    TABLES_PRIV="    UPDATE mysql.tables_priv set db='' WHERE db='';"
fi
if [ `mysql -h  -e "select count(*) from mysql.db where db=''" -sss` -gt 0 ]; then
    DB_PRIV="    UPDATE mysql.db set db='' WHERE db='';"
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
répondu Sathish D 2014-01-29 11:14:37

il est possible de renommer toutes les tables dans une base de données pour être sous une autre base de données sans avoir à faire un dump complet et restaurer.

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 tout déclencheur dans le db cible ne sera pas heureux. Vous aurez besoin de les laisser tomber d'abord puis de les recréer après le renommage.

mysql -uroot -e "call mysql.rename_db('test', 'blah2');" | mysql -uroot
ERROR 1435 (HY000) at line 4: Trigger in wrong schema
9
répondu TodoInTX 2010-05-19 17:16:59

la Plupart des réponses ici sont mauvais pour l'une des deux raisons suivantes:

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

Percona a un billet de blog sur la façon de bien faire: https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql /

et le script posté (fait?) par Simon R Jones qui fait ce qui est proposé 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/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 "" ]; then
    echo "rename_db <server> <database> <new_database>"
    exit 1
fi
db_exists=`mysql -h  -e "show databases like ''" -sss`
if [ -n "$db_exists" ]; then
    echo "ERROR: New database already exists "
    exit 1
fi
TIMESTAMP=`date +%s`
character_set=`mysql -h  -e "SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name = ''" -sss`
TABLES=`mysql -h  -e "select TABLE_NAME from information_schema.tables where table_schema='' and TABLE_TYPE='BASE TABLE'" -sss`
STATUS=$?
if [ "$STATUS" != 0 ] || [ -z "$TABLES" ]; then
    echo "Error retrieving tables from "
    exit 1
fi
echo "create database  DEFAULT CHARACTER SET $character_set"
mysql -h  -e "create database  DEFAULT CHARACTER SET $character_set"
TRIGGERS=`mysql -h   -e "show triggers\G" | grep Trigger: | awk '{print }'`
VIEWS=`mysql -h  -e "select TABLE_NAME from information_schema.tables where table_schema='' and TABLE_TYPE='VIEW'" -sss`
if [ -n "$VIEWS" ]; then
    mysqldump -h   $VIEWS > /tmp/_views${TIMESTAMP}.dump
fi
mysqldump -h   -d -t -R -E > /tmp/_triggers${TIMESTAMP}.dump
for TRIGGER in $TRIGGERS; do
    echo "drop trigger $TRIGGER"
    mysql -h   -e "drop trigger $TRIGGER"
done
for TABLE in $TABLES; do
    echo "rename table .$TABLE to .$TABLE"
    mysql -h   -e "SET FOREIGN_KEY_CHECKS=0; rename table .$TABLE to .$TABLE"
done
if [ -n "$VIEWS" ]; then
    echo "loading views"
    mysql -h   < /tmp/_views${TIMESTAMP}.dump
fi
echo "loading triggers, routines and events"
mysql -h   < /tmp/_triggers${TIMESTAMP}.dump
TABLES=`mysql -h  -e "select TABLE_NAME from information_schema.tables where table_schema='' and TABLE_TYPE='BASE TABLE'" -sss`
if [ -z "$TABLES" ]; then
    echo "Dropping database "
    mysql -h   -e "drop database "
fi
if [ `mysql -h  -e "select count(*) from mysql.columns_priv where db=''" -sss` -gt 0 ]; then
    COLUMNS_PRIV="    UPDATE mysql.columns_priv set db='' WHERE db='';"
fi
if [ `mysql -h  -e "select count(*) from mysql.procs_priv where db=''" -sss` -gt 0 ]; then
    PROCS_PRIV="    UPDATE mysql.procs_priv set db='' WHERE db='';"
fi
if [ `mysql -h  -e "select count(*) from mysql.tables_priv where db=''" -sss` -gt 0 ]; then
    TABLES_PRIV="    UPDATE mysql.tables_priv set db='' WHERE db='';"
fi
if [ `mysql -h  -e "select count(*) from mysql.db where db=''" -sss` -gt 0 ]; then
    DB_PRIV="    UPDATE mysql.db set db='' WHERE db='';"
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

Enregistrer dans un fichier appelé rename_db et rendre le script exécutable avec chmod +x rename_db puis l'utiliser comme ./rename_db localhost old_db new_db

8
répondu ryantm 2017-06-16 23:06:52

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

Syntaxe est 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
répondu Johnny 2008-12-12 10:27:41

la procédure de TodoInTX ne marchait pas pour moi. Voici mon coup de poignard à elle:

-- 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 ;
7
répondu user757945 2011-05-17 18:24:19

I a posé une question sur la faute du serveur essayer de contourner les temps d'arrêt lors de la restauration de très grandes bases de données en utilisant MySQL Proxy. Je n'ai eu aucun succès, mais j'ai réalisé à la fin ce que je voulais était renommer la fonctionnalité de base de données parce que dump/import n'était pas une option en raison de la taille de notre base de données.

il y a une fonctionnalité de table à renommer intégrée à MySQL donc j'ai fini par écrire un script Python simple pour faire le travail à ma place. J'ai l'a posté sur GitHub au cas où il pourrait être utile à d'autres.

6
répondu cclark 2017-04-13 12:13:47

pour votre commodité, ci-dessous se trouve un petit shellscript qui doit être exécuté avec deux paramètres: db-name et New db-name.

vous pourriez avoir besoin d'ajouter des paramètres de connexion aux lignes mysql si vous n'utilisez pas le .mon Dieu.cnf-file in your home-directory. Veuillez faire une sauvegarde avant d'exécuter ce script.


#!/usr/bin/env bash

mysql -e "CREATE DATABASE  DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;"
for i in $(mysql -Ns  -e "show tables");do
    echo ".$i -> .$i"
    mysql -e "rename TABLE .$i to .$i"
done
mysql -e "DROP DATABASE "
6
répondu gerrit damen 2015-11-09 12:08:42

la méthode la plus simple est D'utiliser le logiciel HeidiSQL. Il est gratuit et open source. Il fonctionne sur Windows et sur N'importe quel Linux avec Wine (exécuter des applications Windows sur Linux, BSD, Solaris et Mac OS X).

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

pour télécharger du vin, allez à http://www.winehq.org / .

pour renommer une base de données en 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
répondu Fathah Rehman P 2015-11-09 12:58:02

voici un moyen rapide de générer un script sql renommé, si vous avez beaucoup de tables à déplacer.

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
répondu yantaq 2014-08-11 19:00:59

Suit :

  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". Ajouter un nouveau nom et vérifier les privilèges D'ajustement.
  5. Cliquez sur Go.

enter image description here

4
répondu Shubham Jain 2018-01-19 08:27:42

dans MySQL administrateur faire ce qui suit:

  1. sous catalogues, créer un nouveau schéma de base de données.
  2. aller à la sauvegarde et créer une sauvegarde de l'ancien schéma.
  3. exécuter la sauvegarde.
  4. Aller à Restaurer et ouvrir le fichier créé à l'étape 3.
  5. sélectionnez "un autre schéma" sous Target Schéma et sélectionnez la nouvelle base de données schéma.
  6. Démarrer La Restauration.
  7. Vérifier le nouveau schéma et, s'il semble bon, supprimer l'ancien.
3
répondu Tom 2008-10-03 04:17:56

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 laisser tomber la vieille table et de recharger les données de la table cliquez OK dans les deux

votre base de données est renommée

3
répondu murtaza.webdev 2013-08-21 06:17:20

si vous utilisez phpMyAdmin vous pouvez aller à l'onglet" Opérations " une fois que vous avez sélectionné la base de données que vous voulez renommer. Ensuite, allez dans la dernière section "copier la base de données" (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" les cases à cocher et, enfin, appuyez sur le bouton "go" dans cette section.

au fait, j'utilise phpMyAdmin dans Espagnol donc je ne suis pas sûr que les noms des sections sont en anglais.

3
répondu Peter Mortensen 2015-11-09 12:03:22

voici un extrait de Bash d'une ligne pour 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épart garantit simplement que les commandes MySQL contenant des mots de passe ne sont pas sauvegardées dans l'historique shell.

assurez-vous que db_user a lu/écrit/supprimé les permissions sur l'ancien schéma, et a lu/écrit/créé les permissions sur le nouveau schéma.

3
répondu coffeefiend 2015-11-09 12:11:19

ALTER DATABASE est le moyen proposé par MySQL et RENAME DATABASE est abandonné.

à Partir de 13.1.32 RENOMMER la BASE de données Syntaxe :

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

cette déclaration a été ajoutée dans MySQL 5.1.7, mais elle a été jugée dangereuse et a été supprimée dans MySQL 5.1.23.

3
répondu fancyPants 2015-11-09 12:16:45

Je l'ai fait de cette façon: Prendre de sauvegarde de votre base de données existante. Ça te donnera une PD.zip.tmp et ensuite dans l'invite de commande écrivent après

" C:\Program fichiers (x86)\MySQL\MySQL Server 5.6\bin\mysql.exe" - h localhost -u root -p[mot de passe] [db] < "C:\Backups\db.zip.tmp "

3
répondu Samra 2017-07-26 01:03:31