Jak możemy przywrócić bazę danych mysql o innej nazwie niż plik mysqldump. Nie chcę otwierać pliku zrzutu i edytować go. Jakieś inne lepsze metody?
Jak możemy przywrócić bazę danych mysql o innej nazwie niż plik mysqldump. Nie chcę otwierać pliku zrzutu i edytować go. Jakieś inne lepsze metody?
Odpowiedzi:
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 !!!
ALTER DATABASE ... CHARACTER SET ...
, które psują import. Edycja: Oracle zasadniczo ignoruje błąd .
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.
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.
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.
Jeśli plik jest to, co masz w ręku, a ty manipulujesz go z powłoki / konsoli, użyłbym sed
zrobić zamienniki ciąg na linii zaczynając CREATE DABATASE
, CREATE TABLE
, USE
a 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
, --databases
lub ich krótkie wersje -A
lub -B
nie zostały wykorzystane.
--no-create-db
bez --database
lub --databases
.
Jeśli wykonasz zrzut przy użyciu następujących dwóch reguł:
--databases
, --database
i po prostu wystarczy umieścić nazwę bazy danych na końcu polecenia bez tych opcji.--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
--no-create-db
bez --database
lub --databases
.
Oto skrypt powłoki, który pozwoli Ci dodawać sufiks / afiks do wszystkich nazw schematów w locie.
-Ddb2
nie powinien mieć przed nim myślnika. Przynajmniej dostałem błąd składni MySQL, gdy go załączyłem.