перемещение 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?

553   4  

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.

Условия выполнения процедуры следующие:

  1. Вам нужно иметь набор опций innodb_file_per_table
  2. Вы должны иметь возможность завершить работу базы данных

В моем случае мне пришлось переместить всю базу данных MySql объемом 150 ГБ (самая большая таблица имела aprox. 60 Гб). Создание sqldumps и загрузка их обратно не были вариантом (слишком медленно).

Итак, я сделал "холодную резервную копию"." базы данных mysql (mysql doc), а затем просто переместите файлы на другой компьютер.

Шаги, которые необходимо выполнить после перемещения базы данных, описаны здесь dba stackexchange.

Я пишу это, потому что (предполагая, что вы можете следовать упомянутым условиям) это, безусловно, самый быстрый (и вероятно, самый простой) метод для перемещения (большого) MySQL InnoDb, и никто еще не упоминал об этом.

Comments

    Ничего не найдено.