oracle维护表空间和数据文件(三)
单说一下方法,就不做实验了。
[plain]
实验: 创建一个表空间:
create tablespace wang datafile '/文件名/' size 100M
extent management local uniform size 128k;
create user wang identified by wang default tablespace wang;
然后用user/user登录
创建表 就在以上指定的表空间中了。
create table wang (id integer,name char(10));
insert into t values(0,'wang');
commit;
insert into t values(1,'qiupeng');
第二条不commit
然后切换到sys用户;
然后执行
alter tablespace wang read only;
如果transcription没有commit以上语句耗在这里,commit后这个语句才执行。
drop table wang ;这个命令可以执行。
相当于 一个省的地域是实实在在的文件, 省上面的行政机构是相当于
tablespace,是一个逻辑的结构,
这个tablespace的逻辑结构是存储在数据字段中的,可以执行 drop table操作
相当于对数据字典进行访问。
10 :让一个表空间 offline
以下表空间不能离线:
1:SYSTEM表空间
2:处于active的 undo segment 的表空间
3:default temporary 表空间不能离线 ,temporary 表空间如果不是default的就可以离线。
[sql]
ALTER TABLESPACE mytemp OFFLINE;
ALTER TABLESPACE mytemp ONLINE;
实验:
[plain]
create table tt(id integer,name char(10));
insert into tt values(0,'wang');
commit;
select * from tt;
insert into tt values(1 ,'bbbbb');
select * from tt;
这个时候第二条记录还没有commit;
这意味在undo segment 有一个 active的。
如果表空间离线,就不能对这个表空间内的表做操作。
11: 变大和变小 表空间;(这个很有现实意义)
有二种方式:
1:表空间可以自动变大 创建表空间的时候 可以设置 AUTOEXTEND ON实现。
2:可以通过在表空间中加入新的数据文件来增加表空间。
1:查询表空间的使用情况:
DBA_DATA_FILES 这个表记录了所有数据文件情况。
DBA_FREE_SPACE 能够知道还剩余多少表空间。(如果是离线状态不能查出。)
google 搜索 : oracle tablespace usage sql
这个sql能够查询出
数据库的所有表空间的使用情况;
注意这是一个很重要的sql:
[sql]
SELECT /* + RULE */ df.tablespace_name "Tablespace",
df.bytes / (1024 * 1024) "Size (MB)",
SUM(fs.bytes) / (1024 * 1024) "Free (MB)",
Nvl(Round(SUM(fs.bytes) * 100 / df.bytes),1) "% Free",
Round((df.bytes - SUM(fs.bytes)) * 100 / df.bytes) "% Used"
FROM dba_free_space fs,
(SELECT tablespace_name,SUM(bytes) bytes
FROM dba_data_files
GROUP BY tablespace_name) df
WHERE fs.tablespace_name (+) = df.tablespace_name
GROUP BY df.tablespace_name,df.bytes
UNION ALL
SELECT /* + RULE */ df.tablespace_name tspace,
fs.bytes / (1024 * 1024),
SUM(df.bytes_free) / (1024 * 1024),
Nvl(Round((SUM(fs.bytes) - df.bytes_used) * 100 / fs.bytes), 1),
Round((SUM(fs.bytes) - df.bytes_free) * 100 / fs.bytes)
FROM dba_temp_files fs,
(SELECT tablespace_name,bytes_free,bytes_used
FROM v$temp_space_header
GROUP BY tablespace_name,bytes_free,bytes_used) df
WHERE fs.tablespace_name (+) = df.tablespace_name
GROUP BY df.tablespace_name,fs.bytes,df.bytes_free,df.bytes_used
ORDER BY 4 DESC;
在我数据库上的执行结果:
[sql]
Tablespace Size (MB) Free (MB) % Free % Used
------------------------------ ---------- ---------- ---------- ----------
TS_MYDB 500 499.9375 100 0
MY_SPACE 500 499.9375 100 0
PENG 5 4.9375 99 1
MYTEMP 100 99 99 1
UNDOTBS1 365 335.6875 92 8
USER_TEMP 500 338 68 32
EXAMPLE 100 22.3125 22 78
USERS 9707.06