Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Вопрос по выгрузке данных из Sybase в Oracle
|
|||
|---|---|---|---|
|
#18+
Всем доброго времени суток! Решил заглянуть с соседней Оракловой ветки в вашу. Возникли вопросы. С Sybase никогда не работал. Есть 2 системы. Оракловая и на Sybase. В Оракловую систему часть данных подгружается через ODBC+Generic Connectivly из Sybase. Возникли некоторые разногласия с Вашим коллегой (администратором Sybase 12). Сначала буквально пару слов по Oracle. В Оракле есть понятия: 1. Direct transaction например: select * from T; 2. Indirect transaction например: select * from T1@dia5nt; 3. Distributed transaction например: select * from T1@dia5nt, T where T.ID=100; Таким образом, в случае дистрибутивной транзакции выборка идет из 2-х систем. Многие считают индирект транзакции так же дистрибутивными, но я пишу точно в соотв-ии с документацией Oracle! В моем случае используются классические варианты дистрибутивных транзакций п.3 см. выше. insert into T (...клонки Oracle табл...) select (Колонки Sybase табличек) from T1@dia where T1.ID=значение; --T1 - табличка в Sybase У Oracle есть постулат о неделимости транзакции. Он означает, что должно соблюдаться условие целостности данных вне зависимости от количества систем. Например, update может использовать данные из 100 таблиц 10 удаленных БД(через db link). Далее делаю в Oracle DECLARE n_dealid NUMBER; n_brokerjpid NUMBER; n_customerid NUMBER; BEGIN FOR i IN 1..5000 LOOP select b."DEALID", b."BROKERJPID", b."CUSTOMERID" into n_dealid, n_brokerjpid, n_customerid from IT_BARGAINS@DIA b where b.DEALID = 10; dbms_output.put_line(' DEALID ' || n_dealid || ' BROKERJPID ' || n_brokerjpid || ' CUSTOMERID ' || n_customerid); --commit;--юзер транз. каждый раз открывается заново END LOOP; --commit;--вроде идет одна END; И в DBArtisan наблюдаю $user_transaction на Sybase??? Вообще говоря с т.з. Oracle транзакция - это операция приводящая к неким изменениям в БД, т.е. DML операция. Операция SELECT таковой вообще говоря не является, т.к. не вносит каких-либо изменений в данные системы. Данная команда выделяется из обычных DML операций во всей документации Oracle. --------------------------------------------------------- Вопрос. С т.з. Sybase. Растет ли при этом select на Sybase транзакционный лог? Ресурс сервера(память, процессорное и шпиндельное время) понятно тратится... Эти 5000 select в цикле - это одна транзакция на Sybase или открывается и закрывается 5000 транзакций? По идее она одна(см. commit-ы выше). --------------------------------------------------------- Далее DECLARE BEGIN FOR i IN 1..5000 LOOP insert into IT_BARGAINS (DEALID,BROKERJPID,CUSTOMERID) select b."DEALID",b."BROKERJPID",b."CUSTOMERID", from IT_BARGAINS@DIA b where b.DEALID = 10; --commit; --1-- END LOOP; commit; --2-- END; С т.з. Oracle если возможно сделать что-либо одной транзакцией - это нужно делать одной транзакцией(цитата Тома Кайта), т.е. commit; --2-- Ведь в данном случае мы получаем дистрибутивную транзакцию и Оракловый two-point commit как следствие. Поясню. Что бы обеспечить целостность данных Oracle делает завершение транзакции (условно commit/rollback) в обоих системах! У себя(что естественно) и на удаленной системе. Причем управлять транзакцией в удаленной системе нельзя! Не возможно послать commit or rollback в удаленную систему! При завершении транзакции на point of commit она завершается и на удаленной системе! Вопрос. С т.з. Sybase commit: --2-- вероятнее всего предпочтительнее? В действующем софте используется commit; --1--, т.о. $user_transaction "пляшет" во время операций выгрузки данных вызывая всплески ярости Вашего коллеги. (Софт писал не я. Я его буду переписывать, хоть и работаю Оракловым адм.) С т.з. Sybase как лучше? Что происходит в системе? Транзакционные Логи растут? Ведь при инсерте в свою Oracle базу я делаю лишь select из HS(Sybase). Если я делаю commit; --2-- Это действительно одна транзакция у Sybase??? Насколько я понимаю, когда идет commit; --1-- на Sybase каждый раз открывается новая $user_transaction? С другой стороны, при работе через ODBC опять же лучше завершать только все целиком. Уж очень она не надежна! А если выгрузка свалится? Пойдет rollback по 2-ум системам сразу! Кроме того, если пользователь задаст большой интервал выборки, то это так же сильно подгрузит систему! Ведь пользователь может и ошибиться, поставить дату не 1-2 мес, а например 1 год. В этом случае лучше commit; --1-- Можно много дискутировать на данную тему, но хотелось бы услышать мнение спецуры Sybase. Как лучше это реализовать с именно т.з. Sybase? А с Oracle у меня проблем нет, он родной, знакомый и понятный... Заранее признателен за конструктивный ответ. Виктор ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2005, 14:08 |
|
||
|
Вопрос по выгрузке данных из Sybase в Oracle
|
|||
|---|---|---|---|
|
#18+
С такими делами опыта пока не имею, но в том же DBArtisane легко увидеть динамику изменения Sybase's ASE trlog-oв прямо на картинке. а на selecte в Sybase в трлог тоже по идее ничего не пишется. Тут же еще присутствуют 3 ипостаси кроме Sybase и Oracle, которые по идее могут лепить что-то своё: 1. Connectivity/Complier Sybase->Oracle 2. ODBC 3. Dbartisan (maло ли что он показывает как $user_transaction) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2005, 19:38 |
|
||
|
Вопрос по выгрузке данных из Sybase в Oracle
|
|||
|---|---|---|---|
|
#18+
автор Операция SELECT таковой вообще говоря не является, т.к. не вносит каких-либо изменений в данные системы. Данная команда выделяется из обычных DML операций во всей документации Oracle. Чтение данных - тоже транзакция. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2005, 23:34 |
|
||
|
Вопрос по выгрузке данных из Sybase в Oracle
|
|||
|---|---|---|---|
|
#18+
technomag5Вопрос. С т.з. Sybase. Растет ли при этом select на Sybase транзакционный лог? Нет technomag5 Ресурс сервера(память, процессорное и шпиндельное время) понятно тратится... Эти 5000 select в цикле - это одна транзакция на Sybase или открывается и закрывается 5000 транзакций? По идее она одна(см. commit-ы выше). Это смотря как ею Оракл управляет. Может быть и так, и так. Скорее всего - одна. technomag5 Поясню. Что бы обеспечить целостность данных Oracle делает завершение транзакции (условно commit/rollback) в обоих системах! У себя(что естественно) и на удаленной системе. Причем управлять транзакцией в удаленной системе нельзя! Не возможно послать commit or rollback в удаленную систему! При завершении транзакции на point of commit она завершается и на удаленной системе! Ничего не понял, почему это нельзя ? Можно, нужно и даже обязательно. technomag5 Вопрос. С т.з. Sybase commit: --2-- вероятнее всего предпочтительнее? В действующем софте используется commit; --1--, т.о. $user_transaction "пляшет" во время операций выгрузки данных вызывая всплески ярости Вашего коллеги. (Софт писал не я. Я его буду переписывать, хоть и работаю Оракловым адм.) Sybase - блокировщик, как и многие СУБД помимо Оракла и еще пары (точнее Оракл, на сколько я знаю, тоже блокировщик, но он более хитро разводит писателей и читателей). Во время транзакции накладываются блокировки на читаемые данные. Эти блокировки (!!!) запрещаю другим транзакциям менять эти данные, пока не закончится ваша выгрузка. В зависимости от уровня изоляции (который наверняка ставит Оракл) блокировки могут отпускаться после прочтения "куска" данных, или после прочтения всех данных и окончания транзакции. Видимо, вашего коллегу смущает именно это. technomag5 Если я делаю commit; --2-- Это действительно одна транзакция у Sybase??? Насколько я понимаю, когда идет commit; --1-- на Sybase каждый раз открывается новая $user_transaction? Видимо, все одна транзакция. Точно сказать не могу, поскольку не понятно, что Оракл посылает Sybase-у. technomag5 С другой стороны, при работе через ODBC опять же лучше завершать только все целиком. Уж очень она не надежна! Не понял ничего. technomag5 А если выгрузка свалится? Пойдет rollback по 2-ум системам сразу! Надо надеяться, что да. technomag5 Кроме того, если пользователь задаст большой интервал выборки, то это так же сильно подгрузит систему! Ведь пользователь может и ошибиться, поставить дату не 1-2 мес, а например 1 год. В этом случае лучше commit; --1-- Не понимаю , чего он лучше. В данном случае, все едино, поскольку ничего не меняется в ASE-шной базе. И то и другое отпустит блокировки и все. technomag5 Как лучше это реализовать с именно т.з. Sybase? А что, есть выбор ? Чем это не устраивает ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2005, 00:03 |
|
||
|
Вопрос по выгрузке данных из Sybase в Oracle
|
|||
|---|---|---|---|
|
#18+
MasterZivЧтение данных - тоже транзакция. Согласен, его так принято называть. Но я же уже писал, что в терминологии Oracle транзакция - это атомарная операция, которая должна быть завершена явно или не явно. Операция select этого не требует. Вы не найдете в оригинальной документации Oracle в разделе "Introduction to Transactions" - (A transaction is a logical unit of work that contains one or more SQL statements. A transaction is an atomic unit. The effects of all the SQL statements in a transaction can be either all committed (applied to the database) or all rolled back (undone from the database).) никаких упоминаний о SELECT SELECT - в документации как бы выносится в виде отдельной операции. Т.о. в Oracle select завершается неявно(как оно там идет на уровне Ораклового ядра - не знаю! Скорее всего идет неявное завершение). А вообще, когда например, вы вставляете карточку в банкомат и чего то там получаете или не получаете - это тоже транзакция. будем считать select тоже транзакцией... Вопрос был вообще то говоря по оптимизации работы на Sybase. Вы им занимаетесь - вам и карты как говорится ... MasterZivНет Спасибо! MasterZivЭто смотря как ею Оракл управляет. Может быть и так, и так. Скорее всего - одна. Спрасибо! В Артизане тоже "не мелькает"! MasterZiv Ничего не понял, почему это нельзя ? Можно, нужно и даже обязательно. А чего тут не понятного? Правда у Т.Кайта это описано лучше, но я прям из родной доки...(((Two-Phase Commit Mechanism Unlike a transaction on a local database, a distributed transaction involves altering data on multiple databases. Consequently, distributed transaction processing is more complicated, because Oracle must coordinate the committing or rolling back of the changes in a transaction as a self-contained unit. In other words, the entire transaction commits, or the entire transactions rolls back. Oracle ensures the integrity of data in a distributed transaction using the two-phase commit mechanism. In the prepare phase, the initiating node in the transaction asks the other participating nodes to promise to commit or roll back the transaction. During the commit phase, the initiating node asks all participating nodes to commit the transaction; if this outcome is not possible, then all nodes are asked to roll back.))) Вы не можете явно управлять транзакцией в удаленной базе! Тока завершив ее на Oracle-овой она завершается не явно на удаленной. MasterZivSybase - блокировщик, как и многие СУБД помимо Оракла и еще пары (точнее Оракл, на сколько я знаю, тоже блокировщик, но он более хитро разводит писателей и читателей). Во время транзакции накладываются блокировки на читаемые данные. Эти блокировки (!!!) запрещаю другим транзакциям менять эти данные, пока не закончится ваша выгрузка. В зависимости от уровня изоляции (который наверняка ставит Оракл) блокировки могут отпускаться после прочтения "куска" данных, или после прочтения всех данных и окончания транзакции. Видимо, вашего коллегу смущает именно это. Вот за это БОЛЬШОЕ спасибо! Не учел! Ведь, действительно если много записей будет считываться, то что? Sybase их при чтении (select) блокирует? У Оракила этого нету! Там же редо и андо! Надо проверить, а то блокирну ненароком! Вообще мне это не принципиально, в Sybase таблички из которых я выгружаю в АТдельной схеме. Тока я их пользую... Но вообще на будущее - буду знать! MasterZiv Видимо, все одна транзакция. Точно сказать не могу, поскольку не понятно, что Оракл посылает Sybase-у. А я проверю с Вашим коллегой! MasterZivНе понял ничего. Я в том смысле, что поскольку связка ODBC менее надежна нежели Net8, то дяденька Т.Кайт Особенно выделяет, что при работе через ODBC все лучше делать одной транзакцией, а не когда много маленьких(commit 5000 раз в цикле). Ну могу скинуть Вам его книгу в и номер странички... Знающий человек(Оракловый эксперт) так рекомендует делать... MasterZivА что, есть выбор ? Чем это не устраивает ? Выбора действительно нету... Спасибо за информацию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2005, 13:04 |
|
||
|
Вопрос по выгрузке данных из Sybase в Oracle
|
|||
|---|---|---|---|
|
#18+
technomag5 MasterZivЧтение данных - тоже транзакция. Согласен, его так принято называть. Но я же уже писал, что в терминологии Oracle транзакция - это атомарная операция, которая должна быть завершена явно или не явно. Операция select этого не требует. В терминологии Оракла транзакция - это то же самое, что транзакция в других терминологиях. ПОтому что это стандарт ANSI и его поддерживают все, Оракл в том числе. Операция SELECT требует его точно так же, в смысле, она начинает транзакцию, и ее нужно будет завершать. Любой DML начинает транзакцию, это так по стандарту и в Оракле тоже так. Я думаю, что вы что-то перепутали или недопоняли. technomag5 Вы не найдете в оригинальной документации Oracle в разделе "Introduction to Transactions" - (A transaction is a logical unit of work that contains one or more SQL statements. A transaction is an atomic unit. The effects of all the SQL statements in a transaction can be either all committed (applied to the database) or all rolled back (undone from the database).) никаких упоминаний о SELECT SELECT - в документации как бы выносится в виде отдельной операции. Т.о. в Oracle select завершается неявно(как оно там идет на уровне Ораклового ядра - не знаю! Скорее всего идет неявное завершение). Если не написано, что SELECT начинает транзакцию, почему вы считаете , что он ее не начинает ? Там же вообще ничего не написано. Еще раз, SELECT, как любой другой DML , начинает транзакцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2005, 13:20 |
|
||
|
Вопрос по выгрузке данных из Sybase в Oracle
|
|||
|---|---|---|---|
|
#18+
Да, select - есть транзакция(Data Concurrency and Consistency в оригинальной доке), но сам по себе SELECT у Oracle некая специфическая операция - "Read-only transaction". Ведь она не вносит изменения в данные базы. У Oracle она завершается неявно. Например select * from T; - (директ) не требует от меня каких-либо дополнительных действий на Oracle. А вот если я сделаю select * from T@DBLINK; -(индирект) например, на Sybase, то увижу (via DbArtisan), что на Sybase появилась $user_transaction. Если сделаю commit;(на Oracle) то $user_transaction на Sybase исчезнет, но сессия будет "Avaite..." висеть. При этом, select * from dba_2pc_pending;--вьюшка для просмотра "pending transaction" будет пустой. А если не сделаю commit; , то $user_transaction так и будет висеть. Ведь явного завершения в виде commit/rollback не последовало! Поскольку в Sybase по всей видимости отсутствует механизм сериализации(упорядочивания тр-ций) придется очень аккуратно обращаться с commit/rollback-ми ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2005, 13:22 |
|
||
|
Вопрос по выгрузке данных из Sybase в Oracle
|
|||
|---|---|---|---|
|
#18+
Если я правильно понял, Oracle по select начинает транзакцию, отдает резалт-сет клиенту и сразу закрывает транзакцию? Сайбейзы немножко по другому сделали. Блокировки на структуру таблиц участвующих в select'е висят вплоть до явного завершения транзакции клиентом. Предполагается, что клиент сделал запрос на выборку не просто так, а будет делать изменения в таблице. И будет слегка странно если клиент сделал select, и сразу же update, a update не прошел потому что другой клиент в это время поменял структуру таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2005, 18:13 |
|
||
|
Вопрос по выгрузке данных из Sybase в Oracle
|
|||
|---|---|---|---|
|
#18+
White OwlЕсли я правильно понял, Oracle по select начинает транзакцию, отдает резалт-сет клиенту и сразу закрывает транзакцию? Сайбейзы немножко по другому сделали. Что-то как-то странно, я вообще считал, что это стандарт и все должны вести себя одинаково. На самом деле тут и Оракл не может закрыть транзакцию - он не знает, что может за этим последовать, может с клиента придет UPDATE. Так что видимо там все хитрее. К сожалению, я уже вряд ли когда в этом смогу разобраться, ибо с Ораклом меня ну очень навряд ли судьба сведет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2005, 23:27 |
|
||
|
Вопрос по выгрузке данных из Sybase в Oracle
|
|||
|---|---|---|---|
|
#18+
White OwlПредполагается, что клиент сделал запрос на выборку не просто так, а будет делать изменения в таблице. И будет слегка странно если клиент сделал select, и сразу же update, a update не прошел потому что другой клиент в это время поменял структуру таблицы. Я абсолютно уверен, что в Оракле делается то же самое (я уже писал в письме выше). Там только нет блокировок на чтении и транзакция, прочитавшая таблицу, может висеть часами никому не мешая. Я думаю там хитрее должно быть, что они в какой -то момент должны понять, что вот висит транзакция, она ничего не меняла (это сервер знает), и что ей "пора на покой". Тогда ее можно неявно изничтожить. Только вот когда такой момент настанет -- не понятно. Один момент - обрыв соединения, другой - окончание транзакции или начало явной транзакции (если там вообще такое есть), но вот когда сервер сможет обрубить транзакцию по выборке данных в форму, которая висит на клиенте --- не понятно, потому как не может он ее обрубать. Возможно, там что-то типа timeout-ов сделано, возможно еще что-то. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2005, 23:34 |
|
||
|
Вопрос по выгрузке данных из Sybase в Oracle
|
|||
|---|---|---|---|
|
#18+
В Oracle существует специальная операция select ... from T ... for update (что обычно делают для последовательности на клиенте: выбрать, изменить), a затем update T ... where rowid = <rowid>, так что другой клиент хотящий обновить теже записи будет ждать и ему не дадут до commita сделать то же самое (или просто update), зато не будет потери обновления. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2005, 18:48 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=33311411&tid=2013329]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
83ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
| others: | 259ms |
| total: | 459ms |

| 0 / 0 |
