2013-11-27 2 views
4

У меня есть DB InnoDb innodb_db_1. Я включил innodb_file_per_table.moving InnoDb DB

Если я перехожу на 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?

ответ

4

Даже если вы используете файл-в-таблицы, таблицы держать часть своих данных и метаданных в/вар/Lib/MySQL/ibdata1. Поэтому вы не можете просто перемещать файлы .ibd в новый экземпляр MySQL.

Вам необходимо создать резервную копию и восстановить базу данных. Вы можете использовать:

  • mysqldump, входящий в состав MySQL, надежный, но медленный.

  • mydumper, сообщество внесло вклад в mysqldump, это поддерживает сжатие и параллельное выполнение и другие опрятные функции.

  • Percona XtraBackup, который является бесплатным и выполняет высокоскоростное физическое резервное копирование InnoDB (а также поддерживает другие механизмы хранения). Это рекомендуется для минимизации прерывания ваших операций в реальном времени, а также в случае большой базы данных.


Re ваш комментарий:

Нет, вы не можете просто скопировать файлы .ibd. Вы не можете отключить требование ibdata1. Этот файл включает, среди прочего, словарь данных, о котором вы можете думать как оглавление книги. Он сообщает InnoDB, какие таблицы у вас есть, и в какой физический файл они находятся.

Если вы просто переместите файл .ibd в другой экземпляр MySQL, это не добавит его в словарь данных этого экземпляра. Таким образом, InnoDB не имеет никакого представления о том, чтобы искать в новом файле или с какой логической таблицей он идет.

Если вы хотите обходной путь, вы можете ALTER TABLE mytable ENGINE=MyISAM, переместите этот файл и его .frm в другой экземпляр, а затем ALTER TABLE mytable ENGINE=InnoDB, чтобы изменить его. Перед перемещением файлов MyISAM запомните FLUSH TABLES WITH READ LOCK.

Но эти шаги предназначены не для новичков. Было бы намного безопаснее использовать резервный метод восстановления &, если вы не знаете, что делаете. Я пытаюсь сэкономить вам какое-то горе.

+0

, но могу ли я отключить сохранение значения и метаданных в var/lib/mysql/ibdata1? есть ли возможность скопировать его по файлам? – sergio

+0

Не знал о mydumper и XtraBackup! (учиться чему-то новому каждый день) – Barranka

+0

@sergio Ваша база данных повреждена? Это причина, по которой вы хотите скопировать файлы вручную? – Barranka

3

Насколько я знаю, таблицы с горячим копированием являются очень плохими идеями (я делал это два раза и делал это только с таблицами MyISAM, и я делал это только потому, что у меня не было другого выбора).

Мои личные рекомендации: Используйте mysqldump. На вашей оболочки:

mysqldump -h yourHost -u yourUser -pYourPassword yourDatabase yourTable > dumpFile.sql 

Чтобы скопировать данные из файла дампа в другую базу данных на вашей оболочке:

mysql -h yourHost -u yourUser -pYourPassword yourNewDatabase < dumpFile.sql 

Проверка: mysqldump — A Database Backup Program.


Если вы настаиваете на копировании InnoDB файлов вручную, пожалуйста, прочитайте это: Backing Up and Recovering an InnoDB Database

+0

Эх, но я последовал этой инструкции, и это не помогло мне. – sergio

+0

Спасибо за ссылку о резервном копировании и восстановлении! – sergio

2

Вы можете копировать таблицы MyISAM в течение всего дня (безопасно, если они очищены и заблокированы или сервер остановлен), но вы не можете сделать это с помощью InnoDB, потому что два механизма хранения обрабатывают таблицы и табличные пространства по-разному ,

  • MyISAM автоматически обнаруживает таблицы путем итерации файлов в каталоге, названном для базы данных.

  • У InnoDB есть внутренний словарь данных, хранящийся в системном табличном пространстве (ibdata1). Таблицы должны не только быть согласованными, но и есть идентификаторы в файлах .ibd, которые должны соответствовать тому, что хранит словарь данных.

До версии MySQL 5.6, с введением transportable tablespaces, это была не поддерживаемая операция. Если вы используете 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. Не самая лучшая идея, так как вы потеряете все объявления внешнего ключа и должны добавить их обратно в исходные таблицы, но это альтернатива.

1

Существует легкая процедура, чтобы переместить весь Mysql InnoDB от ПК А до ПК В.

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

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

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

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

Описанные здесь шаги после перемещения базы данных описаны здесь dba stackexchange.

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