On the road again

В статье рассказано о причине и методах решения ошибки "ORA-01658: unable to create INITIAL extent for segment in tablespace string".

Причина этой ошибки кроется в том, что не хватает места в tablespace (Failed to find sufficient contiguous space to allocate INITIAL extent for segment being created). Методы решения - увеличить размер дата-файла для тейблспейса до заданного значения или поставить значение autoextending=yes для автоматического изменения размера.

Итак, смотрим какие тейблспейсы есть в БД:

SQL> select * from v$tablespace;

Смотрим сколько места  свободно для каждого тейблспейса по всей БД:

SQL> select * from dba_free_space

Смотрим свободное место для заданного тейблспейса:

SQL> select * from dba_free_space where TABLESPACE_NAME = 'TABLESPACE_NAME';

Смотрим сколько места занято в определенном тейблспейсе:

SQL> select * from DBA_SEGMENTS where TABLESPACE_NAME = 'TABLESPACE_NAME';

Находим дата-файл заданного тейблспейса:

SQL> select file_id,file_name from dba_data_files where tablespace_name='TABLESPACE_NAME';

Изменяем размер дата-файла (по ID):

SQL> alter database datafile 4 autoextend on maxsize unlimited;

Изменяем размер дата-файла до заданного (по пути к файлу):

SQL> alter database datafile 'C:\ORACLE\ORADATA\DB01\ABC01.DBF' autoextend on next 5m maxsize 900m;

Добавляем дата-файл к тейблспейсу:

ALTER TABLESPACE <tablespace_name> ADD DATAFILE <datafile_name7gt; size <size>

 

Другой способ - выставить параметр autoextensible для заданного дата-файла или для всех дата-файлов.

Смотрим описание таблицы dba_data_files:

SQL> desc dba_data_files;
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
FILE_NAME                                          VARCHAR2(513)
FILE_ID                                            NUMBER
TABLESPACE_NAME                                    VARCHAR2(30)
BYTES                                              NUMBER
BLOCKS                                             NUMBER
STATUS                                             VARCHAR2(9)
RELATIVE_FNO                                       NUMBER
AUTOEXTENSIBLE                                     VARCHAR2(3)
MAXBYTES                                           NUMBER
MAXBLOCKS                                          NUMBER
INCREMENT_BY                                       NUMBER
USER_BYTES                                         NUMBER
USER_BLOCKS                                        NUMBER
ONLINE_STATUS                                      VARCHAR2(7)

Нас интересует параметр AUTOEXTENSIBLE.

SQL> select FILE_NAME, AUTOEXTENSIBLE from dba_data_files;

Здесь мы увидим для каких дата-файлов установлен параметр AUTOEXTENSIBLE. Для определенного дата-файла можно изменить значение с NO на YES.

Для того чтобы выставить этот параметр для всех дата-файлов, можно воспользоваться следующим файлом:

declare
cursor cur is
select 'alter database datafile  ''' || file_name || '''  autoextend on' as exe_query
from dba_data_files
where tablespace_name not in ( 'UNDOTBS1',  'SYSTEM', 'SYSAUX', 'USERS', 'TOOLS');
begin
for cur_rec in cur loop
dbms_output.put_line(cur_rec.exe_query);
execute immediate(cur_rec.exe_query);
end loop;
end;

 

Уменьшение размера Data-файла:

ALTER DATABASE DATAFILE '/u02/oracle/rbdb1/stuff01.dbf' RESIZE 100M;

Если при этом возникает ошибка ORA-03297: file contains used data beyond requested RESIZE value, то это говорит о том что уменьшить файл невозможно из-за того что объем данных превышает размер. При этом не стоит забывать о фрагментации!

Add comment