Ответы:
Копирование очень просто для 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.
.frm
, .MYD
и .MYI
.
Копирование всего каталога данных MySQL является практическим методом, предполагая, что служба MySQL остановлена, и вы хотите скопировать весь сервер базы данных.
Это полезный метод для перемещения баз данных с большими индексами, и дамп mysql не будет включать индексы, которые необходимо будет восстановить во время импорта. Я нашел эту технику полезной при настройке подчиненных MySQL.
Копирование отдельного файла зависит от используемой схемы таблицы, но в большинстве случаев не является подходящим решением.
Используйте xtrabackup w / ow без оболочки innobackupex, и все будет хорошо как с базами данных myisam, так и с базами данных innodb. Обратите внимание, что восстановление баз данных innodb - это не просто копирование файлов назад, даже если вы используете xtrabackup. Скажите, если вам нужно больше информации
Нет, вы должны выполнить резервное копирование с помощью mysqdump и восстановить с помощью утилиты mysql cli, копируя файл frm, вы копируете только структуру таблицы, а не данные внутри, а если вы находитесь в innodb, копировать файл напрямую невозможно.
Лучший способ - сбросить и восстановить таблицу.