Как осуществить перенос файлов данных БД ORACLE на другой диск?

dbstalker, 07 мая

Такую задачу достаточно часто приходиться решать. Поэтому неплохо иметь для этого готовый регламент робот. Коротко это выглядит так:

Обычно я поступаю следующим образом:
  1. Сначала нужно знать какие файлы данных есть в нашей базе данных. Для этого выполним:
    select name from v$datafile;
    Таким образом, перечень готов, к тому же теперь знаем где файлы находятся.
  2. Теперь приготовим скрипт для переименования файлов данных. Предполагаем, что нужно перенести с диска С: на диск K:. Выполнив вот такой запрос, получим скрипт на переименование файлов данных.
    Select 'alter database rename file '''||name||''' to ''K'||substr(name,2)||''';' from v$datafile;
    
    Результат таков:
    alter database rename file 'C:\ORACLE\ORADATA\STB\SYSTEM01.DBF' to 'K:\ORACLE\ORADATA\STB\SYSTEM01.DBF;
    alter database rename file 'C:\ORACLE\ORADATA\STB\UNDOTBS01.DBF' to 'K:\ORACLE\ORADATA\STB\UNDOTBS01.DBF;
    alter database rename file 'C:\ORACLE\ORADATA\STB\DRSYS01.DBF' to 'K:\ORACLE\ORADATA\STB\DRSYS01.DBF;
    alter database rename file 'C:\ORACLE\ORADATA\STB\INDX01.DBF' to 'K:\ORACLE\ORADATA\STB\INDX01.DBF;
    alter database rename file 'C:\ORACLE\ORADATA\STB\TOOLS01.DBF' to 'K:\ORACLE\ORADATA\STB\TOOLS01.DBF;
    alter database rename file 'C:\ORACLE\ORADATA\STB\USERS01.DBF' to 'K:\ORACLE\ORADATA\STB\USERS01.DBF;
    alter database rename file 'C:\ORACLE\ORADATA\STB\XDB01.DBF' to 'K:\ORACLE\ORADATA\STB\XDB01.DBF;
    
  3. Если нужно перенести и управляющие файлы на тот же диск, то выполним следующие манипуляции:
    1. выполнив команду create pfile from spfile;, получим init.ora (файл инициализации) нашей базы данных.
    2. В файле инициализации строку
      control_files='c:\oracle\oradata\STB\control01.ctl','c:\oracle\oradata\STB\control02.ctl','c:\oracle\oradata\STB\control03.ctl'
      
      заменить нужно, например, на
      control_files='k:\oracle\oradata\STB\control01.ctl','k:\oracle\oradata\STB\control02.ctl','k:\oracle\oradata\STB\control03.ctl'
      
    3. Если необходимо перенести архивные файлы журнализации и чтобы они формировались в новое месторасположение, то измените еще и параметр LOG_ARCHIVE_DEST_1
  4. Если необходимо перенести файлы журнализации, то командой
  5. Select 'alter database rename file '''||member||''' to ''K'||substr(member,2)||''';' from v$logfile;
    Получим скрипт:
    alter database rename file 'C:\ORACLE\ORADATA\STB\REDO01.LOG' to 'K:\ORACLE\ORADATA\STB\REDO01.LOG;
    alter database rename file 'C:\ORACLE\ORADATA\STB\REDO02.LOG' to 'K:\ORACLE\ORADATA\STB\REDO02.LOG;
    alter database rename file 'C:\ORACLE\ORADATA\STB\REDO03.LOG' to 'K:\ORACLE\ORADATA\STB\REDO03.LOG;
    
  6. Теперь сервер останавливаем shutdown immediate
  7. Останавливаем службу: Control Panel/Services,служба OracleServiceSTB, STOP
  8. Или для этого выполним net stop OracleServiceSTB
  9. Теперь все файлы данных переносим в соответствующую папку на диске K. Контролируем процесс по списку, полученному в пункте 1.
  10. Затем стартуем базу данных
    SQL> STARTUP MOUNT PFILE=C:\oracle\ora92\database\initstb.ora;
    ORACLE instance started.
    Total System Global Area 2392403784 bytes
    Fixed Size                   458568 bytes
    Variable Size            1862270976 bytes
    Database Buffers          528482304 bytes
    Redo Buffers                1191936 bytes
    Database mounted.
    
  11. Затем выполним наш скрипт на переименование файлов данных и файлов журнализации:
    SQL> @c:\1\r.sql;
    Database altered.
    Database altered.
    ……………….
    Database altered.
    SQL> alter database open;
    Database altered.
    
    SQL> create spfile from pfile;
    File created.
    SQL> shutdown immediate
    Database closed.
    Database dismounted.
    ORACLE instance shut down.
    SQL> startup
    ORACLE instance started.
    Total System Global Area 2392403784 bytes
    Fixed Size                   458568 bytes
    Variable Size            1862270976 bytes
    Database Buffers          528482304 bytes
    Redo Buffers                1191936 bytes
    Database mounted.
    Database opened.
    
  12. Все!

ОднаКнопка

7 комментариев

Прокоментировать

Orange
9 октября 2008 г. в 16:08

Спасибо! Нужный материал

Sky
29 апреля 2009 г. в 08:13

после пункта 3.1. необходимо добавить в план команду:
mv spfileSID.ora tmp_spfileSID.ora
ну или, если файл больше не пригодится:
rm spfileSID.ora

Shiko
29 апреля 2009 г. в 15:24

Кстати может кому-то поможет. Выполняеться на источнике, формирует скрипт для переименования файлов данных в контр файлах


spool d:\1\test.sql -- Путь куда сформируется скрипт для изменения контр файлов
set serveroutput on
declare
new_path varchar2 (200) := 'D:\test\bebebe\'; --новое место где лежат датафайлы на приемнике
--new_log2 varchar2 (200):= 'D:\test\bebebe\1111\';
-- новое место где лежать копии редлогов на приемнике ЕСЛИ НАДО РАСКАМЕНТИТЬ разделитель у меня _
--то есть REDO01_01.LOG
begin
for a in (
select 'alter database rename file '''||name||'''
to '||''''||new_path||regexp_substr(name,'[^\]+.DBF')||''''||';'
as be from v$datafile b
--union
select 'alter database rename file '''||member||''' to '||''''||new_path||
regexp_substr(member,'[^\]+.LOG') ||''''||';'
from v$logfile a where not regexp_like(a.MEMBER, '\_\')
union
select 'alter database rename file '''||name ||''' to '||''''||new_path||
regexp_substr(name,'[^\]+.DBF')||''''||';'
from v$tempfile
)
loop
dbms_output.put_line(a.be);
end loop;
/*for b in (select 'alter database rename file '''||member||''' to '||''''||new_log2||
regexp_substr(member,'[^\]+.LOG') ||''''||';'
as bu from v$logfile a
where regexp_like(a.MEMBER, '\_\'))
loop
dbms_output.put_line(b.bu);
end loop;*/
end;
/
spool off

jil2
23 июня 2010 г. в 11:03

спасибо!:)

Steel_Cat
10 августа 2010 г. в 10:27

Хороший материал, но следуя по нему, обнаружил неточность:

select name from v$datafile; - выдает только список файлов данных. Но не учитывает временные tablespace.
TEMP конечно можно потом создать вручную. Но проще его перенести вместе со всеми остальными файлами.

В итоге скрипт генерации списка файлов будет выглядеть так:
-- получаем имена файлов данных
select name from v$datafile;
-- получаем имена файлов временных табличных пространств
select name from v$tempfile;
-- получаем имена файлов журналов наката
select member from v$logfile;

В остальном все на 5 баллов - четко, грамотно, по пунктам. Ничего лишнего, все работает. Отличный пост !

dbstalker
10 августа 2010 г. в 12:40

я предпочитаю заново создать временное табличное пространство. Так обычно быстрее.

Steel_Cat
10 августа 2010 г. в 16:06

Не спорю. Кому как удобнее...

 

Новый комментарий

Я не спамер: введите суму 5+0



 

От авторов блога

О Блоге - прочитай перед началом.

Задать вопрос и получить ответ - уже решено 94 вопросов

Глоссарий - список терминов и сокращений


 
 

Бизнес форум

Последние темы:

Телепрограмма
23 июня, 1 ответа
Турция
23 июня, 4 ответа
Выбор люстры
22 июня, 1 ответа