LINUX.ORG.RU

Как правильно сделать бэкап из (PL/)SQL по сети?


0

2

Задача: Нужно делать бэкап данных БД (без схемы). Базку-источник изменять нельзя, т.е. это ридонли-бэкап.

Контекст: бэкап данных Оракла в произвольную БД по сети.

Ресурсы: только connection string, и возможность подключиться к базке с максимальными правами. Т.е. ssh до сервера нет, с жесткого файл с бэкапом по ssh не прочитаешь, и вообще на сервере может внезапно стоять венда.

Вопрос: Есть ли на таких условиях какой-нибудь быстрый проверенный способ стянуть данные? Может у кого завалялось готовое опенсорцное решение? %)

Слово «быстрый» тут присутствует потому, что просто селектать кусочками по N строк (через rownum или row_number()) и переправлять на целевую базку - излишне медленно.

Если у кого-то появится желание подискутировать на более глобальную тему - копирование из базки в базку по сети с оптимизацией по времени выполнения, вэллкам))

Спасибо

★★★★☆

Последнее исправление: stevejobs (всего исправлений: 1)

Для postrgesql есть pgAdmin, который умеет все это делать.
Для такого всего-из-себя ЪЫнтерпрайз продукта, как OracleDB наверняка тоже есть. Попробуй посмотреть в эту сторону.

trex6 ★★★★★
()
Ответ на: комментарий от trex6

Нельзя использовать ничего кроме PL/SQL. (Так хочет заказчик.) Никаких специальных настроек сервера, никаких админок требующих такие настройки, только собственный код, который принимает на вход данные о подключении к БД (хост, порт, пароль, ресурс, итп).

Если найдется какое-то опенсорсное решение - скорее всего, его придется с изменениями переписать на другом языке чтобы удовлетворить NIH-синдром, и написать, что оно Invented Here (но я пока не нашел - все пыховые делают селектами, а мне нужно что-то типа куска бинарных данных, или потока с CSV, я не совсем понимаю возможности Оракла в этом плане, потому и спрашиваю).

Насчет pgAdmin. Т.е. данные должны быть кроссплатформенными в широком смысле (переноситься между осями, пихаться в разные типа БД, подвергаться препроцессингу) просто кусок бинарных данных не катит, нужен кусок бинарных данных с известной структурой.

stevejobs ★★★★☆
() автор топика
Последнее исправление: stevejobs (всего исправлений: 2)
Ответ на: комментарий от trex6

Он сохраняет базу в виде набора строк INSERT'ов.

postgresql умеет напрямую импортить-экспортить CSV, и помойму оно написано c крутыми оптимизациями, может тогда его юзать. А инсерты во-первых замучаешься читать, а потом базке их придется как минимум планировать честным способом.

вытягивание терабайтов из оракла сейчас важнее)

stevejobs ★★★★☆
() автор топика
Ответ на: комментарий от tnodir

а данные можно получить через то же самое соединение с базкой? Для примера, Java+жабовый драйвер оракла (можно на любой платформе, главное - результат).

просто если он бэкапит файлы только на жесткий диск сервера - это фейл. (вызывают опасение параметры: DIRECTORY=dmpdir DUMPFILE=scott.dmp) Единственный способ связи с сервером - через обычное соединение. Никаких ssh/ftp/http для того, чтобы пошариться на диске сервера.

stevejobs ★★★★☆
() автор топика
Ответ на: комментарий от stevejobs

Тогда как вариант можно настроить db link.

A database link is a schema object in one database that enables you to access objects on another database.

Потом можно будет работать с таблицами из удаленной БД в стиле:

SELECT * FROM employees@local;
Где после символа «@» записан алиас удаленной БД.

Ja-Ja-Hey-Ho ★★★★
()
Ответ на: комментарий от Ja-Ja-Hey-Ho

только перед этим ты должен создать dblink на удаленную БД, чтобы обращаться к нему через @

Deleted
()
Ответ на: комментарий от Deleted

Думаю, ТС догадается сначала почитать документацию на эту тему, перед тем как начать использовать данную технологию.

Ja-Ja-Hey-Ho ★★★★
()
Ответ на: комментарий от Ja-Ja-Hey-Ho

но тут возникает проблема с лицензией Оракла :( Получается, на промежуточном сервере (который делает бэкап) должна быть еще одна копия Oracle Database? Заказчики неспроста хотят, чтобы мы дописали им такую вот софтинку для бекапа. Распространять вместе с продуктом еще и оракловскую базу исключительно для того, чтобы юзать ее как промежуточное звено в бэкапе - это как-то... очень негибко, дорого и проприетарно что ли :) Там весь наш продукт одной десятой самой дешевой лицензии оракла не стоит поди :)

Но за сам метод - огромнейшее спасибо, не догадался бы. Заюзаю в другом месте)

stevejobs ★★★★☆
() автор топика

Нужно делать бэкап данных БД (без схемы)

Что значит «без схемы»? Т.е. схема БД тебе заранее не известна? Тогда у тебя должны быть права на чтение схемы. Это раз. Далее, я не помню, позволяет ли «оракул» делать кучу селектов «в одной транзакции» - иначе ты скорее всего получишь неконсистентную информацию.

В общем, это всё не очень хорошо «пахнет», такое впечатление что кто-то хочет слить чужую информацию...

Готового скорее всего ничего нет, ибо ты хочешь странного. Но и написать самому особой сложности не вижу (может просто давно не щупал oracle)

yyk ★★★★★
()
Ответ на: комментарий от yyk

Т.е. схема БД тебе заранее не известна?

известна. Т.е. куча человек пошла и руками передрала все заголовки таблиц, все несколько сотен =) Эту проблему решать уже не надо.

кстати, скопипастал на SO и Хабр, ждем лулзов:
тыц: http://stackoverflow.com/questions/13045806/how-to-copy-data-from-pl-sql-in-o...
тыц: http://habrahabr.ru/qa/26593/

позволяет ли «оракул» делать кучу селектов «в одной транзакции»

О_о а есть базы, которые не позволяют?

stevejobs ★★★★☆
() автор топика
Последнее исправление: stevejobs (всего исправлений: 1)
Ответ на: комментарий от stevejobs

известна.

Тогда в чём проблема накропать скрипт на чём угодно?

О_о а есть базы, которые не позволяют?

Только используя SQL/DML? Не помню - давно это было. Чисто теоретически - у версионника проблем быть не должно. Любую другую базу сие действо поставит раком на неопределённое время.

yyk ★★★★★
()
Ответ на: комментарий от yyk

Тогда в чём проблема накропать скрипт на чём угодно?

в том что последовательные SELECTы, даже будучи ограничены пагинацией, сильно медленные. Медленно селектать, медленно писать в файл, медленно потом из файла всё это вычитывать. Хочется какой-нибудь магии, которая сделает всё это намного быстрее. Вообще, такая магия есть - называется встроенный в базку бэкап в какой-нибудь CSV, но в результате такого бэкапа получится файл, и чтобы его скачать - нужен доступ к жесткому диску сервера, а его как раз и нет (есть только прямое соединение с базкой).

stevejobs ★★★★☆
() автор топика
Ответ на: комментарий от stevejobs

Получается, на промежуточном сервере (который делает бэкап) должна быть еще одна копия Oracle Database?

Не обязательно, но крайне желательно.
В принципе таким образом с помощью HSODBC (если не ошибаюсь, начиная с Oracle 10g название сменилось на DG4ODBC) можно подключить любую БД, при наличии вменяемого ODBC драйвера.
Правда, могут быть проблемы с производительностью / кодировками / чем угодно еще, так что сложно заранее сказать, стоит ли игра свеч.
Пример настройки: Accessing ODBC Databases from Windows with Oracle Database Gateway for ODBC (DG4ODBC).

Ja-Ja-Hey-Ho ★★★★
()
Ответ на: комментарий от Ja-Ja-Hey-Ho

Да, забыл добавить работает, естественно, не только в Windows :)

Ja-Ja-Hey-Ho ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.