Restaurer la base de données mysql avec un nom différent

41

Comment pouvons-nous restaurer la base de données mysql avec un nom différent du fichier mysqldump. Je ne veux pas ouvrir le fichier de vidage et le modifier. Toute autre meilleure méthode?

Praveen Prasannan
la source

Réponses:

58

Vous pouvez laisser mysqldump créer le dump de manière à ne pas créer ou sélectionner la base de données.

EXEMPLE: Vous videz la base de données db1 et la chargez dans la base de données db2

Cela mettra dans la CREATE DATABASE et les commandes USE dans le dump

mysqldump -u... -p... --routines --triggers --databases db1 > /root/db1.sql

Cela ne mettra pas dans CREATE DATABASE et les commandes USE dans le dump ( c'est ce que vous voulez )

mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql

Vous pouvez le charger dans une autre base de données (telle que db2) de l’une des quatre (4) façons suivantes:

OPTION 1

$ mysqldump -u... -p... --routines --triggers db1 | mysql -u... -p... -A -Ddb2

OPTION 2

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A -Ddb2 < /root/db1.sql

OPTION 3

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A -Ddb2
mysql> source /root/db1.sql

OPTION 4

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A
mysql> use db2
mysql> source /root/db1.sql

Essaie !!!

RolandoMySQLDBA
la source
Au cas où quelqu'un aurait du mal avec cela, -Ddb2ne devrait pas avoir un trait d'union devant lui. Au moins, j'ai eu une erreur de syntaxe MySQL quand je l'ai incluse.
gwg
Cela ne semble pas fonctionner. Mon fichier de vidage n'a pas de base de données CREATE ou USE, mais il en contient toujours un ALTER DATABASE ... CHARACTER SET ...qui rompt mon import. Edit: Oracle ignore fondamentalement le bogue .
mardi
5

Je suis un grand fan de dump, edit et insert. mais vous n'avez pas besoin d'ouvrir le fichier texte (fichier de vidage) pour le changer (c'est particulièrement utile quand il compte plusieurs millions de lignes). si vous voulez vider la base de données MYDATABASE.

mysqldump MYDATABASE > mydump.sql

utilisez ensuite sed pour remplacer l'ancien nom de la base de données par un nouveau comme celui-ci

sed -i 's/MYDATABASE/MYNEWDATABASE/g' mydump.sql

alors vous pouvez simplement créer la nouvelle base de données et l'importer à nouveau, et il créera toutes les tables dans la nouvelle base de données MYNEWDATABASE '

mysqladmin create MYNEWDATABASE

mysql MYNEWDATABASE < mydump.sql

Edit: Comme certains intervenants sympathiques de la section des commentaires l’ont souligné, cela peut être dangereux si certaines des données sont également modifiées par ce qui précède, ce qui permet de trouver des moyens de l’éviter.

1) Grep pour cela dans le dump, avant de le changer, comme ceci.

cat mydump.sql | grep "MYDATABASE"

et

2) nous pouvons ajouter un peu de `pour le rendre plus sûr comme ceci:

sed -i 's/`MYDATABASE`/`MYNEWDATABASE`/g' mydump.sql

si quelqu'un d'autre a des suggestions concrètes, je serai ravi de modifier ma réponse dans 4 ans.

Sverre
la source
Je pense que la question concernait la restauration d'une base de données enitre mais avec un nom différent, pas seulement la copie d'une table dans une base de données existante.
Michael Green
3
la partie sed est nécessaire
Steve Buzonas
10
Cette commande est une mauvaise idée et je voterais si je le pouvais. Si vous optez pour des remplacements de chaîne, faites au moins correspondre les lignes CREATE TABLE et USE afin de ne remplacer aucune autre donnée.
dimanche
1
Avant d'exécuter la commande sed ( sed -i 's/MYDATABASE/MYNEWDATABASE/g' mydump.sql), vérifiez toutes les occurrences de MYDATABASE avec cat mydump.sql | grep "MYDATABASE"pour vous assurer que seul le nom de la base de données a été modifié, les autres données restent inchangées.
Rafaf Tahsin le
1
sed -i 's/`MYDATABASE`/`MYNEWDATABASE`/g' mydump.sql # édition de vapeur potentiellement plus sûre. mon dump de base de données ne contient aucune instruction USE ou CREATE DATABASE, mais le nom de la base de données se trouve dans les commentaires, les vues et les déclencheurs SQL (MySQL 5.7). Cela ne remplace PAS le nom de la base de données dans les commentaires, mais ceux-ci n'ont aucun effet sur la base de données résultante. Cela a bien fonctionné pour moi.
Jonathan
3

Je l'ai fait une fois, il y a longtemps.

Lorsque vous exportez toutes vos données, il est possible de définir le nom de la base de données au début du fichier, sous la forme suivante: "use database x"

Donc, vous pouvez changer cette déclaration.

Victor
la source
3

Si le fichier est ce que vous avez en main et vous manipuler à partir d' un shell / console, je l' utilise sedpour faire des remplacements de chaîne sur les lignes commençant par CREATE DABATASE, CREATE TABLE, USEet optionnellement --(commentaires mysqldump)

Remplacement du nom de la base de données sur les lignes qui correspondent aux commentaires Create Database, Create Table, Use et mysqldump

dbfile="yoursqldumpfile.sql";
dbname="current_db_name";
dbnewname="new_db_name";
dbnewfile="/tmp/$dbnewname.sql";
cat $dbfile | sed "/^CREATE DATABASE/ s=$dbname=$dbnewname=" | sed "/^CREATE TABLE/ s=$dbname=$dbnewname=" | sed "/^USE / s=$dbname=$dbnewname=" | sed "/^-- / s=$dbname=$dbnewname=" > $dbnewfile


Bien sûr, comme de nombreuses réponses le mentionnent, il est plus facile si la sauvegarde mysqldump ne contient ni CREATE DATABASE ni une ligne USE. Ce qui signifie que les options --all-databases, --databasesou leurs versions courtes -Aou -Bn'ont pas été utilisées.

bksunday
la source
Dans MySQL 5.7, mysqldump inclut le nom de la base de données dans les déclencheurs et les vues, même avec --no-create-dbet sans --databaseou --databases.
Jonathan
2

Si vous effectuez une sauvegarde en utilisant les deux règles suivantes:

  1. Ne pas utiliser les options --databases, --databaseet tout simplement mettre le nom de base de données à la fin de la commande sans ces options.
  2. Inclure l'option --no-create-db

Si vous procédez comme suit, mysqldump créera le code SQL sans faire référence à la base de données. Vous pourrez alors utiliser le nouveau nom de la base de données à la fin de votre commande mysql lors de l'importation!

mysqldump  --no-create-db old_db_name --single-transaction --compress --order-by-primary --host old_db_host -u old_db_user -pOld_db_password | mysql --host new_host -u new_user -pnewpassword new_db_name
Néo
la source
Dans MySQL 5.7, mysqldump inclut le nom de la base de données dans les déclencheurs et les vues, même avec --no-create-dbet sans --databaseou --databases.
Jonathan
1

Voici le script shell qui vous permettra d’ajouter un suffixe / affixe à tous les noms de schéma à la volée.

http://snippets.dzone.com/posts/show/13749

shantanuo
la source
Le lien disponible pour le code est mort.
Michael Minter