Ripristina il database mysql con un nome diverso


Risposte:


58

È possibile consentire a mysqldump di creare il dump in modo tale da non creare o selezionare il database.

ESEMPIO: si sta scaricando il database db1 e lo si sta caricando nel database db2

Ciò inserirà CREATE DATABASE e i comandi USE nel dump

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

Questo non inserirà CREATE DATABASE e i comandi USE nel dump ( questo è quello che vuoi )

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

Puoi caricarlo in un altro database (come db2) in uno dei quattro (4) modi:

OPZIONE 1

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

OPZIONE 2

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

OPZIONE 3

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

OPZIONE 4

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

Provaci !!!


Nel caso in cui qualcun altro abbia lottato con questo, -Ddb2non dovrebbe avere un trattino di fronte. Almeno, ho incluso un errore di sintassi MySQL quando l'ho incluso.
gwg

Questo non sembra funzionare. Il mio dump non ha un database CREATE o USE, ma ha ancora ALTER DATABASE ... CHARACTER SET ...in esso che sta interrompendo la mia importazione. Modifica: Oracle sostanzialmente ignora il bug .
apre il

5

Sono un grande fan di dump, modifica e inserimento. ma non è necessario aprire il file di testo (file di dump) per modificarlo (ciò è particolarmente utile quando è lungo diverse milioni di righe). se si desidera scaricare il database MYDATABASE.

mysqldump MYDATABASE > mydump.sql

quindi utilizzare sed per sostituire il vecchio nome del database con uno nuovo come questo

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

quindi puoi semplicemente creare il nuovo database e importarlo di nuovo, e creerà tutte le tabelle con nel nuovo database MYNEWDATABASE '

mysqladmin create MYNEWDATABASE

mysql MYNEWDATABASE < mydump.sql

Modifica: Come hanno sottolineato alcune persone simpatiche nella sezione commenti, questo può essere pericoloso, se anche alcuni dei dati sono modificati da questo sopra, quindi, per restringere i modi per evitarlo.

1) Grep per questo nella discarica, prima di cambiarlo, in questo modo.

cat mydump.sql | grep "MYDATABASE"

e

2) possiamo aggiungere alcuni `per renderlo più sicuro in questo modo:

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

se qualcun altro ha suggerimenti concreti, sono felice di modificare la mia risposta in altri 4 anni.


Penso che la domanda riguardasse il ripristino di un database enitre ma con un nome diverso, non solo la copia di una tabella all'interno di un DB esistente.
Michael Green,

3
la parte di sed è necessaria
Steve Buzonas il

10
Questo comando è una cattiva idea e voterei in basso se potessi. Se stai per sostituire le stringhe, almeno abbina la riga CREATE TABLE e USE in modo da non sostituire altri dati.
domenica

1
prima di eseguire il comando sed ( sed -i 's/MYDATABASE/MYNEWDATABASE/g' mydump.sql) controllare tutte le occorrenze di MYDATABASE cat mydump.sql | grep "MYDATABASE"per assicurarsi che venga modificato solo il nome del database, altri dati rimangono intatti.
Rafaf Tahsin,

1
sed -i 's/`MYDATABASE`/`MYNEWDATABASE`/g' mydump.sql # modifica del vapore potenzialmente più sicura. il mio dump del database non contiene alcuna istruzione USE o CREATE DATABASE, ma il nome db è in commenti, viste e trigger sql (MySQL 5.7). Questo NON sostituisce il nome del database nei commenti, ma non hanno alcun effetto sul database risultante. Questo ha funzionato bene per me.
Jonathan,

3

L'ho fatto una volta, molto tempo fa.

Quando esporti tutti i tuoi dati, c'è un'opzione per impostare il nome del database all'inizio del file, qualcosa come: "usa il database x"

Quindi, puoi cambiare questa dichiarazione.


3

Se il file è quello che hai in mano e si sta manipolando da una shell / console, vorrei utilizzare sedper fare sostituzioni di stringhe su linee a partire da CREATE DABATASE, CREATE TABLE, USEe optionnally --(commenti mysqldump)

Sostituzione del nome db su righe corrispondenti ai commenti Crea database, Crea tabella, Usa e 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


Naturalmente, come molte delle risposte qui menzionate, è più facile se il backup di mysqldump non contenesse una riga CREATE DATABASE e una linea USE. Significato delle opzioni --all-databases, --databaseso le loro versioni brevi -Ao -Bnon sono stati utilizzati.


In MySQL 5.7, mysqldump include il nome del database in trigger e viste, anche con --no-create-dbe senza --databaseo --databases.
Jonathan,

2

Se si esegue un dump utilizzando le seguenti due regole:

  1. Non utilizzare opzioni come --databases, --databasee semplicemente inserire il nome del database alla fine del comando senza queste opzioni.
  2. Includi l'opzione --no-create-db

Se fai quanto segue, mysqldump creerà l'SQL senza fare riferimento al database, quindi puoi utilizzare il nuovo nome del database alla fine del comando mysql durante l'importazione!

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

In MySQL 5.7, mysqldump include il nome del database in trigger e viste, anche con --no-create-dbe senza --databaseo --databases.
Jonathan,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.