Oracle表空间tablespace区分区
1、表空间:表空间是数据库的逻辑划分,一个表空间只属于一个数据库。每个表空间由一个或多个数据文件组成。
表空间属性:
一个数据库可以包含多个表空间,一个表空间只能属于一个数据库
一个表空间包含多个数据文件,一个数据文件只能属于一个表空间
表这空间可以划分成更细的逻辑存储单元从逻辑的角度来看,一个数据库(database)下面可以分多个表空间(tablespace);一个表空间下面又可以分多个段(segment);一个数据表要占一个段(segment),一个索引也要占一个段(segment )。 一个段(segment)由多个 区间(extent)组成,那么一个区间又由一组连续的数据块(data block)组成。这连续的数据块是在逻辑上是连续的,有可能在物理磁盘上是分散。
那么从物理的角度上看,一个表空间由多个数据文件组成,数据文件是实实在在存在的磁盘上的文件。这些文件是由oracle数据库操作系统的block 组成的。
Segment(段) :段是指占用数据文件空间的通称,或数据库对象使用的空间的集合;段可以有表段、索引段、回滚段、临时段和高速缓存段等。
Extent (区间):分配给对象(如表)的任何连续块叫区间;区间也叫扩展,因为当它用完已经分配的区间后,再有新的记录插入就必须在分配新的区间(即扩展一些块);一旦区间分配给某个对象(表、索引及簇),则该区间就不能再分配给其它的对象.
查看表空间:
SQL> select * from v$tablespace;
表空间的状态属性主要有在线(online),离线(offline),只读(read only)和读写(read write)这四种,其中只读与读写状态属于在线状态的特殊情况,通过设置表空间的状态属性,我们可以对表空间的使用进行管理。
在线
当表空间的状态为online时,才允许访问该表空间中的数据。
如果表空间不是online状态的,可以使用alter tablespace语句将其状态修改为online,语句如下
alter tablespace tablespace_name online;
离线
当表空间的状态为offline时,不允许访问该表空间中的数据。例如向表空间中创建表或者读取表空间的表灯数据操作都将无法进行,这时可以对表空间进行脱机备份,也可以对应用程序进行升级和维护等。
如果表空间不是offline状态的,可以使用alter tablespace语句将其状态修改为offline,其语句如下:
alter tablespace tablespace_name offline parameter;
其中,parameter表示将表空间切换为offline状态时可以使用的参数。主要可以应用如下的几个参数。
normal
temporary
immediate
for recover
只读
当表空间的状态为read only时,虽然可以访问表空间的数据,但范文仅仅仅限于阅读,而不能进行任何的更新和删除操作,目的是为了保证表空间的数据安全。
如果表空间不是read only状态的,可以使用ater tablespace语句将其状态修改为read only,其语句的形式如下:
alter tablespace tablespace_name read only;
不过,将表空间的状态修改为read only之前,需要注意如下的事项:
1.表空间必须处于online状态
2.表空间不能包含任何事务的回退段
3.表空间不能正处于在线的数据库备份期间
读写
当表空间的状态为read write时,可以对表空间进行正常访问,包括对表空间中的数据进行查询,更新和操作。
如果表空间不是read write状态的,可以使用alter tablespace语句将其状态修改为read write,语句形式如下:
alter tablespace tablespace_name read write;
修改表空间的状态为read write,也需要保证表空间处于online状态。
//查看表空间的状态 SQL> select tablespace_name,status from dba_tablespaces;
//修改表空间的状态 SQL> alter tablespace myspace offline
SQL> select tablespace_name,status from dba_tablespaces;
查看每个表空间有哪些数据文件:
SQL> desc dba_data_files;
查看详细数据文件:
SQL> select file_name,tablespace_name from dba_data_files;
1.使表空间脱机
ALTER TABLESPACE game OFFLINE;
如果是意外删除了数据文件,则必须带有RECOVER选项
ALTER TABLESPACE game OFFLINE FOR RECOVER;
2.使表空间联机
ALTER TABLESPACE game ONLINE;
3.使数据文件脱机
ALTER DATABASE DATAFILE 3 OFFLINE;
4.使数据文件联机
ALTER DATABASE DATAFILE 3 ONLINE;
5.使表空间只读
ALTER TABLESPACE game READ ONLY;
6.使表空间可读写
ALTER TABLESPACE game READ WRITE;
五、删除表空间
DROP TABLESPACE data01 INCLUDING CONTENTS AND DATAFILES;
六、扩展表空间
首先查看表空间的名字和所属文件
select tablespace_name, file_id, file_name,
round(bytes/(1024*1024),0) total_space
from dba_data_files
order by tablespace_name;
1.增加数据文件
ALTER TABLESPACE game
ADD DATAFILE '/oracle/oradata/db/GAME02.dbf' SIZE 1000M;
2.手动增加数据文件尺寸
ALTER DATABASE DATAFILE '/oracle/oradata/db/GAME.dbf'
RESIZE 4000M;
3.设定数据文件自动扩展
ALTER DATABASE DATAFILE '/oracle/oradata/db/GAME.dbf
AUTOEXTEND ON NEXT 100M
MAXSIZE 10000M;
设定后查看表空间信息
SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES FREE,
(B.BYTES*100)/A.BYTES "% USED",(C.BYTES*100)/A.BYTES "% FREE"
FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C
WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND A.TABLESPACE_NAME=C.TABLESPACE
表空间中其他逻辑结构的数据存储在这些数据文件中。在Oracle安装完成后,会自动建立多个表空间,
主要有:
(1)System表空间:该表空间用于存放Oracle系统内部表和数据字典的数据,如表名、列名、用户名等。
(2)undo表空间:该表空间是存储撤销信息的表空间。当用户对数据库表进行修改(insert,update,delete)时,
Oracle会自动使用undo表空间来临时存放修改前的数据。当所进行的修改完成并提交后,系统根据需要保留修改前数据的时间长短来释放undo表空间的部分空间。
(3)users表空间:该空间是给用户使用的表空间。
(4)temporary表空间:该表空间是供用户临时使用的,如进行排序、汇总等操作时。
可以使用OEM(Oracle Enterprise Manager)管理表空间,也可以使用命令管理表空间。利用OEM管理表空间是非常简单的,只需要根据系统提示进行操作就可以了。利用create tablespace 命令会创建一个读/写表空间,以后可以利用alter tablespace 语句来使表空间脱机或联机、给它添加数据文件或使它成为只读表空间。也可以利用drop tablespace 语句从数据库中撤销表空间。
2、实例
每一个运行中的数据库都对应着一个Oracle实例。当服务器上的Oracle数据库启动时,Oracle首先会在内存中分配一片区域-称之为System Global Area(SGA),然后启动一个或多个的Oracle进程。
SGA和这些进程合起来就称为一个Oracle的实例。实例中的内存和进程管理器用来高效地访问数据库的数据,同时为单个或多个的用户提供服务。
一个数据库可以由多个实例打开,但任何时刻一个实例只能打开一个数据库。多个实例可以同时运行在同一个机器上,它们彼此访问各自独立的物理数据库。
(1)利用create tablespace命令创建表空间。使用该命令的用户必须具有创建表空间的权限。
语法格式:
Sql代码
create tablespace tablespace_name datafile 'path/fileName' [size integer [K | M]] [reuse]
[autoextend [off | on [next integer [K | M]]] [maxsize [unlimited | integer [K | M]]]]
[minmum extent integer [K | M]]
[default storage storage_clause]
[online | offline]
[logging | nologging]
[extent management [dictionary | local [autoallocate | uniform [size integer [K | M]]]]]
其中,tablespace_name是将要创建的表空间的名称,该名称在数据库中是唯一的,并且命名必须符合命名规则。
path/fileName: 数据文件的存放路径和名称。当使用关键字reuse时表示若该文件存在,则清除该文件再重新建立该文件;如该文件不存在,则建立新文件。
off/on: 禁止或允许自动扩展数据文件。若选则off, 则禁止自动扩展;若选择on,则允许自动扩展数据文件
next:表示当需要更多的磁盘空间时,一次给数据文件分配的磁盘空间,以KB或MB为单位。
maxsize umlimited | integer[K | M]:指定允许分配给数据文件的最大磁盘空间,其中unlimited表示没有限制。
minmum extent:指定最小的长度,默认为操作系统和数据库块。
online:在创建表空间后使该表空间立即可以被授权用户访问,这是默认设置。
offline:则表示不可用
logging/nologging:表示将来的表、索引等是否需要进行日志处理,默认为需要
extent management:指定如何管理表空间的盘区。
dictionary:使用字典表来管理表空间,这是默认设置。
local:指定本地管理表空间
autoallocate:指定表空间由系统管理,用户不能指定盘区尺寸。
uniform:使用size字节的统一盘区来管理表空间。默认的size是1MB。
注意:如果指定了local,就不能指定default storage storage_clause 和temporary。
default storage storage_clause:为在该表空间创建的全部对象指定默认的存储参数。storage_clause的语法格式如下:
Sql代码
storage(
initial integer[K|M]
next integer[K|M]
minextents integer | unlimited
maxextents integer
pctincrease integer
freelists integer
freelist groups integer
optimal [integer[K|M] | null]
)
如:
Sql代码
create tablespace ts_app datafile 'D:\Oracle\oradata\orcl\ts_app.dbf' size 1024M autoextend on next 50M maxsize 2048M;
--将创建一个名为“ts_app”的表空间,初始大小为1024M,允许自动扩充,每次扩充50M,最多扩充到2048M。
创建临时表空间时只需要在tablespace前加上temporary,并且将datafile改为tempfile,如:
Sql代码
create temporary tablespace ts_temp tempfile 'D:\Oracle\oradata\orcl\ts_temp.dbf' size 256M autoextend on next 100M maxsize 2048M;
(2)利用alter tablespace命令管理表空间。
语法格式:
Sql代码
alter tablespace tablespace_name
[add dataFile | tempFile 'path/fileName' [size integer [K | M]]
[reuse]
[autoextend [off | on [next integer [K | M]] maxsize [unlimited | integer [K | M]]]]
[rename dataFile 'path/fileName',...n to 'path/fileName',...n]
[default storage storage_clause]
[online | offline [normal | temporary | immediate]]
[logging | nologging]
[read only | write]
[permanent]
[temporary]
2、分区:在非常大的数据库中,通常可以通过把一个大表的数据分成多个小表来简化数据库的管理,这些小表叫做分区,除了对表分区外,还可以对索引进行分区。分区不仅简化了数据库的管理,还改善了应用性能。在Oracle中,还可以细分分区,创建子分区。
并不是所有的表列都可以进行分区,只有日期型(date)或二进制大对象(blob)等数据类型的表列可以分区。
Oracle有以下几种分区方法:
(1)范围分区:根据列值的范围将行映射到分区。
(2)散列分区:散列分区提供了一种方法,可在指定数量的分区间平均分布数据。这种方法将根据分区关键字的散列值将行映射到分区。
(3)列表分区:列表分区可以显式地控制如何把行映射到分区。
(4)范围-散列分区:首先使用范围方法将数据进行分区,然后在每个分区内,使用散列方法将其分成子分区。
(5)范围-列表分区:首先使用范围方法将数据进行分区,然后在每个分区内,使用列表方法将其分成子分区
Oracle建立表空间和用户
建立表空间和用户的步骤:
用户
建立:create user 用户名 identified by "密码";
授权:grant create session to 用户名;
grant create table to 用户名;
grant create tablespace to 用户名;
grant create view to 用户名;
表空间
建立表空间(一般建N个存数据的表空间和一个索引空间):
create tablespace 表空间名
datafile ' 路径(要先建好路径)\***.dbf ' size *M
tempfile ' 路径\***.dbf ' size *M
autoextend on --自动增长
--还有一些定义大小的命令,看需要
default storage(
initial 100K,
next 100k,
);
例子:创建表空间
create tablespace DEMOSPACE
datafile 'E:/oracle_tablespaces/DEMOSPACE_TBSPACE.dbf'
size 1500M
autoextend on next 5M maxsize 3000M;
删除表空间
drop tablespace DEMOSPACE including contents and datafiles
用户权限
授予用户使用表空间的权限:
alter user 用户名 quota unlimited on 表空间;
或 alter user 用户名 quota *M on 表空间;
完整例子:
--表空间
CREATE TABLESPACE sdt
DATAFILE 'F:\tablespace\demo' size 800M
EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
--索引表空间
CREATE TABLESPACE sdt_Index
DATAFILE 'F:\tablespace\demo' size 512M
EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
--2.建用户
create user demo identified by demo
default tablespace demo;
--3.赋权
grant connect,resource to demo;
grant create any sequence to demo;
grant create any table to demo;
grant delete any table to demo;
grant insert any table to demo;
grant select any table to demo;
grant unlimited tablespace to demo;
grant execute any procedure to demo;
grant update any table to demo;
grant create any view to demo;
--导入导出命令
ip导出方式: exp demo/demo@127.0.0.1:1521/orcl file=f:/f.dmp full=y
exp demo/demo@orcl file=f:/f.dmp full=y
imp demo/demo@orcl file=f:/f.dmp full=y ignore=y
注意点:1.如果在PL/SQL 等工具里打开的话,直接修改下面的代码中[斜体加粗部分]执行
2.确保路径存在,比如【D:\oracle\oradata\Oracle9i\】也就是你要保存文件的路径存在
/*分为四步 */
/*第1步:创建临时表空间 */
create temporary tablespace user_temp
tempfile 'D:\oracle\oradata\Oracle9i\user_temp.dbf'
size 50m
autoextend on
next 50m maxsize 20480m
extent management local;
/*第2步:创建数据表空间 */
create tablespace user_data
logging
datafile 'D:\oracle\oradata\Oracle9i\user_data.dbf'
size 50m
autoextend on
next 50m maxsize 20480m
extent management local;
/*第3步:创建用户并指定表空间 */
create user username identified by password
default tablespace user_data
temporary tablespace user_temp;
/*第4步:给用户授予权限 */
grant connect,resource,dba to username;
2、删除表空间
对于单个user和tablespace 来说, 可以使用如下命令来完成。
步骤一: 删除user
drop user ×× cascade
说明: 删除了user,只是删除了该user下的schema objects,是不会删除相应的tablespace的。
步骤二: 删除tablespace
DROP TABLESPACE tablespace_name INCLUDING CONTENTS AND DATAFILES;
但是,因为是供开发环境来使用的db, 需要清理的user 和 table space 很多。
思路:
Export出DB中所有的user和tablespace, 筛选出系统的和有用的tablespace,把有用的信息load到一张表中去。
然后写例程循环,把不在有用表的tablespace删掉
1. select username,default_tablespace from dba_users;
2.
create table MTUSEFULSPACE
(
ID Number(4) NOT NULL PRIMARY KEY,
USERNAME varchar2(30),
TABLESPACENAME varchar2(60),
OWNERNAME varchar2(30)
);
3.
declare icount number(2);
tempspace varchar2(60);
begin
for curTable in (select username as allusr,default_tablespace as alltblspace from dba_users)
loop
tempspace :=curTable.alltblspace;
dbms_output.put_line(tempspace);
select count(TABLESPACENAME) into icount from MTUSEFULSPACE where TABLESPACENAME = tempspace;
if icount=0 then
DROP TABLESPACE tempspace INCLUDING CONTENTS AND DATAFILES;
end if;
commit;
end loop;
end;
执行后会报如下错误
ORA-06550: 第 10 行, 第 5 列:
PLS-00103: 出现符号 "DROP"在需要下列之一时:
begin case declare exit
for goto if loop mod null pragma raise return select update
while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
好像是被锁了。。
把需要删除的user, tablespace 导出到Excel. 使用CONCATENATE 组出SQL.
贴到SQLdevelop 批量执行
如要找datafile的具体位置,可以使用
select t1.name,t2.name from v$tablespace t1, v$datafile t2 where t1.ts# = t2.ts#;
--删除空的表空间,但是不包含物理文件
drop tablespace tablespace_name;
--删除非空表空间,但是不包含物理文件
drop tablespace tablespace_name including contents;
--删除空表空间,包含物理文件
drop tablespace tablespace_name including datafiles;
--删除非空表空间,包含物理文件
drop tablespace tablespace_name including contents and datafiles;
--如果其他表空间中的表有外键等约束关联到了本表空间中的表的字段,就要加上CASCADE CONSTRAINTS
drop tablespace tablespace_name including contents and datafiles CASCADE CONSTRAINTS;
3修改表空间
Oracle修改表空间大小
使用Oracle10g建立数据库后,向数据库中导入了部分数据,第二天继续向数据库中导入数据表时发生错误:
查了很多资料发现原来是Oracle表空间限制,导致无法继续导入数据的原因。如果在建立数据库时没有设置,
Oracle 默认的表空间大小为400M,当数据库中数据量达到这个值,再向数据库中导入数据就会报错。解决方法是
扩展表空间。可以选择将表容量扩大,比如扩展到5G,或者当表空间不够时每次自动增加一定的容量,如每次自增200M。
下面列出详细过程:
1.通过sql plus 命令登录数据库。
在命令行下输入sqlplus “登录用户名/口令 as 登录类型”就可以登录,系统内建的用户名常用的是sys,密码是在安装oracle过程中设置的密码,清务必牢记,如果用sys帐户登录,登录类型一定要是sysdba。
2.查看各表空间分配情况。
select tablespace_name, sum(bytes) / 1024 / 1024 from dba_data_files
group by tablespace_name;
3.查看各表空间空闲情况。
select tablespace_name, sum(bytes) / 1024 / 1024 from dba_free_space group by tablespace_name;
4.更改数据表大小(10G)
alter database datafile '/ora/oradata/radius/undo.dbf' resize 10240m;
5.设置表空间不足时自动增长
5.1查看表空间是否自动增长
SELECT FILE_NAME,TABLESPACE_NAME,AUTOEXTENSIBLE FROM dba_data_files;
5.2 设置表空间自动增长
ALTER DATABASE DATAFILE 'c:\SmartDB01.ora' AUTOEXTEND ON;//打开自动增长
ALTER DATABASE DATAFILE 'c:\SmartDB01.ora' AUTOEXTEND ON NEXT 200M ;//每次自动增长200m
ALTER DATABASE DATAFILE 'c:\SmartDB01.ora' AUTOEXTEND ON NEXT 200M MAXSIZE 1024M;//每次自动增长200m,数据表最大不超过1G。
产生原因: 需要对用户表空间进行修改
解决方法:
软件在建立帐套时,表空间使用了默认设定,表空间可以自动增加。如果用户为了提升速度进行了优化,关闭了此选项,则在年结前也应该检查一下表空间的使用情况,如果已经使用空间小于剩余空间,也应该进行扩充。
查看表空间使用情况:
SELECT * FROM DBA_FREE_SPACE
举例:
在实际操作中请根据实际数据库路径等信息作适当的调整,切记不可生搬硬套!
另外,请在调整之前,对oracle 作一全备份!
假设表空间名称为GS_ORADB_001,数据文件‘C:\ORADATA\GS_ORADB_001.DBF',
索引表空间名称为GS_ORADB_IDX_001,数据文件‘C:\ORADATA\GS_ORADB_IDX_001.DBF'
ORACLE8i:
首先在DOS命令行方式中执行
C:\>SVRMGRL
SVRMGRL>CONNECT INTERNAL
SVRMGRL>SHUTDOWN
SVRMGRL>STARTUP MOUNT
ORACLE9i:
首先在DOS命令行方式中执行
C:\>SQLPLUS /NOLOG
SQL>CONNECT / AS SYSDBA
SQL >SHUTDOWN
SQL >STARTUP MOUNT
1、增加表空间尺寸
增加一个数据文件:
SQL>ALTER TABLESPACE GS_ORADB_001 ADD DATAFILE ‘C:\ORADATA\GS_ORADB_ADD_001.DBF' SIZE 500M;
2、扩大原有文件大小:
SQL>ALTER DATABASE DATAFILE ‘C:\ORADATA\GS_ORADB_001.DBF' RESIZE 1000M;
3、移动表空间数据文件
假如要求将C:\ORADATA 下GS_ORADB_001.DBF移至D:\ORADATA 下,并把文件名改为GS_ORADB_ALT_001.DBF
步骤:
3.1、将实例处于关闭状态
首先在DOS命令行方式中执行(ORACLE9i)
C:\>SQLPLUS /NOLOG
SQL>CONNECT / AS SYSDBA
SQL >SHUTDOWN
SQL >STARTUP MOUNT
3.2、把数据文件C:\ORADATA 下GS_ORADB_001.DBF移动到D:\ORADATA下,并把文件名改为GS_ORADB_ALT_001.DBF
3.3、再到SQLPLUS 环境中
SQL>ALTER DATABASE RENAME FILE ‘C:\ORADATA\GS_ORADB_001.DBF' TO ‘D:\ORADATA\GS_ORADB_ALT_001.DBFF';
或
SQL>ALTER TABLESPACE GS_ORADB_001 RENAME DATAFILE ‘C:\ORADATA\GS_ORADB_001.DBF' TO ‘D:\ORADATA\GS_ORADB_ALT_001.DBFF';
SQL>ALTER DATABASE OPEN;
4、查看剩余空间
SQL>SELECT TABLESPACE_NAME,SUM(BYTES),MAX(BYTES) FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME;
注意:空闲数据块总和sum(bytes) 够用并不意味每个空闲块都满足分配需要,所以当表空间不够分配扩展块的时候,还要查看最大空闲数据块max(bytes)的大小。
5、合并空闲块
如果表空间上的数据对象经常发生类似drop-create 的变动,加之未采用统一的扩展块尺寸,使那些采用较大扩展块的数据对象不能利用较小的空间碎片,造成空间浪费。可通过将较小的空闲块合并成较大的空闲块的方法,减少空间浪费。
SQL>ALTER TABLESPACE GS_ORADB_001 COALESCE;
6、删除表空间
删除表空间及其包含的所有数据
SQL>DROP TABLESPACE GS_ORADB_001 INCLUDING CONTENTS;
Oracle修改表空间为自动扩展
1.数据文件自动扩展的好处
1)不会出现因为没有剩余空间可以利用到数据无法写入
2)尽量减少人为的维护
3)可以用于重要级别不是很大的数据库中,如测试数据库等
2.数据文件自动扩展的弊端
1)如果任其扩大,在数据量不断变大的过程中会导致某个数据文件异常的大
2)没有人管理的数据库是非常危险的
3.查询当前数据库中表空间
SEC_D是否为自动扩展
sec@orcl> select tablespace_name,file_name,autoextensible from dba_data_files where tablespace_name = 'SEC_D';
4.通过修改SEC_D的数据文件为自动扩展达到表空间SEC_D为自动扩展的目的
sec@orcl> alter database datafile '/u01/app/oracle/oradata/orcl/sec_d01.dbf' autoextend on;
5.确认是否已经修改成功
sec@orcl> select tablespace_name,file_name,autoextensible from dba_data_files where tablespace_name = 'SEC_D';
6.总结修改语句语法
开启自动扩展功能语法:
alter database datafile '对应的数据文件路径信息' autoextend on;
关闭自动扩展功能语法:
alter database datafile '对应的数据文件路径信息' autoextend off
重命名表空间
在需要的情况下,可以对表空间的名称进行修改,其修改不会影响到表空间中数据文件。 但是不能修改系统表空间stsyem和sysaux.的名称
前提条件: 修改表空间的名称时,表空间的状态必须为online.否则无法修改。
alter tablespaces tablespace_name rename to new_tablespace_name;
--1、查看表空间的名称及大小
SELECT t.tablespace_name, round(SUM(bytes / (1024 * 1024)), 0) ts_size
FROM dba_tablespaces t, dba_data_files d
WHERE t.tablespace_name = d.tablespace_name
GROUP BY t.tablespace_name;
--2、查看表空间物理文件的名称及大小
SELECT tablespace_name,
file_id,
file_name,
round(bytes / (1024 * 1024), 0) total_space
FROM dba_data_files
ORDER BY tablespace_name;
--3、查看回滚段名称及大小
SELECT segment_name,
tablespace_name,
r.status,
(initial_extent / 1024) initialextent,
(next_extent / 1024) nextextent,
max_extents,
v.curext curextent
FROM dba_rollback_segs r, v$rollstat v
WHERE r.segment_id = v.usn(+)
ORDER BY segment_name;
--4、查看控制文件
SELECT NAME FROM v$controlfile;
--5、查看日志文件
SELECT MEMBER FROM v$logfile;
--6、查看表空间的使用情况
SELECT SUM(bytes) / (1024 * 1024) AS free_space, tablespace_name
FROM dba_free_space
GROUP BY tablespace_name;
SELECT a.tablespace_name,
a.bytes total,
b.bytes used,
c.bytes free,
(b.bytes * 100) / a.bytes "% USED ",
(c.bytes * 100) / a.bytes "% FREE "
FROM sys.sm$ts_avail a, sys.sm$ts_used b, sys.sm$ts_free c
WHERE a.tablespace_name = b.tablespace_name
AND a.tablespace_name = c.tablespace_name;
--7、查看数据库库对象
SELECT owner, object_type, status, COUNT(*) count#
FROM all_objects
GROUP BY owner, object_type, status;
--8、查看数据库的版本
SELECT version
FROM product_component_version
WHERE substr(product, 1, 6) = 'Oracle';
--9、查看数据库的创建日期和归档方式
SELECT created, log_mode, log_mode FROM v$database;
SQL2:
--1G=1024MB
--1M=1024KB
--1K=1024Bytes
--1M=11048576Bytes
--1G=1024*11048576Bytes=11313741824Bytes
SELECT a.tablespace_name "表空间名",
total "表空间大小",
free "表空间剩余大小",
(total - free) "表空间使用大小",
total / (1024 * 1024 * 1024) "表空间大小(G)",
free / (1024 * 1024 * 1024) "表空间剩余大小(G)",
(total - free) / (1024 * 1024 * 1024) "表空间使用大小(G)",
round((total - free) / total, 4) * 100 "使用率 %"
FROM (SELECT tablespace_name, SUM(bytes) free
FROM dba_free_space
GROUP BY tablespace_name) a,
(SELECT tablespace_name, SUM(bytes) total
FROM dba_data_files
GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name
1、表空间:表空间是数据库的逻辑划分,一个表空间只属于一个数据库。每个表空间由一个或多个数据文件组成。
表空间属性:
一个数据库可以包含多个表空间,一个表空间只能属于一个数据库
一个表空间包含多个数据文件,一个数据文件只能属于一个表空间
表这空间可以划分成更细的逻辑存储单元从逻辑的角度来看,一个数据库(database)下面可以分多个表空间(tablespace);一个表空间下面又可以分多个段(segment);一个数据表要占一个段(segment),一个索引也要占一个段(segment )。 一个段(segment)由多个 区间(extent)组成,那么一个区间又由一组连续的数据块(data block)组成。这连续的数据块是在逻辑上是连续的,有可能在物理磁盘上是分散。
那么从物理的角度上看,一个表空间由多个数据文件组成,数据文件是实实在在存在的磁盘上的文件。这些文件是由oracle数据库操作系统的block 组成的。
Segment(段) :段是指占用数据文件空间的通称,或数据库对象使用的空间的集合;段可以有表段、索引段、回滚段、临时段和高速缓存段等。
Extent (区间):分配给对象(如表)的任何连续块叫区间;区间也叫扩展,因为当它用完已经分配的区间后,再有新的记录插入就必须在分配新的区间(即扩展一些块);一旦区间分配给某个对象(表、索引及簇),则该区间就不能再分配给其它的对象.
查看表空间:
SQL> select * from v$tablespace;
表空间的状态属性主要有在线(online),离线(offline),只读(read only)和读写(read write)这四种,其中只读与读写状态属于在线状态的特殊情况,通过设置表空间的状态属性,我们可以对表空间的使用进行管理。
在线
当表空间的状态为online时,才允许访问该表空间中的数据。
如果表空间不是online状态的,可以使用alter tablespace语句将其状态修改为online,语句如下
alter tablespace tablespace_name online;
离线
当表空间的状态为offline时,不允许访问该表空间中的数据。例如向表空间中创建表或者读取表空间的表灯数据操作都将无法进行,这时可以对表空间进行脱机备份,也可以对应用程序进行升级和维护等。
如果表空间不是offline状态的,可以使用alter tablespace语句将其状态修改为offline,其语句如下:
alter tablespace tablespace_name offline parameter;
其中,parameter表示将表空间切换为offline状态时可以使用的参数。主要可以应用如下的几个参数。
normal
temporary
immediate
for recover
只读
当表空间的状态为read only时,虽然可以访问表空间的数据,但范文仅仅仅限于阅读,而不能进行任何的更新和删除操作,目的是为了保证表空间的数据安全。
如果表空间不是read only状态的,可以使用ater tablespace语句将其状态修改为read only,其语句的形式如下:
alter tablespace tablespace_name read only;
不过,将表空间的状态修改为read only之前,需要注意如下的事项:
1.表空间必须处于online状态
2.表空间不能包含任何事务的回退段
3.表空间不能正处于在线的数据库备份期间
读写
当表空间的状态为read write时,可以对表空间进行正常访问,包括对表空间中的数据进行查询,更新和操作。
如果表空间不是read write状态的,可以使用alter tablespace语句将其状态修改为read write,语句形式如下:
alter tablespace tablespace_name read write;
修改表空间的状态为read write,也需要保证表空间处于online状态。
//查看表空间的状态 SQL> select tablespace_name,status from dba_tablespaces;
//修改表空间的状态 SQL> alter tablespace myspace offline
SQL> select tablespace_name,status from dba_tablespaces;
查看每个表空间有哪些数据文件:
SQL> desc dba_data_files;
查看详细数据文件:
SQL> select file_name,tablespace_name from dba_data_files;
1.使表空间脱机
ALTER TABLESPACE game OFFLINE;
如果是意外删除了数据文件,则必须带有RECOVER选项
ALTER TABLESPACE game OFFLINE FOR RECOVER;
2.使表空间联机
ALTER TABLESPACE game ONLINE;
3.使数据文件脱机
ALTER DATABASE DATAFILE 3 OFFLINE;
4.使数据文件联机
ALTER DATABASE DATAFILE 3 ONLINE;
5.使表空间只读
ALTER TABLESPACE game READ ONLY;
6.使表空间可读写
ALTER TABLESPACE game READ WRITE;
五、删除表空间
DROP TABLESPACE data01 INCLUDING CONTENTS AND DATAFILES;
六、扩展表空间
首先查看表空间的名字和所属文件
select tablespace_name, file_id, file_name,
round(bytes/(1024*1024),0) total_space
from dba_data_files
order by tablespace_name;
1.增加数据文件
ALTER TABLESPACE game
ADD DATAFILE '/oracle/oradata/db/GAME02.dbf' SIZE 1000M;
2.手动增加数据文件尺寸
ALTER DATABASE DATAFILE '/oracle/oradata/db/GAME.dbf'
RESIZE 4000M;
3.设定数据文件自动扩展
ALTER DATABASE DATAFILE '/oracle/oradata/db/GAME.dbf
AUTOEXTEND ON NEXT 100M
MAXSIZE 10000M;
设定后查看表空间信息
SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES FREE,
(B.BYTES*100)/A.BYTES "% USED",(C.BYTES*100)/A.BYTES "% FREE"
FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C
WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND A.TABLESPACE_NAME=C.TABLESPACE
表空间中其他逻辑结构的数据存储在这些数据文件中。在Oracle安装完成后,会自动建立多个表空间,
主要有:
(1)System表空间:该表空间用于存放Oracle系统内部表和数据字典的数据,如表名、列名、用户名等。
(2)undo表空间:该表空间是存储撤销信息的表空间。当用户对数据库表进行修改(insert,update,delete)时,
Oracle会自动使用undo表空间来临时存放修改前的数据。当所进行的修改完成并提交后,系统根据需要保留修改前数据的时间长短来释放undo表空间的部分空间。
(3)users表空间:该空间是给用户使用的表空间。
(4)temporary表空间:该表空间是供用户临时使用的,如进行排序、汇总等操作时。
可以使用OEM(Oracle Enterprise Manager)管理表空间,也可以使用命令管理表空间。利用OEM管理表空间是非常简单的,只需要根据系统提示进行操作就可以了。利用create tablespace 命令会创建一个读/写表空间,以后可以利用alter tablespace 语句来使表空间脱机或联机、给它添加数据文件或使它成为只读表空间。也可以利用drop tablespace 语句从数据库中撤销表空间。
2、实例
每一个运行中的数据库都对应着一个Oracle实例。当服务器上的Oracle数据库启动时,Oracle首先会在内存中分配一片区域-称之为System Global Area(SGA),然后启动一个或多个的Oracle进程。
SGA和这些进程合起来就称为一个Oracle的实例。实例中的内存和进程管理器用来高效地访问数据库的数据,同时为单个或多个的用户提供服务。
一个数据库可以由多个实例打开,但任何时刻一个实例只能打开一个数据库。多个实例可以同时运行在同一个机器上,它们彼此访问各自独立的物理数据库。
(1)利用create tablespace命令创建表空间。使用该命令的用户必须具有创建表空间的权限。
语法格式:
Sql代码
create tablespace tablespace_name datafile 'path/fileName' [size integer [K | M]] [reuse]
[autoextend [off | on [next integer [K | M]]] [maxsize [unlimited | integer [K | M]]]]
[minmum extent integer [K | M]]
[default storage storage_clause]
[online | offline]
[logging | nologging]
[extent management [dictionary | local [autoallocate | uniform [size integer [K | M]]]]]
其中,tablespace_name是将要创建的表空间的名称,该名称在数据库中是唯一的,并且命名必须符合命名规则。
path/fileName: 数据文件的存放路径和名称。当使用关键字reuse时表示若该文件存在,则清除该文件再重新建立该文件;如该文件不存在,则建立新文件。
off/on: 禁止或允许自动扩展数据文件。若选则off, 则禁止自动扩展;若选择on,则允许自动扩展数据文件
next:表示当需要更多的磁盘空间时,一次给数据文件分配的磁盘空间,以KB或MB为单位。
maxsize umlimited | integer[K | M]:指定允许分配给数据文件的最大磁盘空间,其中unlimited表示没有限制。
minmum extent:指定最小的长度,默认为操作系统和数据库块。
online:在创建表空间后使该表空间立即可以被授权用户访问,这是默认设置。
offline:则表示不可用
logging/nologging:表示将来的表、索引等是否需要进行日志处理,默认为需要
extent management:指定如何管理表空间的盘区。
dictionary:使用字典表来管理表空间,这是默认设置。
local:指定本地管理表空间
autoallocate:指定表空间由系统管理,用户不能指定盘区尺寸。
uniform:使用size字节的统一盘区来管理表空间。默认的size是1MB。
注意:如果指定了local,就不能指定default storage storage_clause 和temporary。
default storage storage_clause:为在该表空间创建的全部对象指定默认的存储参数。storage_clause的语法格式如下:
Sql代码
storage(
initial integer[K|M]
next integer[K|M]
minextents integer | unlimited
maxextents integer
pctincrease integer
freelists integer
freelist groups integer
optimal [integer[K|M] | null]
)
如:
Sql代码
create tablespace ts_app datafile 'D:\Oracle\oradata\orcl\ts_app.dbf' size 1024M autoextend on next 50M maxsize 2048M;
--将创建一个名为“ts_app”的表空间,初始大小为1024M,允许自动扩充,每次扩充50M,最多扩充到2048M。
创建临时表空间时只需要在tablespace前加上temporary,并且将datafile改为tempfile,如:
Sql代码
create temporary tablespace ts_temp tempfile 'D:\Oracle\oradata\orcl\ts_temp.dbf' size 256M autoextend on next 100M maxsize 2048M;
(2)利用alter tablespace命令管理表空间。
语法格式:
Sql代码
alter tablespace tablespace_name
[add dataFile | tempFile 'path/fileName' [size integer [K | M]]
[reuse]
[autoextend [off | on [next integer [K | M]] maxsize [unlimited | integer [K | M]]]]
[rename dataFile 'path/fileName',...n to 'path/fileName',...n]
[default storage storage_clause]
[online | offline [normal | temporary | immediate]]
[logging | nologging]
[read only | write]
[permanent]
[temporary]
2、分区:在非常大的数据库中,通常可以通过把一个大表的数据分成多个小表来简化数据库的管理,这些小表叫做分区,除了对表分区外,还可以对索引进行分区。分区不仅简化了数据库的管理,还改善了应用性能。在Oracle中,还可以细分分区,创建子分区。
并不是所有的表列都可以进行分区,只有日期型(date)或二进制大对象(blob)等数据类型的表列可以分区。
Oracle有以下几种分区方法:
(1)范围分区:根据列值的范围将行映射到分区。
(2)散列分区:散列分区提供了一种方法,可在指定数量的分区间平均分布数据。这种方法将根据分区关键字的散列值将行映射到分区。
(3)列表分区:列表分区可以显式地控制如何把行映射到分区。
(4)范围-散列分区:首先使用范围方法将数据进行分区,然后在每个分区内,使用散列方法将其分成子分区。
(5)范围-列表分区:首先使用范围方法将数据进行分区,然后在每个分区内,使用列表方法将其分成子分区
Oracle建立表空间和用户
建立表空间和用户的步骤:
用户
建立:create user 用户名 identified by "密码";
授权:grant create session to 用户名;
grant create table to 用户名;
grant create tablespace to 用户名;
grant create view to 用户名;
表空间
建立表空间(一般建N个存数据的表空间和一个索引空间):
create tablespace 表空间名
datafile ' 路径(要先建好路径)\***.dbf ' size *M
tempfile ' 路径\***.dbf ' size *M
autoextend on --自动增长
--还有一些定义大小的命令,看需要
default storage(
initial 100K,
next 100k,
);
例子:创建表空间
create tablespace DEMOSPACE
datafile 'E:/oracle_tablespaces/DEMOSPACE_TBSPACE.dbf'
size 1500M
autoextend on next 5M maxsize 3000M;
删除表空间
drop tablespace DEMOSPACE including contents and datafiles
用户权限
授予用户使用表空间的权限:
alter user 用户名 quota unlimited on 表空间;
或 alter user 用户名 quota *M on 表空间;
完整例子:
--表空间
CREATE TABLESPACE sdt
DATAFILE 'F:\tablespace\demo' size 800M
EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
--索引表空间
CREATE TABLESPACE sdt_Index
DATAFILE 'F:\tablespace\demo' size 512M
EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO;
--2.建用户
create user demo identified by demo
default tablespace demo;
--3.赋权
grant connect,resource to demo;
grant create any sequence to demo;
grant create any table to demo;
grant delete any table to demo;
grant insert any table to demo;
grant select any table to demo;
grant unlimited tablespace to demo;
grant execute any procedure to demo;
grant update any table to demo;
grant create any view to demo;
--导入导出命令
ip导出方式: exp demo/demo@127.0.0.1:1521/orcl file=f:/f.dmp full=y
exp demo/demo@orcl file=f:/f.dmp full=y
imp demo/demo@orcl file=f:/f.dmp full=y ignore=y
注意点:1.如果在PL/SQL 等工具里打开的话,直接修改下面的代码中[斜体加粗部分]执行
2.确保路径存在,比如【D:\oracle\oradata\Oracle9i\】也就是你要保存文件的路径存在
/*分为四步 */
/*第1步:创建临时表空间 */
create temporary tablespace user_temp
tempfile 'D:\oracle\oradata\Oracle9i\user_temp.dbf'
size 50m
autoextend on
next 50m maxsize 20480m
extent management local;
/*第2步:创建数据表空间 */
create tablespace user_data
logging
datafile 'D:\oracle\oradata\Oracle9i\user_data.dbf'
size 50m
autoextend on
next 50m maxsize 20480m
extent management local;
/*第3步:创建用户并指定表空间 */
create user username identified by password
default tablespace user_data
temporary tablespace user_temp;
/*第4步:给用户授予权限 */
grant connect,resource,dba to username;
2、删除表空间
对于单个user和tablespace 来说, 可以使用如下命令来完成。
步骤一: 删除user
drop user ×× cascade
说明: 删除了user,只是删除了该user下的schema objects,是不会删除相应的tablespace的。
步骤二: 删除tablespace
DROP TABLESPACE tablespace_name INCLUDING CONTENTS AND DATAFILES;
但是,因为是供开发环境来使用的db, 需要清理的user 和 table space 很多。
思路:
Export出DB中所有的user和tablespace, 筛选出系统的和有用的tablespace,把有用的信息load到一张表中去。
然后写例程循环,把不在有用表的tablespace删掉
1. select username,default_tablespace from dba_users;
2.
create table MTUSEFULSPACE
(
ID Number(4) NOT NULL PRIMARY KEY,
USERNAME varchar2(30),
TABLESPACENAME varchar2(60),
OWNERNAME varchar2(30)
);
3.
declare icount number(2);
tempspace varchar2(60);
begin
for curTable in (select username as allusr,default_tablespace as alltblspace from dba_users)
loop
tempspace :=curTable.alltblspace;
dbms_output.put_line(tempspace);
select count(TABLESPACENAME) into icount from MTUSEFULSPACE where TABLESPACENAME = tempspace;
if icount=0 then
DROP TABLESPACE tempspace INCLUDING CONTENTS AND DATAFILES;
end if;
commit;
end loop;
end;
执行后会报如下错误
ORA-06550: 第 10 行, 第 5 列:
PLS-00103: 出现符号 "DROP"在需要下列之一时:
begin case declare exit
for goto if loop mod null pragma raise return select update
while with <an identifier>
<a double-quoted delimited-identifier> <a bind variable> <<
close current delete fetch lock insert open rollback
savepoint set sql execute commit forall merge pipe
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
好像是被锁了。。
把需要删除的user, tablespace 导出到Excel. 使用CONCATENATE 组出SQL.
贴到SQLdevelop 批量执行
如要找datafile的具体位置,可以使用
select t1.name,t2.name from v$tablespace t1, v$datafile t2 where t1.ts# = t2.ts#;
--删除空的表空间,但是不包含物理文件
drop tablespace tablespace_name;
--删除非空表空间,但是不包含物理文件
drop tablespace tablespace_name including contents;
--删除空表空间,包含物理文件
drop tablespace tablespace_name including datafiles;
--删除非空表空间,包含物理文件
drop tablespace tablespace_name including contents and datafiles;
--如果其他表空间中的表有外键等约束关联到了本表空间中的表的字段,就要加上CASCADE CONSTRAINTS
drop tablespace tablespace_name including contents and datafiles CASCADE CONSTRAINTS;
3修改表空间
Oracle修改表空间大小
使用Oracle10g建立数据库后,向数据库中导入了部分数据,第二天继续向数据库中导入数据表时发生错误:
查了很多资料发现原来是Oracle表空间限制,导致无法继续导入数据的原因。如果在建立数据库时没有设置,
Oracle 默认的表空间大小为400M,当数据库中数据量达到这个值,再向数据库中导入数据就会报错。解决方法是
扩展表空间。可以选择将表容量扩大,比如扩展到5G,或者当表空间不够时每次自动增加一定的容量,如每次自增200M。
下面列出详细过程:
1.通过sql plus 命令登录数据库。
在命令行下输入sqlplus “登录用户名/口令 as 登录类型”就可以登录,系统内建的用户名常用的是sys,密码是在安装oracle过程中设置的密码,清务必牢记,如果用sys帐户登录,登录类型一定要是sysdba。
2.查看各表空间分配情况。
select tablespace_name, sum(bytes) / 1024 / 1024 from dba_data_files
group by tablespace_name;
3.查看各表空间空闲情况。
select tablespace_name, sum(bytes) / 1024 / 1024 from dba_free_space group by tablespace_name;
4.更改数据表大小(10G)
alter database datafile '/ora/oradata/radius/undo.dbf' resize 10240m;
5.设置表空间不足时自动增长
5.1查看表空间是否自动增长
SELECT FILE_NAME,TABLESPACE_NAME,AUTOEXTENSIBLE FROM dba_data_files;
5.2 设置表空间自动增长
ALTER DATABASE DATAFILE 'c:\SmartDB01.ora' AUTOEXTEND ON;//打开自动增长
ALTER DATABASE DATAFILE 'c:\SmartDB01.ora' AUTOEXTEND ON NEXT 200M ;//每次自动增长200m
ALTER DATABASE DATAFILE 'c:\SmartDB01.ora' AUTOEXTEND ON NEXT 200M MAXSIZE 1024M;//每次自动增长200m,数据表最大不超过1G。
产生原因: 需要对用户表空间进行修改
解决方法:
软件在建立帐套时,表空间使用了默认设定,表空间可以自动增加。如果用户为了提升速度进行了优化,关闭了此选项,则在年结前也应该检查一下表空间的使用情况,如果已经使用空间小于剩余空间,也应该进行扩充。
查看表空间使用情况:
SELECT * FROM DBA_FREE_SPACE
举例:
在实际操作中请根据实际数据库路径等信息作适当的调整,切记不可生搬硬套!
另外,请在调整之前,对oracle 作一全备份!
假设表空间名称为GS_ORADB_001,数据文件‘C:\ORADATA\GS_ORADB_001.DBF',
索引表空间名称为GS_ORADB_IDX_001,数据文件‘C:\ORADATA\GS_ORADB_IDX_001.DBF'
ORACLE8i:
首先在DOS命令行方式中执行
C:\>SVRMGRL
SVRMGRL>CONNECT INTERNAL
SVRMGRL>SHUTDOWN
SVRMGRL>STARTUP MOUNT
ORACLE9i:
首先在DOS命令行方式中执行
C:\>SQLPLUS /NOLOG
SQL>CONNECT / AS SYSDBA
SQL >SHUTDOWN
SQL >STARTUP MOUNT
1、增加表空间尺寸
增加一个数据文件:
SQL>ALTER TABLESPACE GS_ORADB_001 ADD DATAFILE ‘C:\ORADATA\GS_ORADB_ADD_001.DBF' SIZE 500M;
2、扩大原有文件大小:
SQL>ALTER DATABASE DATAFILE ‘C:\ORADATA\GS_ORADB_001.DBF' RESIZE 1000M;
3、移动表空间数据文件
假如要求将C:\ORADATA 下GS_ORADB_001.DBF移至D:\ORADATA 下,并把文件名改为GS_ORADB_ALT_001.DBF
步骤:
3.1、将实例处于关闭状态
首先在DOS命令行方式中执行(ORACLE9i)
C:\>SQLPLUS /NOLOG
SQL>CONNECT / AS SYSDBA
SQL >SHUTDOWN
SQL >STARTUP MOUNT
3.2、把数据文件C:\ORADATA 下GS_ORADB_001.DBF移动到D:\ORADATA下,并把文件名改为GS_ORADB_ALT_001.DBF
3.3、再到SQLPLUS 环境中
SQL>ALTER DATABASE RENAME FILE ‘C:\ORADATA\GS_ORADB_001.DBF' TO ‘D:\ORADATA\GS_ORADB_ALT_001.DBFF';
或
SQL>ALTER TABLESPACE GS_ORADB_001 RENAME DATAFILE ‘C:\ORADATA\GS_ORADB_001.DBF' TO ‘D:\ORADATA\GS_ORADB_ALT_001.DBFF';
SQL>ALTER DATABASE OPEN;
4、查看剩余空间
SQL>SELECT TABLESPACE_NAME,SUM(BYTES),MAX(BYTES) FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME;
注意:空闲数据块总和sum(bytes) 够用并不意味每个空闲块都满足分配需要,所以当表空间不够分配扩展块的时候,还要查看最大空闲数据块max(bytes)的大小。
5、合并空闲块
如果表空间上的数据对象经常发生类似drop-create 的变动,加之未采用统一的扩展块尺寸,使那些采用较大扩展块的数据对象不能利用较小的空间碎片,造成空间浪费。可通过将较小的空闲块合并成较大的空闲块的方法,减少空间浪费。
SQL>ALTER TABLESPACE GS_ORADB_001 COALESCE;
6、删除表空间
删除表空间及其包含的所有数据
SQL>DROP TABLESPACE GS_ORADB_001 INCLUDING CONTENTS;
Oracle修改表空间为自动扩展
1.数据文件自动扩展的好处
1)不会出现因为没有剩余空间可以利用到数据无法写入
2)尽量减少人为的维护
3)可以用于重要级别不是很大的数据库中,如测试数据库等
2.数据文件自动扩展的弊端
1)如果任其扩大,在数据量不断变大的过程中会导致某个数据文件异常的大
2)没有人管理的数据库是非常危险的
3.查询当前数据库中表空间
SEC_D是否为自动扩展
sec@orcl> select tablespace_name,file_name,autoextensible from dba_data_files where tablespace_name = 'SEC_D';
4.通过修改SEC_D的数据文件为自动扩展达到表空间SEC_D为自动扩展的目的
sec@orcl> alter database datafile '/u01/app/oracle/oradata/orcl/sec_d01.dbf' autoextend on;
5.确认是否已经修改成功
sec@orcl> select tablespace_name,file_name,autoextensible from dba_data_files where tablespace_name = 'SEC_D';
6.总结修改语句语法
开启自动扩展功能语法:
alter database datafile '对应的数据文件路径信息' autoextend on;
关闭自动扩展功能语法:
alter database datafile '对应的数据文件路径信息' autoextend off
重命名表空间
在需要的情况下,可以对表空间的名称进行修改,其修改不会影响到表空间中数据文件。 但是不能修改系统表空间stsyem和sysaux.的名称
前提条件: 修改表空间的名称时,表空间的状态必须为online.否则无法修改。
alter tablespaces tablespace_name rename to new_tablespace_name;
--1、查看表空间的名称及大小
SELECT t.tablespace_name, round(SUM(bytes / (1024 * 1024)), 0) ts_size
FROM dba_tablespaces t, dba_data_files d
WHERE t.tablespace_name = d.tablespace_name
GROUP BY t.tablespace_name;
--2、查看表空间物理文件的名称及大小
SELECT tablespace_name,
file_id,
file_name,
round(bytes / (1024 * 1024), 0) total_space
FROM dba_data_files
ORDER BY tablespace_name;
--3、查看回滚段名称及大小
SELECT segment_name,
tablespace_name,
r.status,
(initial_extent / 1024) initialextent,
(next_extent / 1024) nextextent,
max_extents,
v.curext curextent
FROM dba_rollback_segs r, v$rollstat v
WHERE r.segment_id = v.usn(+)
ORDER BY segment_name;
--4、查看控制文件
SELECT NAME FROM v$controlfile;
--5、查看日志文件
SELECT MEMBER FROM v$logfile;
--6、查看表空间的使用情况
SELECT SUM(bytes) / (1024 * 1024) AS free_space, tablespace_name
FROM dba_free_space
GROUP BY tablespace_name;
SELECT a.tablespace_name,
a.bytes total,
b.bytes used,
c.bytes free,
(b.bytes * 100) / a.bytes "% USED ",
(c.bytes * 100) / a.bytes "% FREE "
FROM sys.sm$ts_avail a, sys.sm$ts_used b, sys.sm$ts_free c
WHERE a.tablespace_name = b.tablespace_name
AND a.tablespace_name = c.tablespace_name;
--7、查看数据库库对象
SELECT owner, object_type, status, COUNT(*) count#
FROM all_objects
GROUP BY owner, object_type, status;
--8、查看数据库的版本
SELECT version
FROM product_component_version
WHERE substr(product, 1, 6) = 'Oracle';
--9、查看数据库的创建日期和归档方式
SELECT created, log_mode, log_mode FROM v$database;
SQL2:
--1G=1024MB
--1M=1024KB
--1K=1024Bytes
--1M=11048576Bytes
--1G=1024*11048576Bytes=11313741824Bytes
SELECT a.tablespace_name "表空间名",
total "表空间大小",
free "表空间剩余大小",
(total - free) "表空间使用大小",
total / (1024 * 1024 * 1024) "表空间大小(G)",
free / (1024 * 1024 * 1024) "表空间剩余大小(G)",
(total - free) / (1024 * 1024 * 1024) "表空间使用大小(G)",
round((total - free) / total, 4) * 100 "使用率 %"
FROM (SELECT tablespace_name, SUM(bytes) free
FROM dba_free_space
GROUP BY tablespace_name) a,
(SELECT tablespace_name, SUM(bytes) total
FROM dba_data_files
GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name