Назад | Перейти на главную страницу

Linux / mysql: безопасно ли копировать файлы mysql db с помощью команды cp из одной базы данных в другую?

Большинство руководств рекомендуют mysqldump и простой SQL для копирования одной таблицы в другую базу данных. Как насчет Linux shell cp? Могу я просто сделать

cp /db1/mytable.frm /db2/mytable.frm

Копирование очень просто для MyISAM и полностью на 100% рискованно (почти самоубийственно) с InnoDB.

Из вашего вопроса вы подняли

cp /db1/mytable.frm /db2/mytable.frm

MyISAM

Это нормально. Однако нельзя просто переместить .frm. Вы должны переместить все компоненты. Из вашего вопроса возьмем таблицу с именем db1.mytable. При обычной установке таблица находится в / var / lib / mysql / db1. Таблица будет состоять из трех файлов.

  • /var/lib/mysql/db1/mytable.frm
  • /var/lib/mysql/db1/mytable.MYD (база данных таблиц)
  • /var/lib/mysql/db1/mytable.MYI (индексы таблиц)

Вы должны переместить все три файла, чтобы переместить одну таблицу. Если все ваши таблицы используют механизм хранения MyISAM, вы можете выключить mysql и скопировать. Если вы просто делаете копию таблицы и помещаете ее в другую базу данных, вам следует сделать это с помощью SQL.

Например, если вы хотите скопировать db1.mytable в базу данных db2, сделайте следующее:

CREATE TABLE db2.mytable LIKE db1.mytable;
ALTER TABLE db2.mytable DISABLE KEYS;
INSERT INTO db2.mytable SELECT * FROM db1.mytable;
ALTER TABLE db2.mytable ENABLE KEYS;

Теперь, если вы просто переместите таблицу с db1 на db2, вы можете сделать это:

ALTER TABLE db1.mytable RENAME db2.mytable;

InnoDB

Копирование очень опасно из-за инфраструктуры, в которой работает InnoDB. Существуют две основные инфраструктуры: 1) innodb_file_per_table отключен и 2) innodb_file_per_table включен.

Ахиллесова пята InnoDB - это системный файл табличного пространства, известный как ibdata1 (обычно находится в / var / lib / mysql). Что содержится в этом файле?

  • Страницы данных таблицы
  • Индексные страницы таблицы
  • Table MetaData (список управления идентификаторами табличных пространств)
  • MVCC Данные (для поддержки изоляции транзакций и Соответствие ACID)

InnoDB (innodb_file_per_table отключен)

Если innodb_file_per_table отключен, все эти типы информации InnoDB хранятся в ibdata1. Единственное проявление любой таблицы InnoDB вне ibdata1 - это файл .frm таблицы InnoDB. Для одновременного копирования всех данных InnoDB необходимо скопировать весь / var / lib / mysql.

Копирование отдельной таблицы InnoDB невозможно. Вы должны использовать mysqldump для извлечения дампа таблицы как логического представления данных и соответствующих определений индекса. Затем вы загрузите этот дамп в другую базу данных на том же или другом сервере.

InnoDB (innodb_file_per_table включен)

При включенном innodb_file_per_table данные таблицы и ее индексы находятся в папке базы данных рядом с файлом .frm. Например, для таблицы db1.mytable проявление этой таблицы InnoDB вне ibdata1 будет:

  • /var/lib/mysql/db1/mytable.frm
  • /var/lib/mysql/db1/mytable.ibd

Все метаданные для db1.mytable по-прежнему находятся в ibdata1 и нет абсолютно никакого способа обойти это. Журналы повтора и данные MVCC также по-прежнему находятся в ibdata1.

ВНИМАНИЕ (или ОПАСНО как Робот сказал бы в "Затерянных в космосе")

Если вы думаете просто скопировать файлы .frm и .ibd, вы попадаете в очередь за миром боли. Копирование файлов .frm и .ibd таблицы InnoDB полезно только в том случае, если вы можете гарантировать, что идентификатор табличного пространства файла .ibd точно совпадает с записью идентификатора табличного пространства в метданных файла ibdata1.

Я написал два сообщения в DBA StackExchange об этой концепции идентификатора табличного пространства.

Вот отличная ссылка на то, как повторно подключить и файл .ibd к ibdata1 в случае несовпадения идентификаторов табличных пространств: http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file. Прочитав это, вы сможете понять, почему я сказал, что близок к суициду.

Для InnoDB вам нужно только это

CREATE TABLE db2.mytable LIKE db1.mytable;
INSERT INTO db2.mytable SELECT * FROM db1.mytable;

чтобы сделать копию таблицы InnoDB. Если вы переносите его на другой сервер БД, используйте mysqldump.

Копирование всего каталога данных MySQL - это практический метод, предполагающий, что служба MySQL остановлена, и вы хотите скопировать весь сервер базы данных.

Это полезный метод для смещения баз данных с большими индексами, и дамп mysql не будет включать индексы, которые необходимо будет регенерировать во время импорта. Я нашел эту технику полезной при настройке ведомых устройств MySQL.

Копирование отдельного файла будет зависеть от используемой схемы таблицы, но в большинстве случаев это не подходящее решение.

Использовать xtrabackup без оболочки innobackupex, и вы будете в порядке с базами данных myisam и innodb. Обратите внимание, что восстановление баз данных innodb - это не просто копирование файлов, даже если вы используете xtrabackup. Сообщите, если вам нужна дополнительная информация

Нет, вы должны сделать резервную копию с помощью mysqdump и восстановить с помощью утилиты mysql cli, копируя файл frm, вы копируете только структуру таблицы, а не данные внутри, и если вы находитесь в innodb, копировать файл напрямую невозможно.

Лучше всего сделать дамп и восстановить таблицу.