Ru-MaNGOS

Вернуться   Ru-MaNGOS > Дополнения > Tools

Важная информация

Tools Обсуждение программ для MaNGOS

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.12.2010, 10:27   #1
Sid
Ученый
 
Аватар для Sid
 
Регистрация: 02.04.2010
Сообщений: 237
Сказал(а) спасибо: 41
Поблагодарили 99 раз(а) в 44 сообщениях
Sid Скоро придёт к известностиSid Скоро придёт к известности
По умолчанию DataBase GUID sorter

Сразу прошу помидорами не кидаться Программиринг в стадии изучения
Давно еще хотел навести порядок в базе в таблицах связанных по ключевым полям GUID (например characters и от нее зависящие character_* или creature и creature_*) смысл понятен. Иногда, или даже постоянно если много работаешь с базой, появляются пробелы в гуидах и они приобретают колоссальные значения
Программка создает темповое поле в которое перезаписывает исходные GUID'ы в инкрементальном порядке от 1 и до значения которое выдаст запрос COUNT(*) Одновременно сопоставляя GUID'ы из указанных зависящих таблиц, так же создает темповое поле и записывает на него соответствующие новые GUID'ы. По окончании выполнения, удаляет из зависящих таблиц записи у которых темповое поле оказалось равным 0 (значит гуид не существует в исходной таблице) и заменяет старое guid поле на то что получилось в темповом.

Мда, не умею я красиво объяснять, но как есть

В итоге что пока умеет:
- Поддержка до 5 таблиц, однако можно в коде выставить больше кто желает.
- Поддержка 2 полей в PRI KEY.

Как работает:
1) Запускаем, вводим данные для соединения с базой (как правило нужен юзер с доступом на ALTER запрос.)
2) После соединения с бд вводим setvar и указываем переменные.
3) Вводим start и ждем (чем больше зависящих таблиц и записей тем дольше работает)

Скриншот результата:


Сейчас пока альфа тестовая версия консольная, позже сделаю на Qt4.

Исходники https://github.com/sidsukana/dbsorter
Релизный бинарник https://github.com/downloads/sidsuka...er_Release.zip

Спасибо за внимание

Последний раз редактировалось Sid; 17.12.2010 в 10:33.
Sid вне форума   Ответить с цитированием
Старый 17.12.2010, 10:34   #2
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Перенумерацию гуидов можно сделать средствами базы данных.
virusav вне форума   Ответить с цитированием
Старый 17.12.2010, 10:41   #3
Sid
Ученый
 
Аватар для Sid
 
Регистрация: 02.04.2010
Сообщений: 237
Сказал(а) спасибо: 41
Поблагодарили 99 раз(а) в 44 сообщениях
Sid Скоро придёт к известностиSid Скоро придёт к известности
По умолчанию

Хм, не знал даже)) А соответствие значений в других таблицах база тоже может сделать?
Sid вне форума   Ответить с цитированием
Старый 17.12.2010, 11:05   #4
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Со старого форума базы YTDB:
Цитата:
Сообщение от virusav Посмотреть сообщение
Восстанавливаю тему со старого форума.

Перенумерация гуидов в таблицах `creature` и `gameobject`, а также во всех связанных таблицах.

Для `creature`:
Код:
DROP TRIGGER IF EXISTS `creature_after_update`;
CREATE TRIGGER `creature_after_update` AFTER UPDATE ON `creature`
FOR EACH ROW BEGIN
UPDATE `creature_addon` SET `guid`=NEW.guid WHERE `guid`=OLD.guid;
UPDATE `creature_movement` SET `id`=NEW.guid WHERE `id`=OLD.guid;
UPDATE `game_event_creature` SET `guid`=NEW.guid WHERE `guid`=OLD.guid;
UPDATE `game_event_creature_quest` SET `id`=NEW.guid WHERE `id`=OLD.guid;
UPDATE `npc_gossip` SET `npc_guid`=NEW.guid WHERE `npc_guid`=OLD.guid;
UPDATE `pool_creature` SET `guid`=NEW.guid WHERE `guid`=OLD.guid;
UPDATE `creature_battleground` SET `guid`=NEW.guid WHERE `guid`=OLD.guid;
END;
SELECT 0 INTO @temp_var;
UPDATE `creature` SET `guid`=1000000 WHERE `guid`=0;
UPDATE `creature` SET `guid`=@temp_var:=@temp_var+1 ORDER BY `guid` ASC;
DROP TRIGGER IF EXISTS `creature_after_update`;
Для `gameobject`:
Код:
DROP TRIGGER IF EXISTS `gameobject_after_update`;
CREATE TRIGGER `gameobject_after_update` AFTER UPDATE ON `gameobject`
FOR EACH ROW BEGIN
UPDATE `event_scripts` SET `datalong`=NEW.guid WHERE `datalong`=OLD.guid AND `command` IN (9,11,12,13);
UPDATE `game_event_gameobject` SET `guid`=NEW.guid WHERE `guid`=OLD.guid;
UPDATE `gameobject_scripts` SET `id`=NEW.guid WHERE `id`=OLD.guid;
UPDATE `gameobject_scripts` SET `datalong`=NEW.guid WHERE `datalong`=OLD.guid AND `command` IN (9,11,12,13);
UPDATE `pool_gameobject` SET `guid`=NEW.guid WHERE `guid`=OLD.guid;
UPDATE `quest_start_scripts` SET `datalong`=NEW.guid WHERE `datalong`=OLD.guid AND `command` IN (9,11,12,13);
UPDATE `quest_end_scripts` SET `datalong`=NEW.guid WHERE `datalong`=OLD.guid AND `command` IN (9,11,12,13);
UPDATE `spell_scripts` SET `datalong`=NEW.guid WHERE `datalong`=OLD.guid AND `command` IN (9,11,12,13);
UPDATE `gameobject_battleground` SET `guid`=NEW.guid WHERE `guid`=OLD.guid;
END;
SELECT 0 INTO @temp_var;
UPDATE `gameobject` SET `guid`=1000000 WHERE `guid`=0;
UPDATE `gameobject` SET `guid`=@temp_var:=@temp_var+1 ORDER BY `guid` ASC;
DROP TRIGGER IF EXISTS `gameobject_after_update`;
Если надо сделать автоинкременты в этих таблицах и сбросить их, то после перенумерации:
Код:
ALTER TABLE `creature` CHANGE COLUMN `guid` `guid` int(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE `creature` AUTO_INCREMENT=1;
ALTER TABLE `gameobject` CHANGE COLUMN `guid` `guid` int(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE `gameobject` AUTO_INCREMENT=1;
Список таблиц можно пополнить в любой момент.
virusav вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Softer (17.12.2010)
Старый 18.12.2010, 19:24   #5
selector
Пользователь
 
Аватар для selector
 
Регистрация: 12.03.2010
Сообщений: 64
Сказал(а) спасибо: 23
Поблагодарили 10 раз(а) в 5 сообщениях
selector На верном пути
По умолчанию

virusav возможно ли такое сделать с чарами. Например гуиды в item_instance зашкаливают(уже триллионы пошли), да и таблицу characters надо бы упорядочить. Проблема лишь в удаленных чарах(которых можно восстановить через .char deleted restore). У них нуиды и все сбито(нули)
selector вне форума   Ответить с цитированием
Старый 18.12.2010, 19:48   #6
KiriX
Умный
Старожил
 
Аватар для KiriX
 
Регистрация: 06.03.2010
Сообщений: 886
Сказал(а) спасибо: 698
Поблагодарили 433 раз(а) в 181 сообщениях
Записей в дневнике: 4
KiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человекKiriX Реально хороший человек
По умолчанию

Цитата:
Сообщение от selector Посмотреть сообщение
virusav возможно ли такое сделать с чарами. Например гуиды в item_instance зашкаливают(уже триллионы пошли), да и таблицу characters надо бы упорядочить. Проблема лишь в удаленных чарах(которых можно восстановить через .char deleted restore). У них нуиды и все сбито(нули)
Можно и когда-то где-то было.
У удалённых сбито потому что присваивается при заливке всё новое
KiriX вне форума   Ответить с цитированием
Старый 18.12.2010, 19:52   #7
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Можно взять приведенные запросы за основу и подставить названия нужных таблиц.
Главное - не забыть указать все связанные таблицы.
virusav вне форума   Ответить с цитированием
Старый 19.12.2010, 01:13   #8
PSZ
Ученый
 
Регистрация: 07.03.2010
Сообщений: 138
Сказал(а) спасибо: 200
Поблагодарили 143 раз(а) в 49 сообщениях
PSZ Обладатель прекрасной аурыPSZ Обладатель прекрасной ауры
По умолчанию

Для более-менее старого сервера да еще и с большим онлайном скорее всего такое упорядочивание загнет mysql на пару суток
PSZ вне форума   Ответить с цитированием
Старый 19.12.2010, 10:00   #9
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Не согласен.

Если, например, 1к персов, 10к записей в связанных таблицах, то получим 11к запросов UPDATE, что будет выполняться не очень долго.
virusav вне форума   Ответить с цитированием
Старый 19.12.2010, 10:18   #10
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

По хорошему этим ядро должно заниматься. FindFirstFreeGuid - и далее заполнять не по следующему а по первому свободному. Иначе это принципиальный затык на переполнении (хотя и не скоро).
rsa вне форума   Ответить с цитированием
3 пользователя(ей) сказали cпасибо:
KiriX (19.12.2010), PSZ (19.12.2010), Кот ДаWINчи (19.12.2010)
Старый 19.12.2010, 12:22   #11
Кот ДаWINчи
Умный
 
Аватар для Кот ДаWINчи
 
Регистрация: 07.03.2010
Адрес: Северный Урал (60°сш, 60°вд)
Сообщений: 330
Сказал(а) спасибо: 82
Поблагодарили 399 раз(а) в 120 сообщениях
Записей в дневнике: 30
Кот ДаWINчи Реально хороший человекКот ДаWINчи Реально хороший человекКот ДаWINчи Реально хороший человекКот ДаWINчи Реально хороший человекКот ДаWINчи Реально хороший человек
Отправить сообщение для Кот ДаWINчи с помощью ICQ Отправить сообщение для Кот ДаWINчи с помощью Skype™
По умолчанию

Цитата:
Сообщение от rsa Посмотреть сообщение
По хорошему этим ядро должно заниматься. FindFirstFreeGuid - и далее заполнять не по следующему а по первому свободному. Иначе это принципиальный затык на переполнении (хотя и не скоро).
согласен, хотя есть такая не хорошая тема для раздумий. У пользователя третье лицо ради шутки стирает персонажа. Бедный пользователь пишет сквозь слезы письмо админу, мол восстанови мне любимого перса.... а гуид уже занят...
Может при удалении в базу заносить дату и гуид удаления персонажа, и несколько дней не трогать этот гуид.
Кот ДаWINчи вне форума   Ответить с цитированием
Старый 19.12.2010, 13:25   #12
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Восстановить можно с новым гуидом, если есть бекап.
virusav вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
KiriX (19.12.2010)
Старый 19.12.2010, 14:06   #13
rsa
Почетный флудер
Старожил
 
Аватар для rsa
 
Регистрация: 08.03.2010
Адрес: Мурманск, Россия
Сообщений: 788
Сказал(а) спасибо: 55
Поблагодарили 333 раз(а) в 151 сообщениях
Записей в дневнике: 1
rsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранитаrsa Как самоцвет среди гранита
По умолчанию

Цитата:
Сообщение от Кот ДаWINчи Посмотреть сообщение
согласен, хотя есть такая не хорошая тема для раздумий. У пользователя третье лицо ради шутки стирает персонажа. Бедный пользователь пишет сквозь слезы письмо админу, мол восстанови мне любимого перса.... а гуид уже занят...
Может при удалении в базу заносить дату и гуид удаления персонажа, и несколько дней не трогать этот гуид.
именно эта проблема уже полгода как в ядре решена. количество дней настраивается в конфиге.
rsa вне форума   Ответить с цитированием
Старый 19.12.2010, 19:27   #14
PSZ
Ученый
 
Регистрация: 07.03.2010
Сообщений: 138
Сказал(а) спасибо: 200
Поблагодарили 143 раз(а) в 49 сообщениях
PSZ Обладатель прекрасной аурыPSZ Обладатель прекрасной ауры
По умолчанию

Цитата:
Сообщение от virusav Посмотреть сообщение
Не согласен.

Если, например, 1к персов, 10к записей в связанных таблицах, то получим 11к запросов UPDATE, что будет выполняться не очень долго.
Это какой-то очень мелкий сервер ). У меня, например, сервер тоже, я считаю, маленький (100-150 онлайна), в таблице чаров - около 30к записей. А связанных - так вообще караул. А что говорить о тех, у кого более 1000 онлайна...
PSZ вне форума   Ответить с цитированием
Старый 19.12.2010, 19:33   #15
virusav
Администратор
 
Аватар для virusav
 
Регистрация: 19.02.2010
Сообщений: 492
Сказал(а) спасибо: 55
Поблагодарили 341 раз(а) в 154 сообщениях
virusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человекvirusav Реально хороший человек
Отправить сообщение для virusav с помощью ICQ
По умолчанию

Запросы на обновление выполняются довольно быстро.
Как-то по работе надо было делать несколько тысяч UPDATE, тоже думали, что будет долго.

Главное - правильно расставить ключи, если их нет.

Уже не раз убеждался, что операции с большим объемом данных лучше делать средствами самого MySQL.
virusav вне форума   Ответить с цитированием
Старый 19.12.2010, 21:59   #16
Sid
Ученый
 
Аватар для Sid
 
Регистрация: 02.04.2010
Сообщений: 237
Сказал(а) спасибо: 41
Поблагодарили 99 раз(а) в 44 сообщениях
Sid Скоро придёт к известностиSid Скоро придёт к известности
По умолчанию

Ну, у меня по изучении с++ стояла задача сделать все на стороне программы Вкачиваем скил ненужным софтом так сказать . А за запросы, спасибо!
Sid вне форума   Ответить с цитированием
Старый 20.12.2010, 10:06   #17
tempura
Forum bot
 
Аватар для tempura
 
Регистрация: 01.02.2010
Адрес: пусто
Сообщений: 841
Сказал(а) спасибо: 286
Поблагодарили 418 раз(а) в 190 сообщениях
Записей в дневнике: 60
tempura отключил(а) отображение уровня репутации
По умолчанию

По программированию - ЗОЧОД.

А по поводу "надо - не надо" - дело десятое. Кому-то может и пригодится.
__________________
Совершенно безопасен для людей, обладающих хотя бы некоторыми минимальными зачатками интеллекта, и способными строить причинно-следственные цепочки.
tempura вне форума   Ответить с цитированием
2 пользователя(ей) сказали cпасибо:
KiriX (20.12.2010), Sid (20.12.2010)
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[10904] Cleanup character_battleground_data when deleting characters from database newsbot CMaNGOS Commits 0 21.12.2010 15:40
Альтернатива Zero Database smoota MaNGOSZero (1.12.X) 1 19.10.2010 22:46
[10100] Fixed some cases assign low guid to full guid update field. newsbot CMaNGOS Commits 0 23.06.2010 10:20
[9849] Implement character database clean up. newsbot CMaNGOS Commits 0 08.05.2010 00:20


Текущее время: 06:35. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot