Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Вынос старых данных в подключаемые таблеспейсы  [new]
slobodyan_ury
Member

Откуда: Украина, г. Днепропетровск
Сообщений: 190
Вот задумал уменьшить объем старых логов путем разбиения на партиции с вынесением оных на таблеспейсы, подключаемых по мере необходимости. Вроде задача, которая ждет рано или позно любого админа. Тренироваться начал естественно на кошках. Вы сами сможете проверить функциональность на своей 10G БД

$ sqlplus '/ as sysdba' 

--@0.Sql: подготовить дирекорию/пользователя
host mkdir /home/oracle/tbs_cpy
create directory hist as '/home/oracle/tbs_cpy';
create user test identified by test;
grant connect, resource to test;

--@1.Sql: создать исходные тестовые данные
drop table test.t1;
create table test.t1 (no, text, d) as select object_id, object_name, to_date('01.01.2009') from all_objects;
alter table test.t1 add constraint pk_t1_no primary key (no) using index;
update test.t1 set d='01.01.2007' where rownum<1000;

--@2.Sql: переделать в партиции, подготовить TBS к вынесению на CDROM
drop tablespace tbs2007 INCLUDING CONTENTS and datafiles;
create tablespace tbs2007 datafile '/opt/oracle/oradata/test/tbs2007.dbf' size 10m;

exec DBMS_REDEFINITION.CAN_REDEF_TABLE('TEST', 'T1', DBMS_REDEFINITION.CONS_USE_PK)

set pages 0
set serveroutput on
create table test.int_t1
(NO NUMBER(5) NOT NULL ENABLE,
TEXT VARCHAR2(30) NOT NULL ENABLE,
D DATE
)
PARTITION BY RANGE(d)
(PARTITION p2007 VALUES LESS THAN (to_date('01.01.2008')) TABLESPACE tbs2007,
 PARTITION p2009 VALUES LESS THAN (to_date('01.01.2010')) TABLESPACE users
);
exec DBMS_REDEFINITION.START_REDEF_TABLE('test', 't1','int_t1')
var err number
exec DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('test', 't1','int_t1', DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, :err)
print err
exec DBMS_REDEFINITION.SYNC_INTERIM_TABLE('test', 't1', 'int_t1')
exec DBMS_REDEFINITION.FINISH_REDEF_TABLE('test', 't1', 'int_t1')
drop table test.int_t1;
CREATE TABLE TEST.t1_2007
(NO NUMBER(5) NOT NULL ENABLE,
 TEXT VARCHAR2(30) NOT NULL ENABLE,
 D DATE,
 constraint pk_t1_2007_no PRIMARY KEY (NO) using index tablespace tbs2007
) tablespace tbs2007;
exec DBMS_REDEFINITION.START_REDEF_TABLE('test','t1', 't1_2007', part_name    => 'p2007')
exec DBMS_REDEFINITION.SYNC_INTERIM_TABLE('test', 't1', 't1_2007', part_name    => 'p2007')
exec DBMS_REDEFINITION.FINISH_REDEF_TABLE('test', 't1', 't1_2007', part_name    => 'p2007')
alter table test.t1 drop partition p2007;
alter index test. pk_t1_2007_no rebuild tablespace tbs2007 compute statistics;
alter tablespace tbs2007 read only;

--@3.sql вынести TBS на хранение, убить вынесеные данные
host exp \'/ as sysdba\' file=tbs2007.dmp transport_tablespace=y tablespaces=tbs2007
drop tablespace tbs2007 INCLUDING CONTENTS;
host mv /opt/oracle/oradata/test/tbs2007.dbf /home/oracle

--@4.sql внести TBS обратно, прикрутить исторические данные как партицию
host imp \'/ as sysdba\' file=tbs2007.dmp transport_tablespace=y tablespaces=tbs2007 datafiles=/home/oracle/tbs2007_.dbf
alter tablespace tbs2007 read write;
ALTER TABLE "TEST"."T1" SPLIT PARTITION "P2009" AT (TO_DATE('1/1/2008','MM/DD/YYYY')) INTO (PARTITION "P2007" tablespace tbs2007, PARTITION "P2009") UPDATE INDEXES;
alter table test.t1 exchange partition p2007 with table test.t1_2007;

--@5.sql по завершению грохнуть партицию с TBS
alter table test.t1 drop partition p2007;
alter tablespace tbs2007 read only;
drop tablespace tbs2007 INCLUDING CONTENTS;

а теперь повторить этап @4.sql, @5.sql. Рано или позно выскочит

Экспоpт-файл создан EXPORT:V10.02.01 чеpез обычный маpшpут
Готовится импорт переносимых метаданных табличных пространств(а)...
импорт выполнен в кодировке AL32UTF8 и AL16UTF16 кодировке NCHAR
импортирующий сервер использует кодировку CL8ISO8859P5 (возможно перекодирование)
. объекты, принадлежащие SYS, импортируются в SYS
. объекты, принадлежащие SYS, импортируются в SYS
IMP-00017: при выполнении следующей команды ORACLE возвращает ошибку 19721:
 "BEGIN   sys.dbms_plugts.checkDatafile(NULL,1977118885,6,1280,7,6,0,0,579206"
 ",579982,446075,25165826,NULL,NULL,NULL); END;"
IMP-00003: ORACLE выдала ошибку 19721
ORA-19721: Невозможно найти файл данных с абс. файловым номером 6 в таб. пространстве TBS2007
ORA-06512: на  "SYS.DBMS_PLUGTS", line 2065
ORA-06512: на  line 1
IMP-00000: Импорт данных завершился неудачно

если этапы переделать как

--@3_.sql 
host rm /home/oracle/tbs_cpy/*; expdp \'/ as sysdba\' dumpfile=tbs2007.dmp directory=hist transport_tablespaces=tbs2007
drop tablespace tbs2007 INCLUDING CONTENTS;
host mv /opt/oracle/oradata/test/tbs2007.dbf /home/oracle/tbs_cpy

--@4_.sql
host impdp \'/ as sysdba\' dumpfile=tbs2007.dmp directory=hist transport_datafiles='/home/oracle/tbs_cpy/tbs2007.dbf'
alter tablespace tbs2007 read write;
ALTER TABLE "TEST"."T1" SPLIT PARTITION "P2009" AT (TO_DATE('1/1/2008','MM/DD/YYYY')) INTO (PARTITION "P2007" tablespace tbs2007, PARTITION "P2009") UPDATE INDEXES;
alter table test.t1 exchange partition p2007 with table test.t1_2007;

и повторить @4_.sql, @5.sql, то выскочит
Import: Release 10.2.0.1.0 - Production on Вторник, 17 Февраль, 2009 15:59:15

Copyright (c) 2003, 2005, Oracle.  All rights reserved.

Соединен с: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
Главная таблица "SYS"."SYS_IMPORT_TRANSPORTABLE_01" успешно загружена/выгружена
Выполняется запуск "SYS"."SYS_IMPORT_TRANSPORTABLE_01":  '/******** AS SYSDBA' dumpfile=tbs2007.dmp directory=hist transport_datafiles=/home/oracle/tbs_cpy/tbs2007.dbf
Обрабатывается объект типа TRANSPORTABLE_EXPORT/PLUGTS_BLK
ORA-39123: Задание канала данных для транспортных табличных пространств прервано
ORA-19721: Невозможно найти файл данных с абс. файловым номером 6 в таб. пространстве TBS2007

Задание "SYS"."SYS_IMPORT_TRANSPORTABLE_01" остановлено по причине неустранимой ошибки в 15:59:17

Note 438683.1 говорит что это исправлено в 11.1G. Вот такие проделки индуского софтпрома.

С 1,2 этапом вопросов нет. Вопрос в другом: неужели никто не пытался повыносить свои данные на внешние таблеспейсы, чтобы их по мере необходимости прикручивать к БД ?
17 фев 09, 17:32    [6830916]     Ответить | Цитировать Сообщить модератору
 Re: Вынос старых данных в подключаемые таблеспейсы  [new]
expla
Guest
А нафиг "внешние таблеспейсы". Если данные временно не нужны, выводи табличное пространство в offline и переноси куда хочешь. Лишь бы процедуры не требовали оперативного доступа к архивным данным, иначе ещё и систему дорабатывать придётся.
17 фев 09, 17:41    [6830988]     Ответить | Цитировать Сообщить модератору
 Re: Вынос старых данных в подключаемые таблеспейсы  [new]
slobodyan_ury
Member

Откуда: Украина, г. Днепропетровск
Сообщений: 190
expla
А нафиг "внешние таблеспейсы". Если данные временно не нужны, выводи табличное пространство в offline и переноси куда хочешь. Лишь бы процедуры не требовали оперативного доступа к архивным данным, иначе ещё и систему дорабатывать придётся.


во во, вот насчет процедур, нами не писаных и вопрос. Никто их переделывать не собирается. В принципе есть практика ограничения доступа к историческим партициям через FGA, как написано в "An Oracle White Paper March 2005. Implementing ILM using Oracle Database 10g". Но если БД навернется, то данные с датафайлов не выцарапаешь.
17 фев 09, 17:55    [6831098]     Ответить | Цитировать Сообщить модератору
 Re: Вынос старых данных в подключаемые таблеспейсы  [new]
slobodyan_ury
Member

Откуда: Украина, г. Днепропетровск
Сообщений: 190
продолжаем неумолимые опыты:

--@3_1.sql 
DECLARE
  tbs_set DBMS_STREAMS_TABLESPACE_ADM.TABLESPACE_SET;
BEGIN
  tbs_set(1) := 'tbs2007';
  DBMS_STREAMS_TABLESPACE_ADM.CLONE_TABLESPACES(
    tablespace_names            => tbs_set,
    tablespace_directory_object => 'hist',
    file_group_name             => 'test.y2007',
    version_name                => 'v1');
END;
/
drop tablespace tbs2007 INCLUDING CONTENTS and datafiles;

--@4_1.sql
DECLARE
  tbs_set DBMS_STREAMS_TABLESPACE_ADM.TABLESPACE_SET;
BEGIN
  DBMS_STREAMS_TABLESPACE_ADM.ATTACH_TABLESPACES(
    tablespace_names            => tbs_set,
    datafiles_directory_object => 'hist',
    file_group_name             => 'test.y2007',
    version_name                => 'v1');
END;
/
alter tablespace tbs2007 read write;
ALTER TABLE "TEST"."T1" SPLIT PARTITION "P2009" AT (TO_DATE('1/1/2008','MM/DD/YYYY')) INTO (PARTITION "P2007" tablespace tbs2007, PARTITION "P2009") UPDATE INDEXES;
alter table test.t1 exchange partition p2007 with table test.t1_2007;

делаем @1, @2, @3_1, @4_1, @5, @4_1

DECLARE
*
ошибка в строке 1:
ORA-06512: на  "SYS.DBMS_STREAMS_TABLESPACE_ADM", line 3515
ORA-06512: на  line 4

$ cat tbs_cpy/impdat56.alg
....... ....... "SYS"."SYS_IMPORT_TRANSPORTABLE_10" ....... ........./.........
........... ...... "SYS"."SYS_IMPORT_TRANSPORTABLE_10":
.............. ...... .... TRANSPORTABLE_EXPORT/PLUGTS_BLK
ORA-39123: ....... ...... ...... ... ............ ......... ........... ........
ORA-19721: .......... ..... .... ...... . .... ........ ....... 6 . .... ............ TBS2007
....... "SYS"."SYS_IMPORT_TRANSPORTABLE_10" ........... .. ....... ............ ...... . 17:06:53


индуский софтпром не обманешь :)
17 фев 09, 18:29    [6831272]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить