|
dg4odbc to Postgres (BLOB)
|
|||
---|---|---|---|
#18+
Здравствуйте! Возникла такая необходимость (обусловлена многими причинами:) - перенести таблицу с блоб-полем из оракла в постгрес и там ее хранить как архивную, обращаясь к ней напрямую из хранимой процедуры оракла. Обращение очень простое: нужно в оракловой хранимке получить из такой таблицы из постгреса по id соотв. блоб из этой строки. Все. Решили делать через dg4odbc. Покурил доки. Создал БД постгреса, там табличку с полями id integer и message bytea (аналог blob в постгресе), написал перекачку, перелил из оракла туда данные. В оракловой БД поднял и настроил dg4odbc, создал dblink pgarc, запросы через dblink к постгресу работают, поля типа id, date и пр. простые выбираются. А вот поле bytea никак не хочет передаваться в оракл в двоичном виде. Через строки передается, но нужно в двоичном (эти данные нужно передать парсеру as is, кроме того, размер может исчисляться мегабайтами (но не гигабайтами)). Вот текст хранимки, в итоге уже уже поле raw1 тупо null (смотрю по этому id в постгресе - норм, там есть данные, передаю в оракл через дблинк как строку - тоже норм, а в двоичном виде - пусто). Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Что посоветуете? Как передать bytea из постгреса в оракл через этот самый odbc gateway без преобразований в строку? Нигде этого не нашел в нете. Может, есть более интересные способы обращаться из хранимок оракла в БД постгрес? БД оракла - 11.2 SE на win2008R2, постгрес 13й. В оракле есть условие: поменьше трогать логику PL/SQL, на которой много чего завязано, ну и БД 24*7 продакшн. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2021, 17:23 |
|
dg4odbc to Postgres (BLOB)
|
|||
---|---|---|---|
#18+
Во-первых, в свойствах DSN выставить "Bytea as LO". Во-вторых, всё равно обломаться, поскольку dg4odbc в принципе не понимает блобы, он их видит как long raw. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2021, 17:50 |
|
dg4odbc to Postgres (BLOB)
|
|||
---|---|---|---|
#18+
Tol2000, строки >32k тож нормально передаются? ..... stax ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2021, 18:09 |
|
dg4odbc to Postgres (BLOB)
|
|||
---|---|---|---|
#18+
Oracle и по своим линкам не может подобное, не говоря уже о линках к другим базам: https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:696224943687 Как вариант использовать java stored procedure. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2021, 11:38 |
|
dg4odbc to Postgres (BLOB)
|
|||
---|---|---|---|
#18+
Tol2000, blob как bfile не? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2021, 12:42 |
|
dg4odbc to Postgres (BLOB)
|
|||
---|---|---|---|
#18+
oragraf Tol2000, blob как bfile не? Спс, над этим вариантом думал, но пока не хотят, да и слишком много будет файлов, боюсь, ФС не потянет в ОС. Или ты про передачу как бин. файл, а не про хранение? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2021, 12:51 |
|
dg4odbc to Postgres (BLOB)
|
|||
---|---|---|---|
#18+
Stax Tol2000, строки >32k тож нормально передаются? ..... stax Не пробовал, но как строки и так передавать не вариант, только в крайнем случае попытаться как-то типа в hex... Но это стремно) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2021, 12:53 |
|
dg4odbc to Postgres (BLOB)
|
|||
---|---|---|---|
#18+
Алымов Анатолий Oracle и по своим линкам не может подобное, не говоря уже о линках к другим базам: https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:696224943687 Как вариант использовать java stored procedure. Спасибо! Я анг. бегло не читаю, там многа букв) И, смотрю, что оракл еще 8й, может в 11ке что-то расширили, т.к. в доках вроде ограничений не встречал по своей простой ситуации, там по инсертам спрашивают в конце, а у меня тупо прочитать лонг рав один из одного столбца, пусть лонг рав, в блоб преобразую) Но я почитаю внимательнее... По поводу хранимок на яве, тоже норм вариант, если сработает, у нас, правда, еще нет ни одной хранимки на яве, но лиха беда начало, как говорится )) Можно для такого случая и запилить одну, покопаю в этом направлении. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2021, 13:00 |
|
dg4odbc to Postgres (BLOB)
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Во-первых, в свойствах DSN выставить "Bytea as LO". Во-вторых, всё равно обломаться, поскольку dg4odbc в принципе не понимает блобы, он их видит как long raw. Bytea as LO уже стояло. Эх, а я уж было раскатал... ) Да можно и в long raw получить, условие-то моей задачи простое, подходит и лонг рав, потом можно преобразовать в блоб и вернуть из функции. Мне ведь только нужно одна пл/скл процедура в оракле, которая внутри полезет к постгресу и прочитает винарную инфу оттуда по айдишнику, а наружу вернет как блоб. Все. Больше ничего не нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2021, 13:07 |
|
dg4odbc to Postgres (BLOB)
|
|||
---|---|---|---|
#18+
Tol2000 Алымов Анатолий Oracle и по своим линкам не может подобное, не говоря уже о линках к другим базам: https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:696224943687 Как вариант использовать java stored procedure. Спасибо! Я анг. бегло не читаю, там многа букв) И, смотрю, что оракл еще 8й, может в 11ке что-то расширили, т.к. в доках вроде ограничений не встречал по своей простой ситуации, там по инсертам спрашивают в конце, а у меня тупо прочитать лонг рав один из одного столбца, пусть лонг рав, в блоб преобразую) Но я почитаю внимательнее... По поводу хранимок на яве, тоже норм вариант, если сработает, у нас, правда, еще нет ни одной хранимки на яве, но лиха беда начало, как говорится )) Можно для такого случая и запилить одну, покопаю в этом направлении. Есть и нас тут статейка https://www.sql.ru/blogs/oracleandsql/1633 Если кратко, то получить LOB через линк можно только через insert select, т.е. как минимум временная таблица нужна ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2021, 13:15 |
|
dg4odbc to Postgres (BLOB)
|
|||
---|---|---|---|
#18+
Tol2000 Или ты про передачу как бин. файл, а не про хранение? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2021, 13:58 |
|
dg4odbc to Postgres (BLOB)
|
|||
---|---|---|---|
#18+
oragraf Tol2000 Или ты про передачу как бин. файл, а не про хранение? Такая идея очень меня прельщает, я сам давно над ней подумываю. У нас типа LTS )), ну, т.е. win2008R2, не оч современно) Я точно не знаю. какая там версия нтфс. Честно говоря, я побаиваюсь доверять ФС хранение этих данных... может, и зря. Но плюсов есть много: это же уйдет забота о консистентности (она тут не нужна), можно будет бэкапить, дублировать отдельно от БД... Позволю себе сослаться на этот форум на работе, а то они тоже побаиваются bfile) Меня смущает во всем этом только один момент: потери на остатках кластера, с большим к-вом записей они будут большими. Пока у нас на быстрых дисках БД для этого мало места. Подумаю тогда над тем, как подключить другой диск, сделать там маленький размер кластера, и туда. Кстати, сорян можете ткнуть в ртфм), но спрошу: bfile не включается в стандартный оракловый в бэкап, надо бэкапить средствами ОС, или все-таки включается или есть опция?) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2021, 15:30 |
|
dg4odbc to Postgres (BLOB)
|
|||
---|---|---|---|
#18+
Tol2000 bfile не включается в стандартный оракловый в бэкап, надо бэкапить средствами ОС, или все-таки включается или есть опция?) Оракл хранит только BFILE locator, сами файлы надо бэкапить отдельно. Попробуйте обсудить эти вопросы, чтобы были понятны агрументы против и страхи использования bfile: Что может случиться с файлами в ФС, чего не может с ними случиться в БД? Почему вы уверены, что при хранении в БД файлы будут занимать меньше места? Зачем для архивного хранилища использовать быстрые диски? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2021, 21:16 |
|
dg4odbc to Postgres (BLOB)
|
|||
---|---|---|---|
#18+
Tol2000, В винде есть чудесная утилита robocopy ... |
|||
:
Нравится:
Не нравится:
|
|||
02.07.2021, 22:43 |
|
dg4odbc to Postgres (BLOB)
|
|||
---|---|---|---|
#18+
BTM, Спасибо за ответ. По поводу дисков я, наоборот, имел в виду медленные для архива конечно же) По поводу того, что места будет занимать больше в ФС, я уверен, т.к. при большом размере диска в ФС будет большой размер кластера, не говоря уже о LBA. Я немного знаю эту тему. Потери на мелких файлах будут существенны. Просто, если диски будут достаточной емкости, нам на это будет все равно) В оракле ведь настраивается, когда небольшие блобы хранятся прямо в блоках таблицы, а большие уже в отдельной, в этом случае, насколько я понимаю, нет особых потерь, когда блоб размером в 100 байт, занимает 4к. В общем, компромиссы конечно. Но вариант с binary file мне все больше нравится) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2021, 10:42 |
|
dg4odbc to Postgres (BLOB)
|
|||
---|---|---|---|
#18+
oragraf, Та это понятно, чем бэкапить файлы - найдем :) Главное, что они будут бэкапиться отдельно от основного бэкапа, что в моем случае большой плюс. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2021, 10:50 |
|
dg4odbc to Postgres (BLOB)
|
|||
---|---|---|---|
#18+
Друзья, спасибо, что поддержали с bfile, это отличная штуковина (тьфу три раза!!!)) Прорабатываю сейчас этот вариант. Если кому интересно, на что я неприятно наткнулся и героически решил)) Дело в том, что я фактически переливаю из одной оракловой таблицы в другую, из таблицы с блобами в таблицу с bfile. Так вот, заливаю я, например, инсертами в pl/sql прямо на сервере это дело и наивно полагаю, что при помощи utl_file я создам всю структуру подкаталогов, а именно: у меня oracle directory установлен, скажем, на /oradir, а файлы пишутся в эту директорию в соотв. подкаталоги (год/мес/день/час). Если для каждого подкаталога, как читал у Кайта, создавать свою оракловую директорию (хотя бы временную), это же с ума сойти :) А utl_file это дело не позволяет, видите-ли, сесурити, все такое. В общем, я вышел из пложения, создав эту загрузку при помощи питонячего скрипта через cx_Oracle, запуская его прямо на сервере с необходимыми правами, и после выполнения инсерта записываю файл в соотв. директорию, имя которой мне сам же оракл при помощи dbms_lob.getfilename и возвращает, отакое! :) А далее с уже созданными файлами спокойно проходит Код: plsql 1.
При создании локатора и чтении оракл прекрасно понимает внутренние каталоги! Так что, utl_file меня немного подверг фрустрации)), но все равно грузить это дело было лучше внешней утилитой, так что все ок. Вопрос с постгресом все-таки пока еще открыт ) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.07.2021, 20:08 |
|
dg4odbc to Postgres (BLOB)
|
|||
---|---|---|---|
#18+
utl_file умеет * (что, естественно, не рекомендуется, как и сама установка utl_file) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2021, 02:16 |
|
dg4odbc to Postgres (BLOB)
|
|||
---|---|---|---|
#18+
Вячеслав Любомудров utl_file умеет * (что, естественно, не рекомендуется, как и сама установка utl_file) Вы про INIT.ORA UTL_FILE_DIR? Ну да, это стремновато ставить, хоть я и использую это дело только на сервере под сисом и только в своих скриптах. Честно говоря, я сначала удивился, что у оракла нет апи для создания физ. файлов, на которые указывает bfile, но потом понял, что оно создавалось для подключения уже существующих файлов. Неисповедимы пути наши ) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2021, 09:29 |
|
dg4odbc to Postgres (BLOB)
|
|||
---|---|---|---|
#18+
Tol2000, Некоторые создают java классы для создания/удаления/перемещения файлов в файловой системе и т.п. и plsql обертку для них. Но это, конечно, не acid путь. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2021, 09:48 |
|
dg4odbc to Postgres (BLOB)
|
|||
---|---|---|---|
#18+
oragraf Tol2000, Некоторые создают java классы для создания/удаления/перемещения файлов в файловой системе и т.п. и plsql обертку для них. Но это, конечно, не acid путь. :) Ну, я вот пытаюсь эти WORM-блобы (хм, каламбур получился))) вывести из-под acid и задышать чуть свободнее, но только потому что оно архивное и worm ) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2021, 10:37 |
|
|
start [/forum/topic.php?fid=52&fpage=15&tid=1880038]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
68ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
104ms |
get tp. blocked users: |
1ms |
others: | 238ms |
total: | 454ms |
0 / 0 |