Чи можу я скопіювати базу даних MySQL, скопіювавши файли? Що саме містять файли?


13

Я використовую базу даних MySQL та використовую машину Ubuntu Linux.

Моя база даних з ім'ям db_test, я помітив , що в дорозі /var/lib/mysql/db_test, є файли , суфікс з .frm, .MYD, .MYIяк наступне:

/var/lib/mysql/db_test# ls

cars.frm 
cars.MYD 
cars.MYI

customers.frm
customers.MYD
customers.MYI

departments.frm
departments.MYD
departments.MYI

... 

Здається , кожен .frm, .MYD, .MYIфайли групи зіставляються з однією таблицею в базі даних.

У мене є два запитання:

  1. Які саме три файли роблять?

  2. Якщо я буду створювати новий каталог під path /var/lib/mysql/say db_test_2і копіюю кожен файл з db_test_1каталогу в db_test_2, чи він також створить нову базу даних, db_test_2яка має точно такий же вміст (таблиці), як db_test_1і?

Чи ці файли, що рухаються фізично, бази даних, що рухаються, створюють такий самий результат, як наступні дії командного рядка:

  1. дамп бази даних db_test_1відмови

  2. створити нову базу даних db_test_2

  3. потім скинути db_test_1базу даних у нову базу даних db_test_2?

Якщо так, здається, що переміщення файлів відбувається набагато швидше, ніж використання mysqldumpдля копіювання баз даних (або для імпорту даних з однієї БД в іншу БД в MySQL). Будь-які думки з цього приводу?

Відповіді:


5
  1. AFAIR, .frm - це файл опису (де описана структура таблиці баз даних), .MYD - це файл із даними, .MYI - файл з індексами.

  2. Так, копіювання буде набагато швидше. Але є одна проблема: це не атомна. Копійовані файли при великій завантаженості будуть непослідовними та, можливо, навіть зіпсовані. Особливо, якщо ви використовуєте якийсь більш «розумний» двигун, як InnoDB.

Редагувати: ps Ви можете безпечно копіювати ці файли, але перед тим, як зупинити сервер mysql.


4

У вас є інструмент cmd-line, який робить саме це: mysqlhotcopy

Він добре працює з таблицями myisam, але не з таблицями InnoDb.

Якщо ви налаштували ваш сервер за допомогою lvm і помістили ваш / var / lib / mysql на виділений обсяг, ось я рекомендую зробити резервну копію дуже швидко і не блокуючи всі ваші бази даних:

mysql -U root -p
  > flush tables with read lock;

Це видаляє всі ваші таблиці на диск і блокує будь-які операції з виводу

  > system "lvcreate -s -L 1G -n lvMysql_snap /dev/vg_myserver/lv_mysql" ;

Потрібно адаптувати до вашої конфігурації, це створює знімок файлової системи вашої бази даних. Це не займе часу

  > unlock tables;

Це зроблено, відновлення роботи Р / З відновлено.

Тепер ви можете змонтувати / dev / vg_myserver / lvMysql_snap і зробити архів tar для вашої бази даних!


Це здається швидким способом резервного копіювання DB. А як щодо переключення цього знімку назад, щоб він знову став моєю базою даних? Це частина, про яку я насправді стурбований. Я можу отримати mysqldumpмінімум 2 секунди. Відновити його потрібно повільно, зайнявши 5-10 хвилин.
Buttle Butkus

на останніх дистрибутивах lvm знімки можна повернути до початку, але це, мабуть, не те, що потрібно для управління резервними копіями бази даних.
Олів'є Ш

Щодо mysqlhotcopy: "Ця утиліта застаріла в MySQL 5.6.20 та видалена в MySQL 5.7" Від: [ dev.mysql.com/doc/refman/5.6/uk/mysqlhotcopy.html]
zeusstl

0

Це буде працювати для MyISAM, але не для InnoDB. Дивіться https://serverfault.com/a/367321/57569

З цієї відповіді про InnoDB:

Якщо ви думаєте просто скопіювати файли .frm та .ibd, ви знаходитесь в черзі, щоб нашкодити. Копіювання файлів .frm та .ibd таблиці InnoDB добре лише в тому випадку, якщо ви можете гарантувати, що ідентифікатор простору таблиць.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.