Oracle里几个不太常用但关键时刻能救命的小技巧
一、找回被误删的数据有一次同事更新一张表忘了加 WHERE 条件把整表数据给改了。他脸都白了。Oracle 有个闪回查询功能能查到某个时间点之前的数据。只要没提交太久都能找回来sql-- 查看5分钟前的数据 SELECT * FROM 表名 AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL 5 MINUTE); -- 确认无误后恢复数据 INSERT INTO 表名 SELECT * FROM 表名 AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL 5 MINUTE);前提是 UNDO 表空间够大保留时间够长。默认保留900秒够用了。二、查谁在锁表开发环境下经常遇到这种情况想改表结构结果提示“资源正忙”。有人把表锁了不知道是谁。sqlSELECT s.sid, s.serial#, s.username, s.osuser, s.machine, l.object_name, l.locked_mode FROM v$locked_object lo JOIN dba_objects l ON lo.object_id l.object_id JOIN v$session s ON lo.session_id s.sid;找到锁表的会话记下 SID 和 SERIAL#然后sqlALTER SYSTEM KILL SESSION sid,serial#;别在生产环境随便杀先确认是谁在做什么操作。三、快速清空一张大表要清空一张几百万行的表用 DELETE 会生成大量 UNDO慢得要死还容易撑爆 UNDO 表空间。用 TRUNCATEsqlTRUNCATE TABLE 表名;注意TRUNCATE 是 DDL不能回滚删完就没了。但它快几秒钟清空几百万行。如果确实需要回滚能力用 DELETE 分批删sqlDELETE FROM 表名 WHERE ROWNUM 10000; COMMIT; -- 重复执行直到删完四、查最近执行过的SQL有时候数据库突然CPU飙高想知道谁在执行什么SQL。Oracle有个视图叫 v$sqlarea记录了所有执行过的SQLsqlSELECT sql_text, executions, elapsed_time / 1000000 AS elapsed_seconds, first_load_time FROM v$sqlarea WHERE first_load_time TO_CHAR(SYSDATE - 1, YYYY-MM-DD/HH24:MI:SS) ORDER BY elapsed_time DESC;如果只想看最近几条加 ROWNUM 限制就行。五、生成AWR报告DBA经常要生成AWR报告来分析数据库性能。不需要记复杂的命令一行搞定sql?/rdbms/admin/awrrpt.sql在 SQL*Plus 里执行这个脚本按提示输入报告格式HTML或TEXT、天数、快照ID就能生成一份完整的性能报告。发给DBA他会感谢你的。写在最后这些技巧不是什么高深的东西但确实在关键时刻能省不少事。尤其是误删数据恢复和查锁表属于“用一次就值回票价”的那种。供参考。