Powiel całą bazę danych MySQL

91

Czy można powielić całą bazę danych MySQL na serwerze z systemem Linux?

Wiem, że mogę eksportować i importować, ale oryginalna baza danych ma> 25 MB, więc nie jest to idealne rozwiązanie.

Czy jest to możliwe przy użyciu mysqldump lub poprzez bezpośrednie kopiowanie plików bazy danych?

Adam Dempsey
źródło

Odpowiedzi:

176

Najpierw utwórz zduplikowaną bazę danych:

CREATE DATABASE duplicateddb;

Upewnij się, że użytkownik i uprawnienia są na miejscu i:

 mysqldump -u admin -p originaldb | mysql -u backup -pPassword duplicateddb; 
Vincent Ramdhanie
źródło
29
Myślę, że między „-p” a „hasłem” w drugiej części drugiego wiersza poleceń nie powinno być spacji
16
nie, nie powinno tam być miejsca! Odpowiedź jest poprawna w ten sposób. Na stronie man mysql napisano: --password [= hasło], -p [hasło] Hasło używane podczas łączenia się z serwerem. Jeśli używasz krótkiego formularza opcji (-p), nie możesz mieć spacji między opcją a hasłem. Jeśli pominiesz wartość hasła po opcji --password lub -p w wierszu poleceń, mysql zapyta o jedno. Podanie hasła w wierszu poleceń powinno być uważane za niebezpieczne. Patrz sekcja 6.1.2.1, „Wytyczne dla użytkowników końcowych dla P ...
nils petersohn”
2
Zauważ, że mysqldump domyślnie tworzy kopię zapasową wyzwalaczy, ale nie procedur składowanych, dodaj --routinesjako opcję w tym przypadku.
LinuxDevOps,
1
Jeśli robisz to w ten sposób i nie chcesz, aby hasło MySQL tego użytkownika było dostępne w historii bash, wyedytuj je z ~/.bash_historypliku po wykonaniu. Możesz też wyprowadzić wynik pierwszego polecenia do pliku tymczasowego i wykonać następujące po nim (co spowoduje wyświetlenie monitu o hasło) mysql -p -u admin duplicatedb < temporaryfile.sql.
Mike
1
Ta odpowiedź z pewnością działa, ale pytanie brzmi: „Wiem, że mogę używać eksportu i importu, ale oryginalna baza danych ma> 25 MB, więc to nie jest idealne”, a to, co sugeruje ta odpowiedź, to w zasadzie eksport i import.
el.pescado
17

Na zdalny serwer

mysqldump mydbname | ssh host2 "mysql mydbcopy"

Do lokalnego serwera

mysqldump mydbname | mysql mydbcopy
Peter Lindqvist
źródło
BŁĄD 1064 (42000): Masz błąd w składni SQL ;, cześć pokazuję błąd podczas używania polecenia na lokalnym serwerze, proszę o pomoc
amit_game
5

Czasami wykonuję mysqldump i przesyłam dane wyjściowe do innego polecenia mysql, aby zaimportować je do innej bazy danych.

mysqldump --add-drop-table -u wordpress -p wordpress | mysql -u wordpress -p wordpress_backup
Paul Tomblin
źródło
Gdy tego używam, pojawia się błąd, że baza danych dest nie istnieje. Potrzebujesz więc również linii CREATE DATABASE.
blak3r
3

Utwórz plik mysqldump w systemie, który zawiera dane i użyj potoku, aby przekazać ten plik mysqldump jako dane wejściowe do nowego systemu. Nowy system można podłączyć za pomocą polecenia ssh.

mysqldump -u user -p'password' db-name | ssh user@some_far_place.com mysql -u user -p'password' db-name

brak spacji między -p [hasło]

TheNormalGuy
źródło
1
Czy mógłbyś dodać opis tego, jak to działa, np. Użycie rury?
kalyfe
1

Oto plik nietoperza systemu Windows, który napisałem, który łączy sugestie Vincenta i Paulsa. Pyta użytkownika o nazwy źródłowe i docelowe.

Po prostu zmodyfikuj zmienne u góry, aby ustawić odpowiednie ścieżki do plików wykonywalnych / portów bazy danych.

:: Creates a copy of a database with a different name.
:: User is prompted for Src and destination name.
:: Fair Warning: passwords are passed in on the cmd line, modify the script with -p instead if security is an issue.
:: Uncomment the rem'd out lines if you want script to prompt for database username, password, etc.

:: See also: http://stackoverflow.com/questions/1887964/duplicate-entire-mysql-database

@set MYSQL_HOME="C:\sugarcrm\mysql\bin"
@set mysqldump_exec=%MYSQL_HOME%\mysqldump
@set mysql_exec=%MYSQL_HOME%\mysql
@set SRC_PORT=3306
@set DEST_PORT=3306
@set USERNAME=TODO_USERNAME
@set PASSWORD=TODO_PASSWORD

:: COMMENT any of the 4 lines below if you don't want to be prompted for these each time and use defaults above.
@SET /p USERNAME=Enter database username: 
@SET /p PASSWORD=Enter database password: 
@SET /p SRC_PORT=Enter SRC database port (usually 3306): 
@SET /p DEST_PORT=Enter DEST database port: 

%MYSQL_HOME%\mysql --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% --execute="show databases;"
@IF NOT "%ERRORLEVEL%" == "0" GOTO ExitScript

@SET /p SRC_DB=What is the name of the SRC Database:  
@SET /p DEST_DB=What is the name for the destination database (that will be created):  

%mysql_exec% --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% --execute="create database %DEST_DB%;"
%mysqldump_exec% --add-drop-table --user=%USERNAME% --password=%PASSWORD% --port=%SRC_PORT% %SRC_DB% | %mysql_exec% --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% %DEST_DB%
@echo SUCCESSFUL!!!
@GOTO ExitSuccess

:ExitScript
@echo "Failed to copy database"
:ExitSuccess

Przykładowe dane wyjściowe:

C:\sugarcrm_backups\SCRIPTS>copy_db.bat
Enter database username: root
Enter database password: MyPassword
Enter SRC database port (usually 3306): 3308
Enter DEST database port: 3308

C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 --execute="show databases;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sugarcrm_550_pro   |
| sugarcrm_550_ce    |
| sugarcrm_640_pro   |
| sugarcrm_640_ce    |
+--------------------+
What is the name of the SRC Database:  sugarcrm
What is the name for the destination database (that will be created):  sugarcrm_640_ce

C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 --execute="create database sugarcrm_640_ce;"

C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysqldump --add-drop-table --user=root --password=MyPassword --port=3308 sugarcrm   | "C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 sugarcrm_640_ce
SUCCESSFUL!!!
blak3r
źródło
1

To nie zadziała w przypadku InnoDB. Użyj tego obejścia tylko wtedy, gdy próbujesz skopiować bazy danych MyISAM.

Jeśli blokowanie tabel podczas tworzenia kopii zapasowej i prawdopodobnie wstrzymywanie MySQL podczas importu bazy danych jest dopuszczalne, mysqlhotcopy może działać szybciej.

Na przykład

Utworzyć kopię zapasową:

# mysqlhotcopy -u root -p password db_name /path/to/backup/directory

Przywracać:

cp /path/to/backup/directory/* /var/lib/mysql/db_name

mysqlhotcopy może również przesyłać pliki przez SSH (scp) i prawdopodobnie bezpośrednio do zduplikowanego katalogu bazy danych.

Na przykład

# mysqlhotcopy -u root -p password db_name /var/lib/mysql/duplicate_db_name
Pavel
źródło
1

Tworzenie kopii bazy danych

# mysqldump -u root -p password db1 > dump.sql
# mysqladmin -u root -p password create db2
# mysql -u root -p password db2 < dump.sql
Maulik patel
źródło
0

To zadziałało dla mnie z wierszem poleceń, z OUTSIDE mysql shell:

# mysqldump -u root -p password db1 > dump.sql
# mysqladmin -u root -p password create db2
# mysql -u root -p password db2 < dump.sql

To wygląda dla mnie najlepiej. Jeśli spakujesz plik „dump.sql”, możesz zapisać go jako skompresowaną kopię zapasową. Fajne! W przypadku bazy danych o pojemności 1 GB z tabelami Innodb potrzeba około minuty na utworzenie pliku „dump.sql” i około trzech minut na zrzucenie danych do nowej bazy DB db2.

Proste skopiowanie katalogu db otworu (mysql / data / db1) nie zadziałało dla mnie, chyba z powodu tabel InnoDB.

Warkot
źródło
-2

Dawno temu w MySQL można było po prostu skopiować wszystkie pliki tabel do innego katalogu w drzewie mysql

mysql cli - tworzy bazę danych db2

linux cli - cp db1 db2

DM
źródło
To działa tylko z MyISAM, prawda? Dobrze, że te złe stare czasy już minęły.
Laurenz Albe,
Dobry do książek historycznych, ale już niezbyt przydatny.
JJJ