Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Зафиксировать чужую транзакцию..  [new]
deleted_2ks3ax
Member [скрыт]

Откуда:
Сообщений: 109
Категорическое, пятничное приветсвие всем! :)
Понимаю, что название трейда может показать смешным, но вопрос встал...
Имеется сессия, в sqlplusw, там запущена длительная процедура пересчета данных.
Возникла необходимость предоставить отчетность хотя по тем данным, что уже обраотаны, но, увы.. процедура не фиксирует транзакции (хоть это и не совсем уместно, сейчас было бы очень полезным). Можно ли каким нибудь образом зафиксировать уже измененные данные, и срубить сессию? Может быть все таки имеются варианты?

Имеется например одна процедура, которая показывает прогресс выполнения и вызывается, после обработки каждой записи, но она в AUTONOMOUS TRANSACTION, было бы здорово убрать эту прагму, но тут DDL LOCK...
3 авг 07, 14:23    [4476422]     Ответить | Цитировать Сообщить модератору
 Re: Зафиксировать чужую транзакцию..  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Чужую транзакцию можете только лишь убить.
3 авг 07, 18:24    [4478239]     Ответить | Цитировать Сообщить модератору
 Re: Зафиксировать чужую транзакцию..  [new]
ASNexus
Member

Откуда: Tula
Сообщений: 111
Ap0k
Имеется например одна процедура, которая показывает прогресс выполнения и вызывается, после обработки каждой записи, но она в AUTONOMOUS TRANSACTION, было бы здорово убрать эту прагму, но тут DDL LOCK...


Не предложу решения обозначенной проблемы, т.к. его не существует, но вот возможность некоторого ускорения выполнения основной процедуры есть точно - не надо вызывать логгирующую процедуру, которая к тому же работает в автономной транзакции, после обработки каждой записи - вызывайте ее хотя бы по прошествии 100 или 1000, или какого-то другого выбранного числа итераций (в зависимости от Ваших объемов данных и затрат времени).

Конечно при условии, что нет непреодолимых требований бизнес-логики сохранять результат обработки каждой записи, но и в этом случае нужно посмотреть, может быть можно изменить логику.
4 авг 07, 00:05    [4478895]     Ответить | Цитировать Сообщить модератору
 Re: Зафиксировать чужую транзакцию..  [new]
ASNexus
Member

Откуда: Tula
Сообщений: 111
ASNexus
Ap0k
Имеется например одна процедура, которая показывает прогресс выполнения и вызывается, после обработки каждой записи, но она в AUTONOMOUS TRANSACTION, было бы здорово убрать эту прагму, но тут DDL LOCK...


Не предложу решения обозначенной проблемы, т.к. его не существует, но вот возможность некоторого ускорения выполнения основной процедуры есть точно - не надо вызывать логгирующую процедуру, которая к тому же работает в автономной транзакции, после обработки каждой записи - вызывайте ее хотя бы по прошествии 100 или 1000, или какого-то другого выбранного числа итераций (в зависимости от Ваших объемов данных и затрат времени).

Конечно при условии, что нет непреодолимых требований бизнес-логики сохранять результат обработки каждой записи, но и в этом случае нужно посмотреть, может быть можно изменить логику.


Вот написал это и понял, что решение не вообще того, что указано в сабже, но конкретной проблемы в принципе есть, но вот стоят-ли затраты на реализацию полученной выгоды, решать Вам...
Если у Вас по условиям задачи есть процедура логгирования, которая вызывается после обработки каждой записи, и которую Вы можете изменять, то:
Уберите прагму и все операции DML
Через pipe посылайте сообщение о результатах обработки записи
При этом у Вас должен быть получатель сообщения через pipe, который произведет какие-то действия над полученными данными, к которым потом Ваш процесс, строящий отчеты по "уже измененнным данным" сможет имеет доступ, но есть риск некоторые изменения не получить.

Ну или оставляете автономные транзакции и банальный триггер на таблицу логов, который все это выполнит без pipe'ов, но с гарантией получения изменений.
P.S. Затраты ресурсов чрезмерны, но, если иного бизнес-логика не допускает, то хотя бы так...
4 авг 07, 00:25    [4478967]     Ответить | Цитировать Сообщить модератору
 Re: Зафиксировать чужую транзакцию..  [new]
deleted_2ks3ax
Member [скрыт]

Откуда:
Сообщений: 109
Это разовая проблема, думаю больше и не повторится никогда, просто процедура построения отчетных данных работает примерно трое суток, записей в логе за это время не набирается и тысячи, так что это ерунда, в плане оптимизации. Просто процедура завершилась только сегодня (на каледнаре суббота, данные до понедельника никому не нужны), а вот вчера бы достать половину проработанных записей было бы очень кстати :)
В общем, удачных выходных всем Тема закрыта, но если вдруг есть магическое решение, по теме - делитесь!

С уважением...
4 авг 07, 08:52    [4479318]     Ответить | Цитировать Сообщить модератору
 Re: Зафиксировать чужую транзакцию..  [new]
.....
Guest
Ap0k
Это разовая проблема, думаю больше и не повторится никогда, просто процедура построения отчетных данных работает примерно трое суток, записей в логе за это время не набирается и тысячи, так что это ерунда, в плане оптимизации. Просто процедура завершилась только сегодня (на каледнаре суббота, данные до понедельника никому не нужны), а вот вчера бы достать половину проработанных записей было бы очень кстати :)
В общем, удачных выходных всем Тема закрыта, но если вдруг есть магическое решение, по теме - делитесь!

С уважением...


Решение есть. Надеюсь как и чувство юмора у вас :)

Смотрите все текущие сегменты отката затронутые данной транзакцией.
Рубите экземпляр абортом.
Выдаете в файл инициализации (pfile, spfile) скрытый параметр
_corrupted_rollback_segments=(имена сегментов через запятую)
Поднимаетесь и вуаля. Данные зафиксированы. Самое главное, чтобы на эти сегменты отката не ссылались другие транзакции, а то глядишь и базку можно будет потом пересоздать

Все. Предлагаю занести в факью

ЗЫ Оно вам надо???
4 авг 07, 10:05    [4479346]     Ответить | Цитировать Сообщить модератору
 Re: Зафиксировать чужую транзакцию..  [new]
.....
Guest
Способ № 2.

1) сбросить кэш буферов
2) задампить блоки принадлежащие этому сегменту (в случае паралельной вставки, нужно будут поработать немного дольше)
3) поднять из дампов данные в отдельную таблицу

4 авг 07, 13:50    [4479539]     Ответить | Цитировать Сообщить модератору
 Re: Зафиксировать чужую транзакцию..  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18339
Изверги... Насоветуете человеку
В зависимости от того, что делает и как организована процедура, есть вариант: вызывать ее не в sql*plus, а в приложении, умеющем прервать ее выполнение посредством посылки OCI Break (например, тот же PL/SQL Developer).
В этом случае можно почитать незафиксированные данные в той же сессии.
Но самым "правильным" методом было бы оснащение процедуры соответствующими вызовами dbms_application_info и отслеживание ее успехов посредством v$session_longops.
4 авг 07, 14:32    [4479592]     Ответить | Цитировать Сообщить модератору
 Re: Зафиксировать чужую транзакцию..  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 63944
Блог
Ap0k
Просто процедура завершилась только сегодня (на каледнаре суббота, данные до понедельника никому не нужны), а вот вчера бы достать половину проработанных записей было бы очень кстати :)

В принципе, можно было бы сделать следующим образом. Где-то год или два назад кто-то публиковал здесь трюк "как достать данные из чужой временной таблицы" - если мне не изменяет память, на нее вешался materialized view. Таким образом, в принципе можно было бы переписать "долгую процедуру" на использование временной таблицы с промежуточными коммитами и перекладыванием в основную таблицу в конце работы. Правда, не факт, что в результате процедура не станет работать неделю :)
4 авг 07, 15:15    [4479630]     Ответить | Цитировать Сообщить модератору
 Re: Зафиксировать чужую транзакцию..  [new]
RA\/EN
Member

Откуда:
Сообщений: 3658
softwarer
Ap0k
Просто процедура завершилась только сегодня (на каледнаре суббота, данные до понедельника никому не нужны), а вот вчера бы достать половину проработанных записей было бы очень кстати :)

В принципе, можно было бы сделать следующим образом. Где-то год или два назад кто-то публиковал здесь трюк "как достать данные из чужой временной таблицы"

Как раз хотел насоветовать твой "трюк", но он то работает, насколько я омню, с закоммичеными в ТТ данными.
Сбросить кэш буферов - это, вроде, только для 10-ки (не помню, чтобы в 9-ке был "flush buffer_cache"), хотя, при наличии знания структур блоков можно попробовать, но для разового действия трудозатраты могут превысить время честной отработки скрипта.
С остановкой с помощью аборта - это как-то негуманно.
6 авг 07, 10:10    [4482133]     Ответить | Цитировать Сообщить модератору
 Re: Зафиксировать чужую транзакцию..  [new]
.....
Guest
RA\/EN
softwarer
[quot Ap0k]Просто процедура завершилась только сегодня (на каледнаре суббота, данные до понедельника никому не нужны), а вот вчера бы достать половину проработанных записей было бы очень кстати :)

Сбросить кэш буферов - это, вроде, только для 10-ки (не помню, чтобы в 9-ке был "flush buffer_cache"), хотя, при наличии знания структур блоков можно попробовать, но для разового действия трудозатраты могут превысить время честной отработки скрипта.
С остановкой с помощью аборта - это как-то негуманно.


в 9-ке

alter session set events 'immediate trace name flush_cache';

Насчет аборта - просто нестандартное решение. Но там же написано

Надеюсь как и чувство юмора у вас :)
6 авг 07, 10:23    [4482233]     Ответить | Цитировать Сообщить модератору
 Re: Зафиксировать чужую транзакцию..  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 63944
Блог
RA\/EN
Как раз хотел насоветовать твой "трюк", но он то работает, насколько я омню, с закоммичеными в ТТ данными.

Я не то чтобы "помню", но "подозреваю" - поскольку MV. Ну и ничего страшного - коммиты временной таблицы ничуть не помешают логике.
6 авг 07, 10:35    [4482290]     Ответить | Цитировать Сообщить модератору
 Re: Зафиксировать чужую транзакцию..  [new]
.....
Guest
что-то мессаги не отправляются

alter session set events 'immediate trace name flush_cache';

насчет аборта - что значит негуманно :), я же не предлагаю его выполнять
6 авг 07, 10:36    [4482293]     Ответить | Цитировать Сообщить модератору
 Re: Зафиксировать чужую транзакцию..  [new]
Grami
Member

Откуда: Москва
Сообщений: 451
написать прогу, внедряющую в нужном месте адресного пространства экземпляра оракла вызов commit =)
6 авг 07, 13:07    [4483470]     Ответить | Цитировать Сообщить модератору
 Re: Зафиксировать чужую транзакцию..  [new]
Дим On
Member

Откуда: Москва
Сообщений: 55
Так, к слову... А разве оракел в Read Uncommited работать не умеет?
6 авг 07, 13:42    [4483702]     Ответить | Цитировать Сообщить модератору
 Re: Зафиксировать чужую транзакцию..  [new]
dummy_ora_dbd
Guest
Дим On
Так, к слову... А разве оракел в Read Uncommited работать не умеет?

А когда-то умел?
6 авг 07, 13:45    [4483722]     Ответить | Цитировать Сообщить модератору
 Re: Зафиксировать чужую транзакцию..  [new]
DВА
Member

Откуда:
Сообщений: 5439
Дим On
Так, к слову... А разве оракел в Read Uncommited работать не умеет?

оракел умеет, но вот позволять работать так пользовотелю что-то не хочет :)
6 авг 07, 13:47    [4483733]     Ответить | Цитировать Сообщить модератору
 Re: Зафиксировать чужую транзакцию..  [new]
Дим On
Member

Откуда: Москва
Сообщений: 55
dummy_ora_dbd
Дим On
Так, к слову... А разве оракел в Read Uncommited работать не умеет?

А когда-то умел?

Формально нет, но...
man

Oracle Database never permits "dirty reads." Although some other database products use this undesirable technique...
6 авг 07, 13:52    [4483772]     Ответить | Цитировать Сообщить модератору
 Re: Зафиксировать чужую транзакцию..  [new]
RA\/EN
Member

Откуда:
Сообщений: 3658
Вообще на линухе, например, память доступна в виде файлка, замапленного в потроха /dev/ - так что рутом можно прочитать незакоммиченные данные, но это верх извращения.
Не знаю, как сейчас, а году эдак в 2000-2001 я с этим файликом баловался.
6 авг 07, 15:52    [4484773]     Ответить | Цитировать Сообщить модератору
 Re: Зафиксировать чужую транзакцию..  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18339
DВА
Дим On
Так, к слову... А разве оракел в Read Uncommited работать не умеет?

оракел умеет, но вот позволять работать так пользовотелю что-то не хочет :)

Если быть точным, то все-таки немножечко позволяет.
- Начнем транзакцию, поправив данные
- Откроем ref cursor
- передадим курсор в автономную транзакцию... о чудо!
6 авг 07, 19:08    [4486579]     Ответить | Цитировать Сообщить модератору
 Re: Зафиксировать чужую транзакцию..  [new]
deleted_2ks3ax
Member [скрыт]

Откуда:
Сообщений: 109
Сколько же замечательных, мазахистских способов завалить базу
Самое интересное - внедриться в процесс оракела и "нажать" там commit
7 авг 07, 08:25    [4487446]     Ответить | Цитировать Сообщить модератору
 Re: Зафиксировать чужую транзакцию..  [new]
......
Guest
Ap0k
Сколько же замечательных, мазахистских способов завалить базу
Самое интересное - внедриться в процесс оракела и "нажать" там commit



кхм. пока не закончена транзакция (statement), это вряд ли :)
7 авг 07, 08:36    [4487465]     Ответить | Цитировать Сообщить модератору
 Re: Зафиксировать чужую транзакцию..  [new]
chameleon82
Member

Откуда: Russia, Новосибирск
Сообщений: 252
Бугого ))

На мой взгляд зафиксить чужую транзакцию, если она обрабатывает по одной строке проще простого - создаем таблицу vars, в ней делаем запись COMMIT_FLAG = 0
Когда нам надо получить данные, мы делаем этот флаг commit_flag = 1
Процедура обработки периодически (через 100, 1000 ... записей) читает значение флага, если флаг =1, то делаем его = 0 и делаем коммит.

Однако, бывают случаи когда все происходит в одном запросе, тогда нужно искать кучу извращенных способов. Но на мой взгляд если запрос выполняется более 10 минут - то этот запрос написан достаточно кривыми руками - в этом случае просто переписать правильно запрос, расставив необходимые индкексы и т.п.

И все же, лучше быть терпеливым :)
16 июл 08, 07:11    [5939105]     Ответить | Цитировать Сообщить модератору
 Re: Зафиксировать чужую транзакцию..  [new]
Elic
Member

Откуда:
Сообщений: 29979
chameleon82
На мой взгляд зафиксить чужую транзакцию, если она обрабатывает по одной строке проще простого
Конечно, легко. Нужно только изменить хранимый код. Правда для этого придётся отстрелить сессию, потеряв незафиксированные изменения. Зато в следующий раз ... Которого "думаю больше и не повторится никогда"
Ох уж эти туповатые гробокопатели
16 июл 08, 08:02    [5939158]     Ответить | Цитировать Сообщить модератору
 Re: Зафиксировать чужую транзакцию..  [new]
Velic
Guest
Elic
Ох уж эти туповатые гробокопатели
Тупые ;-)
16 июл 08, 09:09    [5939320]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить