Oracle学习之表空间操作

1. 查看所有表空间大小
select tablespace_name,sum(bytes)/1024/1024 || 'M' from dba_data_files group by tablespace_name;

2、查看表空间的名称及大小 
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; 

3、查看表空间物理文件的名称及大小 
SELECT tablespace_name, 
file_id, 
file_name, 
round(bytes / (1024 * 1024), 0) total_space 
FROM dba_data_files 
ORDER BY tablespace_name; 

4、查看表空间的使用情况 
方式一:
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; 

方式二:
SELECT UPPER(F.TABLESPACE_NAME) "表空间名",
D.TOT_GROOTTE_MB "表空间大小(M)",
D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",
TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,2),'990.99') || '%' "使用比",
F.TOTAL_BYTES "空闲空间(M)",
F.MAX_BYTES "最大块(M)"
FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
FROM SYS.DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME,
 ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
FROM SYS.DBA_DATA_FILES DD
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
ORDER BY 1;

方式三:
SELECT 
mAX(B.file_id) id,
B.TABLESPACE_NAME 表空间,
B.FILE_NAME 物理文件名,
B.BYTES / 1024 / 1024 大小M,
(B.BYTES - SUM(NVL(A.BYTES, 0))) / 1024 / 1024 已使用M,
SUBSTR((B.BYTES - SUM(NVL(A.BYTES, 0))) / (B.BYTES) * 100, 1, 5) 利用率
FROM DBA_FREE_SPACE A, DBA_DATA_FILES B
WHERE A.FILE_ID = B.FILE_ID
GROUP BY B.TABLESPACE_NAME, B.FILE_NAME, B.BYTES
ORDER BY B.TABLESPACE_NAME;

5、查看日志文件 
SELECT MEMBER FROM v$logfile; 

6、查看控制文件 
SELECT NAME FROM v$controlfile;

7、查看数据库的版本  
SELECT version 
FROM product_component_version 
WHERE substr(product, 1, 6) = 'Oracle'

8、查看数据库的创建日期和归档方式 
SELECT created, log_mode, log_mode FROM v$database;

9、查询表空间的free space
select tablespace_name,
count(*) as extends,
round(sum(bytes) / 1024 / 1024, 2) as MB,
sum(blocks) as blocks
from dba_free_space
group by tablespace_name;

10、查找当前表级锁的SQL如下:
select sess.sid, 
    sess.serial#, 
    lo.oracle_username, 
    lo.os_user_name, 
    ao.object_name, 
    lo.locked_mode 
    from v$locked_object lo, 
    dba_objects ao, 
    v$session sess 
where ao.object_id = lo.object_id and lo.session_id = sess.sid;

11、监控当前数据库谁在运行什么SQL语句 
select osuser, username, sql_text  
from  v$session a, v$sqltext b 
where  a.sql_address =b.address order by address, piece;

12、具有最高等待的对象
SELECT  o.OWNER,o.object_name, o.object_type, a.event,
SUM (a.wait_time + a.time_waited) total_wait_time
FROM v$active_session_history a, dba_objects o
WHERE a.sample_time BETWEEN SYSDATE - 30 / 2880 AND SYSDATE
AND a.current_obj# = o.object_id
GROUP BY o.OWNER,o.object_name, o.object_type, a.event
ORDER BY total_wait_time DESC;

13、查询当前连接会话数
select s.value,s.sid,a.username
from v$sesstat S,v$statname N,v$session A
where 
n.statistic#=s.statistic# and
name='session pga memory'
and s.sid=a.sid
order by s.value;

14、等待最多的SQL
SELECT   a.program, a.session_id, a.user_id, d.username, s.sql_text,
SUM (a.wait_time + a.time_waited) total_wait_time
FROM v$active_session_history a, v$sqlarea s, dba_users d
WHERE a.sample_time BETWEEN SYSDATE - 30 / 2880 AND SYSDATE
AND a.sql_id = s.sql_id
AND a.user_id = d.user_id
GROUP BY a.program, a.session_id, a.user_id, s.sql_text, d.username;

15、查看消耗磁盘读取最多的前10条SQL语句
select *
from (select v.sql_id,
v.child_number,
v.sql_text,
v.elapsed_time,
v.cpu_time,
v.disk_reads,
rank() over(order by v.disk_reads desc) elapsed_rank
from v$sql v) a

where elapsed_rank <= 10;

16、Oracle 版本11g向版本10g导入数据

EXPDP USERID='wechat/wechat@orcl as sysdba' schemas=wechat directory=DATA_PUMP_DIR dumpfile=aa.dmp logfile=aa.log version=10.2.0.1.0


Oracle 表空间不足引起的问题及解决方法
1、向数据库导入数据时报了ORA-01653: unable to extend table错误,网上查了下原因是由于表空间不足引起的;

查询表空间使用情况语句
select a.tablespace_name,a.bytes/1024/1024 total, (a.bytes-b.bytes)/1024/1024 used, b.bytes/1024/1024 free, round((a.bytes-b.bytes)/a.bytes*100,2) used_rate
from 
(
select tablespace_name,sum(bytes) bytes
from dba_data_files
group by tablespace_name
) a,
(
select tablespace_name,sum(bytes) bytes,max(bytes) largest
from dba_free_space
group by tablespace_name
) b
where a.tablespace_name = b.tablespace_name;

2、以上语句可以查询出表空间使用情况,如果发现表空间容量不足,查看数据文件文件所在位置及文件编号
查看数据文件位置
 select file#, name from v$datafile; 
 
3、修改表空间大小有两种方法
修改数据文件大小
 alter database datafile '/usr/oracle/app/oradata/orcl/Test.dbf' resize 20480M; 修改后的大小要比实际大小大至少50%,最好大一倍以上
 
增加数据文件
 alter tablespace XXX add datafile '/home/oracle/data/XXX_1.dbf' size 1024M; 
 

// 重建索引操作 
delete from TRAFFIC_KCKP

alter table TRAFFIC_KCKP move 
 
SELECT T1.TABLE_NAME,  
T1.INDEX_NAME,  
T1.INDEX_TYPE,  
T1.UNIQUENESS,  
T1.TABLE_OWNER,  
T1.STATUS,  
T1.FUNCIDX_STATUS  
FROM ALL_INDEXES T1  
WHERE T1.TABLE_OWNER = UPPER('&wechat')  
AND T1.TABLE_NAME = UPPER('&TRAFFIC_KCKP')  
ORDER BY T1.STATUS DESC; 

alter index PK_KCKP_BH rebuild

注意点:
使用imp导入数据时,不加特别参数的话,假设数据库中已存在该表,会报错
IMP-00015: following statement failed because the object already exists:

加上ignore=y选项,如果表数据没有主键冲突,会追加进去。如果表数据有主键冲突,则导入报错。

ORA-00001: unique constraint (XXX.YYY) violated


猜你喜欢

转载自blog.csdn.net/hansen1159/article/details/80428266
今日推荐