Przywróć bazę danych mysql o innej nazwie


Odpowiedzi:


58

Możesz pozwolić mysqldump utworzyć zrzut w taki sposób, aby nie tworzył ani nie wybierał bazy danych.

PRZYKŁAD: Zrzucasz bazę danych db1 i ładujesz ją do bazy danych db2

Spowoduje to wstawienie poleceń CREATE DATABASE i USE do zrzutu

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

Nie spowoduje to wstawienia poleceń CREATE DATABASE i USE do zrzutu ( to jest to, czego chcesz )

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

Możesz załadować go do innej bazy danych (np. Db2) na jeden z czterech (4) sposobów:

OPCJA 1

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

OPCJA 2

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

OPCJA 3

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

OPCJA 4

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

Spróbuj !!!


W przypadku, gdy ktoś miał z tym problem, -Ddb2nie powinien mieć przed nim myślnika. Przynajmniej dostałem błąd składni MySQL, gdy go załączyłem.
gwg,

To nie działa. Mój zrzut nie ma bazy danych UTWÓRZ ani UŻYJ, ale nadal zawiera dane ALTER DATABASE ... CHARACTER SET ..., które psują import. Edycja: Oracle zasadniczo ignoruje błąd .
mpen

5

Jestem wielkim fanem zrzutu, edycji i wstawiania. ale nie trzeba otwierać pliku tekstowego (pliku zrzutu), aby go zmienić (jest to szczególnie przydatne, gdy ma on kilka milionów linii). jeśli chcesz zrzucić bazę danych MYDATABASE.

mysqldump MYDATABASE > mydump.sql

następnie użyj sed, aby zastąpić starą nazwę bazy danych nową taką jak ta

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

możesz po prostu utworzyć nową bazę danych i zaimportować ją ponownie, a wszystkie tabele zostaną utworzone w nowej bazie danych MYNEWDATABASE ”

mysqladmin create MYNEWDATABASE

mysql MYNEWDATABASE < mydump.sql

Edycja: Jak zauważyli niektórzy mili ludzie w sekcji komentarzy, może to być niebezpieczne, jeśli niektóre dane zostaną również zmienione powyżej, więc wymyślenie sposobów na uniknięcie tego jest.

1) Grep za to na wysypisku, zanim to zmienisz, w ten sposób.

cat mydump.sql | grep "MYDATABASE"

i

2) możemy dodać trochę `, aby było bezpieczniej:

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

jeśli ktoś ma konkretne sugestie, chętnie zredaguję swoją odpowiedź za kolejne 4 lata.


Myślę, że pytanie dotyczyło przywrócenia bazy danych enitre, ale o innej nazwie, a nie tylko skopiowania jednej tabeli w istniejącej bazie danych.
Michael Green

3
potrzebna jest część sed
Steve Buzonas

10
To polecenie jest złym pomysłem i oddałbym głos, gdybym mógł. Jeśli zamierzasz zastąpić ciąg, przynajmniej dopasuj wiersz UTWÓRZ TABELĘ i UŻYJ, aby nie zastępować żadnych innych danych.
bksunday

1
przed uruchomieniem komendy sed ( sed -i 's/MYDATABASE/MYNEWDATABASE/g' mydump.sql) sprawdza wszystkie wystąpień o MyDatabase z cat mydump.sql | grep "MYDATABASE"upewnić się tylko nazwa bazy danych zostanie zmieniona, inne dane pozostają nietknięte.
Rafaf Tahsin

1
sed -i 's/`MYDATABASE`/`MYNEWDATABASE`/g' mydump.sql # potencjalnie bezpieczniejsza edycja Steam. mój zrzut bazy danych nie zawiera żadnych instrukcji USE lub CREATE DATABASE, ale nazwa db znajduje się w komentarzach, widokach i wyzwalaczach SQL (MySQL 5.7). To NIE zastępuje nazwy bazy danych w komentarzach, ale nie ma to wpływu na wynikową bazę danych. To działało dobrze dla mnie.
Jonathan

3

Zrobiłem to raz, dawno temu.

Podczas eksportowania wszystkich danych istnieje możliwość ustawienia nazwy bazy danych na początku pliku, na przykład: „użyj bazy danych x”

Możesz więc zmienić tę deklarację.


3

Jeśli plik jest to, co masz w ręku, a ty manipulujesz go z powłoki / konsoli, użyłbym sedzrobić zamienniki ciąg na linii zaczynając CREATE DABATASE, CREATE TABLE, USEa optionnally --(komentarze mysqldump)

Zastępowanie nazwy db w wierszach pasujących do opcji Utwórz bazę danych, Utwórz tabelę, Użyj i 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


Oczywiście, jak wspomina wiele odpowiedzi tutaj, łatwiej jest, jeśli kopia zapasowa mysqldump nie zawierała instrukcji CREATE DATABASE i USE. Znaczenie opcji --all-databases, --databaseslub ich krótkie wersje -Alub -Bnie zostały wykorzystane.


W MySQL 5.7 mysqldump zawiera nazwę bazy danych w wyzwalaczach i widokach, nawet z lub --no-create-dbbez --databaselub --databases.
Jonathan

2

Jeśli wykonasz zrzut przy użyciu następujących dwóch reguł:

  1. Nie używaj opcji, takich jak --databases, --databasei po prostu wystarczy umieścić nazwę bazy danych na końcu polecenia bez tych opcji.
  2. Uwzględnij opcję --no-create-db

Jeśli wykonasz następujące czynności, mysqldump utworzy kod SQL bez odwoływania się do bazy danych, wtedy możesz użyć nowej nazwy bazy danych na końcu polecenia mysql podczas importowania!

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

W MySQL 5.7 mysqldump zawiera nazwę bazy danych w wyzwalaczach i widokach, nawet z lub --no-create-dbbez --databaselub --databases.
Jonathan

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.