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检查脚本
由于权限控制,巡检数据库用户的只有查询权限
查找当前用户的系统权限
对于巡检数据库来说,这些权限基本也足够了。
但是在巡检过程中遇到这样的问题
在查询数据库headroom的时候报错:
解决办法之一是得到更高的权限
之二,就是理解这个包到底是干什么的
查看包的内容
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结果是否一致
明显是一致的,所有我们用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))
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))
相关文章推荐
- 手动递增SCN号的几种方法:How to increase System Change Number by manual
- oracle system change number(SCN) 下 检查点
- Oracle System Change Number (SCN)完全筆記
- Oracle System Change Number (SCN) Number 完全笔记
- DBA入门之认识Oracle SCN(System Change Number)
- oracle system change number(SCN)
- 搞定Oracle SCN -system change number
- GetCurrentTime(),GetLocalTime(),GetSystemTime()之间的区别
- 关于oracle db 11gR2版本号上的_external_scn_rejection_threshold_hours參数和scn headroom补丁问题
- System.currentTimeMillis,getTimeInMillis与new Date().getTime获取当前时间戳耗时比较
- System.currentTimeMillis,getTimeInMillis与new Date().getTime获取当前时间戳耗时比较
- SCN HeadRoom 事件分析
- System.IO.Directory.GetCurrentDirectory()方法
- VC中GetCurrentTime(), GetSystemTime( ), GetLocalTime( )的区别
- linux get current thread count and system threads limit
- System.currentTimeMillis,getTimeInMillis与new Date().getTime获取当前时间戳耗时比较
- System.currentTimeMillis,getTimeInMillis与new Date().getTime获取当前时间戳耗时比较
- 【C#遗补】获取应用程序路径之System.IO.Directory.GetCurrentDirectory和System.Windows.Forms.Application.StartupPath的区别
- System.currentTimeMillis,getTimeInMillis与new Date().getTime获取当前时间戳耗时比较
- System.currentTimeMillis,getTimeInMillis与new Date().getTime获取当前时间戳耗时比较