Chciałbym napisać skrypt, który kopiuje moją aktualną bazę danych sitedb1
do sitedb2
tej samej instancji bazy danych mysql. Wiem, że mogę zrzucić sitedb1 do skryptu sql:
mysqldump -u root -p sitedb1 >~/db_name.sql
a następnie zaimportuj go do sitedb2
. Czy istnieje łatwiejszy sposób bez zrzucania pierwszej bazy danych do pliku sql?
Odpowiedzi:
Jak mówi podręcznik w sekcji Kopiowanie baz danych , możesz przesłać zrzut bezpośrednio do klienta mysql:
Jeśli używasz MyISAM ty mógł skopiować pliki, ale nie polecam go. To trochę podejrzane.
Zintegrowane z różnymi dobrymi innymi odpowiedziami
Oba polecenia
mysqldump
imysql
akceptują opcje ustawiania szczegółów połączenia (i wiele więcej), takie jak:Ponadto, jeśli nowa baza danych jeszcze nie istnieje, musisz ją wcześniej utworzyć (np. Za pomocą
echo "create database new_db_name" | mysql -u <dbuser> -p
).źródło
mysqldump -uroot -p database1 | mysql -uroot -p database2
. Otrzymuję monit o podanie obu pw, ale mogę wprowadzić tylko jeden. Znak zachęty wygląda tak:Enter password: Enter password:
. Po podaniu pierwszego pw proces czeka wiecznie.Korzystanie z narzędzi MySQL
Narzędzia MySQL zawierają przyjemne narzędzie,
mysqldbcopy
które domyślnie kopiuje bazę danych, w tym wszystkie powiązane obiekty („tabele, widoki, wyzwalacze, zdarzenia, procedury, funkcje i granty na poziomie bazy danych”) oraz dane z jednego serwera DB na ten sam lub inny Serwer DB. Dostępnych jest wiele opcji dostosowywania tego, co faktycznie jest kopiowane.Tak więc, odpowiadając na pytanie PO:
źródło
mysqldump
rozwiązanie oparte na systemie zawodziło.sudo apt-get install mysql-utilities
, ale to bardzo fajne. Czy mogę pominąć hasło i zostać poproszony o jego wprowadzenie?mysqldbcopy
poprosić o hasło; przynajmniej nie mogłem znaleźć czegoś takiego w dokumentacji. Możesz jednak zbudować tę funkcjonalność samodzielnie. W Bash mogłoby to wyglądaćmysqldbcopy --source=root:"$(read -sp 'Source password: ' && echo $REPLY)"@localhost --destination=root:"$(read -sp 'Destination password: ' && echo $REPLY)"@localhost sitedb1:sitedb2
--force
domysqldbcopy
polecenia, ponieważ utworzyłem już docelową bazę danych. Dzięki!źródło
Musisz uruchomić polecenie z terminala / wiersza polecenia.
na przykład:
mysqldump -u root test_db1 | mysql -u root test_db2
To kopiuje test_db1 do test_db2 i przyznaje dostęp do 'root' @ 'localhost'
źródło
Najlepszym i najłatwiejszym sposobem jest wprowadzenie tych poleceń w terminalu i ustawienie uprawnień dla użytkownika root. Pracuje dla mnie..!
źródło
mysqldump -u <user> -p <pwd> db_name | mysql -u <user> -p <pwd> new_db_name
może być problematyczna w przypadku dużych baz danych.Możesz użyć (w pseudokodzie):
Powodem, dla którego nie używam składni CREATE TABLE ... SELECT ..., jest zachowanie indeksów. Oczywiście to tylko kopiuje tabele. Poglądy i procedury nie są kopiowane, chociaż można to zrobić w ten sam sposób.
Zobacz UTWÓRZ TABELĘ .
źródło
Najpierw utwórz zduplikowaną bazę danych:
Upewnij się, że wszystkie uprawnienia itp. Są na miejscu i:
źródło
Możesz zrobić coś takiego:
źródło
To stwierdzenie zostało dodane w MySQL 5.1.7, ale zostało uznane za niebezpieczne i zostało usunięte w MySQL 5.1.23. Miało to na celu umożliwienie aktualizacji baz danych w wersji wcześniejszej niż 5.1 w celu wykorzystania kodowania zaimplementowanego w wersji 5.1 do mapowania nazw baz danych na nazwy katalogów baz danych. Jednak użycie tego oświadczenia mogło spowodować utratę zawartości bazy danych, dlatego zostało ono usunięte. Nie używaj RENAME DATABASE we wcześniejszych wersjach, w których jest obecny.
Aby wykonać zadanie aktualizacji nazw baz danych z nowym kodowaniem, użyj zamiast tego ALTER DATABASE nazwa_bazy danych UPGRADE DATA DIRECTORY NAME: http://dev.mysql.com/doc/refman/5.1/en/alter-database.html
źródło
Prosty sposób na zrobienie tego, jeśli zainstalowałeś phpmyadmin :
Przejdź do swojej bazy danych, wybierz zakładkę „operacja”, a zobaczysz blok „kopiuj bazę danych do”. Użyj go i możesz skopiować bazę danych.
źródło
Jak wspomniano w odpowiedzi Grega ,
mysqldump db_name | mysql new_db_name
jest to darmowy, bezpieczny i łatwy sposób przesyłania danych między bazami danych. Jednak jest też bardzo wolny .Jeśli chcesz wykonać kopię zapasową danych, nie możesz pozwolić sobie na utratę danych (w tej lub innych bazach danych) lub używasz tabel innych niż
innodb
, powinieneś użyćmysqldump
.Jeśli szukasz czegoś do programowania, masz kopie zapasowe wszystkich baz danych w innym miejscu i możesz wygodnie czyścić i ponownie instalować
mysql
(prawdopodobnie ręcznie), gdy wszystko pójdzie nie tak, to mogę po prostu mieć dla Ciebie rozwiązanie.Nie mogłem znaleźć dobrej alternatywy, więc stworzyłem scenariusz, aby zrobić to sam. Spędziłem dużo czasu, aby to zadziałało za pierwszym razem i szczerze mówiąc, trochę mnie przeraża, że mogę teraz wprowadzić zmiany. Bazy danych Innodb nie były przeznaczone do kopiowania i wklejania w ten sposób. Drobne zmiany powodują, że kończy się to niepowodzeniem w wspaniały sposób. Nie miałem problemu, odkąd sfinalizowałem kod, ale to nie znaczy, że tego nie zrobisz.
Systemy testowane na (ale nadal mogą zawieść):
Co to robi
sudo
uprawnienia i sprawdza, czy masz wystarczającą ilość miejsca do sklonowania bazy danychJak to wypada w porównaniu z
mysqldump
W przypadku bazy danych 3 GB użycie
mysqldump
imysql
zajęłoby 40-50 minut na moim komputerze. Używając tej metody, ten sam proces zajmie tylko ~ 8 minut.Jak tego używamy
Zapisujemy nasze zmiany SQL wraz z naszym kodem, a proces uaktualniania jest zautomatyzowany zarówno pod względem produkcji, jak i rozwoju, a każdy zestaw zmian tworzy kopię zapasową bazy danych w celu przywrócenia w przypadku błędów. Jednym z problemów, na który natknęliśmy się, było to, że pracowaliśmy nad długoterminowym projektem ze zmianami w bazie danych i musieliśmy przełączać gałęzie w środku, aby naprawić błąd lub trzy.
W przeszłości używaliśmy jednej bazy danych dla wszystkich gałęzi i musielibyśmy odbudować bazę danych za każdym razem, gdy przełączaliśmy się na gałąź, która nie była zgodna z nowymi zmianami bazy danych. A kiedy wróciliśmy, musielibyśmy ponownie uruchomić aktualizacje.
Próbowaliśmy
mysqldump
zduplikować bazę danych dla różnych gałęzi, ale czas oczekiwania był zbyt długi (40-50 minut) i w międzyczasie nie mogliśmy zrobić nic więcej.To rozwiązanie skróciło czas klonowania bazy danych do 1/5 czasu (pomyśl o przerwie na kawę i łazienkę zamiast długiego lunchu).
Wspólne zadania i ich czas
Przełączanie między gałęziami z niekompatybilnymi zmianami bazy danych zajmuje ponad 50 minut w jednej bazie danych, ale nie ma czasu po początkowym czasie konfiguracji z
mysqldump
tym kodem. Tak się składa, że ten kod jest ~ 5 razy szybszy niżmysqldump
.Oto kilka typowych zadań i przybliżony czas ich trwania w przypadku każdej metody:
Utwórz gałąź funkcji ze zmianami w bazie danych i natychmiast scal:
mysqldump
: 50-60 minutUtwórz gałąź funkcji ze zmianami w bazie danych, przełącz się
master
na, aby naprawić błąd, dokonaj edycji w gałęzi funkcji i scal:mysqldump
: 50-60 minutUtwórz gałąź funkcji ze zmianami w bazie danych, przełącz się
master
na 5 razy w celu usunięcia błędu, dokonując zmian w gałęzi funkcji między nimi i scal:mysqldump
: 50-60 minutKod
Nie używaj tego, chyba że przeczytałeś i zrozumiałeś wszystko powyżej.
Jeśli wszystko pójdzie gładko, powinieneś zobaczyć coś takiego:
źródło
Oprócz odpowiedzi Grega jest to najłatwiejszy i najszybszy sposób, jeśli
new_db_name
jeszcze nie istnieje:źródło
Jeśli masz wyzwalacze w swojej oryginalnej bazie danych, możesz uniknąć błędu „Wyzwalacz już istnieje”, umieszczając je potokowo przed importem:
źródło
Myślę, że nie ma na to metody. Kiedy PHPMyAdmin to robi, zrzuca bazę danych, a następnie wstawia ją ponownie pod nową nazwą.
źródło