Згідно з посібником з дослідження сертифікації 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, якщо ви хочете лише одну таблицю. Ви можете перезавантажити цей dumpfile на будь-який MySQL сервер на ваш вибір.
Оскільки тут було об'єднано два питання (jcolebrand): EDIT
Якщо ви більше ніж готові жити з деякою повільною продуктивністю БД, ви можете виконати ряд rsyncs від старого сервера (ServerA) до нового сервера (ServerB), навіть якщо mysql все ще працює на ServerA.
Крок 01) встановіть ту саму версію mysql на ServerB, яку має ServerA
Крок 02) На ServerA запустіть SET GLOBAL innodb_max_dirty_pages_pct = 0;
з mysql і близько 10 хвилин (Це очищає брудні сторінки з пулу InnoDB Buffer. Це також допомагає швидше відключити 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
на ServerA
Крок 06) Виконайте ще одну rsync
Крок 07) scp ServerA:/etc/my.cnf ServerB:/etc/
Крок 08) service mysql start
на ServerB
Крок 08) service mysql start
на ServerA (необов’язково)
Спробувати !!!
КАВАТИ
Ви можете створити такий підлеглий реплікації. Просто пам’ятайте, що в ідентифікаторі /etc/my.cnf встановлено ідентифікатор сервера explcitly та інше число для ідентифікатора сервера /etc/my.cnf