вторник, 24 мая 2011 г.

Oracle и я

Пост о том, как я сначала боролся, а потом подружился с Oracle.

Задача: развернуть "горячий" бэкап БД
Средства: любые

Во-первых, я нашел внятный мануал как поставить Oracle на Linux.
Во-вторых сам Oracle. Я брал версию 10g r2 для Linux
Сначала меня удивил установщик,его надо обязательно запускать из-под иксов(!), что на мой взгляд не совсем удобно. Продолжая действовать по шагам у меня все получилось, за исключением web-менеджера (я так подумал, он мне нахер не нужен).
А потом началось самое интересное. Бекап и рестор баз данных на Oracle.
Какое-то время все шло хорошо и даже возникающие ошибки были нормальным делом в такой ситтуации.
Меня подкосила команда
recover database  until  cancel   using  backup  controlfile;
После ее запуска я ввел AUTO и рестор стал просить у меня архивные логи. Как оказалось, ему они требовались все и я их копировал и копировал с работающей базы.
В конце концов он меня попросил дать ему архивный файл, которого не было на сервере с работающей базой.
Решил я подойти с другой стороны. Так как мне не важно было на какой момент восстановится база, а важно чтоб она в принципе восстановилась, то я изменил команду на
recover database  until  change 88654992150   using  backup  controlfile;

Вот это загадочное длинное число - это (я так понял) номер изменения в базе после начала бэкапа. И соответственно все изменения до него, рековер должен брать в архивных файлах.
Кстати, есть еще вариант с until date, но я его приберегу до следующего раза.
Затем, естественно, при попытке
alter database open resetlogs;
он выдавал мне ошибку, что мол, не могу. В логах я нашел, что версия не подходящая, версия базы 10.2.0.3.0, а версия сервера 10.2.0.1.0.
Ок, давай ставить патч. Искал я его очень долго, в конце концов нашел на торрентах, потому что с oracle.com скачать я его не смог.
После установки патча я сначала проапгрейдил тестовую базу, которая ставится вместе с Oracle, а потом принялся за свою. Как обычно бывает в таких ситтуациях, в первом случае все прошло отлично, во втором случае были проблемы.
Не буду описывать все свои мытарства, а расскажу решение.
Запускаем $sqlplus /nolog
SQL> connect / as sysdba
SQL> startup upgrade
Тут база монтируется и открывается для апгрейда.
SQL> @?/rdbms/admin/utlirp.sql
Долго-долго выполняется скрипт. Он исправляет все неправильные объекты в БД
SQL> shut
Вырубаем и запускаем. Затем делаем:
SQL> startup upgrade
SQL> @?/rdbms/admin/catupgrd.sql
Опять долго-долго выполняется скрипт. Но это последнее, что нужно сделать для апгрейда.
SQL> shut
Теперь вырубаем и запускаем в нормальном режиме
SQL> startup
Проапгрейдить базу мне помогли здесь и здесь
После этого осталось только настроить tsnlistener и работать.

Upd. Я забыл про temp-файл. его надо создать командой:
SQL> alter tablespace temp add  tempfile '/path/to/base/temp/temp01.dbf' SIZE 500M;
Удалить его можно другой командой
alter database tempfile '/path/to/base/temp/temp01.dbf' drop;

Upd2.Восстановление до времени
SQL> recover database until time '2011-07-27:15:30:00' using backup controlfile