Текущее время: Пт, мар 29 2024, 12:34

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: Дамп SQL code: 1555
СообщениеДобавлено: Пн, дек 13 2021, 10:22 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, дек 21 2006, 16:38
Сообщения: 301
Полезли дампы в Z программе. При этом саму программу вроде не правили (5 месяцев назад последние изменения)
Падает на команде удаления данных из таблицы БД ZXXX (в которой 169.889.184 записей)
Удаление идет по 4-м полям. Из них первые три - ключевые.
Code:
     DELETE FROM ZXXX  WHERE field1 = p_field1
                               AND field2 IN s_field2
                               AND field3 IN s_field3
                               AND field4 = p_field4.

В s_field2 - одно значение
s_field3 - пустое
Под фильтр попадает 739.404 записей.

Программа работает в фоновом режиме.

В чем может быть причина?


Краткий текст
Цитата:
SQL error "SQL code: 1555" occurred while accessing table "ZXXX".


Что произошло?
Цитата:
Database error text: "SQL message: ORA-01555: snapshot too old: rollback
segment number 119 with name "_SYSSMU119_4022673822$" too small"


Что Вы можете сделать?
Цитата:
Note which actions and entries caused the error to occur.

Consult your SAP administrator.

Using transaction ST22 for ABAP dump analysis, you can view, manage,
and retain termination messages for longer periods.


Анализ ошибки
Цитата:
An exception has occurred which is explained in more detail below. The
exception, which is assigned to class 'CX_SY_OPEN_SQL_DB' was not caught and
therefore caused a runtime error. The reason for the exception is:
Database error text: SQL message: ORA-01555: snapshot too old: rollback
segment number 119 with name "_SYSSMU119_4022673822$" too small
Return value of the database layer: "SQL dbsl rc: 99"


Указания по устранению ошибки
Цитата:
Analyze the entries in the system log (transaction SM21).
If the error occurs in a non-modfied SAP program, you might be able to
find a solution in the SAP Notes system. If you have access to the SAP
Notes system, check there first using the following keywords:


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дамп SQL code: 1555
СообщениеДобавлено: Пн, дек 13 2021, 10:40 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Вт, май 17 2005, 13:35
Сообщения: 4842
Откуда: Москва
Пол: Мужской
Ну вроде из текста дампа очевидно следует, что вопрос надо передавать админам Oracle, где-то у них там место кончилось (видимо под лог изменений)

_________________
Удача - результат нашего желания (© А. Нортон)


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дамп SQL code: 1555
СообщениеДобавлено: Пн, дек 13 2021, 10:47 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, дек 21 2006, 16:38
Сообщения: 301
LKU написал:
Ну вроде из текста дампа очевидно следует, что вопрос надо передавать админам Oracle, где-то у них там место кончилось (видимо под лог изменений)

Спрашиваю чтобы подтвердить свои подозрения, что разработчики тут не при чем. :)


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дамп SQL code: 1555
СообщениеДобавлено: Пн, дек 13 2021, 11:20 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, дек 21 2006, 16:38
Сообщения: 301
В настройках указано до 1.4 млн. записей
Изображение

А сейчас уже 169 млн. Т.е. в 100 раз больше. Может это быть причиной такой ошибки?


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дамп SQL code: 1555
СообщениеДобавлено: Пн, дек 13 2021, 14:30 
Специалист
Специалист

Зарегистрирован:
Пн, мар 12 2012, 08:40
Сообщения: 226
Посмотрите, что есть в sm21 во время дампа.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Дамп SQL code: 1555
СообщениеДобавлено: Пн, дек 13 2021, 14:57 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, дек 21 2006, 16:38
Сообщения: 301
skaa написал(а):
Посмотрите, что есть в sm21 во время дампа.

Нет прав. :(


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дамп SQL code: 1555
СообщениеДобавлено: Пн, дек 13 2021, 15:47 
Специалист
Специалист

Зарегистрирован:
Чт, дек 16 2010, 15:23
Сообщения: 131
Откуда: Набережные Челны
Пол: Мужской
Удаляйте порциями, после каждого делая COMMIT WORK, возможно поможет.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Дамп SQL code: 1555
СообщениеДобавлено: Пн, дек 13 2021, 18:39 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
broker.chelny написал:
Удаляйте порциями, после каждого делая COMMIT WORK, возможно поможет.

Согласен. Для удаления, равно как и для прочих операций над БД, сначала создаётся область ROLLBACK, а она не резиновая - о чём, собственно, и выдаётся сообщение.

_________________
"For all entries" не в SAP-ах, "for all entries" в головах! :)


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дамп SQL code: 1555
СообщениеДобавлено: Вт, дек 14 2021, 06:25 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, дек 21 2006, 16:38
Сообщения: 301
broker.chelny написал:
Удаляйте порциями, после каждого делая COMMIT WORK, возможно поможет.

А как это делать порциями? С добавлением понятно. Добавил 100 шт, закомитил.

А как удаление сделать по такому подобию?


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дамп SQL code: 1555
СообщениеДобавлено: Вт, дек 14 2021, 11:40 
Специалист
Специалист

Зарегистрирован:
Вт, дек 30 2008, 18:10
Сообщения: 171
Пол: Мужской
Валерка написал(а):
broker.chelny написал:
Удаляйте порциями, после каждого делая COMMIT WORK, возможно поможет.

А как это делать порциями? С добавлением понятно. Добавил 100 шт, закомитил.

А как удаление сделать по такому подобию?


выбирать select up to 100 rows пока выбирается
и удалять то что вошло выше


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Дамп SQL code: 1555  Тема решена
СообщениеДобавлено: Вт, дек 14 2021, 16:04 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Пт, сен 07 2007, 07:53
Сообщения: 1392
Есть такое понятие как изолированность транзакций. Обычно sql-запрос выполняется так, что обеспечивается консистентность данных на момент начала транзакции. Например, у нас есть огромная таблица со счетами, и нам посчитать остатки на них. Процесс подсчета занимает какое-то время, а сами данные в процессе выполнения запроса могут меняться в других транзакциях. Так вот, ORACLE обеспечивает выполнение нашего запроса по состоянию таблицы, которое было на момент начала транзакции. Причем, сам ORACLE не устанавливает блокировок на изменение, и данные в таблице могут изменяется в параллельных транзакциях.

Чтобы такое провернуть у СУБД должен быть доступ к старым версиям данным в таблице, когда они изменились. ORACLE использует довольно интересный механизм. Когда данные изменяются, то старая версия данных попадает в ROLLBACK сегмент для возможности отката. Когда транзакция завершена необходимость в этих данных пропадает, однако сами остается какое-то время в ROLLBACK сегменте. Сам ROLLBACK сегмент имеет кольцевую структуру и перезаписывается только когда будет использован весь остальной объем.

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

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

Другие варианты:
- Запускать такую операцию в момент малой нагрузки таблицы на изменение.
- Увеличить число и объем ROLLBACK сегментов. Это не гарантия, просто вероятность переполнение ROLLBACK сегментов снизиться. Уточню еще раз - переполняется не ROLLBACK сегмент, который назначен нашей транзакции (это другой тип ошибки). Переполняется какой-то чужой ROLLBACK сегмент. Поэтому просто увеличить размера какого-то одного сегмента скорее всего ничего не даст. Нужно увеличивать их все.

Удаление небольшими кусочками даст эффект только время выполнения удаления этого небольшого кусочка будет заметно меньше, чем удаление всех записей. Если для удаления небольшого кусочка все равно будет выполняться FULL TABLE SCAN, то это ничего не даст, так как нам все равно нужен весь объем таблицы.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дамп SQL code: 1555
СообщениеДобавлено: Ср, дек 15 2021, 06:16 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, дек 21 2006, 16:38
Сообщения: 301
В результате решили перенести запуск фоновых задач на ночное время. Так что выбрали вариант
Цитата:
- Запускать такую операцию в момент малой нагрузки таблицы на изменение.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Дамп SQL code: 1555
СообщениеДобавлено: Ср, дек 15 2021, 09:50 
Специалист
Специалист

Зарегистрирован:
Пн, мар 12 2012, 08:40
Сообщения: 226
RoustR написал(а):

Как с этим бороться? Принципиально, на мой взгляд, есть один метод - блокировка таблицы от записи на момент выполнения нашей транзакции.
.

Я правильно понимаю, что имеется виду блокировка таблицы от записи на уровне БД? Как такое сделать из abap?


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Дамп SQL code: 1555
СообщениеДобавлено: Ср, дек 15 2021, 10:05 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Вт, май 17 2005, 13:35
Сообщения: 4842
Откуда: Москва
Пол: Мужской
skaa написал(а):
RoustR написал(а):

Как с этим бороться? Принципиально, на мой взгляд, есть один метод - блокировка таблицы от записи на момент выполнения нашей транзакции.
.

Я правильно понимаю, что имеется виду блокировка таблицы от записи на уровне БД? Как такое сделать из abap?

Наверное, имеется в виду "select for update"

_________________
Удача - результат нашего желания (© А. Нортон)


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB