В статье рассказано о причине и методах решения ошибки "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, то это говорит о том что уменьшить файл невозможно из-за того что объем данных превышает размер. При этом не стоит забывать о фрагментации!