首页 > 代码库 > Oracle 常用SQL
Oracle 常用SQL
查询回收站内容,大于20则需要清理
SELECT count(1) FROM dba_recyclebin;
清理回收站所有内容
purge dba_recyclebin;
查询所有表空间
SELECT ‘RESULT=‘||df.tablespace_name "Tablespace",df.bytes/(1024*1024) "Total Size(MB)",
sum(fs.bytes)/(1024*1024) "Free Size(MB)", round(sum(fs.bytes)*100/df.bytes) "% Free",
round((df.bytes-sum(fs.bytes))*100/df.bytes) "% Used"
FROM (SELECT
a.bytes,a.tablespace_name FROM dba_free_space
a UNION ALL SELECT b.BYTES_FREE,b.tablespace_name FROM V$TEMP_SPACE_HEADER b )fs,
(SELECT tablespace_name, sum(bytes) bytes FROM dba_data_files GROUP BY tablespace_name UNION ALL SELECT tablespace_name, SUM(bytes) total FROM dba_temp_files GROUP BY tablespace_name) df
WHERE fs.tablespace_name = df.tablespace_name
GROUP BY df.tablespace_name, df.bytes;
查询某个表空间被谁占用
SELECT * FROM
(SELECT owner,segment_name, sum(bytes)/1024/1024 Mbytese FROM dba_segments WHERE
tablespace_name IN(‘CBS_DEFAULT_DAT‘)
GROUP BY owner,segment_name
ORDER BY Mbytese DESC )
WHERE rownum<=10;
统计信息定时任务是否正常,结果数大于 0则表明正常
SELECT count(1) FROM dba_autotask_job_history a WHERE a.client_name=‘auto optimizer stats collection‘ AND job_status=‘SUCCEEDED‘ AND a.window_start_time >=sysdate-2;
检查SQL是否绑定变量
SELECT
substr(sql_text, 1, 40) "SQL", count(*),
sum(executions) "TotExecs"
FROM v$sqlarea
WHERE executions < 5
GROUP BY
substr(sql_text, 1, 40)
HAVING count(*) > 30
ORDER BY 2 DESC;
SQL返回查询时间超过5秒的SQL
SELECT p.spid, s.sid,
s.last_call_et,
s.machine, s.program, s.terminal,
w.event,q.sql_text
FROM v$process p,
v$session s,
v$sqltext q,
v$session_wait w
WHERE p.addr = s.paddr
AND s.sql_address = q.address
AND s.STATUS = ‘ACTIVE‘
AND p.background IS NULL
AND s.sid = w.sid
AND s.last_call_et > 5
ORDER BY s.last_call_et DESC, s.sid, q.piece;
检查分区表是否存在全局索引,如果查询返回纪录,则表明建立了全局索引,需要重新建立为本地索引或者全局分区索引
SELECT a.owner, a.table_name, a.index_name,
a.partitioned, a.STATUS
FROM dba_indexes a, dba_part_tables b
WHERE a.table_name = b.table_name
AND a.owner NOT IN (‘SYS‘, ‘SYSTEM‘)
AND a.partitioned <> ‘YES‘;
检查业务对象并行度设置
SELECT owner, object_name, degree
FROM (SELECT a.owner,
a.table_name object_name, a.degree
FROM dba_tables a
WHERE trim(a.degree) > ‘1‘
UNION ALL
SELECT a.owner, a.index_name object_name, a.degree
FROM dba_indexes a
WHERE trim(a.degree) > ‘1‘
) b
WHERE b.owner NOT IN (‘SYS‘, ‘SYSTEM‘, ‘SYSMAN‘, ‘MGMT_VIEW‘)
AND b.owner NOT IN (SELECT c.username FROM dba_users_with_defpwd c);
设置索引并行度为1
ALTER INDEX IDX_NAME noparallel;
设置表并行度为1
ALTER TABLE TABLE_NAME noparallel;
检查非正常的job
SELECT JOB,SCHEMA_USER,WHAT FROM dba_jobs WHERE broken=‘Y‘;
修复job:检查Oracle告警日志,分析job失败的原因。找出对应的job号后(如20),用以下命令将其的broken改为N
exec dbms_job.broken(20,false);
检查是否存在失效对象
SELECT t.owner,
t.object_type,
t.object_name, t.STATUS
FROM dba_objects t
WHERE t.STATUS = ‘INVALID‘
--如果没用,建议删除。
--如果有用,则需要重新编译。
--重编译对象
ALTER object_type object_owner.object_name compile;
--重编译用户
execute dbms_utility.compile_schema(schema => ‘‘,compile_all => false);
--重编译数据库
@?/rdbms/admin/utlrp.sql
在线创建索引
CREATE INDEX index_name ON table_name(col_name) tablespace tablespace_name online;
并行创建索引(如果分在线创建,请将online参数去掉)
CREATE INDEX index_name ON table_name(col_name) parallel 4 tablespace tablespace_name online;
ALTER INDEX index_name noparallel;
在线重建索引
expdp sysdb/sys_db1 dumpfile=sysdb_expdb20120415.dmp directory=dpump_dir logfile=sysdb.log EXCLUDE=TABLE:\"IN\(\‘MDSP_CDR\‘,\‘T_BME_TASKRUNRESULT\‘,\‘TB_INTERACTLOG\‘\)\"
导出数据排除某些表
expdp sysdb/sys_db1 dumpfile=sysdb_expdb20120415.dmp directory=dpump_dir logfile=sysdb.log EXCLUDE=TABLE:\"IN\(\‘MDSP_CDR\‘,\‘T_BME_TASKRUNRESULT\‘,\‘TB_INTERACTLOG\‘\)\";
单表导入导出
expdp sysdb/sysdb TABLES=TB1 directory= dpump_dir dumpfile=sysdb_tb_mobileno.dmp
impdp sysdb/sysdb t directory=dpump_dir dumpfile= dumpfile=sysdb_tb_mobileno.dmp TABLES= TB1;
在不同用户恢复表数据
expdp sysdb/sys_db1 directory=dmpdir content=ALL DUMPFILE=Tcategory_Relation.dmp
TABLES=Tcategory_Relation
impdp sysdb5/sys_db1 DIRECTORY=dmpdir DUMPFILE=Tcategory_Relation.dmp
TABLES=Tcategory_Relation remap_schema=sysdb:sysdb5;
对表转移表空间,需要停业务操作,表重建后索引也要重建
ALTER TABLE table_name move tablespace <new tablespace>;
ALTER INDEX index_name
rebuild online;
对索引转移表空间
ALTER INDEX PK_MDSP_T_RENTINFO_2 rebuild online tablespace TS_MDSP_IDX;
降低高水位
ALTER TABLE table_name enable row movement;
ALTER TABLE table_name shrink space compact;
ALTER TABLE table_name shrink space cascade;
收集表的统计信息
exec dbms_stats.gather_table_stats(ownname=>‘大写的数据库用户名‘,tabname=>‘大写的表名‘,degree=>4,cascade=>true,force=>true,no_invalidate=>false);
收集用户的统计信息
exec dbms_stats.gather_schema_stats(ownname=> ‘大写的数据库用户名‘,estimate_percent => dbms_stats.AUTO_SAMPLE_SIZE,degree=>4,cascade=>true,force=>true,no_invalidate=>false);
如何检查失效的索引
SELECT a.owner, a.index_name,
a.STATUS
FROM dba_indexes a
WHERE a.STATUS = ‘UNUSABLE‘
UNION ALL
SELECT a.index_owner, a.index_name, a.STATUS
FROM dba_ind_partitions a
WHERE a.STATUS = ‘UNUSABLE‘;
检查失效索引并显示重建语句
SELECT ‘alter index ‘|| a.owner||‘.‘|| a.index_name || ‘ rebuild online;‘ AS rebuild_index_sql
FROM DBA_indexes a
WHERE a.partitioned <> ‘YES‘
AND ( a.STATUS = ‘UNUSABLE‘)
UNION
SELECT ‘alter index
‘||
t.index_owner||‘.‘|| t.index_name || ‘ rebuild
partition ‘ ||
t.partition_name || ‘ online;‘ AS rebuild_index_sql
FROM DBA_ind_partitions t,user_part_indexes n
WHERE ( t.STATUS = ‘UNUSABLE‘);
如何恢复删除的数据,如果数据被误删除,而且时间不是很长,可以从undo表空间将表数据恢复,请修改为现场的表明和时间
CREATE TABLE table_name_new AS SELECT * FROM table_name AS of timestamp to_timestamp (‘2013-03-26 11:00:00‘,‘YYYY-MM-DD HH24:MI:SS‘);
创建snapshot
execute dbms_workload_repository.create_snapshot;
收集AWR报告
@?/rdbms/admin/awrrpt.sql
收集ASH报告
@?/rdbms/admin/ashrpt.sql
查询session历史信息
SELECT *
FROM dba_hist_active_sess_history t
WHERE
t.sample_time > to_date(‘20130811 070000‘, ‘yyyymmdd hh24miss‘)
AND t.sample_time < to_date(‘20130811 090000‘, ‘yyyymmdd
hh24miss‘);
检查事务锁
SELECT ‘session ‘ || c.locker ||
‘ lock session ‘ || c.locked
AS "result"
FROM ( SELECT a.sid locked,
b.sid locker
FROM v$lock a, v$lock b
WHERE a.request > 0
AND a.id1 = b.id1
AND a.id2 = b.ID2
AND a.type = b.type
AND a.addr <> b.addr
) c,
v$session d
WHERE c.locker = d.sid;
检查锁并显示杀锁语句
SELECT DISTINCT ‘kill -9 ‘ ||
p.spid || ‘;‘ AS "result"
FROM ( SELECT a.sid locked,
b.sid locker
FROM v$lock a, v$lock b
WHERE a.request > 0
AND a.id1 = b.id1
AND a.id2 = b.ID2
AND a.type = b.type
AND a.addr <> b.addr
) c,
v$session d,
v$process p
WHERE c.locker = d.sid AND
d.paddr=p.addr;
清理归档日志操作
--方法一
rman target /
crosscheck backup;
DELETE obsolete;
DELETE expired backup;
crosscheck archivelog ALL;
DELETE expired archivelog ALL;
--方法2
rman target /
allocate channel FOR maintenance type disk;
DELETE obsolete device type disk;
如何获取SQL的执行计划,从AWR报告中找到想要获取的sql的SQL ID,然后用以下sql获取:
SELECT * FROM TABLE(dbms_xplan.display_cursor(‘atfwcg8anrykp‘));
-
锁表查询的代码有以下的形式:
select count(*) from v$locked_object;
select * from v$locked_object;
查看哪个表被锁
select b.owner,b.object_name,a.session_id,a.locked_mode
from v$locked_object a,dba_objects b
where b.object_id = a.object_id;
查看是哪个session引起的
select b.username,b.sid,b.serial#,logon_time
from v$locked_object a,v$session b
where a.session_id = b.sid order by b.logon_time;
杀掉对应进程,执行命令:
alter system kill session‘1025,41‘;
其中1025为sid,41为serial#.
Oracle 常用SQL