четверг, 30 июня 2011 г.

Как сдублировать базу в Oracle 10g

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

Задачу мы сформулируем так: нам надо получить практически точную копию нашей базы на другом хосте. В этот раз мы не будем переименовывать файлы и директории. Мы будем пользоваться каталогом RMAN.

Для этого нам потребуется:

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

2. Обязательно проверьте, что у вас достаточно места на диске тестового компьютера, куда мы будем дублировать базу, чтобы эта печальная новость не застигла вас по середине процесса.

3. Создайте или скопируйте init.ora на ваш тестовый хост. Я просто взял оригинальный, скопировал его, переименовал и чуть-чуть подправил, чтобы он лучше вписывался в реалии моего тестового сервера - память, пути и прочее. Пути очень важны - поэтому вы должны воссоздать пустые директории adump, bdump, cdump, udump - короче все админские директории, которые указаны в вашем init.ora файле. Не будет лишним создать директорию для данных и места, где у вас лежат архивлоги - и положить сразу логи туда. Чтобы не было путаницы я называю SID и dbname одинаково и с большими буквами. Пусть у нас будет в init.ora dbname=TESTDB. И в файле /etc/oratab я прописываю - 
TESTDB:/u01/app/oracle/product/10.2.0/db_1:N.

4. Теперь мы можем попытаться “поднять” наш инстанс на тестовом хосте до состояния nomount - потому что у нас пока вообще ничего нет кроме init.ora.

sqlplus /nolog
conn / as sysdba;
strartup nomount

5. Если у вас все прекрасно поднялось, то выходим из плюса и занимаемся настройкой связи до нашего главного сервере и каталога RMAN (надеюсь он у вас есть). Для этого редактируем $ORACLE_HOME/network/admin/tnsnames.ora до состояния пока вы не будете успешно соединяться с этими двумя серверами.

6. Мы почти у цели, и осталась совсем немного. Нам нужен скрипт дупликации базы. В нашем случае, когда мы не хотим переименовывать файлы, а хотим точно такую же структуру как на target db - нам надо обязательно указывать nofilenamecheck. Иначе RMAN будет ругаться, что имена файлов target и auxiliary db совпадают. Вторая вещь - по умолчанию RMAN будет стараться сдуплицировать вашу базу максимально близко к нынешнему моменту во времени. То есть к сейчас. Для этого вам надо иметь все архив логи, о которых знает RMAN. Если вы хотите облегчиться себе жизнь, как я - и вам достаточно например, базы из ночного бэкапа, то вы можете установить set until time на время, которое вас устраивает. Не забываем об ошибке, связанной с set until time, которую я указал в прошлом сообщении.

сам скрипт duplicate.rcv будет таков

run {
set until time “to_date(‘Jun 30 2011 23:30:00’,’Mon DD YYYY HH24:MI:SS’)”;
allocate auxiliary channel C1 device type disk;
duplicate target database to TESTDB nofilenamecheck;
}

7. Еще раз подумайте, все ли вы сделайте и особенно проверьте расположение файлов бэкапа и архив логов и права на них. Я однажды нечаянно скопировал архивлоги под другим пользователем и оракл мне долго говорил, что не может восстановить базу. Запускаем RMAN на тестовой машине

rman target sys/sys@PROD catalog rman/rman@rman auxiliary /

в случае успеха на экране будет написано, что мы удачно подсоединились ко всем трем базам - PROD (наш продакшен), rman - наш каталог, auxiliary - это наш тестовый сервер.
Запускаем скрипт @duplicate.rcv

Если мы все сделали правильно, RMAN восстановит файлы на диске - restore, сделает нам media recovery и откроет базу open resetlogs. Если что-то осталось непонятным, вы можете еще посмотреть вот этот документ Note 388431.1 Creating a Duplicate Database on a New Host. на Oracle Support. Там же есть нота, что делать если RMAN где-то посередине не смог завершить дупликацию Manual Completion of a Failed RMAN Duplicate [ID 360962.1]

В версии 11g вы можете сдуплицировать базу данных не только из бэкапа, но и с активной базы данных. Более подробно об этом в соответствующей литературе по 11g и Note 452868.1 RMAN 'Duplicate Database' Feature in 11G

вторник, 21 июня 2011 г.

ORA-00907 неправильный текст ошибки при неправильных параметрах языка

Недавно делал базе duplicate - дублировал ее на другой совершенно новый компьютер. И немного застопорился на ошибке ORA-00907 в случае когда я использую в скрипте RMAN

set until time "to_date('Jun 20 2011 01:00:00','Mon DD YYYY HH24:MI:SS')";
ORA-907: missing right parenthesis


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

Делаем в плюсе select to_char(sysdate,'Mon') from dual; и видим, что у нас там вопросики. Так и есть у нас везде почему-то оказался русский в NLS_ параметрах, которые мы можем глянуть через запрос к v$nls_parameters. То есть RMAN нам показывает не совсем ту ошибку. Тогда мы пишем export NLS_LANG=AMERICAN_AMERICA.CL8MSWIN1251 и все у нас работает!