ReSize System

ZVV
Дата: 06.11.2008 11:27:48
Всем привет!

Имеется такая примерно ситуация:


Windows 2003
Oracle9i Enterprise Edition Release 9.2.0.8.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.8.0 - Production

SQL*Plus: Release 9.2.0.8.0 - Production on Thu Nov 6 10:09:39 2008

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

SQL> connect / as sysdba
Connected.
SQL> Column owner format a10
SQL> Column segment_name format a15
SQL> Column segment_type format a15
SQL>
SQL> Select *
2 From ( Select Owner, Segment_name, Segment_type, File_id, Block_id
3 From Dba_extents A
4 Where Tablespace_name = 'SYSTEM'
5 Order By Block_id Desc )
6 Where rownum <= 10
7 /

OWNER SEGMENT_NAME SEGMENT_TYPE FILE_ID BLOCK_ID
---------- --------------- --------------- ---------- ----------
SYS C_OBJ#_INTCOL# CLUSTER 1 1525001
SYS I_H_OBJ#_COL# INDEX 1 1524873
SYS C_OBJ#_INTCOL# CLUSTER 1 1523849
SYS I_H_OBJ#_COL# INDEX 1 1523721
SYS C_TS# CLUSTER 1 246025
SYS PLAN_TABLE TABLE 1 245761
SYS C_OBJ#_INTCOL# CLUSTER 1 162697
SYS C_OBJ#_INTCOL# CLUSTER 1 161673
SYS I_FILE#_BLOCK# INDEX 1 159241
SYS I_ACCESS1 INDEX 1 157953

10 rows selected.

SQL> Select Tablespace_name, File_id, Bytes, Blocks
2 From Dba_data_files
3 Where Tablespace_name = 'SYSTEM'
4 /

TABLESPACE_NAME FILE_ID BYTES BLOCKS
------------------------------ ---------- ---------- ----------
SYSTEM 1 1,3191E+10 1610240

SQL> Alter Database
2 Datafile 'D:\ORACLE DBS\ORADATA\AXDB\SYSTEM01.DBF' Resize
3 12000000 K
4 /
Alter Database
*
ERROR at line 1:
ORA-03297: file contains used data beyond requested RESIZE value


SQL> Alter Index I_h_obj#_col# Rebuild
2 /
Alter Index I_h_obj#_col# Rebuild
*
ERROR at line 1:
ORA-00701: object necessary for warmstarting database cannot be altered

Причины, думаю, понятны. :) По ошибке не был установлен таблеспэйс по умолчанию у пользователя и он отожрал больше 10Г из система, прежде чем это было замечено.
Теперь объекты пользователя из СИСТЕМа перенесены, но в описанной ситуации я не могу догнать, можно ли всё-таки как-то уменьшить размер файла SYSTEM?
Как видите, реально в нём занято порядка меньше 2-х ГБ, но файл занимает 12 Гб и уменьшить "в лоб" нельзя из-за индекса I_H_OBJ#_COL# в кластере C_OBJ#_INTCOL#.

Спасибо!
----------------
Zhirenkov Vitaly
pravednik
Дата: 06.11.2008 11:48:14
знаю пару вариантов, как можно менять объекты в систем ТП
Один из них - это стартовать БД в startup migrate моде, тогда вам позволит перестроить ваш индекс
ZVV
Дата: 06.11.2008 11:55:48
pravednik
знаю пару вариантов, как можно менять объекты в систем ТП
Один из них - это стартовать БД в startup migrate моде, тогда вам позволит перестроить ваш индекс


А можно поподробнее про варианты? :)
Включая приведённый, база то рабочая. :)

Типа так?
startup migrate
Alter Index I_h_obj#_col# Rebuild (есть сомнения перенесёт ли он этот индекс в другое место по этой операции? В другой ТС не получится, т.к. он вроде как в кластере)
alter cluster C_OBJ#_INTCOL# deallocate unused
"restart normal"
SergINI
Дата: 06.11.2008 12:10:09
Выполняем запрос.
select file_name, segment_name, segment_type, owner from dba_extents s,
(select max(block_id) maxblock, file_id from dba_extents group by file_id) b, dba_data_files f where
s.block_id = b.maxblock and s.file_id = b.file_id and f.file_id = s.file_id
order by file_name;
Смотрим какой объект в System занимает верхние блоки. Например выдалось, что это таблица
xxx.
Дальше.

alter table SYS.xxx deallocate unused;
alter table SYS.xxx move tablespace SYSTEM;
alter index "Принадлежайший индекс таблице" rebuild;

Дальше Resize. Если не уменьшился, тогда по кругу.
pravednik
Дата: 06.11.2008 12:14:30
ZVV,
SQL> startup
ORACLE instance started.

Total System Global Area  209715200 bytes
Fixed Size                  1286604 bytes
Variable Size             117444148 bytes
Database Buffers           88080384 bytes
Redo Buffers                2904064 bytes
Database mounted.
Database opened.
SQL> alter index I_H_OBJ#_COL# rebuild;
alter index I_H_OBJ#_COL# rebuild
*
ERROR at line 1:
ORA-00701: object necessary for warmstarting database cannot be altered


Elapsed: 00:00:01.46
SQL> shu immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup migrate
ORACLE instance started.

Total System Global Area  209715200 bytes
Fixed Size                  1286604 bytes
Variable Size             117444148 bytes
Database Buffers           88080384 bytes
Redo Buffers                2904064 bytes
Database mounted.
Database opened.
SQL> alter index I_H_OBJ#_COL# rebuild;

Index altered.

Elapsed: 00:00:00.76
SQL> shu immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area  209715200 bytes
Fixed Size                  1286604 bytes
Variable Size             117444148 bytes
Database Buffers           88080384 bytes
Redo Buffers                2904064 bytes
Database mounted.
Database opened.
SQL>
втрой вариант, это через эвент
alter system set event='38003 trace name context forever, level 10' scope=spfile;
после чего startup force;
но первый вариант мне нравиться больше
ZVV
Дата: 06.11.2008 12:20:22
2 SergINI
Читайте исходное сообщение.

2 pravednik
ОК, спасибо большое! Попробую когда будет возможность остановить базу.
Правда по-преждему терзают сомнения, перенесутся ли эти экстэнты так вот просто в кластере? :(

----------------
Zhirenkov Vitaly
pravednik
Дата: 06.11.2008 12:23:26
ZVV
2 SergINI
Читайте исходное сообщение.

2 pravednik
ОК, спасибо большое! Попробую когда будет возможность остановить базу.
Правда по-преждему терзают сомнения, перенесутся ли эти экстэнты так вот просто в кластере? :(

----------------
Zhirenkov Vitaly

))) - гугл, веселая вешчь китайси ораклисты
SergINI
Дата: 06.11.2008 12:28:38
ZVV
2 SergINI
Читайте исходное сообщение.


Извиняюсь. Действительно не дочитал.
ZVV
Дата: 27.11.2008 13:23:00
pravednik,

Привет ещё раз.
Вообщем появилась, наконец, у меня возможность всё это провернуть. Случилось то, чего я больше всего и боялся: я не смог "перекинуть" кластер. :(

Т.е. сделал всё как вы рассказывали, и по ссылке описано
shu immediate
startup migrate
alter index I_H_OBJ#_COL# rebuild;
с этим проблем не возникло.
НО, в этих примерах нет кластера. :(

Теперь имеется ситуация:
OWNER      SEGMENT_NAME    SEGMENT_TYPE       FILE_ID   BLOCK_ID
---------- --------------- --------------- ---------- ----------
SYS        C_OBJ#_INTCOL#  CLUSTER                  1    1525001
SYS        C_OBJ#_INTCOL#  CLUSTER                  1    1523849
SYS        C_TS#           CLUSTER                  1     246025
SYS        PLAN_TABLE      TABLE                    1     245761
SYS        C_OBJ#_INTCOL#  CLUSTER                  1     162697
SYS        C_OBJ#_INTCOL#  CLUSTER                  1     161673
SYS        I_FILE#_BLOCK#  INDEX                    1     159241
SYS        I_ACCESS1       INDEX                    1     157953
SYS        DEPENDENCY$     TABLE                    1      94609
SYS        I_OBJ#          INDEX                    1      93193


Я, оказалось, совсем не в курсе как можно перестроить кластер (ну кроме пересоздать, но я решил пока так радикально не поступать). :(

В кластере C_OBJ#_INTCOL#, насколько я понимаю есть только одна таблица, HISTGRM$.
Я даже её на время очистил, и попытался с ней поработать, но безрезультатно:
alter table HISTGRM$ deallocate unused;
ORA-01771: illegal option for a clustered table
alter table HISTGRM$ move tablespace system;
ORA-14512: cannot perform operation on a clustered object

alter cluster C_OBJ#_INTCOL# deallocate unused;
результата никакого не даёт, что, наверняка, и правильно.
А никаких МУВов и РЕБИЛДов у кластера нет....

Наверняка же должен быть какой-то способ, о котором я не знаю.
Не подскажете?

Спасибо!
sqlplus
Дата: 27.11.2008 14:13:41
Остаётся только надеется что бэкап базы у тебя есть.