Этот выпуск посвящен некоторым аспектам проблемы переименования и клонирования базы данных. Начнем с простого - как узнать и изменить идентификатор службы (SID) и имя базы данных (DB_NAME). Последний раз Том Кайт вернулся к этому вопросу 20 августа 2002 года.
Том!
Тривиальный вопрос для тебя: что такое SID и для чего он используется? Повлияет ли
его изменение на другие экземпляры базы данных? И, наконец, как мне узнать
значение SID моей базы данных? Я не смог найти ответ на сайте
technet.oracle.com.
SID - это идентификатор сайта. Его значение хешируется вместе со значеним параметра ORACLE_HOME в ОС Unix для получения уникального ключа для подключения к области SGA. Если значения Oracle_sid или Oracle_home установлены неправильно, будет получено сообщение "oracle not available", поскольку мы не можем подключиться к сегменту разделяемой памяти, который идентфицируется этим "волшебным" лючом. В NT мы не используем разделяемую память, но SID все равно важен. Можно создать несколько баз данных в одном начальном каталоге oracle, так что, надо же их как-то идентифицировать.
Изменить его сложнее, чем кажется. Я знаю, что вы работаете в ОС Unix, поэтому следующая последовательность шагов для изменения SID (или имени базы данных) в Unix - для вас. В NT последовательность шагов - немного другая.
Как найти sid -- с помощью оператора select instance from v$thread.
Здесь описано, как найти и изменить имя базы данных (db_name) или ORACLE_SID для экземпляра, не пересоздавая базу данных.
Для АБД, которым надо найти или изменить db_name или ORACLE_SID.
Чтобы найти текущие значения DB_NAME и ORACLE_SID:
Выполните запросы к представлениям v$database и v$thread.
V$DATABASE дает DB_NAME V$THREAD дает ORACLE_SID
Если ORACLE_SID = DB_SID и db_name = DBNAME:
Чтобы найти текущее значение ORACLE_SID:
SVRMGR> select instance from v$thread; INSTANCE ---------------- DB_SID
Чтобы найти текущее значение DB_NAME:
SVRMGR> select name from v$database; NAME --------- DBNAME
Изменение базы данных для работы с новым ORACLE_SID:
Например, пройдите по всем каталогам и выполните grep ORACLE_SID *
% cd $ORACLE_HOME/dbs
% cd $ORACLE_HOME/rdbms/admin
orapwd file=orapw<NEWSID> password=?? entries=<количество пользователей, которые смогут получить право запускать экземпляр>
% svrmgrl SVRMGR> connect internal
SVRMGR> alter system switch logfile;
SVRMGR> alter database backup controlfile to trace resetlogs;
SVRMGR> shutdown SVRMGR> exit
БЫЛО:
CREATE CONTROLFILE REUSE DATABASE "старое_имя_базы" NORESETLOGS ...
НАДО:
CREATE CONTROLFILE set DATABASE "новое_имя_базы" RESETLOGS ...
БЫЛО:
# Recovery is required if any of the datafiles are restored backups, # or if the last shutdown was not normal or immediate. RECOVER DATABASE USING BACKUP CONTROLFILE
НАДО:
# Recovery is required if any of the datafiles are restored backups, # or if the last shutdown was not normal or immediate. # RECOVER DATABASE USING BACKUP CONTROLFILE
% svrmgrl SVRMGR> connect internal
SVRMGR> @ccf
Если в этот момент вы получаете сообщение об ошибке, утверждающее, что для файла необходимо восстановление носителя (media recovery), значит, база данных была остановлена аварийно на шаге 4. Можно попытаться восстановить базу данных, используя данные повторного выполнения в текущем файле журнала, с помощью команды:
SVRMGRL> recover database using backup controlfile;
Чтобы применить необходимые данные повторного выполнения, надо проверить активные журналы повторного выполнения и применить один, порядковый номер которого указан в сообщении. Обычно, это журнальный файл со status=CURRENT.
Чтобы найти список активных журнальных файлов:
SVRMGR> select group#, seq#, status from v$log;
GROUP# SEQUENCE# STATUS
---------- --------- ----------------
1 123 CURRENT <== надо применить этот журнал
2 124 INACTIVE
3 125 INACTIVE
4 126 INACTIVE
5 127 INACTIVE
6 128 INACTIVE
7 129 INACTIVE
7 rows selected.
SVRMGR> select member
from v$logfile
where GROUP# = 1;
Member
------------------------------------
/u02/oradata/V815/redoV81501.log
alter database open resetlogs;
alter database rename global_name to.
Удивительно, сколько механической работы требуется в Oracle для простых вещей.
Смысл реляционной модели - нормализация; если проще - устранение избыточных данных. А что мы имеем - SID в десятке мест?
Ну, и что???
Чтобы было просто -- не меняйте SID.
База данных поддерживает реляционную модель, а обеспечивающее работу с ней программное обеспечение, согласен, этой модели не соответствует.
НА САМОМ ДЕЛЕ, мы сталкиваемся с попыткой ИЗМЕНИТЬ ПЕРВИЧНЫЙ КЛЮЧ.
Это, на самом деле, ПРЕКРАСНАЯ демонстрация особенностей реляционной модели. Первичным ключом для базы данных является SID. Вы пытаетесь изменить первичный ключ (чего в реляционных базах данных делать КРАЙНЕ НЕ РЕКОМЕНДУЕТСЯ) и реализовать действие on update cascade.
Так что, даже при наличии ОДНОГО внешнего ключа, пробюлема будет аналогичной. Если вы когда-нибудь изменяли значение первичного ключа, вам приходилось делать то же самое (находить все внешние ключи и изменять их соответственно).
Почему вы считаете изменение SID "простой вещью" (мне этот процесс кажется весьма мутным -- мне ни разу не приходилось самому это делать за 15 лет)...
Прекрасное описание процедуры изменения sid. Я постоянно это делала на прежней работе при создании тестовых экземпляров. Одна проблема, связанная с sid, меня всегда беспокоила - как узнать этот самый sid. Если вы не знаете sid, как вы подключитесь к экземпляру и спросите значение sid?
ps -<флаги, соответствующие версии ОС UNIX> | grep pmon
$ ps -aux | grep pmon ora734 3662 0.0 0.518720 6896 ? S Jan 21 0:00 ora_pmon_ora734 tkyte 7446 0.0 0.1 944 784 pts/8 S 13:30:09 0:00 grep pmon ora716 12929 0.0 0.417472 5552 ? S Jan 22 0:00 ora_pmon_ora716 oracle9i 13112 0.0 13.6249688205872 ? S Jan 18 0:00 ora_pmon_ora9iUTF ora806 13901 0.0 1.03324014080 ? S Feb 26 0:00 ora_pmon_ora806 oracle9i 17941 0.0 24.6413528372528 ? S Feb 18 0:00 ora_pmon_ora9i ora817 25122 0.0 16.2279824245824 ? S Feb 01 0:00 ora_pmon_ora817dev ora815 25424 0.0 2.99008043712 ? S Jan 28 0:00 ora_pmon_ora815
Если вы работате не на сервере, sid просто не имеет значения, - вам нужна запись tns в файле tnsnames.ora.
На NT посмотрите список служб Oracle в Панели управления.
Оригинал обсуждения этого вопроса можно найти здесь.
Изменение SID на платформе Windows, кстати, описано вот здесь.Copyright © 2003 Oracle Corporation
Перевод очередной статьи Джонатана Льюиса пока придется подождать. Статья большая... Пожалуй, продолжим тему клонирования БД "по мотивам" ответов Тома Кайта. Следите за новостями на сайте проекта Open Oracle.
С наилучшими пожеланиями,
В.К.
|
|