Дублюйте всю базу даних MySQL


90

Чи можливо продублювати всю базу даних MySQL на сервері Linux?

Я знаю, що можу використовувати експорт та імпорт, але вихідна база даних становить> 25 Мб, тож це не ідеально.

Чи можна за допомогою mysqldump або безпосередньо продублювати файли бази даних?

Відповіді:


174

Спочатку створіть дублікат бази даних:

CREATE DATABASE duplicateddb;

Переконайтеся, що користувач та дозволи на місці та:

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

29
Я не думаю, що між "-p" та "password" має бути пробіл у 2-й частині вашого 2-го командного рядка

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.
Mike

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

3

Створіть файл mysqldump у системі, що містить дані, і використовуйте конвеєр, щоб надати цей файл mysqldump як вхід для нової системи. Нову систему можна підключити за допомогою команди ssh.

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

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


1
Чи можете ви додати опис того, як це працює, наприклад, використання труби?
kalyfe

1

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

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

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

Це спрацювало для мене в командному рядку, з OWSIDE 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

Це виглядає для мене найкращим способом. Якщо заархівувати файл "dump.sql", ви можете зберегти його як стиснуту резервну копію. Класно! Для 1 Гб бази даних з таблицями Innodb потрібно близько хвилини для створення "dump.sql" і близько трьох хвилин для скидання даних у нову DB 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.