Дублировать всю базу данных MySQL


92

Возможно ли дублировать всю базу данных MySQL на сервере Linux?

Я знаю, что могу использовать экспорт и импорт, но исходная база данных имеет размер> 25 МБ, так что это не идеально.

Можно ли использовать mysqldump или напрямую дублировать файлы базы данных?

Ответы:


177

Сначала создайте дубликат базы данных:

CREATE DATABASE duplicateddb;

Убедитесь, что пользователь и права доступа указаны и:

 mysqldump -u admin -p originaldb | mysql -u backup -pPassword duplicateddb; 

29
Я не думаю, что во второй части второй командной строки должен быть пробел между «-p» и «пароль»

16
нет места там быть не должно! Ответ правильный. На странице руководства mysql указано: --password [= пароль], -p [пароль] Пароль для использования при подключении к серверу. Если вы используете короткую форму параметра (-p), у вас не может быть пробела между параметром и паролем. Если вы опустите значение пароля после параметра --password или -p в командной строке, mysql запросит его. Указание пароля в командной строке следует считать небезопасным. См. Раздел 6.1.2.1, «Руководство для конечных пользователей P ...
nils petersohn

2
Обратите внимание, что mysqldump по умолчанию выполняет резервное копирование триггеров, но не хранимых процедур, добавьте --routinesв качестве опции для этого случая.
LinuxDevOps,

1
Если вы делаете это таким образом и не хотите, чтобы пароль MySQL этого пользователя был доступен в истории bash, отредактируйте его из своего ~/.bash_historyфайла после его выполнения. Или вы также можете вывести результат первой команды во временный файл и выполнить после него следующее (которое предложит вам пароль) mysql -p -u admin duplicatedb < temporaryfile.sql.
Майк

1
Этот ответ, безусловно, работает, но в вопросе говорится: «Я знаю, что могу использовать экспорт и импорт, но исходная база данных имеет размер> 25 МБ, поэтому это не идеально», и в этом ответе предлагается в основном экспорт и импорт.
el.pescado

17

На удаленный сервер

mysqldump mydbname | ssh host2 "mysql mydbcopy"

На локальный сервер

mysqldump mydbname | mysql mydbcopy

ОШИБКА 1064 (42000): у вас есть ошибка в синтаксисе SQL; привет показывает ошибку при использовании команды на локальном сервере, помогите пожалуйста
amit_game


5

Иногда я выполняю mysqldump и передаю вывод в другую команду mysql, чтобы импортировать его в другую базу данных.

mysqldump --add-drop-table -u wordpress -p wordpress | mysql -u wordpress -p wordpress_backup

Когда я использую это, я получаю сообщение об ошибке, что база данных dest не существует. Итак, вам также нужна строка CREATE DATABASE.
blak3r 07

3

Создайте файл mysqldump в системе, в которой есть данные, и используйте pipe, чтобы передать этот файл mysqldump в качестве входных данных в новую систему. Новую систему можно подключить с помощью команды ssh.

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

нет пробела между -p [пароль]


1
Не могли бы вы добавить описание того, как это работает, например, об использовании трубы?
Калифе

1

Вот написанный мной файл bat для Windows, который объединяет предложения Винсента и Полса. Он запрашивает у пользователя имена источника и назначения.

Просто измените переменные вверху, чтобы установить правильные пути к вашим исполняемым файлам / портам базы данных.

:: 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

Пример вывода:

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!!!

1

Это не сработает для InnoDB. Используйте этот обходной путь, только если вы пытаетесь скопировать базы данных MyISAM.

Если блокировка таблиц во время резервного копирования и, возможно, приостановка MySQL во время импорта базы данных допустима, mysqlhotcopy может работать быстрее.

Например

Резервное копирование:

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

Восстановить:

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

mysqlhotcopy также может передавать файлы по SSH (scp) и, возможно, прямо в каталог дублированной базы данных.

Например

# mysqlhotcopy -u root -p password db_name /var/lib/mysql/duplicate_db_name

1

Создание копии базы данных

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

0

Это сработало для меня с командной строкой из ВНЕШНЕЙ оболочки mysql:

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

Это лучший вариант для меня. Если заархивировать "dump.sql", вы можете сохранить его как сжатую резервную копию. Круто! Для базы данных размером 1 ГБ с таблицами Innodb около минуты на создание dump.sql и около трех минут на выгрузку данных в новую базу данных db2.

Прямое копирование каталога дырочных db (mysql / data / db1) у меня не сработало, я думаю, из-за таблиц InnoDB.


-2

Когда-то в MySQL вы могли просто скопировать все файлы таблиц в другой каталог в дереве mysql.

mysql cli - создать базу данных db2

linux cli - cp db1 db2


Это работает только с MyISAM, верно? Хорошо, что старые плохие времена прошли.
Laurenz Albe

Хороший для учебников по истории, но уже не очень полезный.
JJJ
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.