Этот выпуск завершает серию, посвященную "клонированию" и переносу данных в другую,
скажем, "тестовую" базу. Представлен пример использования переносимых табличных пространств,
которые позволяют перенести из одной базы данных в другую необходимый (самодостаточный) набор
данных без клонирования всей базы в целом. Как обычно, по мотивам ответа
Тома Кайта.
Хочу также поделиться с вами ссылкой на полезный сайт с интересной, авторской информацией
о СУБД Oracle на русском: dsvolk
Переносимые табличные пространства
Том!
Мы изучаем возможность использовать переносимые табличные пространства для перемещения данных
из одной базы в другую. Нашего dba беспокоит целостность данных при использовании этого
метода: что, если переносимые файлы данных не содержат последние зафиксированные данные.
Например, в момент времени 0.0 транзакция была зафиксирована, но грязные блоки
по-прежнему могут находиться в буферном кэше. В момент времени 0.1 выполняется:
alter tablespace имя_пространства read only. Вызывает ли сревер Oracle
при этом принудительный сброс грязных блоков на диск процессом dbwr при
переводе пространства в режим только для чтения? Если нет, то переносимые файлы
данных не будут содержать данных, зафиксированных в момент времени 0.0.
Ответ Тома Кайта
Первод табличного пространства в режим только для чтения ОБЯЗАТЕЛЬНО (подумайте)
приводит к сбросу блоков на диск. После выполнения этой команды файлы доступны только для
чтения. Если не сбросить блоки перед этим, сбросить их уже не получится НИКОГДА.
Режим только для чтения вообще не мог бы работать без этого. Когда это делается
для переноса табличного пространства, бояться вообще нечего.
Комментарий читателя от 27 ноября 2002
Можно ли изменить имя файла данных при переносе? Т.е., у меня есть файл abc.dbf
на исходном сервере. Я хочу, чтобы на целевом сервере этот файл получил имя def.dbf.
Можно ли это сделать? Если да, как?
И еще - предполагается следующий сценарий:
У меня есть таблицы и пакеты в базе данных db1. db2 - новая база данных.
Я хочу перенести в db2 только таблицы из db1. Таблицы большие, гигабайтные
(10 Гбайт). Экспорт занимает много времени. Таблицы содержат большие объекты, а эти объекты
(и соответствующие индексы) находятся в жругом табличном пространстве (lob_tablepace),
а не в пространстве данных (data_tablespace) или индексов (index_tablespace).
В том же пространстве data_tablespace находятся данные и других таблиц. Есть и другие
табличные пространства с данными и индексами (data_tablespace2,
index_tablespace2), в которых находится много таблиц. Мне также надо
изменить имя файлов данных в базе db2 (в соответствии с корпоративными стандартами).
Переносятся ли пакеты из db1 при переносе табличного пространства? (Я бы не хотел
этого делать... Мне нужны только таблицы и хранящиеся в них данные.)
Можно ли использовать для решения этой задачи переносимые табличные пространства? Как?
Ответ Тома Кайта
Переносится только содержимое табличного пространства (и, при желании, триггеры и
ограничения). Причем, переносится ВСЕ табличное пространство в целом, ВСЕ ПОЛНОСТЬЮ.
Следующий пример показывает переименование файлов по ходу дела -- файлы не
обязательно должны иметь те же имена:
ops$ora920@ORA920.US.ORACLE.COM> create tablespace tts_test
2 datafile '/tmp/tts_test1.dbf' size 2m reuse autoextend off
3 uniform size 256k
4 /
Tablespace created.
ops$ora920@ORA920.US.ORACLE.COM> alter tablespace tts_test
2 add datafile '/tmp/tts_test2.dbf' size 2m reuse autoextend off
3 /
Tablespace altered.
ops$ora920@ORA920.US.ORACLE.COM> create table t tablespace tts_test
2 as
3 select * from all_objects;
Table created.
ops$ora920@ORA920.US.ORACLE.COM> select count(*) from t;
COUNT(*)
----------
29364
ops$ora920@ORA920.US.ORACLE.COM> exec show_space('T')
Old fashioned
Free Blocks.............................0
Total Blocks............................448
Total Bytes.............................3670016
Total MBytes............................3
Unused Blocks...........................47
Unused Bytes............................385024
Last Used Ext FileId....................12
Last Used Ext BlockId...................201
Last Used Block.........................17
PL/SQL procedure successfully completed.
ops$ora920@ORA920.US.ORACLE.COM> alter tablespace tts_test READ ONLY;
Tablespace altered.
ops$ora920@ORA920.US.ORACLE.COM> host exp transport_tablespace=y tablespaces=tts_test
Export: Release 9.2.0.1.0 - Production on Wed Nov 27 13:00:05 2002
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Username: / as sysdba
Connected to: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
Export done in WE8ISO8859P1 character set and AL16UTF16 NCHAR character set
Note: table data (rows) will not be exported
About to export transportable tablespace metadata...
For tablespace TTS_TEST ...
. exporting cluster definitions
. exporting table definitions
. . exporting table T
. exporting referential integrity constraints
. exporting triggers
. end transportable tablespace metadata export
Export terminated successfully without warnings.
ops$ora920@ORA920.US.ORACLE.COM> drop tablespace tts_test including contents;
Tablespace dropped.
ops$ora920@ORA920.US.ORACLE.COM> select count(*) from t;
select count(*) from t
*
ERROR at line 1:
ORA-00942: table or view does not exist
ops$ora920@ORA920.US.ORACLE.COM> exec show_space( 'T' )
BEGIN show_space( 'T' ); END;
*
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-06512: at "SYS.DBMS_SPACE", line 59
ORA-06512: at "SYS.SHOW_SPACE", line 44
ORA-06512: at line 1
ops$ora920@ORA920.US.ORACLE.COM> host mv /tmp/tts_test1.dbf /tmp/better_name1.dbf ops$ora920@ORA920.US.ORACLE.COM> host mv /tmp/tts_test2.dbf /tmp/better_name2.dbf
ops$ora920@ORA920.US.ORACLE.COM> host imp transport_tablespace=y
'datafiles=(/tmp/better_name1.dbf,/tmp/better_name2.dbf)'
Import: Release 9.2.0.1.0 - Production on Wed Nov 27 13:00:33 2002
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Username: / as sysdba
Connected to: Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production
Export file created by EXPORT:V09.02.00 via conventional path
About to import transportable tablespace(s) metadata...
import done in WE8ISO8859P1 character set and AL16UTF16 NCHAR character set
. importing SYS's objects into SYS
. importing OPS$ORA920's objects into OPS$ORA920
. . importing table "T"
Import terminated successfully without warnings.
ops$ora920@ORA920.US.ORACLE.COM> select count(*) from t;
COUNT(*)
----------
29364
ops$ora920@ORA920.US.ORACLE.COM> exec show_space( 'T' )
BEGIN show_space( 'T' ); END;
*
ERROR at line 1:
ORA-00372: file 11 cannot be modified at this time
ORA-01110: data file 11: '/tmp/better_name2.dbf' <<== показывает новое имя
ORA-06512: at "SYS.DBMS_SPACE", line 74
ORA-06512: at "SYS.SHOW_SPACE", line 34
ORA-06512: at line 1
ops$ora920@ORA920.US.ORACLE.COM> alter tablespace tts_test read write;
Tablespace altered. ops$ora920@ORA920.US.ORACLE.COM> exec show_space( 'T' )
Old fashioned
Free Blocks.............................0
Total Blocks............................448
Total Bytes.............................3670016
Total MBytes............................3
Unused Blocks...........................47
Unused Bytes............................385024
Last Used Ext FileId....................11
Last Used Ext BlockId...................201
Last Used Block.........................17
PL/SQL procedure successfully completed.
ops$ora920@ORA920.US.ORACLE.COM>
Перенос табличных пространств с одной версии сервера на другую
В нашем проекте консолидации сервера надо перенести исходные (управляемые по словарю)
табличные пространства с системы 8.1.6 на целевую систему версии 8.1.7.4. Можно
ли использовать перенос табличных пространств, если версии Oracle не совпадают?
Надо ли сначала обновить исходную систему до версии 8.1.7.4? Если я хочу, чтобы
в целевой системе табличные пространства управлялись локально, надо ли переносить
исходные табличные пространства как управляемые по словарю, а затем преобразовывать их
в локально управляемые?
Ответ Тома Кайта
Надо проверить, но если не возникнет "непредвиденных проблем", это должно сработать.
Мне не нравится идея преобразования табличного пространства, управляемого по
словарю, в упрапвляемое локально - это не решает исходную проблему.
Я бы создал пустые локально управляемые табличные пространства, а затем:
alter table move в локально управляемое табличное пространство;
alter index rebuild в локально управляемое табличное пространство;
удалил бы пустые табличные пространства, управляемые по словарю.
Оригинал обсуждения этого вопроса можно найти
здесь.
Скорее всего, обсуждение параметра sort_area_size или перевод одной из статей Джонатана Льюиса с сайта DBAZine. Следите за новостями на
сайте проекта Open Oracle.