Oracle의 모든 버전이 주어지면 :
- 현재 SCN을 어떻게 찾습니까?
- 가능한 최대 SCN은 무엇입니까?
Oracle의 모든 버전이 주어지면 :
답변:
Oracle 9i :
SELECT dbms_flashback.get_system_change_number as current_scn
FROM DUAL;
Oracle 10g 이상 :
SELECT current_scn
FROM V$DATABASE;
SCN에는 여기에 설명 된대로 형식에 의해 부과 된 하드 한계와 Oracle에 의해 인공적으로 부과 된 소프트 한계가 있습니다 . 아래에 관련 부분을 인용했습니다 (강조 추가).
오라클의 주력 데이터베이스 애플리케이션 설계자는 SCN이 거대한 정수 여야한다는 것을 잘 알고 있어야합니다. 48 비트 숫자 ( 281,474,976,710,656 )입니다. Oracle 데이터베이스가 그와 같은 수의 트랜잭션을 처리하고 문제를 일으키는 데는 수십 년이 걸릴 것입니다.
소프트 한계는 24 년 전의 특정 시점에 고정 된 매우 간단한 계산에서 파생됩니다. 00:00:00 01/01/1988 이후의 시간 (초)에 16,384를 곱하십시오. 현재 SCN 값이 이보다 낮 으면 모두 정상이며 처리가 정상적으로 진행됩니다. 간단히 말하면 계산은 초당 16,384 개의 트랜잭션을 처리하는 1988 년 1 월 1 일 이후 지속적으로 실행되는 데이터베이스가 실제로 존재할 수 없다고 가정합니다.
이 스크립트 (Oracle 10g 이상)는 소진 된 하드 및 소프트 한계의 양을 확인합니다. 소프트 한계를 불러 온 Rob에게 감사합니다.
WITH limits AS (
SELECT
current_scn
--, dbms_flashback.get_system_change_number as current_scn -- Oracle 9i
, (SYSDATE - TO_DATE('1988-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')) * 24*60*60 * 16384
AS SCN_soft_limit
, 281474976710656 AS SCN_hard_limit
FROM V$DATABASE
)
SELECT
current_scn
, current_scn/scn_soft_limit*100 AS pct_soft_limit_exhausted
, scn_soft_limit
, current_scn/scn_hard_limit*100 AS pct_hard_limit_exhausted
, scn_hard_limit
FROM limits;
다음은 SCN 버그 문제와 관련하여 데이터베이스의 무결성을 검사하기 위해 작성한 쿼리입니다.
# Show the amount of SCN keyspace we have used so far on this database
# By default the SCN max on a 10g/11g
# instance is a 48-bit integer (281,474,976,710,656)
SELECT NAME,
(current_scn/281474976710656)*100 as PCT_OF_SCN_KEYSPACE_USED,
ROUND(SYSDATE-CREATED) as DAYS_SINCE_DB_CREATION,
ROUND(1/(current_scn/281474976710656)*(SYSDATE-CREATED)) AS EST_DAYS_BEFORE_SCN_EXHAUSTED,
ROUND(1/(current_scn/281474976710656)*(SYSDATE-CREATED)/365) AS EST_YEARS_BEFORE_SCN_EXHAUSTED
FROM v$database;
DB 링크를 사용하는 대부분의 데이터베이스는 3.5 % 소진되어 50 년 이상 현재 속도로 문제없이 지속될 수 있습니다. 이것은 내가 SCN 버그를 간질이는 사람으로부터 안전하다는 것을 의미하지는 않지만 적어도 다른 사람보다 높거나 한계에 가까운 데이터베이스를 찾지 못했습니다.
281,474,976,710,656은 하드 한계입니다. 소프트 리미트가 무엇인지 알고 싶을 것입니다. 소프트 리미트가 처음에 머리에 부딪힌 값이기 때문입니다. 소프트 한계는 (대략) 1988 년 1 월 1 일 이후 경과 된 시간 (초) x 16384로 계산됩니다.