Come possiamo ripristinare il database mysql con un nome diverso dal file mysqldump. Non voglio aprire il file di dump e modificarlo. Qualche altro metodo migliore?
Come possiamo ripristinare il database mysql con un nome diverso dal file mysqldump. Non voglio aprire il file di dump e modificarlo. Qualche altro metodo migliore?
Risposte:
È 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 !!!
ALTER DATABASE ... CHARACTER SET ...
in esso che sta interrompendo la mia importazione. Modifica: Oracle sostanzialmente ignora il bug .
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.
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.
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.
Se il file è quello che hai in mano e si sta manipolando da una shell / console, vorrei utilizzare sed
per fare sostituzioni di stringhe su linee a partire da CREATE DABATASE
, CREATE TABLE
, USE
e 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
, --databases
o le loro versioni brevi -A
o -B
non sono stati utilizzati.
--no-create-db
e senza --database
o --databases
.
Se si esegue un dump utilizzando le seguenti due regole:
--databases
, --database
e semplicemente inserire il nome del database alla fine del comando senza queste opzioni.--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
--no-create-db
e senza --database
o --databases
.
Ecco lo script della shell che ti permetterà di aggiungere al volo suffisso / affisso a tutti i nomi degli schemi.
-Ddb2
non dovrebbe avere un trattino di fronte. Almeno, ho incluso un errore di sintassi MySQL quando l'ho incluso.