丁保国的博客

收集整理工作生活,点点滴滴

  :: :: 博问 :: 闪存 :: :: :: :: 管理 ::

6.1 Oracle 引入逻辑结构的目的

主要是为了跨平台

 

6.2 Oracle数据库中存储结构之间的关系

l       每个数据库是由一个或多个表空间组成(至少一个)

l       每个表空间基于一个或多个操作系统的数据文件(至少一个)

l       每个表空间中可以存放一个或多个段(segment)。

l       每个段是由一个或多个区段(extent)所组成。

l       每个区段是由一个或多个连续的Oracle数据块所组成。

l       每个Oracle数据块是由一个或多个连续的操作系统数据块所组成。

l       每个操作系统数据文件是由一个或多个区段(extent)所组成

l       每个操作系统数据文件是由一个或多个操作系统数据块所组成

 

6.3

表空间分为系统(system)表空间和非系统(non-system)表空间

6.4 Tablespace 的磁盘空间管理

早的版本磁盘空间管理是由数据字典来管理的。系统要管理一切。

后来推去了本地空间管理,是用位图(bitmap)的方式来管理。

6.5 创建数据字典管理的表空间

SQL> create tablespace jinlian1

  2  datafile 'D:\Disk2\moon\jinlian01.DBF' size 50 M,

  3           'D:\Disk4\moon\jinlian02.DBF' size 50 M

  4  Minimum extent 50K extent management dictionary

  5  default storage (initial 50K next 50K maxextents 100 pctincrease 0);

 

 

 

SQL> select tablespace_name,block_size,extent_management,segment_space_management from dba_tablespaces;

 

TABLESPACE_NAME                BLOCK_SIZE EXTENT_MAN SEGMEN

------------------------------ ---------- ---------- ------

SYSTEM                               8192 LOCAL      MANUAL

UNDOTBS1                             8192 LOCAL      MANUAL

SYSAUX                               8192 LOCAL      AUTO

TEMP                                 8192 LOCAL      MANUAL

USERS                                8192 LOCAL      AUTO

JINLIAN_INDEX                        8192 LOCAL      AUTO

JINLIAN_UNDO                         8192 LOCAL      MANUAL

JINLIAN_TEMP                         8192 LOCAL      MANUAL

PIONEER_DATA                         8192 LOCAL      AUTO

PIONEER_INDX                         8192 LOCAL      AUTO

PIONEER_UNDO                         8192 LOCAL      MANUAL

 

TABLESPACE_NAME                BLOCK_SIZE EXTENT_MAN SEGMEN

------------------------------ ---------- ---------- ------

PIONEER_TEMP                         8192 LOCAL      MANUAL

 

已选择12行。

 

SQL> col file_name for a50

SQL> select file_id,file_name,tablespace_name

  2  from dba_data_files

  3  order by file_id;

 

   FILE_ID FILE_NAME  TABLESPACE_NAME

---------- -------------------------------------------------- ---------------

         1 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF SYSTEM

         2 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DB UNDOTBS1

           F

 

         3 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF SYSAUX

         4 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF  USERS

         5D:\DISK6\ORCL\JINLIAN_INDEX.DBF  JINLIAN_INDEX

         6D:\DISK7\ORCL\JINLIAN_UNDO.DBF  JINLIAN_UNDO

         7D:\DISK2\ORCL\PIONEER_DATA.DBF  PIONEER_DATA

         8D:\DISK4\ORCL\PIONEER_INDX.DBF  PIONEER_INDX

         9D:\DISK6\ORCL\PIONEER_UNDO.DBF   PIONEER_UNDO

 

   FILE_ID FILE_NAME  TABLESPACE_NAME

---------- -------------------------------------------------- ---------------

        10 D:\DISK8\ORCL\JINLIAN2_UNDO.DBF  JINLIAN_UNDO

 

已选择10行。

 

 

 

6.6 创建本地管理的表空间

SQL> create tablespace jinlian_index

  2  datafile 'D:\disk6\moon\jinlian_index.dbf'

  3  size 50M

  4  extent management local

  5  uniform size 1M;

 

6.7 还原表空间

SQL> create undo tablespace jinlian_undo

  2  datafile 'D:\Disk7\moon\jinlian_undo.DBF'

  3  size 20 M;

 

6.8 临时表空间

SQL> create temporary tablespace jinlian_temp

  2  tempfile 'D:\Disk8\moon\jinlian_temp.dbf'

  3  size 10M

  4  extent management local

  5  uniform size 2 M;

 

SQL> select f.file#,t.ts#,f.name,t.name from v$tempfile f,v$tablespace t where f.ts#= t.ts#;

 

NOTE:

l       临时数据文件的状态不能置为只读。

l       不能将临时数据文件重新命名。

l       临时数据文件总是置为NOLOGGING状态。

l       不能使用ALTER DATABASE命令创建临时数据文件。

l       以只读方式运行的数据库需要临时数据文件。

l       介质恢复是不能恢复临时数据文件的。

NOTE: uniform size 设为 SORT_AREA_SIZE(PGA中排序区的大小)参数的整数倍。

 

6.9 默认临时表空间

Oracle中如果没有设置默认临时表空间,他将使用system表空间做为排序区,这将使system表空间碎片化,从而使数据库系统的效率下降。如果在创建一个数据库时没有设定默认临时表空间,Oracle服务器将把system表空间是默认临时表空间的报警信息写入报警文件。

查看当前默认临时表空间:

 

SQL> col property_name for a25

SQL> col property_value for a16

SQL> col description for a38

SQL> select * from database_properties where property_name like 'DEFAULT_TEMP_TABLESPACE%';

 

PROPERTY_NAME             PROPERTY_VALUE   DESCRIPTION

------------------------- ---------------- --------------------------------------

DEFAULT_TEMP_TABLESPACE   TEMP Name of default temporary tablespace

 

SQL> alter database default temporary tablespace jinlian_temp;

 

数据库已更改。

 

SQL> select * from database_properties where property_name like 'DEFAULT_TEMP_TABLESPACE%';

 

PROPERTY_NAME             PROPERTY_VALUE   DESCRIPTION

------------------------- ---------------- --------------------------------------

DEFAULT_TEMP_TABLESPACE   JINLIAN_TEMP  Name of default temporary tablespace

 

 

NOTE:

默认临时表空间不可以设置成脱机。

 

 

6.10 设置表空间为脱机

表空间的维护工作:

l       在数据库处于打开状态下移动数据文件。

l       在数据库打开的状态下恢复一个表空间或一个数据文件

l       执行对表空间的脱机备份(虽然对表空间可以进行联机备份).

l       使数据库的一部分不可以被访问,而其他的部分可以被正常访问

脱机表空间的数据不可以被访问,用户试图访问会收到出错信息。表空间的脱机联机设置会记录到数据字典、控制文件和报警文件中。

以下表空间不可以设置为脱机:

l       系统(System)表空间

l       上面有活动的还原/回滚段的表空间

l       默认临时表空间

 

630

SQL> set line 150

SQL> select tablespace_name,status,contents

  2  from dba_tablespaces

  3  where tablespace_name like 'JIN%';

 

TABLESPACE_NAME                STATUS    CONTENTS

------------------------------ --------- ---------

JINLIAN_INDEX                  ONLINE    PERMANENT

JINLIAN_TEMP                   ONLINE    TEMPORARY

JINLIAN_UNDO                   ONLINE    UNDO

 

SQL> col name for a55

SQL> select file#,name,status

  2  from v$datafile

  3  where file# >= 8;

 

     FILE# NAME                                                    STATUS

---------- ------------------------------------------------------- -------

         8 D:\DISK4\ORCL\PIONEER_INDX.DBF                          ONLINE

         9 D:\DISK6\ORCL\PIONEER_UNDO.DBF                          ONLINE

        10 D:\DISK8\ORCL\JINLIAN2_UNDO.DBF                         ONLINE

 

SQL> alter tablespace jinlian_undo offline;

 

表空间已更改。

 

SQL> select tablespace_name,status,contents

  2  from dba_tablespaces

  3  where tablespace_name like 'JIN%';

 

TABLESPACE_NAME                STATUS    CONTENTS

------------------------------ --------- ---------

JINLIAN_INDEX                  ONLINE    PERMANENT

JINLIAN_TEMP                   ONLINE    TEMPORARY

JINLIAN_UNDO                   OFFLINE   UNDO

SQL> select file#,name,status

  2  from v$datafile

  3  where file# >= 8;

 

     FILE# NAME                                                    STATUS

---------- ------------------------------------------------------- -------

         8 D:\DISK4\ORCL\PIONEER_INDX.DBF                          ONLINE

         9 D:\DISK6\ORCL\PIONEER_UNDO.DBF                          ONLINE

        10 D:\DISK8\ORCL\JINLIAN2_UNDO.DBF                         OFFLINE

 

SQL> alter tablespace jinlian_undo online;

 

表空间已更改。

 

SQL> select tablespace_name,status,contents

  2  from dba_tablespaces

  3  where tablespace_name like 'JIN%';

 

TABLESPACE_NAME                STATUS    CONTENTS

------------------------------ --------- ---------

JINLIAN_INDEX                  ONLINE    PERMANENT

JINLIAN_TEMP                   ONLINE    TEMPORARY

JINLIAN_UNDO                   ONLINE    UNDO

 

SQL> select file#,name,status

  2  from v$datafile

  3  where file# >= 8;

 

     FILE# NAME                                                    STATUS

---------- ------------------------------------------------------- -------

         8 D:\DISK4\ORCL\PIONEER_INDX.DBF                          ONLINE

         9 D:\DISK6\ORCL\PIONEER_UNDO.DBF                          ONLINE

        10 D:\DISK8\ORCL\JINLIAN2_UNDO.DBF                         ONLINE

 

6.11 只读(Read - Only)表空间

 

当表空间的数据不再需要改变的时候,我们应该将表空间设置成只读,因为只读表空间的数据不会发生变化,就不需要重做日志保护,所以操作只读表空间上的数据就不会产生重做操作。只读表空间的数据只需要做一次备份就好了,从而减少了数据库系统的维护工作量。

 

将表空间变成只读状态的时候,一开始处于中间状态,等没有提交的事务完成后,表空间就被置为只读状态。

 

将表空间的状态改为只读时,Oracle会产生检查点。可以删除只读表空间中对象,如表和索引,这是因为删除对象的命令是DDL语句,它们只修改数据字典而不是数据文件。

 

Step 1:

SQL> alter tablespace jinlian read only;

 

Step 2:

SQL> select tablespace_name,status,contents from dba_tablespaces where tablespace_name like 'JIN%';

 

Step 3:

SQL> alter tablespace jinlian read write;

 

 

 

查看报警文件:

没有找到

 

 

6.12 改变表空间的存储

Step 1

SQL> alter tablespace jinlian minimum extent 100K;

 

Step 2

SQL> alter tablespace jinlian default storage (initial 100K next 100K maxextents 200);

 

Step 3:

SQL> select tablespace_name,initial_extent,next_extent,

  2         max_extents,pct_increase,min_extlen

  3  from dba_tablespace

  4  where tablespace_name like 'JIN%';

 

6.13 重置表空间的大小

SQL> col file_name for a40;

SQL> col tablespace_name for a15;

SQL> select file_id,tablespace_name,file_name,autoextensible

  2  from dba_data_files

  3  where file_id >= 8;

 

   FILE_ID TABLESPACE_NAME FILE_NAME                                AUT

---------- --------------- ---------------------------------------- ---

         8 PIONEER_INDX    D:\DISK4\ORCL\PIONEER_INDX.DBF           NO

         9 PIONEER_UNDO    D:\DISK6\ORCL\PIONEER_UNDO.DBF           NO

        10 JINLIAN_UNDO    D:\DISK8\ORCL\JINLIAN2_UNDO.DBF          NO

 

SQL> alter database datafile

  2  'D:\Disk2\orcl\Jinlan_index.DBF' autoextend on

  3  next 1M;

 

 

6.14 手动重置数据文件的大小

 

 

SQL> select file_id,file_name, tablespace_name,

  2         bytes/(1024*1024) MB

  3  from dba_data_files

  4  where tablespace_name like 'JIN%'

  5  order by tablespace_name;

 

   FILE_ID FILE_NAME   TABLESPACE_NAME         MB

---------- ---------------------------------------- --------------- ----------

         5 D:\DISK6\ORCL\JINLIAN_INDEX.DBF   JINLIAN_INDEX           50

        10 D:\DISK8\ORCL\JINLIAN2_UNDO.DBF  JINLIAN_UNDO            25

         6 D:\DISK7\ORCL\JINLIAN_UNDO.DBF   JINLIAN_UNDO            50

SQL> alter database datafile 'D:\Disk2\orcl\Jianlian01.DBF' resize 100M;

 

SQL> alter tablespace jinlian

  2  add datafile 'D:\Disk6\orcl\jinlian03.DBF'

  3  size 80M;

 

6.15 移动数据文件的方法

有时某个磁盘的IO可能过于繁忙,这可能影响到Oracle数据库整体效率,此时就应该将一个或几个数据文件移动到其他的磁盘上以平衡IO。有时某个磁盘可能已经毁损,此时为了能使数据库系统继续运行,也可能要将一个或几个数据文件移动到其他的磁盘上,Oracle一共提供了两条移动数据文件的语句。

第一条移动数据文件语句的格式如下:

ALTER TABLESPACE 表空间名

RENAME DATAFILE ’文件名[,文件名….

TO ‘文件名[,文件名….

这条语句只适用于上面没有活动的还原数据或临时段的非系统表空间中的数据文件。要求在使用这条语句时,表空间一下为脱机状态而目标数据必须存在。因为该语句只修改文件中指向数据文件的指针(地址)。

移动数据文件或重要命名数据文件的步骤如下:

1)使用数据字典获取所需的空间和数据文件的相关信息。

2)将表空间置为脱机。

3)使用操作系统命令移动或复制要移动的数据文件。

4)执行ALTER TABLESPACE RENAME DATAFILE 命令。

5)将表空间置为联机。

6)使用数据字典获取所需的表空间和数据文件的相关信息。

7)如果需要,使用操作系统命令删除无用的数据文件。

第二条移动数据文件语句的格式如下:

ALTER DATABASE [数据库名]

  RENAME FILE ‘文件名[,文件名

  TO ‘文件名[,‘文件名

这条语句适用于系统表空间和不能置为联机的表空间的数据文件。要求在使用这条语句坟,数据训必须运行加载(mount)状态而且目标数据文件必须存在。因为该语句只修改文件中指向数据文件的指针(地址)。

移动数据文件或重新命名数据文件的步骤如下:

1)使用数据字典获取所需的表空间和数据文件的相关信息。

2)关闭数据库系统。

3)使用操作系统命令移动或复制要移动的数据文件。

4)将数据库置罚加载(mount)状态。

5)执行ALTER DATABASE RENAME FILE 命令。

6)打开数据库系统。

7)使用数据字典获取所需的表空间和数据文件的相信信息。

8)如果需要,使用操作系统命令删除无用的数据文件。通过以睥讨论您是否已经掌握了如何移动数据文件的方法?如果不觉得不十分理解,下面再勇冠一个实际的例子来演示一下移动数据文件依法的全过程。

6.16 移动数据文件的应用实例

SQL> col file_name for a55

SQL> set line 150

SQL> select file_id,file_name,tablespace_name

  2  from dba_data_files

  3  where file_name like '%ORADATA%'

  4  order by file_id;

 

   FILE_ID FILE_NAME TABLESPACE_NAME

---------- ------------------------------------------------------- ---------------

         1 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF  SYSTEM

         2 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBFUNDOTBS1

         3 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF SYSAUX

         4 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF  USERS

 

SQL> select tablespace_name,status,contents

  2  from dba_tablespaces

  3  where tablespace_name not like '%JIN%';

 

TABLESPACE_NAME STATUS    CONTENTS

--------------- --------- ---------

SYSTEM          ONLINE    PERMANENT

UNDOTBS1        ONLINE    UNDO

SYSAUX          ONLINE    PERMANENT

TEMP            ONLINE    TEMPORARY

USERS           ONLINE    PERMANENT

PIONEER_DATA    ONLINE    PERMANENT

PIONEER_INDX    ONLINE    PERMANENT

PIONEER_UNDO    ONLINE    UNDO

PIONEER_TEMP    ONLINE    TEMPORARY

 

已选择9行。

 

SQL> alter tablespace users offline;

 

表空间已更改。

 

SQL> alter tablespace indx offline;

SQL> select tablespace_name,status,contents

  2  from dba_tablespaces

  3  where tablespace_name not like '%JIN%';

 

TABLESPACE_NAME STATUS    CONTENTS

--------------- --------- ---------

SYSTEM          ONLINE    PERMANENT

UNDOTBS1        ONLINE    UNDO

SYSAUX          ONLINE    PERMANENT

TEMP            ONLINE    TEMPORARY

USERS           OFFLINE   PERMANENT

PIONEER_DATA    ONLINE    PERMANENT

PIONEER_INDX    ONLINE    PERMANENT

PIONEER_UNDO    ONLINE    UNDO

PIONEER_TEMP    ONLINE    TEMPORARY

 

已选择9行。

 

 

 

 

SQL> host copy C:\oracle\product\10.2.0\oradata\orcl\USERS01.DBF  D:\Disk2\ORADATA

已复制         1 个文件。

 

SQL> alter tablespace users rename

  2  datafile 'C:\oracle\product\10.2.0\oradata\orcl\USERS01.DBF'

  3  to 'D:\Disk2\ORADATA\USERS01.DBF';

 

SQL> alter tablespace users online;

 

表空间已更改。

 

SQL> select tablespace_name,status,contents

  2  from dba_tablespaces

  3  where tablespace_name not like '%JIN%';

 

TABLESPACE_NAME STATUS    CONTENTS

--------------- --------- ---------

SYSTEM          ONLINE    PERMANENT

UNDOTBS1        ONLINE    UNDO

SYSAUX          ONLINE    PERMANENT

TEMP            ONLINE    TEMPORARY

USERS           ONLINE    PERMANENT

PIONEER_DATA    ONLINE    PERMANENT

PIONEER_INDX    ONLINE    PERMANENT

PIONEER_UNDO    ONLINE    UNDO

PIONEER_TEMP    ONLINE    TEMPORARY

 

已选择9行。

 

 

SQL> select file_id,file_name,tablespace_name

  2  from dba_data_files

  3  where file_name like '%ORADATA%'

  4  order by file_id;

 

   FILE_ID FILE_NAME  TABLESPACE_NAME

---------- ------------------------------------------------------- ---------------

         1 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF  SYSTEM

         2 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBFUNDOTBS1

         3 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF SYSAUX

         4 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF USERS

 

 

SQL> connect system/password as sysdba

已连接。

SQL> shutdown immediate

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> startup mount

ORACLE 例程已经启动。

 

Total System Global Area  612368384 bytes

Fixed Size                  1250428 bytes

Variable Size             243272580 bytes

Database Buffers          360710144 bytes

Redo Buffers                7135232 bytes

数据库装载完毕。

 

SQL> host copy C:\oracle\product\10.2.0\oradata\orcl\USERS01.DBF  D:\Disk2\ORADATA

已复制         1 个文件。

 

SQL> alter tablespace users rename

  2  datafile 'C:\oracle\product\10.2.0\oradata\orcl\USERS01.DBF'

  3  to 'D:\Disk2\ORADATA\USERS01.DBF';

 

SQL> alter database open;

 

数据库已更改。

 

SQL> select file_id,file_name,tablespace_name

  2  from dba_data_files

  3  where file_name like '%ORADATA%'

  4  order by file_id;

 

   FILE_ID FILE_NAME  TABLESPACE_NAME

---------- ------------------------------------------------------- ---------------

         1 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF  SYSTEM

         2 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBFUNDOTBS1

         3 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF SYSAUX

         4 C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF USERS

 

6.17 迁移数据字典和本地管理的表空间

SQL> connect system/password as sysdba

SQL> show user;

USER "SYS"

 

SQL> select tablespace_name,status,contents

  2  from dba_tablespaces

  3  where tablespace_name not like '%JIN%';

 

SQL> execute dbms_space_admin.tablespace_migrate_to_local('jinlian');

SQL> select tablespace_name,status,contents

  2  from dba_tablespaces

  3  where tablespace_name not like '%JIN%';

 

SQL> execute dbms_space_admin.tablespace_migrate_from_local('jinlian');

SQL> select tablespace_name,status,contents

  2  from dba_tablespaces

  3  where tablespace_name not like '%JIN%';

 

 

6.18 删除表空间

SQL> select file_id,file_name,tablespace_name

  2  from dba_data_files

  3  where file_id > 5

  4  order by file_id;

 

   FILE_ID FILE_NAME TABLESPACE_NAME

---------- ------------------------------------------------------- ---------------

         6 D:\DISK7\ORCL\JINLIAN_UNDO.DBF  JINLIAN_UNDO

         7 D:\DISK2\ORCL\PIONEER_DATA.DBF  PIONEER_DATA

         8 D:\DISK4\ORCL\PIONEER_INDX.DBF  PIONEER_INDX

         9 D:\DISK6\ORCL\PIONEER_UNDO.DBF  PIONEER_UNDO

        10 D:\DISK8\ORCL\JINLIAN2_UNDO.DBF  JINLIAN_UNDO

 

SQL> drop tablespace jinlian;

只是删除了控制文件中指向数据文件的指针。

SQL> drop tablespace jinlian including contents and datafiles;

包括数据文件都删除掉

SQL> select file_id,file_name,tablespace_name

  2  from dba_data_files

  3  where file_id > 5

  4  order by file_id;

 

   FILE_ID FILE_NAME TABLESPACE_NAME

---------- ------------------------------------------------------- ---------------

         6 D:\DISK7\ORCL\JINLIAN_UNDO.DBF  JINLIAN_UNDO

         7 D:\DISK2\ORCL\PIONEER_DATA.DBF  PIONEER_DATA

         8 D:\DISK4\ORCL\PIONEER_INDX.DBF  PIONEER_INDX

         9 D:\DISK6\ORCL\PIONEER_UNDO.DBF  PIONEER_UNDO

        10 D:\DISK8\ORCL\JINLIAN2_UNDO.DBF  JINLIAN_UNDO

 

 

SQL> select f.file#, t.ts#,f.name "File",t.name "Tablespace"

  2  from v$tempfile f, v$tablespace t

  3  where f.ts# = t.ts#;

 

posted on 2009-08-23 17:04  丁保国  阅读(259)  评论(0编辑  收藏  举报