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.