Oracle DB: Изменение имени базы и dbid

Материал из sysadm
Перейти к навигации Перейти к поиску

Изменение имени базы

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

Шаг 1 Убедитесь что у вас есть бэкап текущей базы данных

Шаг 2 Отключите архивлоги

sqlplus / as sysdba
shutdown immediate;
startup mount;
alter database NOARCHIVELOG;
quit

Шаг 3 Смените имя базы данных

# проверьте параметр листенера, он должен быть либо пустой, либо соответствовать хосту заданному
# в файле $ORACLE_HOME/network/admin/listener.ora
sqlplus / as sysdba
show parameter local_listener

# остановите и запустите инстанцию до режима монтирования
shutdown immediate;
startup mount;
quit

# проверьте что сервисы базы перешли в состояние READY
lsnrctl status

# смените имя базы, при этом будет сгенерирован новый dbid
nid target=sys as sysdba dbname=<new_name>

# если не выдало ошибок и завершилось строкой, то переходим к следующему шагу
# DBNEWID - Completed succesfully. 

# если возникла такая ошибка, то скорее всего взаимосвязь листенера с базой нарушена или некорректна
# еще раз проверьте конфигурацию листенера и параметры в базе
NID-00135: There are 1 active threads

Шаг 4 Изменение имени базы в файле параметров

# убедитесь, что инстанция остановлена и не осталось ее процессов
ps -ef | grep ora_

# измените имя базы в файле параметров
sqlplus / as sysdba
startup nomount;
alter system set db_name=<new_name> scope=spfile;
shutdown immediate;
quit

Шаг 5 Запуск базы

sqlplus / as sysdba
startup mount;
alter database open resetlogs;

# проверьте
select instance_name,status from v$instance;
select db_unique_name,name,database_role,open_mode from v$database;

Изменение имени инстанции

Имя инстанции не зависит от имени базы и может меняться отдельно

# остановите инстанцию
sqlplus / as sysdba
shutdown immediate;
quit

# измените имя инстанции в oratab
vi /etc/oratab

# перейдите в каталог файлов параметров
cd $ORACLE_HOME/dbs

# сохраните содержимое в отдельный каталог
# переименуюйте файл паролей и бинарный файл параметров, все остальные файлы удалите
mv orapw<old_sid> orapw<new_sid>
mv spfile<old_sid>.ora spfile<new_sid>.ora

# переопределите переменную
export ORACLE_SID=<new_sid>

# создайте текстовый файл параметров из бинарного
sqlplus / as sysdba
create pfile from spfile;

# скорректируйте текстовый файл параметров (pfile)
# удалите динамические параметры
<инстанция>.__<параметр>

# исправьте имя сервиса или удалите этот параметр
*.service_names='...'

# сконвертируйте обратно
create spfile from pfile;

# проверьте определения переменных в профиле пользователя
# если они явно заданы, то внесите соответствующие корректировки
# если переменные определяются автоматически через oraenv, то переопределять переменные не требуется
# завершите сессию пользователя и войдите снова
# проверьте определения всех переменных ORACLE
env | grep ORACLE_

Изменение путей и параметров

*.audit_file_dest='/opt/oracle/admin/<имя_инстанции>/adump'
*.control_files='/u01/oradata/<имя_базы>/control01.ctl','/u02/oradata/<имя_базы>/control02.ctl'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=<имя_базы>XDB)'
*.log_archive_config='DG_CONFIG=(<имя_инстанции>)'
*.log_archive_dest_1='location=/exp/<имя_инстанции>/LOG db_unique_name=<имя_инстанции> valid_for=(all_logfiles,all_roles)'

Изменение пути к каталогу дампов

-- текущий путь
select * from dba_directories where directory_name='DATA_PUMP_DIR';

-- изменение пути
CREATE OR REPLACE DIRECTORY "DATA_PUMP_DIR" as '/new/path/';

Изменение путей к файлам логов, данных, временных

-- остановите базу
-- переместите файлы по новым путям
-- скорректируйте текстовый файл параметров, измените пути к контрольным файлам
-- пересоздайте spfile из pfile
sqlplus / as sysdba
create spfile from pfile;

-- смонтируйте контрольные файлы
startup mount;

-- сгенерируйте скрипты изменения путей к файлам базы и выполните их (предварительно файлы должны быть перенесены по новым путям)
select 'ALTER DATABASE RENAME FILE '''||member||''' TO '''||replace(member,'/old/path/','/new/path/')||''';' from v$logfile order by group#;
select 'ALTER DATABASE RENAME FILE '''||name||''' TO '''||replace(name,'/old/path/','/new/path/')||''';' from v$datafile order by file#;
select 'ALTER DATABASE RENAME FILE '''||name||''' TO '''||replace(name,'/old/path/','/new/path/')||''';' from v$tempfile order by file#;

-- откройте базу
alter database open;

Чистка

-- в процессе переименования база может создать каталоги инстанций с неверным именем.
-- проверьте каталоги с старыми или временными именами инстанции или db_unique_name
find /opt -name <часть_имени>

# каталоги которые создаются и наполняются автоматически (можно удалять лишнее)
/opt/oracle/diag/rdbms/<имя>
/opt/oracle/cfgtoollogs/dbca/<имя>
/opt/oracle/admin/<имя>
/opt/oracle/audit/<имя>

# естественно вы должны понимать что вы удаляете, чтобы не удалить лишнего


################################################### разобрать
# удаление и зачистка инстанции
old_sid='myoldsid'
rm $ORACLE_HOME/rdbms/audit/${old_sid}_*.*
rm $ORACLE_HOME/rdbms/log/${old_sid}_*.*
rm $ORACLE_HOME/dbs/*${old_sid}*

# проврьте и удалите файлы связанные с удаляемой инстанцией
ls $ORACLE_HOME/dbs/lk*

Зачистка после смены имени хоста
old_hostname='myoldhost'
rm -rf $ORACLE_HOME/log/${old_hostname}
rm -rf $ORACLE_BASE/diag/tnslsnr/${old_hostname}
rm $ORACLE_HOME/install/root_${old_hostname}_*.log
rm -rf $ORACLE_HOME/ccr/hosts/${old_hostname}
###################################################

Ссылки по теме