Большинство руководств рекомендуют mysqldump и простой SQL для копирования одной таблицы в другую базу данных. Как насчет Linux shell cp? Могу я просто сделать
cp /db1/mytable.frm /db2/mytable.frm
Копирование очень просто для MyISAM и полностью на 100% рискованно (почти самоубийственно) с InnoDB.
Из вашего вопроса вы подняли
cp /db1/mytable.frm /db2/mytable.frm
Это нормально. Однако нельзя просто переместить .frm. Вы должны переместить все компоненты. Из вашего вопроса возьмем таблицу с именем db1.mytable. При обычной установке таблица находится в / var / lib / mysql / db1. Таблица будет состоять из трех файлов.
Вы должны переместить все три файла, чтобы переместить одну таблицу. Если все ваши таблицы используют механизм хранения 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. Существуют две основные инфраструктуры: 1) innodb_file_per_table отключен и 2) innodb_file_per_table включен.
Ахиллесова пята InnoDB - это системный файл табличного пространства, известный как ibdata1 (обычно находится в / var / lib / mysql). Что содержится в этом файле?
Если innodb_file_per_table отключен, все эти типы информации InnoDB хранятся в ibdata1. Единственное проявление любой таблицы InnoDB вне ibdata1 - это файл .frm таблицы InnoDB. Для одновременного копирования всех данных InnoDB необходимо скопировать весь / var / lib / mysql.
Копирование отдельной таблицы InnoDB невозможно. Вы должны использовать mysqldump для извлечения дампа таблицы как логического представления данных и соответствующих определений индекса. Затем вы загрузите этот дамп в другую базу данных на том же или другом сервере.
При включенном innodb_file_per_table данные таблицы и ее индексы находятся в папке базы данных рядом с файлом .frm. Например, для таблицы db1.mytable проявление этой таблицы InnoDB вне ibdata1 будет:
Все метаданные для 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, копировать файл напрямую невозможно.
Лучше всего сделать дамп и восстановить таблицу.