[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: MySQL, партиции. Вопросик есть.
sergeiss
Задача простая. Надо выполнить всего 2 команды на одной таблице. Первая - изменить primary key с одного столбца на 2 столбца. Вторая - создать партиции.

Как делать, какие команды запустить - всё понятно. Попробовал на локальном сервере, всё тип-топ. Вот только загвоздка в том, что таблица большая, примерно 10.5 млн записей (иначе и партиции не были бы нужны smile.gif). Поэтому обе команды выполняются очень долго, на локальном сервере в течение многих часов.

Вопрос такой.
На "боевом" сервере что будет при выполнении этих команд - блокировка таблицы? Или просто будет подтормаживать? С тормозами можно смириться, а вот с блокировками нет. Гуру Мускуля - ваше слово!

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Valick
sergeiss, зачем? кто мешает (да и по другому я бы не советовал) сделать все изменения на копии базы, а потом сделать подмену?


_____________
Стимулятор ~yoomoney - 41001303250491
sergeiss
Потому что я не могу остановить базу. Она используется. Даже если ночью с ней работать, то там автоматические действия выполняются.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
sergeiss
Уточнил... Все-таки можно сделать так, чтобы именно в эту таблицу ничего не писалось некоторое время. Достаточное для того, чтобы обработать.

Думаю так. Сначала сделаю копию данных в другую таблицу в этой же БД. Затем удалю всё из основной таблицы. Изменю структуру таблицы. "Залью" данные обратно из временной таблицы. Установлю корректную величину автоинкремента.

По предварительным локальным тестам, вроде как, достаточно быстро пройти должно. Тем более, что обратную заливку можно делать по частям. Сначала более свежие данные, которые чаще используются. А потом более старые.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Oyeme
Вам нужно иметь как минимим 2 вир.сервера master и slave и между ними сделать балансировку.
Это точно такаеже опирация если Вы будете делать back up таблицам,slave лочится,а мастер работает.

Другово варианта тут быть не должно,у Вас огромный обьем данных.
sergeiss
Oyeme, идея интересная, но тут не поможет никак, по-моему. Ведь для того, чтобы сделать мастер-слейв, надо проделать еще больше действий. Не с одной таблицей, а со всеми!!! Недавно как раз упражнялся с репликациями, знаю. В данном случае "овчинка выделки не стоит".

Поупражнялся сейчас на локальном сервере с таблицей аналогичного размера (только полей чуть меньше сделал, чем на реальном сервере). Минимальное время, которое у меня получается, порядка 2-3-х часов (точнее не замечал). И очень существенно то, что нахрен все индексы удаляю, остается только primary key - в той таблице, ОТКУДА выкачиваю!!! Иначе вместо простого чтения (как мне надо) для выборки берется зачем-то один из индексов (EXPLAIN показывает использование индекса). Время перекачки инфы возрастает очень сильно с использованием этого индекса. Ну а там, куда качаю, в промежуточной таблице вообще индексов нет.

Можно было бы, наверное, в файл вылить, а потом залить. Но, по сути, я примерно то же самое делаю с промежуточной таблицей.

Кстати. Пока не удалил индексы, вообще ни разу не записал инфу в промежуточную таблицу. Потому что через 4-5 часов просто выключал эту перезапись, потому что понимал, что это уже изврат и что не известно, сколько там еще будет копироваться.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Oyeme
Цитата (sergeiss @ 14.06.2014 - 00:15)
Oyeme, идея интересная, но тут не поможет никак, по-моему. Ведь для того, чтобы сделать мастер-слейв, надо проделать еще больше действий. Не с одной таблицей, а со всеми!!! Недавно как раз упражнялся с репликациями, знаю. В данном случае "овчинка выделки не стоит".

Поупражнялся сейчас на локальном сервере с таблицей аналогичного размера (только полей чуть меньше сделал, чем на реальном сервере). Минимальное время, которое у меня получается, порядка 2-3-х часов (точнее не замечал). И очень существенно то, что нахрен все индексы удаляю, остается только primary key - в той таблице, ОТКУДА выкачиваю!!! Иначе вместо простого чтения (как мне надо) для выборки берется зачем-то один из индексов (EXPLAIN показывает использование индекса). Время перекачки инфы возрастает очень сильно с использованием этого индекса. Ну а там, куда качаю, в промежуточной таблице вообще индексов нет.

Можно было бы, наверное, в файл вылить, а потом залить. Но, по сути, я примерно то же самое делаю с промежуточной таблицей.

Кстати. Пока не удалил индексы, вообще ни разу не записал инфу в промежуточную таблицу. Потому что через 4-5 часов просто выключал эту перезапись, потому что понимал, что это уже изврат и что не известно, сколько там еще будет копироваться.

Ваша таблица растет,и я предрологаю что быстро.

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

На одном сервере Вы мало протянете в любом случаи даже при росте до 20 миллионов записей,это очень рискованно.

Если Вам потребеуетя срочный back up у Вас вся таблица залочится,на localhost Вы можите забыть делать такие тесты с обьемем свыше 10 миллионов данных.

А если У Вас Innodb то и обьем еще толще.

Покукпа второго виртуальнго сервера Вам спасет жизнь в будущем.Тем более стоит это все копейки,по сровнеение с тем временем что Вы будуте тратить на решение Ваших проблем.
vital
Цитата (sergeiss @ 13.06.2014 - 20:11)
Уточнил... Все-таки можно сделать так, чтобы именно в эту таблицу ничего не писалось некоторое время. Достаточное для того, чтобы обработать.

Думаю так. Сначала сделаю копию данных в другую таблицу в этой же БД. Затем удалю всё из основной таблицы. Изменю структуру таблицы. "Залью" данные обратно из временной таблицы. Установлю корректную величину автоинкремента.

По предварительным локальным тестам, вроде как, достаточно быстро пройти должно. Тем более, что обратную заливку можно делать по частям. Сначала более свежие данные, которые чаще используются. А потом более старые.

Ну вот самостоятельно почти и придумался ответ на свой же вопрос? smile.gif

Вообще для таких целей обычно пишут процедурку, прямо в самой бд, создает новую таблицу с нужной структурой и сегментированием, потом переносит туда данные из старой, потом сносит старую и переименовывает новую в как звали старую

Так - большую часть времени сего действия оно будет тормозить но работать, и потом только на момент удаления-переименования что-то может упасть.

_____________
"Нужно быть готовым прислушиваться к тем, кто может тебя чему-нибудь научить. Иначе ты никогда не вырастешь."

Откровенно я никому ниразу не нагрубил. А дать подзатыльник зарвавшемуся юнцу, так это и ему на пользу, и мне в удовольствие. © AllesKlar
vital
Ну и да, если делать так
ALTER TABLE t1
PARTITION BY ...
Прямо на живой таблице оно ее залочит. В этом же был вопрос изначально.

Еще есть тулзы для автоматического делания то что я описал выше. У percona-ы есть своя, а еще есть штука от фейсбука для этого же https://www.facebook.com/notes/mysql-at-fac...ql/430801045932

_____________
"Нужно быть готовым прислушиваться к тем, кто может тебя чему-нибудь научить. Иначе ты никогда не вырастешь."

Откровенно я никому ниразу не нагрубил. А дать подзатыльник зарвавшемуся юнцу, так это и ему на пользу, и мне в удовольствие. © AllesKlar
DedMorozzz
Если вопрос про блокировку, то тут не должно вызывать сомнений...
При партицировании физически создаются разные файлы, на низком уровне
Соотв. если не будет блокировки, то до окончания разбивки - все сохранёные даные будут утеряны

_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
sergeiss
Цитата (DedMorozzz @ 14.06.2014 - 13:03)
При партицировании физически создаются разные файлы, на низком уровне

Не всё так однозначно. Мускуль же может хранить всю БД в одном большом файле. Что он и делает по умолчанию, вобщем-то. А чтобы Мускуль создавал физически разные файлы, надо сделать определенные настройки.
Так что если всё пишется в один файл, то и при партицировании всё будет в одном большом файле. Там только логические куски будут разные.

Цитата (vital @ 14.06.2014 - 12:48)
Ну вот самостоятельно почти и придумался ответ на свой же вопрос?

Ну да, это как в анекдоте про профессора и студентов smile.gif

Цитата (Oyeme @ 14.06.2014 - 12:34)
Ваша таблица растет,и я предролагаю что быстро.

На одном сервере Вы мало протянете в любом случаи даже при росте до 20 миллионов записей,это очень рискованно.

Эти 10 млн. скопились с начала 2013 года, судя по датам. Надеюсь, что до 20 млн. дотянем без проблем smile.gif Но уже с партициями будем "тянуть".

Цитата (Oyeme @ 14.06.2014 - 12:34)
Покупка второго виртуального сервера Вам спасет жизнь в будущем.Тем более стоит это все копейки,по сравнению с тем временем что Вы будете тратить на решение Ваших проблем.

Правильно ты всё говоришь. Но это пусть уже заказчик думает, мысль такую я ему подкину. Единственная проблема, что при создании мастер-слейва тоже будут нехилые такие "танцы с бубном". Изначально же не планировал никто никаких мастер-слейвов, а когда данных дохрена, то тормоза будут большие при создании такой структуры.


PS. В Постгре намного проще это всё решается с партициями. Там я бы создал партиции, не тормозя таблицу. И перетащил бы всю лабуду в партиции прямо "на ходу". А тут, блин, "танцы с бубном".

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
FatCat
Цитата (sergeiss @ 13.06.2014 - 19:07)
изменить primary key с одного столбца на 2 столбца

Делал подобное на большой таблице: 6 гигов таблица (миллионы строк) нужно было добавить индекс. Напрямую в пхп-админе молотило несколько часов, не дождался, надоело.
Сделал в 4 приема:
1. SELECT * INTO OUTFILE
2. DROP
3. ALTER
4. LOAD DATA INFILE
На круг уложилось минут в 10.

_____________
Бесплатному сыру в дырки не заглядывают...
sergeiss
Цитата (FatCat @ 14.06.2014 - 19:52)
Сделал в 4 приема:...

Я чуть ранее написал, что примерно к тому же и пришел. Только не в файл, а в другую таблицу выливаю данные и потом оттуда забираю. В промежутке между вылил-залил еще и партиции настраиваю.
Локально получилось не 10 минут... Но все равно более-менее разумное время.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.