Теории было много, но теория не подкрепленная практикой сама по себе бесполезна! Попробуем создать свое табличное пространство и поэкспериментируем с ним. Начнем с простого (помните команду 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 средствами ОС и на этом все закончится с удалением табличного пространства из чрева вашего сервера БД! Первое пространство можете тоже удалить или оставить! Решайте сами. Пока закрепляйте материал! ;-)