您的位置:首页 > 其它

headroom,get_system_change_number和scn_current

2018-01-04 15:01 387 查看
关于headroom的文章很多,其中咱恩墨熊爷多年前对scn的增长分析非常清晰
http://www.laoxiong.net/tag/scn
难以望其项背

对于headroom的检查以及是日常化的操作,一般而言直接运行脚本检查headroom是否足够即可,但是我在检查脚本中遇到了问题,这也加深了我对headroom的认识

我这里要说的问题很简单,当脚本中的dbms_flashback.get_system_change_number 不可用时怎么办。

headroom检查脚本

SELECT to_char(tim, 'yyyy-mm-dd hh24:mi:ss') curr_time,
scn,
round((chk16kscn - scn) / 24 / 3600 / 16 / 1024, 1) "Headroom(Days)"
FROM (select tim,
scn,
((((to_number(to_char(tim, 'YYYY')) - 1988) * 12 * 31 * 24 * 60 * 60) +
((to_number(to_char(tim, 'MM')) - 1) * 31 * 24 * 60 * 60) +
(((to_number(to_char(tim, 'DD')) - 1)) * 24 * 60 * 60) +
(to_number(to_char(tim, 'HH24')) * 60 * 60) +
(to_number(to_char(tim, 'MI')) * 60) +
(to_number(to_char(tim, 'SS')))) * (16 * 1024)) chk16kscn
from (select sysdate                                 tim,
dbms_flashback.get_system_change_number scn
from dual))


由于权限控制,巡检数据库用户的只有查询权限

查找当前用户的系统权限

select privilege from user_sys_privs

select any table

select any dictionary

create session


对于巡检数据库来说,这些权限基本也足够了。

但是在巡检过程中遇到这样的问题

在查询数据库headroom的时候报错:

dbms_flashback.get_system_change_number scn
ERROR at line 13
ORA-00904:标识符无效
对dbms_flashback无权限

解决办法之一是得到更高的权限

之二,就是理解这个包到底是干什么的

查看包的内容

SQL> select text from dba_source where name='DBMS_FLASHBACK' ;

TEXT
--------------------------------------------------------------------------------
package dbms_flashback AUTHID CURRENT_USER as

----------------
-- OVERVIEW
-- Procedures for enabling and disabling dbms_flashback.
...

end;
PACKAGE BODY dbms_flashback wrapped
a000000
1
abcd
abcd
...

40 rows selected.包体加密

从字面上理解get_system_change_number是获得系统当前scn号

其实还有一个更加方便的查看当前scn号的方式current_scn

问题变成了current_scn,dbms_flashback.get_system_change_number结果是否一致
SQL> select a.current_scn,dbms_flashback.get_system_change_number from v$database a;

CURRENT_SCN GET_SYSTEM_CHANGE_NUMBER
----------- ------------------------
1729456      1729456

SQL> /

CURRENT_SCN GET_SYSTEM_CHANGE_NUMBER
----------- ------------------------
1729936      1729936

SQL> /

CURRENT_SCN GET_SYSTEM_CHANGE_NUMBER
----------- ------------------------
1729937      1729937

明显是一致的,所有我们用current_scn去替换dbms_flashback.get_system_change_number就可以了

SELECT to_char(tim, 'yyyy-mm-dd hh24:mi:ss') curr_time,
scn,
round((chk16kscn - scn) / 24 / 3600 / 16 / 1024, 1) "Headroom(Days)"
FROM (select tim,
scn,
((((to_number(to_char(tim, 'YYYY')) - 1988) * 12 * 31 * 24 * 60 * 60) +
((to_number(to_char(tim, 'MM')) - 1) * 31 * 24 * 60 * 60) +
(((to_number(to_char(tim, 'DD')) - 1)) * 24 * 60 * 60) +
(to_number(to_char(tim, 'HH24')) * 60 * 60) +
(to_number(to_char(tim, 'MI')) * 60) +
(to_number(to_char(tim, 'SS')))) * (16 * 1024)) chk16kscn
from (select sysdate tim,
scn_current scn
from v$database))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息