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.