Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > backUp DB


Автор: Stallionf1 27.4.2011, 23:55
Доброго времени суток!!!
Подскажите, пожалуйста, как сделать бэкап/восстановление БД (в моем случае, DB Oracle) через веб-приложение??
скажем, "Админ" зашел на сайт и захотел сделал бэкап всей БД (всех зарегистрированных юзеров).

Автор: COVD 28.4.2011, 01:22
Наверное, проще и надежнее поставить программы удаленного доступа (например, RAdmin), соединяться через VPN и делать все, что хотите. Я таким способом соединяюсь из дома с моим рабочим офисным компьютером и всеми серверами, в том числе и с теми, где установлены базы данных.

Автор: Stolzen 28.4.2011, 07:45
Цитата(COVD @  28.4.2011,  02:22 Найти цитируемый пост)
Наверное, проще и надежнее поставить программы удаленного доступа (например, RAdmin), соединяться через VPN и делать все, что хотите. 

Ну если на сервере доступна только командная строка? Да, в таком случае можно подсоединятся через ssh - то же самое получается.

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

Автор: carper 28.4.2011, 08:18
Цитата(Stallionf1 @  27.4.2011,  23:55 Найти цитируемый пост)
Подскажите, пожалуйста, как сделать бэкап/восстановление БД (в моем случае, DB Oracle) через веб-приложение


Вижу три пути:
1. Создать свою программу архивации, размещенную в web каталоге и обращающуюся к базе данных стандартным образом.
И складывать архив в папку находящуюся внутри каталога развернутого приложения.
Тогда не будет никакой разницы откуда запускать архивацию.

Но таким образом вы потратите кучу времени на то, что "из коробки" есть в Oracle.

2. Попробовать все возможные пути экскалации прав удаленного пользователя web приложения с тем чтобы он мог запускать выполняемые файлы на сервере. 

IMHO путь, очень мягко выражаясь, бесперспективный.

3. Не морочить никому голову и удаленно коннектиться к серверу, как это вам уже посоветовали.


Автор: Stallionf1 28.4.2011, 08:36
наверное я не совсем конкретно поставил вопрос....
Например, АДМИН регистрируется на сайте, входит, и у него есть кнопка "создать копию БД".
Вот что мне делать при нажатии на кнопку? 
и  можете, пожалуйста, поподробнее описать вариант, если писать какой-то скрипт, то как он вообще выполняется (где он должен лежать), а то  если честно не очень я понимаю? спасибо!

Автор: Stolzen 28.4.2011, 09:08
Так в java запускается внешняя программа:
Код

proc = Runtime.getRuntime().exec("./external); 


Этот самый "external" - может быть скрипт. Не знаю, как в Oracle, но, например, в MySQL и Firebird есть программа, позволяющая сделать полный дамп базы - такую вам и нужно запускать из скрипта. В MySQL в результате выходит файл с sql запросом, который может целиком повторить базу - его, скорее всего, нужно будет сжать каким-нибудь gzip. Как скрипт закончил свое выполнение, можно уведомлять пользователя об этом и давать ссылку на полученный файл.

Автор: carper 28.4.2011, 10:25
Цитата(Stolzen @  28.4.2011,  09:08 Найти цитируемый пост)
Так в java запускается внешняя программа:


А вы пробовали через web интерфейс задеплоенного приложения запустить экзешник на сервере, особенно тот, которому еще придется чего то писать/читать вне его каталога web сервера?

Если да, то не поделитесь тем, как это делать, например, под Tomcat ?



Цитата(Stallionf1 @  28.4.2011,  08:36 Найти цитируемый пост)
Например, АДМИН регистрируется на сайте, входит, и у него есть кнопка "создать копию БД".
Вот что мне делать при нажатии на кнопку? 


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

Пункт про права при работе через web приложение, как я понял, вы решили проигнорировать, а зря. smile

Ну, если очень хочется ... 
1. Забудьте про web вообще.

2. Напишите на JAVA метод (ну форум здесь как бы про JAVA, а так на любом подходящем языке, например, PHP), который коннектится к базе, отбирает нужную информацию и пишет ее, например, в какой-то файл.

3. Вспомните, что этот метод будет вызываться из web  smile  и задайте каталог для выгрузки внутри web каталога, куда будет задеплоено вашего приложения, и к которому у вашего метода будет доступ.

4. На кнопку навесьте вызов этого метода.

5. Прикрутите, по желанию, возможность загрузки дампа, например, через другую web страничку.


P.S. Вы не могли бы уточнить какие технологии вы уже применяете для создания вашего web приложения ?

Автор: LSD 28.4.2011, 10:34
Если речь идет именно о бекапе, а не импорт/экспорт, я бы делал так:
- создать скрипт бекапа средствами СУБД
- вызывать его из приложения

Автор: Stolzen 28.4.2011, 10:41
Цитата(carper @  28.4.2011,  11:25 Найти цитируемый пост)
А вы пробовали через web интерфейс задеплоенного приложения запустить экзешник на сервере, особенно тот, которому еще придется чего то писать/читать вне его каталога web сервера?

Если да, то не поделитесь тем, как это делать, например, под Tomcat ?


Честно говоря, нет. Но информация в интернете имеется -  http://perlmonks.org.ru/vorota_v_perl/2009/05/tomcat-i-perl-bistrij-start.html

Автор: carper 28.4.2011, 11:09
Цитата(Stolzen @  28.4.2011,  10:41 Найти цитируемый пост)
Но информация в интернете имеется 


Почитал, я не знаю Perl, но того, что понял достаточно чтобы увидеть, что никакими файловыми операциями и запуском внешних программ там и не пахнет.

С одной стороны вроде как "CGI scripts are used to execute programs external to the Tomcat JVM" с другой, без особых извращений (включая игрища с Java SecurityManager), вы для  Server OS практически никто и звать вас никак.

Полагаю, хотя сам и никогда не пробовал, в конечном итоге систему безопасности можно сломать/"усовершенствовать" и запускать на сервере всё, что угодно, только ЗАЧЕМ ?!

Особенно если учесть, что для этой же задачи существует куча других методов? smile




Цитата(LSD @  28.4.2011,  10:34 Найти цитируемый пост)
скрипт бекапа средствами СУБД


Такой скрипт создается просто, вот только как его запустить?

Ну, вот возьмем такой кусочек с абсолютно элементарными действиями - устраиваем shutdown приложению и
бэками один маленький файлик (для него, кстати, shutdown не обязателен, но оставим как есть) куда-то на 
другой диск сервера:

Код

С:\Ora92\bin\sqlplus.exe  sys/myBase@"password as sysdba" @c:\tools\vekshutdown.sql -s
c:\tools\arj32\arj32 a -r -hk1 -h# c:\Backup\daily\vekpfile G:\dbvek\pfile\*.*                 


Не подскажете как выполнить через web приложение?

Как вариант, можно попробовать поизощряться с созданием задач в самом Oracle, наверное, может получиться, но зачем такое извращение?


P.S. Вообще задача web сервера максимально ограничить возможность внешнего пользователя хоть что-то делать вне доступного ему выделенного пространства. 
Пытаться самому сломать такое поведение кажется не очень разумным, нет?

Автор: LSD 28.4.2011, 14:02
Для начала, это не бекап, это импорт/экспорт smile
Что мешает выполнить Runtime.exec() внутри сервлета? Тот же томкат никаких security manager не устанавливает. Единственное скрипт будет работать долго, и надо его вынести в отдельный поток.

Автор: Stallionf1 28.4.2011, 14:32
Цитата(carper @ 28.4.2011,  10:25)
P.S. Вы не могли бы уточнить какие технологии вы уже применяете для создания вашего web приложения ?

технологий типа Hibernate, Spring не использую!
1)графическое представление (JSP+Servlets)
2)отдельными классами описываю логику
3)доступ к БД через DAO (Data Access Object)

Добавлено через 2 минуты и 54 секунды
Цитата(LSD @ 28.4.2011,  10:34)
Если речь идет именно о бекапе, а не импорт/экспорт, я бы делал так:
- создать скрипт бекапа средствами СУБД
- вызывать его из приложения

да, речь идет именно о бэкапе / рэсторе.

так как же скрипт вызвать, каким макаром?

Автор: carper 28.4.2011, 14:59
Цитата(LSD @  28.4.2011,  14:02 Найти цитируемый пост)
Тот же томкат никаких security manager не устанавливает. Единственное скрипт будет работать долго, и надо его вынести в отдельный поток. 


Не устанавливает, только вот не запускать же боевой сервис Tomcat от админа, а дав права JAVA хозяйничать на компьютере не будет ли странно не поднять там  security manager? 


(Хотя, каюсь, пока сейчас не поборол лень и не попробовал на своей машине, полагал, что всё еще хуже.   smile )


У меня на машине под разработку, Tomcat сидит от имени локального админа, никакого security manager и там Runtime.exec()  выполняется на ура.

Но разве тоже будет на рабочем Tomcat?


http://tomcat.apache.org/tomcat-5.5-doc/setup.html
"For optimal security, the service should be run as a separate user, with reduced permissions".

И вот с этим-то пользователем и начнет получаться кавардак с правами и, IMHO, необходимостью задействовать security manager, для безопасности.


Цитата(LSD @  28.4.2011,  14:02 Найти цитируемый пост)
 и надо его вынести в отдельный поток. 


Ага, а еще надо будет учесть, что если это не Tomcat, то сервер может очень не полюблять потоки, которые не он сам запускает. smile

Автор: LSD 29.4.2011, 12:28
Давайте все же разберемся с терминологией. Бекап это физическое копирование файлов базы данных. Из бекапа базу можно восстановить даже если будут повреждены файлы базы и она вообще не будет запускаться. Импорт/экспорт это копирование данных из таблицы(таблиц) в файл. И соответственно восстановить можно только работающую базу и то лишь частично.

Для импорта/экспорта нужны лишь права в базе и место куда писать файлы экспорта.

Для "ручного" бекапа Оракла нужны права в СУБД, доступ на чтение файлов базы и журнала и место куда писать файлы бекапа. Либо права на выполнение rman или скрипта.



Цитата(carper @  28.4.2011,  15:59 Найти цитируемый пост)
"For optimal security, the service should be run as a separate user, with reduced permissions".

Можно создать .sh файл который будет выполняться с правами другого пользователя, а томкатовскому пользователю дать право на выполнение и все.



Цитата(carper @  28.4.2011,  15:59 Найти цитируемый пост)
Ага, а еще надо будет учесть, что если это не Tomcat, то сервер может очень не полюблять потоки, которые не он сам запускает.

В таком случае там точно есть какой нибудь шедуллер. smile 

Автор: carper 29.4.2011, 13:08
Цитата(LSD @  29.4.2011,  12:28 Найти цитируемый пост)
Можно создать .sh файл который будет выполняться с правами другого пользователя, а томкатовскому пользователю дать право на выполнение и все.


Хм... Наверное можно. Можно и в Windows устроить что-то типа run as.

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

OK. Мы так не хотим, поднимаем security, работаем через HTTPS и т.д. и т.п. и все это  ради того, чтобы иметь возможность 
таки нажать кнопочку именно через web морду.

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



Цитата(LSD @  29.4.2011,  12:28 Найти цитируемый пост)
В таком случае там точно есть какой нибудь шедуллер


Более того шедулер есть и в самом Oracle и можно его как-то "заводить"  в ответ на нажатие кнопки, да собственно и cron можно использовать, не терзая web сервер вообще. smile

Вопрос все тот же - а на фига такие сложности?



Цитата(LSD @  29.4.2011,  12:28 Найти цитируемый пост)
Давайте все же разберемся с терминологией.


А в чем разбираться? У нас тут разногласий нет.
Или я где-то чего-то про export/import сказал (посмотрел, вроде как не нашел, а тот кусочек кода, что приводил - это как раз начало скрипта холодного бэкапа - команда на shutdown и архивация файла параметров) ?

Я так понял, что автору нужен полноценный бэкап, скорее всего cold, со всеми вытекающими правами.


P.S. 
Полагаю тема получилась любопытная - лично я пришел к выводу, что если забывать о безопасности web сервера, то можно попасть на такой вот getRuntime().exec  и очень потом переживать.  smile

Автор: Stolzen 29.4.2011, 14:00
А там что-то типа папки cgi-bin есть? Например, в апаче можно засунуть скрипт в эту самую папку и вызывать напрямую.

Автор: LSD 29.4.2011, 17:06
Цитата(carper @  29.4.2011,  14:08 Найти цитируемый пост)
Но я о чем сейчас подумал...  Это значится, достаточно будет злоумышленнику узнать адрес нужной странички, перехватить пароль и он в любой момент может уронить базу на время ненужного бэкапа?

Если злоумышленник получил пароль админа, то у него и так достаточно средств для вредительства. А вообще, конечно нужно предпринимать меры по защите, SSL, отдельный пароль на опасные операции и т.д. Просто я не вижу в ситуации с бекапом, какого то исключительного случая.
Ну и к тому же, бекам может быть горячим smile



Цитата(carper @  29.4.2011,  14:08 Найти цитируемый пост)
Более того шедулер есть и в самом Oracle и можно его как-то "заводить"  в ответ на нажатие кнопки, да собственно и cron можно использовать, не терзая web сервер вообще. smile

Вопрос все тот же - а на фига такие сложности?

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



Цитата(carper @  29.4.2011,  14:08 Найти цитируемый пост)
А в чем разбираться? У нас тут разногласий нет.
Или я где-то чего-то про export/import сказал (посмотрел, вроде как не нашел, а тот кусочек кода, что приводил - это как раз начало скрипта холодного бэкапа - команда на shutdown и архивация файла параметров) ?

Я так понял, что автору нужен полноценный бэкап, скорее всего cold, со всеми вытекающими правами.

Меня смутила фраза
Цитата(Stallionf1 @  28.4.2011,  00:55 Найти цитируемый пост)
скажем, "Админ" зашел на сайт и захотел сделал бэкап всей БД (всех зарегистрированных юзеров). 

Но раз мы говорим про бекап, то будем про него и говорить smile

Автор: mbasil 1.5.2011, 16:36
В базе данных Oracle (начиная с 9 версии) имеется такое административное WEB приложение, как Enterprise Manager, которое с помощью wizard'ов предлагает сделать job'ы для выполнения резервирования и восстановления.
Выполняется же резервирование и восстановление через утилиту RMAN.
В любом случае для резервированя и восстановления через RMAN надо подключаться имея привилегию SYSDBA, то есть самым "крутым" администратором.
Если не хотите запускать Enterprise Manager (для этого на сервере стартует ядро сервера приложений), можете писать и запускать напрямую скрипты RMAN по расписанию.
В любом случае:
1. Для резервирования надо продумать периодически выполняемый сценарий, а значит выполнять по расписанию, и WEB здесь не шибко нужен.
2. Восстановление же после сбоя задача слишком важная и обычно весьма специфическая, так что хоть и можно его делать через Enterprise Manager, я бы без крайней нужды бы делать этого не стал, а сделал напрямую через RMAN.
3. Так что WEB здесь нужен только в том случае, когда вы в другом городе и уж никак не можете подключиться по TCP/IP к базе.
4. Команды RMAN конесно придется изучать, но деваться некуда. 
Если вы хотите через Enterprise Manager приходите к нам на курс: 
"O10gDBA2. Oracle Database 10g: Administration Workshop I"
Если же вы хотите ознакомится с RMAN вам прямая дорога на курс: 
"O10gDBA2. Oracle Database 10g: Administration Workshop II"

Автор: COVD 2.5.2011, 04:16
Цитата

3. Так что WEB здесь нужен только в том случае, когда вы в другом городе и уж никак не можете подключиться по TCP/IP к базе.


HTTP - "межгород", а ТСР - локально?  smile 

Автор: mbasil 2.5.2011, 10:05
to COVD
Я прекрасно знаю, что  HTTP это лишь туннелирование над TCP/IP, но есть ряд аспектов связанных с практиками администрирования Oracle:
1. Enterprise Manager через HTTP может работать и локально, а при некотором ослаблении безопасности вы можете подключаться для  выполнения административных работ по TCP/IP и из глобальной сети (например, запустив RMAN на клиенте). 
2. Многие администраторы работают "по старинке" не используя Enterprise Manager либо по причине нежелания стартовать на сервере базы данных сервер приложений, либо по причине безопасности.
3. Вопросы резервирования и восстановления в Oracle, в отличие от некоторых других баз данных, весьма непросты. Oracle декларирует, что у них сверх надежная база, однако за этот уровень пришлось заплатить сложностью.  Хоть я помимо курсов по Java еще читаю курсы по администрированию Oracle и сталкивался со многими типами сбоев базы данных, но по секрету скажу,  что знаю эти вопросы только поверхностно. Но. чтобы начинать заниматься резервированием/восстановлением,  надо хотя бы поверхностно разобраться со всей картиной.

Автор: COVD 2.5.2011, 16:06
to mbasil
Я абсолютно согласен, что для администрирования следует использовать штатные средства. Просто удивило, что в качестве примера причины отсутствия должного соединения был приведен географический фактор. 

Автор: mbasil 2.5.2011, 17:06
Ну, говоря о другом городе, я просто имел в виду, что обычно у нас в России из соображений безопасности базу данных "отсекают" от возможности прямой видимости из глобальной сети. Поэтому, в большинстве случаев, при возникновении сбоя администратор должен как можно быстрее "взять ноги в руки", приехать на место и выполнить восстановление.
Если же речь идет о резервировании, то этот механизм должен быть настроен так, чтобы в общем он выполнялся автоматически и без присутствия администратора.

Автор: COVD 2.5.2011, 18:21
Цитата

из соображений безопасности базу данных "отсекают" от возможности прямой видимости из глобальной сети

VPN не отвечает требованиям безопасности?

Автор: mbasil 2.5.2011, 19:48
to COVD
Отвечает. 
Можно использовать еще более простой способ, например обеспечить полное шифрование данных, передаваемых по TCP/IP подключению, средствами Oracle Net. Делается с помощью трех параметров.
Однако "безопасники" в банке, например, никогда вам не позволят выполнять административные операции извне, подключаясь напрямую к базе.

Вспомним, что наш вопрос разбивается на две части, о чем мы уже говорили:
- резервирование, которое можно (и нужно) автоматизировать, так что извне по Web может понадобится только легкий контроль исполнения, типа просмотра наличия файлов резерва или журнала RMAN, наличия свободного места на диске и т.п.
- восстановление, которое почти всегда возникает неожиданно, так как связано со сбоем, часто требует копирования множества файлов и черевато возможными неожиданными проблемами. Может получится удаленно и легко, а может и нет. 

Конечно, есть еще такие операции как создание дубликата базы для тестирования и т.п. Их можно делать удаленно, например с помощью того же RMAN, но это вопрос администрации фирмы. Принципиально, разрешает руководство  удаленное администрирование, или - нет.
И разработчик или администратор не может брать на себя решение этого вопроса.

Автор: koroplysov 10.5.2011, 19:19
я с ораклом тесно не знаком, но в DB2 можно настроить создание бекапа, например, каждые 0,5 часа.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)