OS 환경 : Oracle Linux 8.7 (64bit)
DB 환경 : Oracle Database 19.27.0.0
방법 : 오라클 19c 시스템(Dictionary, Fixed Objects) 통계정보 수집 및 백업, 복구, 이관 방법
이전 게시글에서 일반 오브젝트의 통계를 수집 및 이관하는 방법을 설명했음
참고 : 오라클 19c 통계정보 이관 방법 ( https://positivemh.tistory.com/1265 )
본문에서는 dictionary와 fixed object의 통계를 수집하고 백업, 복구, 이관하는 방법을 설명함
딕셔너리(Data Dictionary)란?
데이터베이스의 모든 메타데이터를 담고 있는 실제 테이블로
사용자가 create table을 하거나 index를 만들면 그 정보가 TAB$, IND$ 같은 시스템 테이블에 기록됨
이 통계가 없으면 dba_tables 같은 뷰를 조회하거나 쿼리를 파싱할 때 성능이 떨어짐
dba_table에서 owner='SYS'로 조회 했을떄 목록과 통계 정보를 조회할 수 있음
픽스드 오브젝트(Fixed Objects)란?
오라클 인스턴스가 기동될 때 메모리에 생성되는 내부 구조체임
v$session 같은 뷰를 조회하면 실제로는 메모리 상의 x$kslwt, x$ksuse 등의 테이블을 읽어오는 방식임
디스크에 파일 형태로 존재하지 않고 인스턴스를 재기동하면 메모리 내용은 사라지지만 수집된 통계 정보는 디스크에 영구 보관되어 재기동 후에도 옵티마이저가 참조함
v$fixed_table에서 전체 목록을 확인할 수 있고 dba_tab_statistics에서 object_type = 'FIXED TABLE'로 통계 정보를 조회할 수 있음
시나리오
현재 통계정보를 확인하고 통계 정보를 백업해둔 뒤, 통계 정보를 새로 수집하고, 다시 백업된 통계정보로 복구해봄
본문에서 사용하는 프로시저들 설명
DBMS_STATS.GATHER_DICTIONARY_STATS
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
DBMS_STATS.GATHER_DICTIONARY_STATS (
comp_id VARCHAR2 DEFAULT NULL,
estimate_percent NUMBER DEFAULT
to_estimate_percent_type(GET_PARAM('ESTIMATE_PERCENT')),
block_sample BOOLEAN DEFAULT FALSE,
method_opt VARCHAR2 DEFAULT GET_PARAM('METHOD_OPT'),
degree NUMBER DEFAULT to_degree_type(GET_PARAM('DEGREE')),
granularity VARCHAR2 DEFAULT GET_PARAM('GRANULARITY'),
cascade BOOLEAN DEFAULT to_cascade_type(GET_PARAM('CASCADE')),
stattab VARCHAR2 DEFAULT NULL,
statid VARCHAR2 DEFAULT NULL,
options VARCHAR2 DEFAULT 'GATHER AUTO',
statown VARCHAR2 DEFAULT NULL,
no_invalidate BOOLEAN DEFAULT
to_no_invalidate_type(get_param('NO_INVALIDATE')),
obj_filter_list ObjectTab DEFAULT NULL);
|
변수 설명
comp_id : 분석할 스키마의 컴포넌트 ID임, NULL이면 모든 RDBMS 컴포넌트 스키마를 분석함. (dba_registry 뷰의 comp_id 컬럼 참조) 이 인자 값과 상관없이 sys와 system 스키마는 항상 포함됨
estimate_percent : 통계 수집을 위해 샘플링할 행의 백분율임, 0.000001에서 100 사이를 지정할 수 있음, NULL 입력시 전체 계산을 의미함. dbms_stats.auto_sample_size 사용시 오라클이 최적의 샘플 크기를 결정함(기본값)
block_sample : 행 샘플링 대신 랜덤 블록 샘플링을 사용할지 결정함, 블록 샘플링이 더 효율적이지만, 데이터가 디스크에 무작위로 분산되지 않은 경우 샘플 값이 편향될 수 있음
method_opt : 히스토그램 수집 옵션으로 기본값은 for all columns size auto이고 오라클이 워크로드에 따라 히스토그램 수집 여부를 결정함
degree : 병렬 처리 수준임. NULL은 테이블의 기본값을 사용함을 의미함, dbms_stats.auto_degree를 사용하면 오브젝트 크기에 따라 병렬도를 자동으로 결정함
granularity : 파티션 테이블의 통계 수집 범위를 지정함, auto(기본값), all, global, partition 등을 선택할 수 있음
cascade : 인덱스 통계를 함께 수집할지 여부임, dbms_stats.auto_cascade를 사용하면 오라클이 수집 여부를 결정함(기본값)
stattab : 현재 통계를 저장할 사용자 통계 테이블의 이름임
statid : stattab 내에서 이 통계 데이터를 구분하기 위한 식별자(선택 사항)임
options : 통계 수집 대상 오브젝트를 지정함
- gather auto : (기본값) 통계가 필요한 오브젝트를 오라클이 판단하여 수집함
- gather : 해당 스키마의 모든 오브젝트에 대해 통계를 수집함
- gather stale : 변경 사항이 많은(stale) 오브젝트만 수집함
- gather empty : 통계 정보가 없는 오브젝트만 수집함
statown : stattab이 속한 스키마 이름임(현재 사용자와 다를 경우 지정)
no_invalidate : 통계 수집 시 관련 커서(실행 계획)의 무효화 방식을 제어함
- true : 관련 커서를 무효화하지 않음
- false : 관련 커서를 즉시 무효화함
- dbms_stats.auto_invalidate : (기본값) 오라클이 무효화 시점을 결정하여 성능 영향을 최소화함
obj_filter_list : 특정 조건(필터)을 만족하는 오브젝트들에 대해서만 통계를 수집할 때 사용함, 대소문자를 구분하지 않으며 와일드카드 사용이 가능함
DBMS_STATS.GATHER_FIXED_OBJECTS_STATS
|
1
2
3
4
5
6
|
DBMS_STATS.GATHER_FIXED_OBJECTS_STATS (
stattab VARCHAR2 DEFAULT NULL,
statid VARCHAR2 DEFAULT NULL,
statown VARCHAR2 DEFAULT NULL,
no_invalidate BOOLEAN DEFAULT to_no_invalidate_type (
get_param('NO_INVALIDATE')));
|
변수 설명
stattab : 가져올 통계가 저장되어 있는 통계 테이블 이름
statid : stattab 내에서 이 통계를 구분할 수 있는 식별자 (선택 사항)
statown : stattab이 속한 스키마 (현재 스키마와 다를 경우 지정함)
no_invalidate : 통계를 가져올 때 관련 커서의 무효화 방식을 제어함
- TRUE : 관련 커서를 무효화하지 않음
- FALSE : 관련 커서를 즉시 무효화함
- AUTO : 기본값이며, 점진적 무효화를 통해 성능 영향 최소화함(많은 커서가 무효화되는 경우 특히 효과적임)
이 기본값은 SET_DATABASE_PREFS, SET_GLOBAL_PREFS, SET_SCHEMA_PREFS, SET_TABLE_PREFS 프로시저로 변경할 수 있음
DBMS_STATS.CREATE_STAT_TABLE
|
1
2
3
4
5
|
DBMS_STATS.CREATE_STAT_TABLE (
ownname VARCHAR2,
stattab VARCHAR2,
tblspace VARCHAR2 DEFAULT NULL,
global_temporary BOOLEAN DEFAULT FALSE);
|
변수 설명
ownname : 통계 테이블을 생성할 스키마 이름
stattab : 생성할 통계 테이블 이름임, 이 값은 나중에 EXPORT_*_STATS나 IMPORT_*_STATS 프로시저에서 stattab 파라미터로 사용됨
데이터딕셔너리 통계를 직접 수정하지 않고 내보내거나 가져오기 위해 사용하는 테이블 이름
tblspace : 통계 테이블을 생ㅋ성할 테이블스페이스 이름, 지정하지 않으면 유저의 기본 테이블스페이스에 생성됨
global_temporary : 글로벌 임시 테이블로 생성할지 여부를 지정함
테이블을 글로벌 임시 테이블로 생성해야 하는지 여부
DBMS_STATS.EXPORT_DICTIONARY_STATS
|
1
2
3
4
5
|
DBMS_STATS.EXPORT_DICTIONARY_STATS (
stattab VARCHAR2,
statid VARCHAR2 DEFAULT NULL,
statown VARCHAR2 DEFAULT NULL,
stat_category VARCHAR2 DEFAULT DEFAULT_STAT_CATEGORY);
|
변수 설명
stattab : 통계를 저장할 사용자 정의 통계 테이블 이름
statid : 통계 그룹 식별자(선택 사항), 이 값으로 stattab 내에서 통계를 구분할 수 있음
statown : stattab이 속한 스키마(현재 스키마와 다를 경우 지정함)
stat_category : 가져올 통계 종류를 지정함, 여러 값을 쉼표로 구분해서 입력 가능
- OBJECT_STATS : 테이블, 컬럼, 인덱스 통계(기본값)
- SYNOPSES : 증분 통계를 위한 synopsis 정보
- OBJECT_STATS, SYNOPSES 지정 시 기존 테이블, 컬럼, 인덱스 통계와 synopsis 모두 삭제됨
DBMS_STATS.IMPORT_DICTIONARY_STATS
|
1
2
3
4
5
6
7
8
|
DBMS_STATS.IMPORT_DICTIONARY_STATS (
stattab VARCHAR2,
statid VARCHAR2 DEFAULT NULL,
statown VARCHAR2 DEFAULT NULL,
no_invalidate BOOLEAN DEFAULT to_no_invalidate_type(
get_param('NO_INVALIDATE')),
force BOOLEAN DEFAULT FALSE,
stat_category VARCHAR2 DEFAULT DEFAULT_STAT_CATEGORY);
|
변수 설명
stattab : 가져올 통계가 저장되어 있는 통계 테이블 이름
statid : stattab 내에서 이 통계를 구분할 수 있는 식별자 (선택 사항)
statown : stattab이 속한 스키마 (현재 스키마와 다를 경우 지정함)
no_invalidate : 통계를 가져올 때 관련 커서의 무효화 방식을 제어함
- TRUE : 관련 커서를 무효화하지 않음
- FALSE : 관련 커서를 즉시 무효화함
- AUTO : 기본값이며, 점진적 무효화를 통해 성능 영향 최소화함(많은 커서가 무효화되는 경우 특히 효과적임)
이 기본값은 SET_DATABASE_PREFS, SET_GLOBAL_PREFS, SET_SCHEMA_PREFS, SET_TABLE_PREFS 프로시저로 변경할 수 있음
force : 통계가 잠겨 있을 경우에도 강제로 가져올지 여부를 지정함
- TRUE : 통계 잠금을 무시하고 통계를 가져옴
- FALSE : 통계가 잠겨 있지 않은 경우에만 가져옴
stat_category : 가져올 통계 종류를 지정함, 여러 값을 쉼표로 구분해서 입력 가능
- OBJECT_STATS : 테이블, 컬럼, 인덱스 통계 (기본값)
- SYNOPSES : 증분 통계를 위한 synopsis 정보
DBMS_STATS.EXPORT_FIXED_OBJECTS_STATS
|
1
2
3
4
|
DBMS_STATS.EXPORT_FIXED_OBJECTS_STATS (
stattab VARCHAR2,
statid VARCHAR2 DEFAULT NULL,
statown VARCHAR2 DEFAULT NULL);
|
변수 설명
stattab : 통계를 저장할 사용자 정의 통계 테이블 이름
statid : 통계 그룹 식별자(선택 사항), 이 값으로 stattab 내에서 통계를 구분할 수 있음
statown : stattab이 속한 스키마(현재 스키마와 다를 경우 지정함)
DBMS_STATS.IMPORT_FIXED_OBJECTS_STATS
|
1
2
3
4
5
6
7
|
DBMS_STATS.IMPORT_FIXED_OBJECTS_STATS (
stattab VARCHAR2,
statid VARCHAR2 DEFAULT NULL,
statown VARCHAR2 DEFAULT NULL,
no_invalidate BOOLEAN DEFAULT to_no_invalidate_type(
get_param('NO_INVALIDATE')),
force BOOLEAN DEFAULT FALSE);
|
변수 설명
stattab : 가져올 통계가 저장되어 있는 통계 테이블 이름
statid : stattab 내에서 이 통계를 구분할 수 있는 식별자 (선택 사항)
statown : stattab이 속한 스키마 (현재 스키마와 다를 경우 지정함)
no_invalidate : 통계를 가져올 때 관련 커서의 무효화 방식을 제어함
- TRUE : 관련 커서를 무효화하지 않음
- FALSE : 관련 커서를 즉시 무효화함
- AUTO : 기본값이며, 점진적 무효화를 통해 성능 영향 최소화함(많은 커서가 무효화되는 경우 특히 효과적임)
이 기본값은 SET_DATABASE_PREFS, SET_GLOBAL_PREFS, SET_SCHEMA_PREFS, SET_TABLE_PREFS 프로시저로 변경할 수 있음
force : 통계가 잠겨 있을 경우에도 강제로 가져올지 여부를 지정함
- TRUE : 통계 잠금을 무시하고 통계를 가져옴
- FALSE : 통계가 잠겨 있지 않은 경우에만 가져옴
DBMS_STATS.DROP_STAT_TABLE
|
1
2
3
|
DBMS_STATS.DROP_STAT_TABLE (
ownname VARCHAR2,
stattab VARCHAR2);
|
변수 설명
ownname : 스키마 이름
stattab : 사용자 통계 테이블 식별자 (통계를 저장하거나 가져오는 데 사용하는 테이블 이름)
테스트
현재 통계정보 확인
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
--Dictionary Statistics
SQL>
set lines 200 pages 1000
col owner for a20
col table_name for a30
select * from (
select owner, table_name, to_char(last_analyzed, 'yyyy/mm/dd hh24:mi:ss') last_analyzed
from dba_tables
where 1=1
and owner = 'SYS'
and table_name not in (select table_name from dba_tab_statistics where object_type = 'FIXED TABLE')
and last_analyzed is not null
order by 3 desc
)
where rownum <= 10;
OWNER TABLE_NAME LAST_ANALYZED
-------------------- ------------------------------ -------------------
SYS SMON_SCN_TIME 2026/04/25 22:10:02
SYS WRH$_SEG_STAT 2026/04/25 22:10:02
SYS WRH$_MUTEX_SLEEP 2026/04/25 22:10:02
SYS WRI$_ADV_ADDM_TODO 2026/04/25 22:10:02
SYS STATS_TARGET$ 2026/04/25 22:10:01
SYS COL_USAGE$ 2026/04/25 22:10:01
SYS WRH$_SEG_STAT_OBJ 2026/04/25 22:10:01
SYS WRH$_SQL_WORKAREA_HISTOGRAM 2026/04/25 22:10:01
SYS WRI$_ADV_TASKS 2026/04/25 22:10:01
SYS WRI$_OPTSTAT_OPR 2026/04/25 22:10:01
10 rows selected.
--Fixed Objects Statistics
SQL>
set lines 200 pages 1000
col owner for a20
col table_name for a30
select * from (
select owner, table_name, to_char(last_analyzed, 'yyyy/mm/dd hh24:mi:ss') last_analyzed
from dba_tab_statistics
where 1=1
and object_type = 'FIXED TABLE'
and last_analyzed is not null
order by 3 desc
)
where rownum <= 10;
OWNER TABLE_NAME LAST_ANALYZED
-------------------- ------------------------------ -------------------
SYS X$RPOP_FILESTATS 2026/01/06 22:01:38
SYS X$KECUC_CACHE 2026/01/06 22:01:38
SYS X$MMON_AUTOTASK 2026/01/06 22:01:38
SYS X$KEWRTBGM 2026/01/06 22:01:38
SYS X$KEWFLINFO 2026/01/06 22:01:38
SYS X$KSXMCOLST 2026/01/06 22:01:38
SYS X$SQL_TESTCASES 2026/01/06 22:01:38
SYS X$KCNT 2026/01/06 22:01:38
SYS X$KSNSRESINFO 2026/01/06 22:01:38
SYS X$KSNSOBJ 2026/01/06 22:01:38
10 rows selected.
|
Dictionary Statistics는 4월 25일, Fixed Objects Statistics는 1월 6일이 최신임
통계 저장용 테이블 생성
|
1
2
3
4
5
6
7
8
9
|
--Dictionary Statistics
SQL> exec dbms_stats.create_stat_table(ownname => 'SYSTEM', stattab => 'DICTIONARY_TABLE_STATS');
PL/SQL procedure successfully completed.
--Fixed Objects Statistics
SQL> exec dbms_stats.create_stat_table(ownname => 'SYSTEM', stattab => 'FIXED_TABLE_STATS');
PL/SQL procedure successfully completed.
|
통계정보 수집 전 백업(통계정보 export)
|
1
2
3
4
5
6
7
8
9
|
--Dictionary Statistics
SQL> exec dbms_stats.export_dictionary_stats(statown => 'SYSTEM', stattab => 'DICTIONARY_TABLE_STATS', statid => 'DICTIONARY_TABLE_STATS_ID');
PL/SQL procedure successfully completed.
--Fixed Objects Statistics
SQL> exec dbms_stats.export_fixed_objects_stats(statown => 'SYSTEM', stattab => 'FIXED_TABLE_STATS', statid => 'FIXED_TABLE_STATS_ID');
PL/SQL procedure successfully completed.
|
각각 테이블 용량 확인
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
SQL>
set lines 200 pages 1000
col owner for a10
col segment_name for a30
select owner, segment_name, segment_type, bytes/1024/1024 mb
from dba_segments
where segment_name in ('DICTIONARY_TABLE_STATS', 'FIXED_TABLE_STATS');
OWNER SEGMENT_NAME SEGMENT_TYPE MB
---------- ------------------------------ ------------------ ----------
SYSTEM DICTIONARY_TABLE_STATS TABLE 22
SYSTEM DICTIONARY_TABLE_STATS INDEX 16
SYSTEM FIXED_TABLE_STATS TABLE 4
SYSTEM FIXED_TABLE_STATS INDEX 3
|
테스트 db에서 대략 각각 22m, 4m 정도의 용량을 차지함, 인덱스는 각각 16m, 3m 용량을 차지함
통계정보 수집
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
--Dictionary Statistics
SQL>
BEGIN
DBMS_STATS.GATHER_DICTIONARY_STATS(
estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
method_opt => 'FOR ALL COLUMNS SIZE SKEWONLY',
degree => DBMS_STATS.AUTO_DEGREE,
cascade => TRUE
);
END;
/
PL/SQL procedure successfully completed.
--Fixed Objects Statistics
SQL> EXEC DBMS_STATS.GATHER_FIXED_OBJECTS_STATS;
PL/SQL procedure successfully completed.
|
파라미터 의미
GATHER_DICTIONARY_STATS
estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE : 자동 샘플링, Oracle이 데이터 양과 통계 품질에 따라 적절한 샘플링 비율을 자동 결정
method_opt => 'FOR ALL COLUMNS SIZE SKEWONLY' : Oracle이 컬럼의 데이터 분포를 기반으로 히스토그램을 수집할 컬럼을 결정
degree => DBMS_STATS.AUTO_DEGREE : 병렬 자동 시스템 상황(코어 수, 부하 등)에 따라 Oracle이 병렬도를 자동 설정
cascade => TRUE 인덱스 포함 테이블뿐 아니라 해당 테이블에 속한 인덱스 통계도 함께 수집
GATHER_FIXED_OBJECTS_STATS는 별도로 옵션을 사용하지 않음
통계정보 재확인
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
--Dictionary Statistics
SQL>
set lines 200 pages 1000
col owner for a20
col table_name for a30
select * from (
select owner, table_name, to_char(last_analyzed, 'yyyy/mm/dd hh24:mi:ss') last_analyzed
from dba_tables
where 1=1
and owner = 'SYS'
and table_name not in (select table_name from dba_tab_statistics where object_type = 'FIXED TABLE')
and last_analyzed is not null
order by 3 desc
)
where rownum <= 10;
OWNER TABLE_NAME LAST_ANALYZED
-------------------- ------------------------------ -------------------
SYS WRI$_OPTSTAT_TAB_HISTORY 2026/04/27 19:31:43
SYS WRI$_OPTSTAT_OPR 2026/04/27 19:31:42
SYS WRI$_OPTSTAT_HISTHEAD_HISTORY 2026/04/27 19:31:40
SYS TAB_STATS$ 2026/04/27 19:31:36
SYS WRI$_OPTSTAT_HISTGRM_HISTORY 2026/04/27 19:31:36
SYS TAB$ 2026/04/27 19:31:35
SYS IND$ 2026/04/27 19:31:35
SYS HIST_HEAD$ 2026/04/27 19:31:35
SYS WRM$_SNAPSHOT 2026/04/27 19:31:34
SYS WRM$_PDB_INSTANCE 2026/04/27 19:31:34
10 rows selected.
--Fixed Objects Statistics
SQL>
set lines 200 pages 1000
col owner for a20
col table_name for a30
select * from (
select owner, table_name, to_char(last_analyzed, 'yyyy/mm/dd hh24:mi:ss') last_analyzed
from dba_tab_statistics
where 1=1
and object_type = 'FIXED TABLE'
and last_analyzed is not null
order by 3 desc
)
where rownum <= 10;
OWNER TABLE_NAME LAST_ANALYZED
-------------------- ------------------------------ -------------------
SYS X$XS_SESSION_NS_ATTRIBUTES 2026/04/27 19:33:29
SYS X$XSOBJECT 2026/04/27 19:33:29
SYS X$XSAGOP 2026/04/27 19:33:29
SYS X$XSSINFO 2026/04/27 19:33:29
SYS X$XSAGGR 2026/04/27 19:33:29
SYS X$XPLTOO 2026/04/27 19:33:29
SYS X$XPLTON 2026/04/27 19:33:29
SYS X$ZASAXTAB 2026/04/27 19:33:29
SYS X$XS_SESSIONS 2026/04/27 19:33:29
SYS X$XS_SESSION_ROLES 2026/04/27 19:33:29
10 rows selected.
|
통계정보가 최신화됨
통계정보 정보 이전 정보로 복구(통계정보 import)
|
1
2
3
4
5
6
7
8
9
|
--Dictionary Statistics
SQL> exec dbms_stats.import_dictionary_stats(statown => 'SYSTEM', stattab => 'DICTIONARY_TABLE_STATS', statid => 'DICTIONARY_TABLE_STATS_ID');
PL/SQL procedure successfully completed.
--Fixed Objects Statistics
SQL> exec dbms_stats.import_fixed_objects_stats(statown => 'SYSTEM', stattab => 'FIXED_TABLE_STATS', statid => 'FIXED_TABLE_STATS_ID');
PL/SQL procedure successfully completed.
|
통계정보 재확인
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
--Dictionary Statistics
SQL>
set lines 200 pages 1000
col owner for a20
col table_name for a30
select * from (
select owner, table_name, to_char(last_analyzed, 'yyyy/mm/dd hh24:mi:ss') last_analyzed
from dba_tables
where 1=1
and owner = 'SYS'
and table_name not in (select table_name from dba_tab_statistics where object_type = 'FIXED TABLE')
and last_analyzed is not null
order by 3 desc
)
where rownum <= 10;
OWNER TABLE_NAME LAST_ANALYZED
-------------------- ------------------------------ -------------------
SYS SMON_SCN_TIME 2026/04/26 22:10:02
SYS WRH$_SEG_STAT 2026/04/26 22:10:02
SYS WRH$_MUTEX_SLEEP 2026/04/26 22:10:02
SYS WRI$_ADV_ADDM_TODO 2026/04/26 22:10:02
SYS STATS_TARGET$ 2026/04/26 22:10:01
SYS COL_USAGE$ 2026/04/26 22:10:01
SYS WRH$_SEG_STAT_OBJ 2026/04/26 22:10:01
SYS WRH$_SQL_WORKAREA_HISTOGRAM 2026/04/26 22:10:01
SYS WRI$_ADV_TASKS 2026/04/26 22:10:01
SYS WRI$_OPTSTAT_OPR 2026/04/26 22:10:01
10 rows selected.
--Fixed Objects Statistics
SQL>
set lines 200 pages 1000
col owner for a20
col table_name for a30
select * from (
select owner, table_name, to_char(last_analyzed, 'yyyy/mm/dd hh24:mi:ss') last_analyzed
from dba_tab_statistics
where 1=1
and object_type = 'FIXED TABLE'
and last_analyzed is not null
order by 3 desc
)
where rownum <= 10;
OWNER TABLE_NAME LAST_ANALYZED
-------------------- ------------------------------ -------------------
SYS X$RPOP_FILESTATS 2026/01/06 22:01:38
SYS X$KECUC_CACHE 2026/01/06 22:01:38
SYS X$MMON_AUTOTASK 2026/01/06 22:01:38
SYS X$KEWRTBGM 2026/01/06 22:01:38
SYS X$KEWFLINFO 2026/01/06 22:01:38
SYS X$KSXMCOLST 2026/01/06 22:01:38
SYS X$SQL_TESTCASES 2026/01/06 22:01:38
SYS X$KCNT 2026/01/06 22:01:38
SYS X$KSNSRESINFO 2026/01/06 22:01:38
SYS X$KSNSOBJ 2026/01/06 22:01:38
10 rows selected.
|
통계정보가 수집하기 전으로 원상복구됨
만약 통계정보를 export 하여 타 db(clone)에 import 해야한다면
본문 방식에서 export_~_stats 이후 datapump로 expdp를 수행하여 clone db에 impdp 후 통계정보를 import_~_stats 하면됨
참고용. 통계 복구(통계정보 restore 프로시져)
*이 기능은 10g부터 사용가능한 기능임
현재 복구 가능한 가장 오래된 시점 확인
|
1
2
3
4
5
|
SQL> select to_char(dbms_stats.get_stats_history_availability, 'yyyy/mm/dd hh24:mi:ss') get_stats_history_availability from dual;
GET_STATS_HISTORY_A
-------------------
2026/03/27 15:44:05
|
히스토리 보관 주기(Retention) 확인(단위: 일)
|
1
2
3
4
5
|
SQL> select dbms_stats.get_stats_history_retention from dual;
GET_STATS_HISTORY_RETENTION
---------------------------
31
|
히스토리 보관 주기 변경
|
1
2
3
|
SQL> exec dbms_stats.alter_stats_history_retention(retention => 60);
PL/SQL procedure successfully completed.
|
특정 시점으로 딕셔너리 통계 복구(날짜 타입 입력)
|
1
2
3
|
SQL> exec dbms_stats.restore_dictionary_stats(as_of_timestamp => to_timestamp('2026/04/27 00:00:00', 'yyyy/mm/dd hh24:mi:ss'));
PL/SQL procedure successfully completed.
|
특정 시점으로 fixed objects 통계 복구(interval 이용)
|
1
2
3
|
SQL> exec dbms_stats.restore_fixed_objects_stats(as_of_timestamp => systimestamp - interval '1' day);
PL/SQL procedure successfully completed.
|
딕셔너리, 픽스드 오브젝트 외에도 db단위, 스키마, 테이블 단위로도 restore 가능함
restore_database_stats
restore_dictionary_stats
restore_fixed_objects_stats
restore_schema_stats
restore_system_stats
restore_table_stats
결론 :
시스템 통계정보를 본문에서 설명한 방식을 이용해 백업 및 복구할 수 있음
만약 딕셔너리 조회가 느려 통계를 수집해야할 경우 통계정보를 백업 해두고 수집한 뒤 문제가 발생한 경우 다시 복원하면 안전하게 작업할 수 있음
참조 :
How to check dictionary and fixed objects statistics(KB137765)
https://docs.oracle.com/en/database/oracle/oracle-database/19/arpls/DBMS_STATS.html
'ORACLE > Admin' 카테고리의 다른 글
| 오라클 19c AutoUpgrade를 이용해 패치 다운로드 방법 (0) | 2026.05.10 |
|---|---|
| 오라클 26ai CDB, PDB에 Oracle Text 컴포넌트 설치 (0) | 2026.05.07 |
| 오라클 19c 테이블에 grant시 last_ddl_time이 변경될까? (0) | 2026.04.19 |
| 오라클 26ai CDB TWO_TASK 환경변수 (0) | 2026.04.11 |
| 오라클 19c 잘못된 dns 주소로 인한 sqlplus 연결 지연 문제 (0) | 2026.04.07 |
