23.07.2008, 15:34 | #141 |
Участник
|
Цитата:
Да, запустил еще раз проверку кодов то через 4-о суток оно сделалось!!! Значение RecId стало "140568244" :-) (правда я запускал перед этим еще реиндексацию зачем-то :-( )
__________________
Жить все веселей!.. AX3SP3CU1 |
|
23.07.2008, 16:10 | #142 |
Участник
|
привожу
__________________
Жить все веселей!.. AX3SP3CU1 |
|
14.10.2008, 11:49 | #143 |
Участник
|
LedgerTrans.BondBatchTrans_RU
У меня вопрос знатокам по поводу поля LedgerTrans.BondBatchTrans_RU. У поля тип RefRecId, но как я понял ни на какой живой RecId он не ссылается. Вопрос, что будет с содержимым этого поля при выполнении дефрагментации RecId? Ведь новые номера в таблице AXOLDTONEWRECIDS сгенерятся не для всех его значений, а апдейт будет все равно запускаться.
|
|
14.10.2008, 13:35 | #144 |
Member
|
С ними будет то же самое, что будет в полях, которые таки ссылаются на другие записи по RecId. Т.е. если у вас запись ссылается на другую запись по RecId, но записи с таким RecId не существует, то ссылка по RecId не обновляется. После реиндексации она может начать ссылаться на какую-то другую (уже существующую) запись. Тут будет точно так же. Но в данном конкретном случае, по-моему, это не страшно.
__________________
С уважением, glibs® |
|
14.10.2008, 14:17 | #145 |
Участник
|
Цитата:
Смотрим код. Там в частности для оракла генерится оператор вида: UPDATE table set field = NEWRECID FROM AXOLDTONEWRECIDS WHERE OLDRECID=table.field Допустим, в AXOLDTONEWRECIDS не всегда есть подходящая запись, UPDATE вообще не отработает или запишет пусто? Версия 3. |
|
14.10.2008, 14:32 | #146 |
Участник
|
Для table.field, которым нет соответствия в AXOLDTONEWRECIDS, ничего не изменится
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: coolibin (1). |
23.12.2009, 15:22 | #147 |
Moderator
|
Изучаю метод \Classes\SysRecIdRepair\mainLoop.
И что-то возникло смутное беспокойство - а транзакция-то где? Самая главная, в которой выполняются все эти executeUpdate? Или она неявно обеспечивается существованием объекта Connection, который в new инициализируется? Развеивателям беспокойства - заранее спасибо! |
|
23.12.2009, 15:39 | #148 |
Administrator
|
Нэту... У объекта Connection есть методы ttsbegin(), ttscommit() - вот они и должны стоять (именно у этого экземпляра)... Все остальные tts-ы не имеют к этому коду никакого отношения.
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: Gustav (2). |
23.12.2009, 16:28 | #149 |
Member
|
Там нет транзакции. Более того, пересчет нужно запускать только в "монопольном" режиме. А то все развалится.
Насколько я понимаю, транзакция подсадит производительность. Я перед пересчетом предпочитаю сделать бэкап базы, перевести ее в "simple recovery mode", а потом вернуть обратно. Если что не получится — гораздо быстрее и безопаснее откатиться в начало из бэкапа. А запись лога отнимет ресурсы и потребует прилично места на диске.
__________________
С уважением, glibs® |
|
|
За это сообщение автора поблагодарили: Gustav (2). |
23.12.2009, 16:31 | #150 |
Moderator
|
Та-а-а-к... Т.е. если уборщица тётя Клава шваброй дёрнет какой-нибудь не тот провод во время дефрагментации, ты мы имеем... Точнее, мы, наверное, уже ничего не имеем!.. И как же быть? Делать копию рабочей базы, дефрагментировать на копии и при успешном завершении "подставлять" копию под рабочее приложение?
Логично! И лучше, чем я предположил. Последний раз редактировалось Gustav; 23.12.2009 в 16:37. |
|
23.12.2009, 16:42 | #151 |
Moderator
|
Цитата:
Сообщение от Gustav
Та-а-а-к... Т.е. если уборщица тётя Клава шваброй дёрнет какой-нибудь не тот провод во время дефрагментации, ты мы имеем... Точнее, мы, наверное, уже ничего не имеем!.. И как же быть? Делать копию рабочей базы, дефрагментировать на копии и при успешном завершении "подставлять" копию под рабочее приложение?
Так что рекомендую дефрагментацию ставить в ночь с пятницы на субботу, в субботу приходить на работу и смотреть что получилось. Ну а если не получилось - откатываться до бэкапа на пятничный вечер. |
|
|
За это сообщение автора поблагодарили: Gustav (2). |
23.12.2009, 16:48 | #152 |
Модератор
|
Цитата:
Цитата:
ты мы имеем... Точнее, мы, наверное, уже ничего не имеем!..
Цитата:
И как же быть? Делать копию рабочей базы, дефрагментировать на копии и при успешном завершении "подставлять" копию под рабочее приложение?
P.S. Попробуйте (на тестовом инстансе!) завернуть дефрагментацию в транзакцию и посмотрите, что происходит в это время с transaction log ( undo / redo ). Теперь попробуйте прервать эту транзакцию на середине. Теперь представьте, что у Вас каждую минуту звонит телефон "ну когда уже можно будет зайти". Вариант с полным бэкапом покажется не таким уж и страшным
__________________
-ТСЯ или -ТЬСЯ ? |
|
|
За это сообщение автора поблагодарили: Gustav (2). |
29.03.2010, 16:04 | #153 |
Участник
|
Провожу сейчас исследование на тему дефрагментации, поскольку RecID уже за -1.6 млрд перевалил. Что обнаружил, применимо к Oracle -
строка 103, mainLoop - X++: this.executeUpdate('CREATE TABLE AXOLDTONEWRECIDS (OLDRECID NUMERIC(12), NEWRECID NUMERIC(12), CONSTRAINT PK_AXOLDTONEWRECIDS PRIMARY KEY (OLDRECID)) ORGANIZATION INDEX'); Собственно CONSTRAINT PK_AXOLDTONEWRECIDS ИМХО можно безболезненно убрать! |
|
|
За это сообщение автора поблагодарили: Logger (5), gl00mie (3). |
20.08.2010, 13:46 | #154 |
Модератор
|
Недавно вместе с одним из пожелавших остаться неизвестным участников "отдефрагментировали" RecId :
Вводная: - Несколько (порядка 10) компаний, три крупных - Одна виртуальная компания - Максимальный RecId 1843756363 - Размер БД около 280Гб (SQL Server 2008) Проблемы: - основная, разумеется, размер БД и ограниченное временное окно на выполнение процедуры - стандартный механизм обладает некоторыми "особенностями": - при запуске по всем компаниям компаний эффект "сжатия RecId" может снижаться или полностью отсутствовать - при запуске по одной компании неправильно делается обновление ссылок по RecId на таблицы в виртуальных компаниях и "общие" (SaveDataPerCompany=No) таблицы - хотелось хранить историю маппинга "старых" и "новых" значений RecId для разбора непредвиденных проблем Как обходили: - модифицирован класс SysRecRepair, добавлен небольшой фреймворк для регистрации "проблемных" ссылок (описание "проблемных" ссылок см. выше, определение ссылок делается вручную) - исключили (средствами фреймворка) из обработки некоторые большие "непостоянные" таблицы (SysDatabaseLog, SysUserLog, xRef) - переконфигурировали некоторые параметры БД на время обработки (отключение RCS, auto update statistics и пр.) - настроили partitioning по DataAreaId - временно удалили некластерные индексы с RecId на таблицах, где их более одного - сохраняем временную таблицу маппинга "старых" значений RecId на "новые" Результат: - Количество обработанных записей по всем компаниям - 2850036022 - Максимальный RecId - 180862996 (сжатие приблизительно в 10 раз, благо были достаточно большие "дырки" в выделенных RecId) - Вся процедура заняла около 12 часов, из них работа класса SysRecIdRepair около 7 часов. Ограничения: - Анализ имеющихся проблемных ссылок по RecId в виртуальные компании не автоматизирован (выполняется вручную) - Версии для Oracle нет (пока) - Обработка нескольких виртуальных компаний есть, но не протестирована Код не выкладывается (по крайней мере пока), воспринимайте данный пост как некий whitepaper плюс "тестовый забег" P.S. - в "простых" случаях (одна компания) стандартный механизм работает корректно
__________________
-ТСЯ или -ТЬСЯ ? |
|
|
За это сообщение автора поблагодарили: gl00mie (3). |
08.12.2010, 14:17 | #155 |
Модератор
|
Также см. альтернативный подход от Gustav
__________________
-ТСЯ или -ТЬСЯ ? |
|
22.12.2010, 16:50 | #156 |
Участник
|
Коллеги, привет. На форуме не нашел, поэтому пишу здесь.
Есть значит у нас большая база на тройке. Делали дефрагментацию, временно помогла. Но только временно. По прогнозам на следующий год RecId не хватит даже с учетом дефрагментации, что печально. Компания переходит на САП, поэтому переход на новую версию аксапты есть не самый лучший способ избавления от проблемы RecId. Проблема в том, что проект по внедрению САПа может затянуться, а рекайди все растут.. Поэтому был предложен альтернативный вариант спасения аксапты. Если кратко, то он заключается в том, чтобы сделать RecId уникальными потаблично, а не во всей системе. Делается это конечно же не автоматически, а ручками с помощью дефрагментации и укладывания таблиц ровными слоями начиная с некоторого значения (например с 1). То есть например раз в квартал можно запускать дефрагментацию, в результате которой (а таблицы будут лежать параллельно!) масимальное значение RecId будет равно количеству записей в наибольшей таблице и затем уменьшать счетчик RecId. Вот такое временное решение. Понятно, что это грозит нам возможными переписываниями кода с таблицей SpecTrans и проими, в которых хранятся ссылки на RecId нескольких таблиц. Так же возможны проблемы с уникальными индексами по подобым полям-ссылкам на RecId. Но все это на мой взгляд вполне побеждаемо. Подскажите пожалуйста, кто-нибудь так делал? Не видите ли вы неразрешимых проблем в этой схеме? |
|
23.12.2010, 10:52 | #157 |
Участник
|
Если вы все равно переходите на SAP, то, может, рассмотреть вариант с усечением базы? Вы же явно не будете тащить в SAP все исторические данные - только справочники и сальдовки...
|
|
23.12.2010, 11:09 | #158 |
Member
|
Поддерживаю. Я бы в данной ситуации почистил данные, которые не нужны, но которые очень жалко выбросить, а затем дефрагментировал бы RecId.
Подходы к чистке данных могут быть различными. Как вариант можно подумать над архивированием, но это нетривиально.
__________________
С уважением, glibs® |
|
23.12.2010, 12:58 | #159 |
Участник
|
Да, извиняюсь, что сразу не рассказал.
У нас будет старт с чистого листа в эту замечательную новогоднюю ночь, видимо то, что вы имеете ввиду под архивированием. То есть текущая база станет архивной, а в новую боевую перенесутся справочники, всяческие остатки и работа начнется в чистой базе. Проблема в том, что RecId могут переполниться даже за год! В прошлый раз подобная процедура архивирования выполнялась 2 года назад. До этого нового года дотянули со скрипом и дефрагментацией. По прогнозам на следующий год планируется увеличение отгрузок в системе. При таком росте до следующего нового года мы дотягиваем, а вот до 2013 уже нет (хотя там может и не важно, в 2012 году-то ). Делать процедуру рхивирования чаще раза в год не вариант из-за проблем с годовой отчетностью и общей ее геморойностью. Поэтому рассматриваем такой экстремальный способ спасения. Что думаете на этот счет? В сравнении например с переходом на новую версию? |
|
23.12.2010, 15:19 | #160 |
Модератор
|
Бизнес, генерящий столько транзакций, чтобы переполнить диапазон RecId (4 миллиарда записей) за год, причем на 3.0 - как-то слабо верится. Логистика к примеру в трешке такого не вытянет, разве что самописный модуль какой-то
Либо чего-то Вы не договариваете, либо что-то не то считаете, либо как-то не так дефрагментируете (imho) Каков текущий размер БД (в терабайтах, я полагаю) ?
__________________
-ТСЯ или -ТЬСЯ ? |
|