В соответствии с Руководством по изучению сертификации MySQL 5.0 , глава 32, раздел 32.3.4, стр. 456 457 описаны условия двоичной переносимости, в которых описывается следующее:
Двоичная переносимость важна, если вы хотите взять бинарную резервную копию, которая была сделана на одной машине, и использовать ее на другой машине, которая имеет другую архитектуру. Например, использование бинарного резервного копирования - это один из способов копирования баз данных с одного сервера MySQL на другой.
Для MyISAM двоичная переносимость означает, что вы можете напрямую скопировать файлы для таблицы MyISAM с одного сервера MySQL на другой на другом компьютере, и второй сервер сможет получить доступ к таблице.
Для InnoDB двоичная переносимость означает, что вы можете напрямую копировать файлы табличного пространства с сервера MySQL на одном компьютере на другой сервер на другом компьютере, и второй сервер сможет получить доступ к табличному пространству. По умолчанию все таблицы InnoDB, управляемые сервером, хранятся вместе в табличном пространстве, поэтому переносимость табличного пространства зависит от того, являются ли все отдельные таблицы InnoDB переносимыми. Если хотя бы одна таблица не является переносимой, ни одно из них не является табличным пространством.
Таблицы MyISAM и табличные пространства InnoDB являются двоично переносимыми с одного хоста на другой, если выполняются два условия:
- Обе машины должны использовать целочисленную арифметику с двумя дополнениями
- Обе машины должны использовать формат IEEE с плавающей запятой, иначе таблицы не должны содержать столбцы с плавающей запятой (FLOAT или DOUBLE)
На практике эти два условия представляют собой небольшое ограничение. Целочисленная арифметика с двумя дополнениями и формат IEEE с плавающей точкой являются нормой для современного оборудования. Третье условие переносимости двоичных файлов InnoDB - использование строчных имен для таблиц и баз данных. Это связано с тем, что InnoDB хранит эти имена внутри (в своем словаре данных) в нижнем регистре в Windows. Использование строчных имен позволяет переносить двоичные файлы между Windows и Unix, чтобы принудительно использовать строчные имена, вы можете поместить следующие строки в файл опций:
[mysqld]
lower_case_table_names=1
Если вы сконфигурируете InnoDB для использования табличных пространств для таблиц, условия переносимости двоичных файлов будут расширены, чтобы включить также файлы .ibd для таблиц InnoDB. (Условия для общих табличных пространств все еще применяются, потому что он содержит словарь данных, в котором хранится информация обо всех таблицах InnoDB.)
Если условия двоичной переносимости не выполняются, вы можете скопировать таблицы MyISAM или InnoDB с одного сервера на другой, выгрузив их в некотором текстовом формате (например, с помощью mysqldump) и перезагрузив их на целевой сервер.
Существует два основных способа перемещения отдельных таблиц на основе механизма хранения.
Для данного примера предположим следующее:
- datadir - это / var / lib / mysql
- база данных называется mydb
- таблица в базе данных mydb называется mytable .
MyISAM таблицы
Если mydb.mytable использует механизм хранения MyISAM, таблица будет физически отображаться как три отдельных файла.
- /var/lib/mysql/mydb/mytable.frm (файл .frm)
- /var/lib/mysql/mydb/mytable.MYD (файл .MYD)
- /var/lib/mysql/mydb/mytable.MYI (файл .MYI)
.Frm содержит структуру таблицы
.MYD содержит данные таблицы
.MYI содержит страницу индекса таблицы
Эти файлы используются взаимозависимо для представления таблицы с логической точки зрения в MySQL. Так как эти файлы не имеют дальнейшей логической привязки к нему, перенос таблицы с одного сервера БД на другой. Вы даже можете сделать это с сервера Windows на сервер Linux или MacOS. Конечно, вы можете отключить MySQL и скопировать 3 файла таблицы. Вы можете запустить следующее:
LOCK TABLES mydb.mytable READ;
SELECT SLEEP(86400);
UNLOCK TABLES;
в одном сеансе SSH держать таблицу только для чтения и удерживать блокировку в течение 24 часов. Через секунду выполните копирование в другой сессии ssh. Затем завершите сеанс mysql с 24-часовой блокировкой. Вам не нужно ждать 24 часа.
Таблицы InnoDB
Исходя из вышеупомянутой цитаты из книги сертификации, существует множество факторов, которые определяют, как сделать резервную копию конкретной таблицы InnoDB. Для простоты, ясности и краткости просто выполните mysqldump желаемой таблицы, используя параметры --single-транзакции, чтобы получить идеальный дамп таблицы на момент времени. Не нужно разбираться с семантикой InnoDB, если вам нужна только одна таблица. Вы можете перезагрузить этот дамп-файл на любой сервер MySQL по вашему выбору.
Поскольку два вопроса были объединены здесь (Jcolebrand): РЕДАКТИРОВАТЬ
Если вы более чем готовы жить с некоторой медленной производительностью БД, вы можете выполнить серию rsyncs со старого сервера (ServerA) на новый сервер (ServerB), даже если mysql все еще работает на ServerA.
Шаг 01) Установите ту же версию MySQL на сервере B, что и у ServerA
Шаг 02) На сервере A, запустите SET GLOBAL innodb_max_dirty_pages_pct = 0;
из mysql и около 10 минут (Это удаляет грязные страницы из пула буферов InnoDB. Это также помогает быстрее выполнять завершение работы mysql) Если ваша база данных - это MyISAM, вы можете пропустить этот шаг.
Шаг 03) rsync --archive --verbose --stats --partial --progress --human-readable ServerA:/var/lib/mysql ServerB:/var/lib/mysql
Шаг 04) Повторяйте шаг 03, пока rsync не займет менее 1 минуты
Шаг 05) service mysql stop
на сервере А
Шаг 06) Выполните еще одну rsync
Шаг 07) scp ServerA:/etc/my.cnf ServerB:/etc/
Шаг 08) service mysql start
на сервере B
Шаг 08) service mysql start
на сервере А (необязательно)
Попробуйте!
ПРЕДОСТЕРЕЖЕНИЕ
Вы можете создать подчиненное устройство репликации следующим образом. Просто помните, что в главном /etc/my.cnf явно указывается идентификатор сервера, а в ведомом /etc/my.cnf - другой номер для идентификатора сервера.