Oracle DB: Изменение имени базы и dbid
Изменение имени базы
При смене имени базы генерируется новый 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} ###################################################