Mysql
 sql >> база данни >  >> RDS >> Mysql

Промяна на големи MySQL InnoDB таблици

Редактиране 2016 г.: наскоро (август 2016 г.) пуснахме gh-ost , променяйки отговора си, за да го отрази.

Днес има няколко инструмента, които ви позволяват да правите онлайн таблица за промяна на MySQL. Това са:

Нека разгледаме "нормалната" `ALTER TABLE`:

ALTER на голяма таблица ще отнеме много време . innodb_buffer_pool_size е важно, както и другите променливи, но на много голяма маса всички те са незначителни. Просто отнема време.

Какво прави MySQL с ALTER таблица е да създадете нова таблица с нов формат, да копирате всички редове и след това да превключите. През това време масата е напълно заключена.

Помислете за вашето собствено предложение:

Най-вероятно ще се представи най-лошо от всички опции. Защо така? Тъй като използвате таблица на InnoDB, INSERT INTO tablename_tmp SELECT * FROM tablename прави за транзакция. огромени транзакция. Това ще създаде дори повече натоварване от нормалния ALTER TABLE .

Освен това ще трябва да изключите приложението си по това време, за да не пише (INSERT , DELETE , UPDATE ) на вашата маса. Ако е така - цялата ви транзакция е безсмислена.

Какво предоставят онлайн инструментите

Инструментите не работят еднакво. Основните неща обаче са споделени:

  • Те създават таблица в сянка с променена схема
  • Те създават и използват тригери за разпространение на промените от оригиналната таблица към таблицата призрак
  • Те бавно копирайте всички редове от вашата таблица в таблица с сянка. Те го правят на парчета:да речем, 1000 реда наведнъж.
  • Те правят всичко по-горе, докато вие все още имате достъп и манипулирате оригиналната таблица.
  • Когато са доволни, те разменят двете, като използват RENAME .

Openark-комплект инструментът се използва вече 3,5 години. Инструментът Percona е на няколко месеца, но вероятно е по-изпитан от предишния. Твърди се, че инструментът на Facebook работи добре за Facebook, но не предоставя общо решение на обикновения потребител. Самият аз не съм го използвал.

Редактиране 2016 г.: gh-ost е решение без задействане, което значително намалява натоварването на главния запис върху главния, отделяйки натоварването при запис на миграция от нормалното натоварване. Той е одитируем, контролиран, тестван. Разработихме го вътрешно в GitHub и го пуснахме като отворен код; правим всички наши производствени миграции чрез gh-ost днес. Вижте повече тук .

Всеки инструмент има свои собствени ограничения, разгледайте внимателно документацията.

Консервативният начин

Консервативният начин е да използвате репликация Active-Passive Master-Master, направете ALTER на резервния (пасивен) сървър, след това сменете ролите и направете ALTER отново на това, което преди беше активен сървър, сега стана пасивен. Това също е добър вариант, но изисква допълнителен сървър и по-задълбочени познания за репликацията.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Попълване на база данни без командата load data

  2. Как да се свържем дистанционно с MySQL база данни, разположена на нашия споделен сървър

  3. MySQL Вмъкване и присъединяване

  4. Какъв режим за MySQL WEEK() отговаря на ISO 8601

  5. Показване на дървовидното меню на избрания родител