最近在做了次数据库的割接,整理了下操作中的分析语句:
1. 分析数据库表空间
方法一:这个方法当空间爆满时无法查出满了的表空间
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 4 DESC;
方法二:解决上面爆满的问题
SELECT A.TABLESPACE_NAME, A.BYTES/1024/1024 TOTAL_M, B.BYTES/1024/1024 USED_M, C.BYTES/1024/1024 FREE_M, (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;
空间不足后需要添加表空间,以下供参考:
alter tablespace TBS_QUERY add datafile '/home/oracle/oracle/product/10.2.0/oradata/dajun/tbs_query01.dbf' size 2048m autoextend off;
2. 分析各表数据量大小
Select Segment_Name,Sum(bytes)/1024/1024 tab_size
From User_Extents t
where t.segment_type='TABLE'
Group By Segment_Name
order by tab_size desc;
3. 确认表空间对应的数据文件
select a.name,b.name from v$tablespace a, v$datafile b where a.ts#=b.ts#;
4. 对有外键约束进行关闭、开启
alter table 表名 disable constraint 约束名;
alter table 表名 enable constraint 约束名;
5.查询用户、权限等
1.查看所有用户:
select * from dba_user;
select * from all_users;
select * from user_users;
2.查看用户系统权限:
select * from dba_sys_privs;
select * from all_sys_privs;
select * from user_sys_privs;
3.查看用户对象权限:
select * from dba_tab_privs;
select * from all_tab_privs;
select * from user_tab_privs;
4.查看所有角色:
select * from dba_roles;
5.查看用户所拥有的角色:
select * from dba_role_privs;
select * from user_role_privs;
6. 在使用user_tables中的num_rows做为数据迁移检查时,出现了与表实际数据不一至的情况
分析后认为是oracle对user_tables的没有即时刷新,需要对表进行分析处理。
分析表的语法:analyze table table_name compute statistics;
参过如下语句:
方法一:
--生成当前用户下所有的表分析语句
spool 路径/AnalyzeTab.sql;
select 'analyze table '||t1.TABLE_NAME||' compute statistics;' from user_tables t1;
spool off;
执行AnalyzeTab.sql即可。
方法二:由于分析过程不可见,谨慎使用。对于大数据量的用户不建议使用。
create or replace procedure Pro_AnalyzeTables is
cursor cur_tab is
select table_name from user_tables;
record_cur_tab cur_tab%rowtype;
begin
open cur_tab;
loop
fetch cur_tab
into record_cur_tab;
exit when cur_tab%notfound;
--dbms_output.put_line('Start Analyze '||record_cur_tab.table_name);
execute immediate 'analyze table ' || record_cur_tab.table_name ||
' compute statistics';
--dbms_output.put_line('End Analyze '||record_cur_tab.table_name);
end loop;
end Pro_AnalyzeTables;
7. 分析一个表的主外键关连关系
select a.owner 主键拥有者
,a.table_name 主键表
,b.column_name 主键列
,C.OWNER 外键拥有者
,c.table_name 外键表
,d.column_name 外键列
from user_constraints a
left join user_cons_columns b on a.constraint_name=b.constraint_name
left join user_constraints C ON C.R_CONSTRAINT_NAME=a.constraint_name
left join user_cons_columns d on c.constraint_name=d.constraint_name
where a.constraint_type='P'
and a.table_name=upper('bi_wo_info') --需要查看主外键关系的表
order by a.table_name