Шаг 122 - Табличные пространства на практике

Теории было много, но теория не подкрепленная практикой сама по себе бесполезна! Попробуем создать свое табличное пространство и поэкспериментируем с ним. Начнем с простого (помните команду CREATE TABLESPACE?) Запускайте SQL*Plus и вперед:

CREATE TABLESPACE TBLSPCMYONE DATAFILE 'C:\ORACLE\ORADATA\PROBA\TEMP\ONE.DAT'
SIZE 100M REUSE AUTOEXTEND ON NEXT 2M MAXSIZE 200M
/

Получаем:

SQL> CREATE TABLESPACE TBLSPCMYONE DATAFILE 'C:\ORACLE\ORADATA\PROBA\TEMP\ONE.DAT'
  2  SIZE 100M REUSE AUTOEXTEND ON NEXT 2M MAXSIZE 200M
  3  /

Раздел создан.

Мы с вами создали наше первое табличное пространство! Давайте посмотрим как это отразилось на самой системе. Сначала можете посмотреть содержимое каталога C:\ORACLE\ORADATA\PROBA\TEMP - и соответственно видим:

Volume in drive С has no label.
Volume Serial Number is 24FF-83ED

Directory of С:\Oracle\ORADATA\PROBA\TEMP

20.04.2004  20:40    <DIR>          .
20.04.2004  20:40    <DIR>          ..
20.04.2004  20:40                 0 my.txt
20.04.2004  20:35       104 865 792 ONE.DAT
               2 File(s)    104 865 792 bytes
               2 Dir(s)  41 545 981 952 bytes free

Эти данные чисто гипотетические у вас может быть другое! У меня данные с моего рабочего сервера Win2003 и Oracle 9.0.1.0, так что принимайте как есть! Главное видно, что файл появился и звать его ONE.DAT! Такое расширение я дал не случайно для того, чтобы не путать с основными файлами системы. У них расширение как это не смешно DBF. И каталог, я сделал загодя отдельный для того, чтобы не вносить сумятицу рабочий каталог сервера. Теперь давайте сделаем еще одно табличное пространство с другим именем и другими опциями создания:

CREATE TABLESPACE TBLSPCMYTWO LOGGING DATAFILE 'C:\ORACLE\ORADATA\PROBA\TEMP\TWO.DBF' SIZE 50M 
REUSE AUTOEXTEND ON NEXT  1024K MAXSIZE  250M EXTENT MANAGEMENT LOCAL SEGMENT SPACE 
MANAGEMENT  AUTO
/

Получаем:

SQL> CREATE TABLESPACE TBLSPCMYTWO LOGGING DATAFILE 'C:\ORACLE\ORADATA\PROBA\TEMP\TWO.DBF' SIZE 50M
  2  REUSE AUTOEXTEND ON NEXT  1024K MAXSIZE  250M EXTENT MANAGEMENT LOCAL SEGMENT SPACE
  3  MANAGEMENT  AUTO
  4  /

Раздел создан.

А теперь в каталоге уже два файла:

Volume in drive С has no label.
Volume Serial Number is 24FF-83ED

Directory of С:\Oracle\ORADATA\PROBA\TEMP

20.04.2004  20:40    <DIR>          .
20.04.2004  20:40    <DIR>          ..
20.04.2004  20:40                 0 my.txt
20.04.2004  20:35       104 865 792 ONE.DAT
20.04.2004  20:29        52 436 992 TWO.DBF
               3 File(s)    157 302 784 bytes
               2 Dir(s)  41 545 981 952 bytes free

Для полноты картины посмотрим системное представление dba_data_files. Описание его полей можно получить дав такую команду:

DESC dba_data_files

Получаем:

SQL> DESC dba_data_files
Name            Type          Nullable Default Comments                                            
--------------- ------------- -------- ------- --------------------------------------------------- 
FILE_NAME       VARCHAR2(513) Y                Name of the database data file                      
FILE_ID         NUMBER        Y                ID of the database data file                        
TABLESPACE_NAME VARCHAR2(30)  Y                Name of the tablespace to which the file belongs    
BYTES           NUMBER        Y                Size of the file in bytes                           
BLOCKS          NUMBER        Y                Size of the file in ORACLE blocks                   
STATUS          VARCHAR2(9)   Y                File status:  "INVALID" or "AVAILABLE"              
RELATIVE_FNO    NUMBER        Y                Tablespace-relative file number                     
AUTOEXTENSIBLE  VARCHAR2(3)   Y                Autoextensible indicator:  "YES" or "NO"            
MAXBYTES        NUMBER        Y                Maximum size of the file in bytes                   
MAXBLOCKS       NUMBER        Y                Maximum size of the file in ORACLE blocks           
INCREMENT_BY    NUMBER        Y                Default increment for autoextension                 
USER_BYTES      NUMBER        Y                Size of the useful portion of file in bytes         
USER_BLOCKS     NUMBER        Y                Size of the useful portion of file in ORACLE blocks 

Теперь дадим вот такой запрос к этому представлению:

SELECT tablespace_name, file_name, status, bytes
FROM dba_data_files
WHERE tablespace_name LIKE 'TBLSP%'
ORDER BY tablespace_name, file_name
/

Получаем:

SQL> SELECT tablespace_name, file_name, status, bytes
  2  FROM dba_data_files
  3  WHERE tablespace_name LIKE 'TBLSP%'
  4  ORDER BY tablespace_name, file_name
  5  /

TABLESPACE_NAME   FILE_NAME                              STATUS     BYTES
----------------- -------------------------------------- ---------- -----------
TBLSPCMYONE       C:\ORACLE\ORADATA\PROBA\TEMP\ONE.DAT   AVAILABLE  104857600
TBLSPCMYTWO       C:\ORACLE\ORADATA\PROBA\TEMP\TWO.DBF   AVAILABLE  52428800

Все верно! У нас есть два табличных пространства, которые мы только что создали! Кстати я провожу все эти действия в схеме SYS и поэтому будьте внимательнее при удалении объектов! Или можете дать системные привилегии на создание и удаление табличных пространств MILLER-у, но какое из зол меньшее выбирать вам! :-) Теперь давайте переведем одно из табличных пространств в OFFLINE:

ALTER TABLESPACE TBLSPCMYONE OFFLINE
/

Получаем:

SQL> ALTER TABLESPACE TBLSPCMYONE OFFLINE
  2  /

Раздел изменен.

Попробуем дать предыдущий запрос снова:

SELECT tablespace_name, file_name, status, bytes
FROM dba_data_files
WHERE tablespace_name LIKE 'TBLSP%'
ORDER BY tablespace_name, file_name
/

Получаем:

SQL> SELECT tablespace_name, file_name, status, bytes
  2  FROM dba_data_files
  3  WHERE tablespace_name LIKE 'TBLSP%'
  4  ORDER BY tablespace_name, file_name
  5  /

TABLESPACE_NAME   FILE_NAME                              STATUS     BYTES
----------------- -------------------------------------- ---------- -----------
TBLSPCMYONE       C:\ORACLE\ORADATA\PROBA\TEMP\ONE.DAT   AVAILABLE  
TBLSPCMYTWO       C:\ORACLE\ORADATA\PROBA\TEMP\TWO.DBF   AVAILABLE  52428800

Видите все вроде верно, но поле BYTES для табличного пространства TBLSPCMYONE пустое! Все верно оно в режиме OFFLINE! Убедимся в этом дав такой запрос к системному представлению DBA_TABLESPACES:

SELECT TABLESPACE_NAME, PCT_INCREASE, STATUS, CONTENTS, LOGGING
FROM DBA_TABLESPACES
WHERE TABLESPACE_NAME LIKE 'TBLSP%'
ORDER BY TABLESPACE_NAME
/

Получаем:

SQL> SELECT TABLESPACE_NAME, PCT_INCREASE, STATUS, CONTENTS, LOGGING
  2  FROM DBA_TABLESPACES
  3  WHERE TABLESPACE_NAME LIKE 'TBLSP%'
  4  ORDER BY TABLESPACE_NAME
  5  /

TABLESPACE_NAME                PCT_INCREASE STATUS    CONTENTS  LOGGING
------------------------------ ------------ --------- --------- ---------
TBLSPCMYONE                                 OFFLINE   PERMANENT LOGGING
TBLSPCMYTWO                                 ONLINE    PERMANENT LOGGING

Вот теперь все понятно, к стати обратите внимания на поля CONTENTS, LOGGING помните предыдущий шаг? :) Вернем пространство TBLSPCMYONE в ONLINE:

ALTER TABLESPACE TBLSPCMYONE ONLINE
/

Получаем:

SQL> ALTER TABLESPACE TBLSPCMYONE ONLINE
  2  /

Раздел изменен.

Теперь дадим такую команду:

ALTER TABLESPACE TBLSPCMYTWO OFFLINE
/

Получаем:

SQL> ALTER TABLESPACE TBLSPCMYTWO OFFLINE
  2  /

Раздел изменен.

Теперь пространство TBLSPCMYTWO в отключке! Попробуем что-либо создать на нем в таком режиме! Например табличку:

SQL> CREATE TABLE TEST
  2  (
  3  TEST VARCHAR2(100)
  4  )
  5  TABLESPACE TBLSPCMYTWO
  6  /
CREATE TABLE TEST
*
ошибка в строке 1:
ORA-01542: раздел 'TBLSPCMYTWO' явл. автономным, в нем нельзя распределять 
память 

Все привет! ORA-01542 настигло нас! Вернем его в нормальное состояние и создадим таблицу:

ALTER TABLESPACE TBLSPCMYTWO ONLINE
/

CREATE TABLE SYS.TEST
(
TEST VARCHAR2(100)
)
TABLESPACE TBLSPCMYTWO
/

Получаем:

SQL> ALTER TABLESPACE TBLSPCMYTWO ONLINE
  2  /

Раздел изменен.

SQL> CREATE TABLE SYS.TEST
  2  (
  3  TEST VARCHAR2(100)
  4  )
  5  TABLESPACE TBLSPCMYTWO
  6  /

Таблица создана.

Прекрасно! А, вот теперь попробуйте удалить пространство из словаря данных БД:

DROP TABLESPACE TBLSPCMYTWO
/

Получаем:

SQL> DROP TABLESPACE TBLSPCMYTWO
  2  /
DROP TABLESPACE TBLSPCMYTWO
*
ошибка в строке 1:
ORA-01549: раздел не пуст, используйте опцию INCLUDING CONTENTS 

Вот теперь нам заявляют с помощью ORA-01549, что раздел не пуст! Можно конечно дать команду типа:

DROP TABLESPACE TBLSPCMYTWO INCLUDING CONTENTS
/

Но, чтобы не раздражать пользователя SYS (все же он DBA!) удалим табличку, а потом файл пространства в каталоге:

DROP TABLE TEST
/

DROP TABLESPACE TBLSPCMYTWO INCLUDING CONTENTS
/

Получаем:

SQL> DROP TABLE TEST
  2  /

Таблица удалена.

SQL> DROP TABLESPACE TBLSPCMYTWO INCLUDING CONTENTS
  2  /

Раздел удален.

Вот и все осталось только стереть файл TWO.DBF в каталоге C:\ORACLE\ORADATA\PROBA\TEMP средствами ОС и на этом все закончится с удалением табличного пространства из чрева вашего сервера БД! Первое пространство можете тоже удалить или оставить! Решайте сами. Пока закрепляйте материал! ;-)


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Летучий Сергей.