перемещение InnoDb DB
У меня есть DB InnoDb innodb_db_1. Я включил innodb_file_per_table.
Если я пойду в var/lib/mysql/innodb_db_1/, я найду файлы table_name.ibd, table_name.frm, db.opt.
Теперь я пытаюсь скопировать эти файлы в другую БД, например, чтобы innodb_db_2(var/lib/mysql/innodb_db_2/) но ничего не произошло.
Но если моя БД будет MyIsam, я могу скопировать таким образом, и все будет в порядке.
Какие предложения по перемещению БД путем копирования файла InnoDb DB?
4 ответов:
Даже при использовании file-per-table, таблицы сохраняют некоторые из своих данных и метаданных в /var / lib / mysql / ibdata1. Так что ты не можешь просто двигаться .ibd-файлы в новый экземпляр MySQL.
Вам придется создавать резервные копии и восстанавливать базу данных. Вы можете использовать:
Mysqldump, включенный в MySQL, надежный, но медленный.
Mydumper , сообщество внесло замену mysqldump, это поддерживает сжатие и параллельное выполнение и другие аккуратные особенности.
Percona XtraBackup , который является бесплатным и выполняет высокоскоростные физические резервные копии InnoDB (а также поддерживает другие механизмы хранения). Это рекомендуется, чтобы свести к минимуму прерывание ваших текущих операций, а также если ваша база данных велика.
Ваш комментарий:
Нет, вы не можете просто копировать .файлы ibd. вы не можете отключить требование для ibdata1. Этот файл включает в себя, среди прочего, данные словарь , который можно рассматривать как оглавление книги. Он сообщает InnoDB, какие таблицы у вас есть, и в каком физическом файле они находятся.
Если вы просто переместите a .ibd-файл в другой экземпляр MySQL, это не добавляет его в словарь данных этого экземпляра. Таким образом, InnoDB понятия не имеет, что искать в новом файле или в какой логической таблице он идет.
Если вы хотите обходной путь, вы можете
Но эти шаги не для начинающих. Было бы намного безопаснее для вас использовать метод резервного копирования и восстановления, если вы не знаете, что делаете. Я пытаюсь избавить тебя от горя.ALTER TABLE mytable ENGINE=MyISAM, переместить этот файл и его .frm к другому экземпляру, а затемALTER TABLE mytable ENGINE=InnoDB, чтобы изменить его назад. Не забудьтеFLUSH TABLES WITH READ LOCKперед перемещением файлов MyISAM.
Насколько я знаю," горячее копирование " файлов таблиц-очень плохая идея (я делал это два раза, и только сделал это с таблицами MyISAM, и я сделал это только потому, что у меня не было другого выбора).
Моя личная рекомендация такова: используйтеmysqldump. На вашем панцире:mysqldump -h yourHost -u yourUser -pYourPassword yourDatabase yourTable > dumpFile.sqlЧтобы скопировать данные из файла дампа в другую базу данных, на вашей оболочке:
mysql -h yourHost -u yourUser -pYourPassword yourNewDatabase < dumpFile.sqlПроверка: mysqldump - программа резервного копирования базы данных .
Если вы настаиваете на копировании файлов InnoDB вручную, пожалуйста, прочитайте это: резервное копирование и восстановление базы данных InnoDB
Вы можете копировать таблицы MyISAM в течение всего дня (безопасно, пока они очищены и заблокированы или сервер остановлен), но вы не можете сделать это с InnoDB, потому что два механизма хранения обрабатывают таблицы и табличные пространства очень по-разному.
MyISAM автоматически обнаруживает таблицы, повторяя файлы в каталоге, названном для базы данных.
InnoDB имеет внутренний словарь данных, хранящийся в системном табличном пространстве (
ibdata1). Не только таблицы имеют чтобы быть последовательным, в файлах.ibdесть идентификаторы, которые должны соответствовать тому, что словарь данных хранит внутри.До MySQL 5.6, с введением переносимых табличных пространств , это не было поддерживаемой операцией. Если вы используете MySQL 5.6, ссылка предоставляет вам информацию о том, как это работает.
Альтернативы:
Использование
mysqldump [options] database_name > dumpfile.sqlбез опции--databases, которая будет сбрасывать таблицы в указанная база данных, но будет пропускать любые командыDATABASE(DROP DATABASE,CREATE DATABASEиUSE), некоторые или все из которых, в зависимости от комбинации указанных параметров, обычно добавляются в файл дампа. Затем вы можете импортировать его с помощьюmysql [options] < dumpfile.sql.
CREATE TABLE db2.t1 LIKE db1.t1;INSERT INTO db2.t1 SELECT * FROM db1.t1;(для каждой таблицы; вам придется добавить любые ограничения внешнего ключа обратно в)
ALTER TABLEна каждом столе, изменяя его наMyISAM, затем смывая и фиксируя таблицы сFLUSH TABLES WITH READ LOCK;, копируя их, а затем изменяя все вернемся кInnoDB. Не самая лучшая идея, так как вы потеряете все объявления внешнего ключа и должны будете добавить их обратно в исходные таблицы, но это альтернатива.
Существует простая процедура для перемещения всего MySQL InnoDB с ПК A на ПК B.
Условия выполнения процедуры следующие:
- Вам нужно иметь набор опций innodb_file_per_table
- Вы должны иметь возможность завершить работу базы данных
В моем случае мне пришлось переместить всю базу данных MySql объемом 150 ГБ (самая большая таблица имела aprox. 60 Гб). Создание sqldumps и загрузка их обратно не были вариантом (слишком медленно).
Итак, я сделал "холодную резервную копию"." базы данных mysql (mysql doc), а затем просто переместите файлы на другой компьютер.
Шаги, которые необходимо выполнить после перемещения базы данных, описаны здесь dba stackexchange.
Я пишу это, потому что (предполагая, что вы можете следовать упомянутым условиям) это, безусловно, самый быстрый (и вероятно, самый простой) метод для перемещения (большого) MySQL InnoDb, и никто еще не упоминал об этом.
Comments