<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>고민의 흔적</title>
    <link>https://lusida-coding.tistory.com/</link>
    <description>더 성장하는 개발자가 되기 위해 고민하고 공부한 내용을 기록하고 공유하기 위함입니다.</description>
    <language>ko</language>
    <pubDate>Wed, 8 Jul 2026 17:28:10 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>lusida0131</managingEditor>
    <item>
      <title>exp한 파일 impdp로 import하면 발생되는 오류</title>
      <link>https://lusida-coding.tistory.com/176</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;오류 내용&lt;/h3&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;ORA-39001 invalid argument value
ORA-39000 bad dump file specification
ORA-31619 invalid dump file &amp;ldquo;/덤프파일경로/파일이름&amp;ldquo;
ORA-27072 file i/o error&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;해결 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 오류 내용은 Export dump 백업이 아니라 기본 Export 백업으로 생성된 파일인데 Import dump 백업을 사용해 파일을 Import 할 때 발생되는 오류입니다. 위의 해결방법은 기본 Export로 백업을 진행하는 것이 아니라 Export dump를 사용해서 백업 파일을 생성하는 방법과 기본 Import로 Export 된 파일을 Import 받는 방법 2가지가 있습니다. 기본 Export 된 파일을 기본 Import로 파일을 Import 받았는데 속도가 너무 느리고 사용할 수 있는 옵션도 dump에 비해 사용할 수 있는 옵션이 적어 다시 Dump를 받을 수 있으면 Dump를 받는 것을 추천드립니다.&lt;/p&gt;</description>
      <category>Oracle/오라클 이관</category>
      <category>ora-27072</category>
      <category>ora-31619</category>
      <category>ora-39000</category>
      <category>ora-39001</category>
      <category>오라클</category>
      <category>이관 오류</category>
      <author>lusida0131</author>
      <guid isPermaLink="true">https://lusida-coding.tistory.com/176</guid>
      <comments>https://lusida-coding.tistory.com/176#entry176comment</comments>
      <pubDate>Thu, 20 Apr 2023 21:41:04 +0900</pubDate>
    </item>
    <item>
      <title>DataDump가 아닌 기본 exp, imp</title>
      <link>https://lusida-coding.tistory.com/175</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;개요&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에 데이터베이스 이관 프로젝트를 진행하면서 DataDump가 아닌 기본 exp, imp를 해야 하는 일이 발생되어 schema별로 exp 된 dmp 파일을 개발서버에 imp를 진행하는데 해당 schema 계정이 아닌 dump 하기 위해 생성한 계정으로 테이블이 imp 되어 기본 exp, imp 하는 방법에 대해 작성하게 되었다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;EXPORT&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Full EXPORT&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 데이터베이스가 Export 된다. 모든 테이블스페이스, 모든 사용자, 또한 모든 객체, 데이터들이 포함 된다.&lt;/p&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;exp system/manager file='dumpfile_생성경로/dumpfile_name.dmp' full=y
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;User EXPORT&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 자신이 만든 모든 오브젝트를 그 user가 EXPORT 하는 방법&lt;/p&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;exp scott/tiger file='dumpfile_생성경로/dumpfile_name.dmp'
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비밀번호 특수문자 있을 시&lt;/p&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;exp userid='scott'/'tiger!^' &amp;nbsp;file='dumpfile_생성경로/dumpfile_name.dmp'
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SYSTEM계정으로 특정 user소유의 오브젝트들을 EXPORT 하는 방법&lt;/p&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;exp system/manager owner=scott &amp;nbsp;file='dumpfile_생성경로/dumpfile_name.dmp'
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Table EXPORT&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SYSTEM계정으로 특정 유저의 table을 EXPORT 하는 예제&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다른 계정으로 EXPORT시 table의 user명까지 지정해야 EXPORT가 성공한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;exp system/manager file='dumpfile_생성경로/dumpfile_name.dmp' tables=(usern_ame.table_name, scott.DEPT)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;scott user로 table을 몇 개만 EXPORT하는 예제&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자신의 table을 EXPORT 할 때에는 user명을 지정할 필요가 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;exp scott/tiger file='dumpfile_생성경로/dumpfile_name.dmp' tables=(EMP, DEPT) log=exp.log
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;EXPORT 옵션&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;userid/passwd : EXPORT를 실행시키고 있는 username/password 명&lt;/li&gt;
&lt;li&gt;file : 생성되는 EXPORT 덤프 파일명&lt;/li&gt;
&lt;li&gt;full : 전체 데이터베이스를 EXPORT 할 것인가의 여부 (Y / N)&lt;/li&gt;
&lt;li&gt;owner : EXPORT 될 데이터베이스의 소유자 명 [owner=user]&lt;/li&gt;
&lt;li&gt;tables : EXPORT 될 테이블의 리스트 [tables=(table1, table2,...)]&lt;/li&gt;
&lt;li&gt;log : EXPORT 실행 과정을 지정된 로그 파일에 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;IMPORT&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 데이터베이스가 IMPORT(Full Level Export file을 Import)&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;imp system/manager file='dumpfile_생성경로/dumpfile_name.dmp' full=y
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;User Export file을 Import&lt;/p&gt;
&lt;pre class=&quot;delphi&quot;&gt;&lt;code&gt;imp scott/tiger file='dumpfile_생성경로/dumpfile_name.dmp'
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;User Export file을 다른 계정으로 IMPORT&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;scott 유저의 데이터를 EXPORT 받아 test 유저에게 IMPORT 하는 예시&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;exp system/manager file='dumpfile_생성경로/dumpfile_name.dmp' owner=scott
imp system/manager file='dumpfile_생성경로/dumpfile_name.dmp' fromuser=scott touser=test
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;IMPORT 옵션&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;username/password : IMPORT를 실생 시키는 계정의 username/password 명&lt;/li&gt;
&lt;li&gt;file : IMPORT 될 EXPORT 덤프 파일명&lt;/li&gt;
&lt;li&gt;show : 파일 내용이 화면에 표시되어야 할 것인가를 나타냄(Y / N)&lt;/li&gt;
&lt;li&gt;ignore : IMPORT 중 CREATE명령을 실행할 때 만나게 되는 에러들을 무시할 것인지 결정(Y / N)&lt;/li&gt;
&lt;li&gt;full : FULL엑스포트 덤프 파일이 IMPORT 할 때 사용한다.&lt;/li&gt;
&lt;li&gt;tables : IMPORT 될 테이블 리스트&lt;/li&gt;
&lt;li&gt;commit : 배열(배열의 크기는 BUFFER에 의해 설정됩니다.) 단위로 COMMIT을 할 것인가 결정 기본적으로는 테이블 단위로 COMMIT을 한다.&lt;/li&gt;
&lt;li&gt;fromuser : EXPORT덤프 파일로 부터 읽혀야 하는 객체들을 갖고 있는 데이터베이스 계정&lt;/li&gt;
&lt;li&gt;touser : EXPORT덤프 안에 있는 객체들이 IMPORT 될 데이터베이스 계정&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;참고&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://godlvkhj.tistory.com/215&quot;&gt;https://godlvkhj.tistory.com/215&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://www.gurubee.net/lecture/1161&quot;&gt;http://www.gurubee.net/lecture/1161&lt;/a&gt;&lt;/p&gt;</description>
      <category>Oracle/오라클 이관</category>
      <category>9i 미만</category>
      <category>exp</category>
      <category>imp</category>
      <category>디비 이관</category>
      <category>오라클</category>
      <category>옵션</category>
      <author>lusida0131</author>
      <guid isPermaLink="true">https://lusida-coding.tistory.com/175</guid>
      <comments>https://lusida-coding.tistory.com/175#entry175comment</comments>
      <pubDate>Tue, 18 Apr 2023 22:38:03 +0900</pubDate>
    </item>
    <item>
      <title>테이블스페이스 관리 관련 쿼리문과 DBF 파일 삭제 시 Drop</title>
      <link>https://lusida-coding.tistory.com/174</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;Tablespace란?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나 또는 여러 개의 데이터 파일로 구성되어 있는 논리적인 데이터 저장구조이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;DataFile이란?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB Table의 데이터가 물리적으로 저장되는 공간이다. (Data File 1개의 최대 용량 32GB) Tablespace는 1개 이상의 DataFile로 구성되어 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;DataFile 확장 방법&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;DataFile 추가&lt;/li&gt;
&lt;li&gt;AUTOEXTEND로 추가&lt;/li&gt;
&lt;li&gt;RESIZE&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Tablespace 용량 확인 쿼리문&lt;/h4&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT    A.TABLESPACE_NAME AS &quot;테이블스페이스명&quot;,
          A.FILE_NAME AS &quot;파일경로&quot;,
          A.BYTES/1024/1024/1024 AS &quot;총크기&quot;,
          (A.BYTES - B.FREE)/1024/1024/1024 AS &quot;사용공간&quot;,
          B.FREE/1024/1024/1024 AS &quot;여유 공간&quot;,
          TO_CHAR( (B.FREE / A.BYTES * 100) , '999.99')||'%' AS &quot;여유공간&quot;
FROM
(
 SELECT FILE_ID,
        TABLESPACE_NAME,
        FILE_NAME,
        SUBSTR(FILE_NAME,1,200) AS FILE_NM,
        SUM(BYTES) BYTES
   FROM DBA_DATA_FILES
 GROUP BY FILE_ID,TABLESPACE_NAME,FILE_NAME,SUBSTR(FILE_NAME,1,200)
) A,
(
 SELECT TABLESPACE_NAME,
        FILE_ID,
        SUM(NVL(BYTES,0)) AS FREE
   FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME,FILE_ID
) B
WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME
 AND A.FILE_ID = B.FILE_ID
ORDER BY A.TABLESPACE_NAME;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Tablespace 관련 조회 쿼리문&lt;/h4&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;select * from dba_tablespaces;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;설정된&amp;nbsp;테이블&amp;nbsp;스페이스&amp;nbsp;확인&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;SELECT&amp;nbsp;*&amp;nbsp;FROM&amp;nbsp;dba_data_files;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터가&amp;nbsp;저장되는&amp;nbsp;물리경로&amp;nbsp;및&amp;nbsp;테이블스페이스&amp;nbsp;정보&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;SELECT&amp;nbsp;*&amp;nbsp;FROM&amp;nbsp;user_users;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재&amp;nbsp;유저의&amp;nbsp;default_tablespace&amp;nbsp;확인&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Tablespace 생성&lt;/h4&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;create tablespace [TABLESPACENAME]
datafile '파일경로' size 10M 
autoextend on next 10M 
maxsize 100M 
uniform size 1M 
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;datafile '파일경로' size 10M : 초기 데이터 파일 경로와 크기 설정&lt;/li&gt;
&lt;li&gt;autoextend on next 10M : 초기 설정한 크기를 모두 사용하는 경우 자동으로 파일의 크기가 정해진 크기만큼 커지는 기능&lt;/li&gt;
&lt;li&gt;maxsize 100M : 데이터파일이 최대로 커질 수 있는 크기 지정, 기본값 = unlimited&lt;/li&gt;
&lt;li&gt;uniform size 1M : EXTENT 한 개의 크기를 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Tablespace에 Data File 추가하는 방법&lt;/h4&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;1. DataFile 추가
ALTER TABLESPACE [TABLE_SPACE_NAME] ADD DATAFILE [DATA_FILE_NAME] SIZE [SIZE];
2. DataFile 추가 후 Auto Extensible 설정
ALTER TABLESPACE [TABLE_SPACE_NAME] ADD DATAFILE [DATA_FILE_NAME] SIZE [초기추가용량] 
AUTUEXTEND ON NEXT [자동증가 용량] MAXSIZE [최대 용량]
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Tablespace 변경 관련 쿼리문&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;ALTER&amp;nbsp;USER&amp;nbsp;[USER_NAME]&amp;nbsp;DEFAULT&amp;nbsp;TABLESPACE&amp;nbsp;[TABLE_SPACE_NAME];
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유저의&amp;nbsp;default&amp;nbsp;Tablespace&amp;nbsp;변경&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;ALTER&amp;nbsp;TABLE&amp;nbsp;[TABLE_NAME]&amp;nbsp;move&amp;nbsp;tablespace&amp;nbsp;[TABLE_SPACE_NAME];
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;테이블의&amp;nbsp;Tablespace&amp;nbsp;변경&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;ALTER&amp;nbsp;TABLESPACE&amp;nbsp;RENAME&amp;nbsp;A&amp;nbsp;TO&amp;nbsp;B
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Tablespace&amp;nbsp;물리적인&amp;nbsp;파일의&amp;nbsp;이름&amp;nbsp;또는&amp;nbsp;위치변경&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;ALTER DATABASE MOVE DATAFILE '/원본 경로/파일 이름' TO '/이동 경로/파일 이름';
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Tablespace&amp;nbsp;Online dbf 파일 위치 이동&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;DROP&amp;nbsp;TABLESPACE&amp;nbsp;[TABLE_SPACE_NAME]&amp;nbsp;include&amp;nbsp;contents;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;테이블스페이스&amp;nbsp;내&amp;nbsp;객체(테이블,&amp;nbsp;인덱스&amp;nbsp;등)를&amp;nbsp;모두&amp;nbsp;삭제&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;DROP&amp;nbsp;TABLESPACE&amp;nbsp;[TABLE_SPACE_NAME]&amp;nbsp;INCLUDING&amp;nbsp;contents;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;테이블스페이스의&amp;nbsp;모든&amp;nbsp;세그먼트를&amp;nbsp;삭제&amp;nbsp;(데이터가&amp;nbsp;테이블스페이스는&amp;nbsp;삭제할&amp;nbsp;수&amp;nbsp;없다)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;DROP&amp;nbsp;TABLESPACE&amp;nbsp;[TABLE_SPACE_NAME]&amp;nbsp;CASCADE&amp;nbsp;constranints;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;삭제된&amp;nbsp;테이블스페이스&amp;nbsp;내의&amp;nbsp;테이블의&amp;nbsp;기본키와&amp;nbsp;PK를&amp;nbsp;참조하는&amp;nbsp;다른&amp;nbsp;테이블스페이스의&amp;nbsp;테이블로부터&amp;nbsp;참조무결성&amp;nbsp;제약&amp;nbsp;조건을&amp;nbsp;삭제한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;DROP&amp;nbsp;TABLESPACE&amp;nbsp;[TABLE_SPACE_NAME]&amp;nbsp;INCLUDING&amp;nbsp;CONTENTS&amp;nbsp;AND&amp;nbsp;DATAFILES;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;테이블&amp;nbsp;스페이스의&amp;nbsp;물리파일까지&amp;nbsp;삭제&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;유저 생성시 Tablespace 지정&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;CREATE USER [USER_NAME] IDENTIFIED BY [PASSWORD]
DEFAULT TABLESPACE [TABLESPACE_NAME]
TEMPORARY TABLESPACE [TABLESPACE_NAME];
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본(디폴트) 테이블스페이스, 임시(temp) 테이블스페이스를 명시해 줄 수 있다.&lt;/li&gt;
&lt;li&gt;기본 테이블스페이스란 해당 사용자로 로그인한 뒤 테이블과 같은 각종 데이터베이스 객체가 저장되는 테이블스페이스이다.&lt;/li&gt;
&lt;li&gt;임시 테이블스페이스는 해당 사용자가 사용하는 디폴트 임시 테이블스페이스를 말한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;실수로 dbf 파일을 삭제해버렸다면&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;shutdown immediate 시 테이블 스페이스를 찾을 수 없다고 에러가 난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해결 방법 1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블스페이스 오프라인 드롭을 하자&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;alter database datafile 'file path' offline drop;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;해결 방법 2&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;1. shutdown abort 로 강제 종료
2. startup nomount;
3. alter database mount;
4. alter database datafile 'file path' offline
&amp;rarr; control 파일 정보에 해당 dbf 파일 offline 상태 알려준다.
5. alter database open;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;amp;blogId=tawoo0&amp;amp;logNo=221547724506&quot;&gt;https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&amp;amp;blogId=tawoo0&amp;amp;logNo=221547724506&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://coding-factory.tistory.com/411&quot;&gt;https://coding-factory.tistory.com/411&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://itkevin.tistory.com/36&quot;&gt;https://itkevin.tistory.com/36&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://yoo-hyeok.tistory.com/136&quot;&gt;https://yoo-hyeok.tistory.com/136&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dreamingnote.tistory.com/entry/RESIZE로-TABLESPACE의-data-file-크기-변경&quot;&gt;https://dreamingnote.tistory.com/entry/RESIZE로-TABLESPACE의-data-file-크기-변경&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://bluehb.egloos.com/m/1507700&quot;&gt;http://bluehb.egloos.com/m/1507700&lt;/a&gt;&lt;/p&gt;</description>
      <category>Oracle/Oracle DataBase 관리</category>
      <category>DBA</category>
      <category>dbf</category>
      <category>dbf 파일 삭제</category>
      <category>online move</category>
      <category>관리</category>
      <category>삭제</category>
      <category>생성</category>
      <category>오라클</category>
      <category>추가</category>
      <category>테이블스페이스</category>
      <author>lusida0131</author>
      <guid isPermaLink="true">https://lusida-coding.tistory.com/174</guid>
      <comments>https://lusida-coding.tistory.com/174#entry174comment</comments>
      <pubDate>Sat, 15 Apr 2023 17:31:48 +0900</pubDate>
    </item>
    <item>
      <title>오라클 RAC 기동 절차서</title>
      <link>https://lusida-coding.tistory.com/172</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 오라클 종료&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;# 권한 : oracle1
# OS
1. (2호기) 오라클 SYS계정 로그인
sqlplus &quot;/ as sysdba&quot;
	# sqlplus
	1. 오라클 정지 
	shutdown immediate;
    
	2. SQLPLUS 종료
	exit;

# OS
2. (1호기) 오라클 SYS계정 로그인
sqlplus &quot;/ as sysdba&quot;
	# sqlplus
	1. 오라클 정지 
	shutdown immediate;
    
	2. SQLPLUS 종료
	exit;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. RAC CRS 정지 OS 재기동&lt;/h4&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;# 권한 : root
# OS
1. (2호기) 오라클 CRS 정지
crsctl stop crs

2. (2호기) OS 마운트 경로 정지
hastop -local

3. (2호기) OS 재기동
reboot

4. (1호기) 오라클 CRS 정지
crsctl stop crs

5. (1호기) OS 마운트 경로 정지
hastop -local

6. (1호기) OS 재기동
reboot
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. OS 기동 확인 후 CRS 가동&lt;/h4&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;# 권한 : root
# OS
1. (1호기) OS 경로 마운트 
hastart -local

2. (1호기) 오라클 CRS 기동
crsctl start crs

3. (2호기) OS 경로 마운트 
hastart -local

4. (2호기) 오라클 CRS 기동
crsctl start crs
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 오라클 기동&lt;/h4&gt;
&lt;pre class=&quot;sql&quot; data-ke-language=&quot;sql&quot;&gt;&lt;code&gt;# 권한 : oracle1
# OS
1. (1호기) SQLPLUS 접속
sqlplus &quot;/ as sysdba&quot;
	# sqlplus
	1. DB 마운트 
	startup mount;
    
	2. DB 마운트 상태 확인(선택)
	select status, database_status from v$instance;
    
	3. 마운트 DB OPEN 
	alter database open;
    
	4. DB 마운트 상태 확인(필수)
	select status, database_status from v$instance;
    
	5. DB 전자지갑 확인(선택)
	SELECT * FROM v$encrytion_wallet;
    
	6. DB 전자지갑 적용
	alter system set ENCRYPTION wallet open identified by &quot;key&quot;;
    
	7. DB 전자지갑 확인(필수)
	SELECT * FROM v$encrytion_wallet;
    
2. (2호기) SQLPLUS 접속
sqlplus &quot;/ as sysdba&quot;
	# sqlplus
	1호기와 방법 동일함&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Oracle/RAC</category>
      <category>Oracle</category>
      <category>RAC</category>
      <category>기동절차서</category>
      <category>데이터베이스</category>
      <category>오라클</category>
      <author>lusida0131</author>
      <guid isPermaLink="true">https://lusida-coding.tistory.com/172</guid>
      <comments>https://lusida-coding.tistory.com/172#entry172comment</comments>
      <pubDate>Tue, 14 Feb 2023 21:17:56 +0900</pubDate>
    </item>
    <item>
      <title>SQLD 기출 21회 개념 정리</title>
      <link>https://lusida-coding.tistory.com/171</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;비교 연산자 ANY(만족하는 값 하나만 있으면 됨)&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 76px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 19px;&quot;&gt;조건&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 19px;&quot;&gt;결과&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 19px;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 19px;&quot;&gt;1000 &amp;gt; ANY (500, 1000, 2000)&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 19px;&quot;&gt;TRUE&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 19px;&quot;&gt;ANY 값에 1000 보다 작은 500이 있으므로 TRUE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 19px;&quot;&gt;1000 = ANY (500, 1000, 2000)&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 19px;&quot;&gt;TRUE&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 19px;&quot;&gt;ANY 값에 같은 값 1000이 있으므로 TRUE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;text-align: center; height: 19px;&quot;&gt;2000 &amp;lt; ANY (500, 1000, 2000)&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 19px;&quot;&gt;FALSE&lt;/td&gt;
&lt;td style=&quot;text-align: center; height: 19px;&quot;&gt;ANY 값에 2000 보다 큰 값이 없으므로 FALSE&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;= ANY&lt;/td&gt;
&lt;td&gt;하나라도 만족하는 값이 있으면 결과를 리턴 (IN과 동일)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;gt; ANY&lt;/td&gt;
&lt;td&gt;값들 중 최소값 보다 크면 결과를 리턴&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;gt;= ANY&lt;/td&gt;
&lt;td&gt;값들 중 최소값 보다 크거나 같으면 결과를 리턴&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt; ANY&lt;/td&gt;
&lt;td&gt;값들 중 최대값 보다 작으면 결과를 리턴&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;= ANY&lt;/td&gt;
&lt;td&gt;값들 중 최대값 보다 작거나 같으면 결과를 리턴&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt;&amp;gt; ANY&lt;/td&gt;
&lt;td&gt;모든 값들 중 다른 값만 리턴 (값이 하나일 때만 가능, 사용X)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SOME은&amp;nbsp;ANY와&amp;nbsp;이름만 다를 뿐&amp;nbsp;동일한 기능이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ALL&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ALL(30, 50)은 30보다 작고 50보다 작아야 한다. 두 개의 값을 모두 만족해야 함&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;IN, NOT IN, EXISTS, NOT EXISTS&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IN에서 Null은 포함되지 않는다. IS Null로 비교해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NOT IN의 경우 조회를 할 때 값이 없으면 ROW가 나와야 할 것 같지만 Null 값이 하나라도 포함되어 있으면 Null을 비교하면서 NOT IN 조건 전체가 false가 되어버려 아무 ROW가 나오지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EXISTS는 존재하느냐 존재하지 않느냐의 여부만 체크하기 때문에 서브쿼리의 SELECT 리스트에는 등장하는 값과는 상관없이 서브쿼리의 결과로 반환되는 로우가 있느냐 없느냐만 중요한 것이다. 따라서 IN과 EXISTS는 동일한 결괏값을 출력한다. 반면 NOT IN과 NOT EXISTS는 결괏값이 다를 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;데이터 모델링&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;논리 모델링의 외래키는 물리 모델에서 반드시 구현되지 않는다.&lt;/li&gt;
&lt;li&gt;실제 데이터 베이스 구축 시 참고되는 모델은 물리적 데이터 모델링이다.&lt;/li&gt;
&lt;li&gt;개념 모델링에서 물리 모델링으로 가면서 더 구체적이며 개념 모델링이 가장 추상적이다.&lt;/li&gt;
&lt;li&gt;물리 &amp;rarr; 논리 &amp;rarr; 개념 갈수록 추상적&lt;/li&gt;
&lt;li&gt;데이터 모델링의 3가지 요소는 Thing, Attirbutes, Relationship이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;개념적 데이터 모델링&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추상화 수준이 높고 업무중심적이고 포괄적인 수준의 모델링 진행 전사적 데이터 모델링, EA 수립 시 많이 이용됨&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;엔터티, 인스턴스, 속성, 속성 값&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 속성은 하나의 속성값을 가지며 하나 이상의 속성값을 가지는 경우 정규화가 필요함&lt;/li&gt;
&lt;li&gt;한 개의 엔터티는 두 개 이상의 인스턴스의 집합이어야 한다.&lt;/li&gt;
&lt;li&gt;한 개의 엔터티는 두 개 이상의 속성을 갖는다.&lt;/li&gt;
&lt;li&gt;하나의 엔터티의 인스턴스는 다른 엔터티의 인스턴스 간의 관계인 Paring을 가진다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;function(3.46) 함수 결과 값 다른 경우&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FLOOR : 숫자보다 작거나 같은 최대 정수를 리턴 &amp;rarr; 3&lt;/li&gt;
&lt;li&gt;CEIL/CEILING : 숫자보다 크거나 같은 최소 정수를 리턴 &amp;rarr; 4&lt;/li&gt;
&lt;li&gt;TRUNC : 숫자를 소수 m 자리에서 잘라서 리턴 (m default : 0) &amp;rarr; 3&lt;/li&gt;
&lt;li&gt;ROUND : 숫자를 소수 m 자리에서 반올림하여 리턴 (m default : 0) &amp;rarr; 3&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;정규화&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1차 정규형&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 속성은 반드시 하나의 값을 가져야 한다. 즉, 반복 형태가 있어서는 안 된다.&lt;/li&gt;
&lt;li&gt;각 속성의 모든 값은 동일한 형식이어야 한다.&lt;/li&gt;
&lt;li&gt;각 속성들은 유일한 이름을 가져야 한다.&lt;/li&gt;
&lt;li&gt;레코드들은 서로 간에 식별 가능해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2차 정규형&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;식별자가 아닌 모든 속성들은 식별자 전체 속성에 완전 종속되어야 한다.&lt;/li&gt;
&lt;li&gt;이것을 물리 데이터 모델의 테이블로 말하면 기본키가 아닌 모든 칼럼들이 기본키에 종속적이어야 2차 정규형을 만족할 수 있다는 것이다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3차 정규형&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2차 정규형을 만족하고 식별자를 제외한 나머지 속성들 간의 종속이 존재하면 안 된다.&lt;/li&gt;
&lt;li&gt;이것이 3차 정규형을 만족하는 것이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-01-28 오후 4.50.59.png&quot; data-origin-width=&quot;1396&quot; data-origin-height=&quot;740&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P5vUG/btrXn7g5Cxk/UEHmckgUVxwi9cxkL9NNpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P5vUG/btrXn7g5Cxk/UEHmckgUVxwi9cxkL9NNpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P5vUG/btrXn7g5Cxk/UEHmckgUVxwi9cxkL9NNpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP5vUG%2FbtrXn7g5Cxk%2FUEHmckgUVxwi9cxkL9NNpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;794&quot; height=&quot;421&quot; data-filename=&quot;스크린샷 2023-01-28 오후 4.50.59.png&quot; data-origin-width=&quot;1396&quot; data-origin-height=&quot;740&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ROLLUP&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ROLLUP구문은 GROUP BY 절과 같이 사용되며, GROUP BY절에 의해서 그룹 지어진 집합 결과에 대해서 좀 더 상세한 정보를 반환하는 기능을 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SELECT절에 ROLLUP을 사용함으로써 보통의 SELECT 된 데이터와 그 데이터의 총계를 구할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;CUBE&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;SQL&amp;gt; SELECT b.dname, a.job, SUM(a.sal) sal, COUNT(a.empno) emp_count
     FROM emp a, dept b
     WHERE a.deptno = b.deptno
     GROUP BY CUBE(b.dname, a.job)

DNAME      JOB               SAL  EMP_COUNT
---------- ---------- ---------- ----------
ACCOUNTING  CLERK            1300          1
ACCOUNTING  MANAGER          2450          1
ACCOUNTING  PRESIDENT        5000          1
ACCOUNTING                   8750          3 --&amp;gt; ACCOUNTING 부서의 직업별 급여의 총계와 사원 수.
RESEARCH    ANALYST          6000          2
RESEARCH    CLERK            1900          2
RESEARCH    MANAGER          2975          1
RESEARCH                    10875          5 --&amp;gt; RESEARCH 부서의 직업별 급여의 총계와 사원 수.
SALES       MANAGER         28500          1
SALES       SALESMAN         4000          3
SALES                       32500          4 --&amp;gt; SALES 부서의 직업별 급여 총계와 사원수.
            ANALYST          6000          2
            CLERK            3200          3
            MANAGER         33925          3
            PRESIDENT        5000          1
            SALESMAN         4000          3
                            52125         12  --&amp;gt; 직업별로 급여의  총계와 사원 수.
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CUBE는 Cross-Tab에 대한 Summary를 추출하는 데 사용된다&lt;/li&gt;
&lt;li&gt;즉 ROLLUP에 의해 나타 내어지는 Item Total값과 Column Total값을 나타 낼 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Grouping 함수&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: pseudo column (의사컬럼 : 실제로는 존재하지 않으나 특수목적으로 사용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GROUPING&amp;nbsp;함수는&amp;nbsp;ROLLUP,&amp;nbsp;CUBE에 모두 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GROUPING&amp;nbsp;함수는 해당 Row가&amp;nbsp;GROUP BY에 의해서 산출된 Row인 경우에는 0을 반환하고,&amp;nbsp;ROLLUP이나&amp;nbsp;CUBE에 의해서 산출된 Row인 경우에는 1을 반환하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 해당 Row가 결과집합에 의해 산출된 Data 인지,&amp;nbsp;ROLLUP이나&amp;nbsp;CUBE에 의해서 산출된 Data 인지를 알 수 있도록 지원하는 함수이다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;GROUP BY ROLLUP(DNAME,JOB)  
 = GROUP BY DNAME,JOB
	UNION ALL
	GROUP BY DNAME
	UNION ALL
	모든 집합 그룹 결과

GROUP BY GROUPING SET(DNAME,JOB)
= GROUP BY DNAME
	UNION ALL
	GROUP BY JOB

GROUP BY CUBE(DNAME,JOB)
 = GROUP BY DNAME,JOB
	UNION ALL
	GROUP BY DNAME
	UNION ALL
	GROUP BY JOB
	UNION ALL
	모든 집합 그룹 결과
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ANSI SQL JOIN&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ANSI SQL에서 조인 조건절(ON 절)에 사용된 조건절은 조인 전 조건으로 작용한다. ON 절 이후 WHERE 절에서 쓰인 조건절은 조인 후 조건절로 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조인 조건과 조회 조건이 분리되어야 하므로 조회 조건은 WHERE 절로 분리되어야 함&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;SQL Server vs Oracle&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL SERVER의 IDENTITY로 지정된 칼럼에는 값을 넣으면 에러가 남 ORACLE의 CHECK 조건을 만족하지 못할 경우 에러가 나나 NULL 은 무시됨(Null Row Insert 가능)&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Hash Join&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Hash Join 은 Non Equal Join 은 불가능함. Equal Join 만 가능함&lt;/li&gt;
&lt;li&gt;사전 Sorting 작업이 필요한 Join 알고리즘은 Sort Merge Join 임&lt;/li&gt;
&lt;li&gt;각 테이블에 인덱스가 반드시 필요한 것은 아니다.&lt;/li&gt;
&lt;li&gt;일반적으로 작은 테이블을 Memory에 올리는 선행 테이블로 사용한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;SQL 수행 순서&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FROM &amp;rarr; WHERE &amp;rarr; GROUP BY &amp;rarr; HAVING &amp;rarr; SELECT &amp;rarr; ORDER BY&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;문자 비교&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SAPCE를 추가하여 길이를 맞춰 비교하는 방법은 CHAR 타입인 경우임&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;SQL 결합 함수&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Oracle의 결합 함수 : CONCAT, /, ||&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL Server : +&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;SQL Server TOP vs Oracle Rownum&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TOP (Expression) [PERCENT] [WITH TIES]&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;WITH TIES : ORDER BY 조건 기준으로 TOP N의 마지막 행으로 표시되는 추가 행의 데이터가 같을 경우 N + 동일 정렬 순서 데이터를 추가 반환하도록 지정하는 옵션 (마지막 기준 공통일 경우 모두 출력)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ROWNUM &amp;lt; 4의 의미는 3건까지 출력이므로 TOP(3) 임 WITH TIES를 사용할 경우 동일 데이터가 있을 때 추가 건수가 출력되는 현상이 가능함&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ANSI Join SQL&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NATURAL JOIN에서 사용된 열은 식별자를 가질 수 없음. 즉 EMP.DEPTNO 와 같이 OWNER 명을 사용하면 에러가 난다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;엔터티 기준&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;엔터티는 사람, 장소, 물건, 사건, 개념 등의 명사에 해당한다.&lt;/li&gt;
&lt;li&gt;엔터티는 업무상 관리가 필요한 관심사에 해당한다.&lt;/li&gt;
&lt;li&gt;엔터티는 저장이 되기 위한 어떤 것(Thing)이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;계층형 SQL&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CONNECT_BY_ISLEAF : 전개 과정에서 해당 데이터가 리프 데이터면 1, 아니면 0&lt;/li&gt;
&lt;li&gt;CONNECT_BY_ISCYCLE : 전개 과정에서 자식을 갖는데, 해당 데이터가 조상으로 존재하면 1, 그렇지 않으면 0 여기서 조상이란 자신으로부터 루트까지의 경록에 존재하는 데이터를 말함&lt;/li&gt;
&lt;li&gt;SYS_CONNECT_BY_PATH : 하위 레벨의 칼럼까지 모두 표시해 줌 (구분자 지정 가능)&lt;/li&gt;
&lt;li&gt;CONNECT_BY_ROOT : Root 노드의 정보를 표시&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;RANGE BETWEEN start_point AND end_point&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;start_point는 end_point와 같거나 작은 값이 들어감&lt;/li&gt;
&lt;li&gt;Default값은 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW&lt;/li&gt;
&lt;li&gt;UNBOUNDED PRECEDING : start_point만 들어갈 수 있으며, 파티션의 first row&lt;/li&gt;
&lt;li&gt;UNBOUNDED FOLLOWING : end_point만 들어갈 수 있으며, 파티션의 last row&lt;/li&gt;
&lt;li&gt;CURRENT ROW : start, end_point 둘 다 가능. 윈도우는 CUREENT ROW에서 start 하거나 end 함&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;권한&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DBA 권한은 SYSTEM, SYS 등의 상위 유저와 그에 해당하는 권한을 가진 경우 부여 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블의 소유자는 해당 테이블의 DML 권한을 다른 유저에게 부여할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;MAX(LEVEL)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계층형 쿼리에서 최대 계층의 수를 구하기 위한 문제. MAX (LEVEL)을 사용하여 최대 계층 수를 구함&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;NOT EXISTS &amp;rarr; OUTER JOIN&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NOT EXISTS의 OUTER JOIN으로의 변형을 묻는 문제로 NOT EXISTS는 OUTER JOIN으로 변경 시 NOT NULL COLUMN에 대한 IS NULL 체크로 NOT EXISTS를 구현가능하다&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;참조&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://gent.tistory.com/287&quot;&gt;https://gent.tistory.com/287&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://icty.tistory.com/entry/Oracle-EXISTS-연산자의-활용&quot;&gt;https://icty.tistory.com/entry/Oracle-EXISTS-연산자의-활용&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://androphil.tistory.com/166&quot;&gt;https://androphil.tistory.com/166&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQLD_예상문제해답&lt;/p&gt;</description>
      <category>자격증/SLQD, SQLP</category>
      <category>21회</category>
      <category>SQL</category>
      <category>SQLD</category>
      <category>SQLD 개념</category>
      <category>SQLD 기출</category>
      <author>lusida0131</author>
      <guid isPermaLink="true">https://lusida-coding.tistory.com/171</guid>
      <comments>https://lusida-coding.tistory.com/171#entry171comment</comments>
      <pubDate>Sat, 28 Jan 2023 18:04:57 +0900</pubDate>
    </item>
    <item>
      <title>Oracle RMAN 테이블 복구 3부</title>
      <link>https://lusida-coding.tistory.com/170</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;테이블 복구는 FLASHBACK을 사용하는 게 편리하고 간단하다. FLASHBACK을 사용하려면 undo_retension 파라미터와 undo 테이블 스페이스의 충분한 공간이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FLASHBACK은 데이터나 테이블이 최근에 삭제되었을 때만 유용하게 사용이 가능하다. 이런 단점을 보안하는 방법이 RMAN을 이용한 복구이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;RMAN 테이블 단위 복구&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RMAN을 이용한 복구는 오래된 데이터나 테이블을 삭제했을 때 유용하게 사용한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Auxiliary DB(보조 DB) 생성 및 시점 복구&lt;/li&gt;
&lt;li&gt;테이블 Datapump Export Auxiliary DB&lt;/li&gt;
&lt;li&gt;테이블 Datapump Import STR DB&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RMAN을 테이블을 복구하기 위해 Auxiliary DB를 따로 만들어야 되기 때문에 운영시스템의 CPU, 메모리, 디스크 공간을 많이 사용해서 정말 필요한 상황이 아니면 테스트 DB를 따로 만들어서 거기에 복구하고 데이터를 옮기는 게 실무에서는 더 적절하다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;RMAN 테이블 복구 제약조건&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SYS 계정 테이블 복구 불가&lt;/li&gt;
&lt;li&gt;SYSTEM 테이블 복구 불가&lt;/li&gt;
&lt;li&gt;SYSAUX 테이블 복구 불가&lt;/li&gt;
&lt;li&gt;테이블 NOT NULL 제약 조건 복구 불가(REMAP)&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;NLS_DATE_FORMAT 변경&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;export NLS_DATE_FORMAT=&quot;YYYY/MM/DD(DY) HH24:MI:SS&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;rman_backup.rcv 백업 파일 생성&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;cat &amp;lt;&amp;lt; EOF &amp;gt; /home/oracle/script/rman_backup.rcv
run {
  allocate channel ch1 device type disk format '/RMANBKP/str_%T_full_%U';
  allocate channel ch2 device type disk format '/RMANBKP/str_%T_full_%U';
  allocate channel ch3 device type disk format '/RMANBKP/str_%T_full_%U';
  allocate channel ch4 device type disk format '/RMANBKP/str_%T_full_%U';
  crosscheck archivelog all;
  delete noprompt archivelog all completed before 'trunc(sysdate) -1';
  backup as compressed backupset database tag 'DB_FULL_BACKUP' plus archivelog tag 'ARCHIVELOG';
  backup current controlfile tag 'CONTROLFILE' format '/RMANBKP/str_%T_cont_%U';
  backup spfile tag 'SPFILE' format '/RMANBKP/str_%T_para_%U';
  crosscheck backup;
  delete noprompt backup completed before 'trunc(sysdate) -1';
  release channel ch1;
  release channel ch2;
  release channel ch3;
  release channel ch4;
}

run {
begin
for i in 1..10 loop
  EXECUTE IMMEDIATE 'ALTER SYSTEM SWITCH LOGFILE';
end loop;
end;
/
}
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;백업 실행&lt;/h4&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;rman target /

@/home/oracle/script/rman_backup.rcv

list backup summary;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;DB 테이블 복구&lt;/h4&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;-- DB 시간 확인(복구 시간 확인)
SELECT TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI:SS') AS &quot;RECO_TIME&quot; FROM DUAL;
-- &amp;lt;&amp;lt;DB 시간 확인(복구 시간 확인)&amp;gt;&amp;gt;을 확인하고 until time 뒤에 시간을 넣어주세요.
rman target /

-- PARALLEL 4 변경
CONFIGURE DEVICE TYPE DISK PARALLELISM 4;

-- RMAN TABLE 복구
recover table STR.&quot;TEST&quot; until time &quot;TO_DATE('2023/01/12 12:53:47','YYYY/MM/DD HH24:MI:SS')&quot; auxiliary  destination  '/RMANBKP'
datapump destination '/RMANBKP' dump file 'TEST_20230112.dmp';
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;RMAN TABLE RENAME 복구&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;recover table STR.&quot;TEST&quot; until time &quot;TO_DATE('2023/01/12 12:53:47','YYYY/MM/DD HH24:MI:SS')&quot; auxiliary  destination  '/RMANBKP'
remap TABLE 'STR'.'TEST':'TEST_20230112_1253'
datapump destination '/RMANBKP' dump file 'TEST_20230112.dmp';

-- PARALLEL 초기화
CONFIGURE DEVICE TYPE DISK CLEAR;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;PITR 관련 로그 파일 삭제&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;## Linux oracle 계정 실행
find /RMANBKP \\( -name &quot;*PITR_STR*&quot; -o -name &quot;STR&quot; \\) | xargs rm -rf
find $ORACLE_BASE/admin -name &quot;*pitr_STR&quot; | xargs rm -rf
find $ORACLE_BASE/diag/rdbms -name &quot;*pitr_str&quot; | xargs rm -rf
find $ORACLE_HOME/dbs \\( -name &quot;hc*dat&quot; -o -name &quot;spfile*ora&quot; -o -name &quot;*PITR_STR&quot; \\) -not \\( -name &quot;hc_STR.dat&quot; -o -name &quot;spfileSTR.ora&quot; \\) | xargs rm -f

## 삭제 확인
find $ORACLE_BASE \\( -name &quot;*pitr_str*&quot; -o -name &quot;*pitr_STR*&quot; -o -name &quot;*PITR_STR&quot; \\)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;crontab 자동 백업 삭제&lt;/h4&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;crontab -r
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;참조&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=5f8H6c1u3-w&amp;amp;t=603s&quot;&gt;https://www.youtube.com/watch?v=5f8H6c1u3-w&amp;amp;t=603s&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=5f8H6c1u3-w&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/cQzJlf/hyRm4PoM0K/CByt31iT8PC0nTdol4gUw1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/5f8H6c1u3-w&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Oracle/Oracle DataBase 관리</category>
      <category>DB</category>
      <category>DB보다</category>
      <category>Oracle</category>
      <category>rman</category>
      <category>오라클</category>
      <category>테이블 복구</category>
      <author>lusida0131</author>
      <guid isPermaLink="true">https://lusida-coding.tistory.com/170</guid>
      <comments>https://lusida-coding.tistory.com/170#entry170comment</comments>
      <pubDate>Sat, 21 Jan 2023 18:54:37 +0900</pubDate>
    </item>
    <item>
      <title>Oracle RMAN 복구는 예술이다. 2부</title>
      <link>https://lusida-coding.tistory.com/169</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;RMAN 데이터 파일 복구 명령어 순서&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DB SHUTDOWN&lt;/li&gt;
&lt;li&gt;STARTUP MOUNT&lt;/li&gt;
&lt;li&gt;RESTORE DATAFILE&lt;/li&gt;
&lt;li&gt;RECOVER DATAFILE&lt;/li&gt;
&lt;li&gt;DB OPEN&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;RMAN 전체 복구 명령어 순서&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DB SHUTDOWN&lt;/li&gt;
&lt;li&gt;STARTUP NOMOUNT&lt;/li&gt;
&lt;li&gt;RESTORE CONTROLFILE&lt;/li&gt;
&lt;li&gt;STARTUP MOUNT&lt;/li&gt;
&lt;li&gt;RESTORE DATABASE&lt;/li&gt;
&lt;li&gt;RECOVER DATABASE&lt;/li&gt;
&lt;li&gt;DB OPEN RESETLOGS&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;전체 백업&lt;/h4&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;-- 전체 백업 파일
rman target /

list backup summary;

## 아카이브 로그 파일 확인
ls -l /ARC_STR

## 아카이브 로그 파일 생성
## ALTER SYSTEM SWITCH LOGFILE 10회 수행
sqlplus / as sysdba &amp;lt;&amp;lt;EOF
begin
for i in 1..10 loop
  EXECUTE IMMEDIATE 'ALTER SYSTEM SWITCH LOGFILE';
end loop;
end;
/
exit
EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;데이터 파일 복구&lt;/h4&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;## 리스너 종료
lsnrctl stop 

-- DB 접속
sqlplus / as sysdba

-- DB 종료
shutdown&amp;nbsp;abort

startup mount

-- rman 접속
rman target /

REPORT SCHEMA;

RESTORE DATAFILE 3,5;
RECOVER DATAFILE 3,5;

ALTER&amp;nbsp;DATABASE&amp;nbsp;OPEN

REPORT SCHEMA;

## sysaux 데이터 파일 확인
## linux 수행
ls -lh /oracle/app/oracle/oradata/STR
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;DB 전체 복구&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;sqlplus / as sysdba

shutdown&amp;nbsp;abort
startup nomount

-- rman 접속
-- /RMANBKP/str_20230108_cont_541hdsi2_1_1 --&amp;gt; 최근 백업한 컨트롤 파일로 변경해주세요.

rman target /

host 'ls -l /RMANBKP/str*cont*';

RESTORE CONTROLFILE FROM '/RMANBKP/str_20230108_cont_541hdsi2_1_1';

host 'ls -l /oracle/app/oracle/oradata/STR';

ALTER DATABASE MOUNT;

CONFIGURE DEVICE TYPE DISK PARALLELISM 4;

RESTORE DATABASE;
RECOVER DATABASE;
host 'ls -l /ARC_STR';

ALTER DATABASE OPEN RESETLOGS;

-- 정상적으로 백업 되었는지 확인
REPORT SCHEMA;

CONFIGURE DEVICE TYPE DISK CLEAR;

## 리스너 시작
lsnrctl start
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;리스너 빠르게 등록하는 팁&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lsnrctl start 명령어 후 SQLPlus에 접속하여 alter system register&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;참고&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=BTd-wVIjZI8&amp;amp;t=627s&quot;&gt;https://www.youtube.com/watch?v=BTd-wVIjZI8&amp;amp;t=627s&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=BTd-wVIjZI8&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/h1WQd/hyRkj8GXcT/513I1oO3lNRpF6SqryE7BK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/BTd-wVIjZI8&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Oracle/Oracle DataBase 관리</category>
      <category>19c</category>
      <category>DB</category>
      <category>DB보다</category>
      <category>rman</category>
      <category>백업</category>
      <category>복구</category>
      <category>오라클</category>
      <author>lusida0131</author>
      <guid isPermaLink="true">https://lusida-coding.tistory.com/169</guid>
      <comments>https://lusida-coding.tistory.com/169#entry169comment</comments>
      <pubDate>Thu, 19 Jan 2023 21:01:04 +0900</pubDate>
    </item>
    <item>
      <title>Oracle RMAN 백업은 기술이다. 1부</title>
      <link>https://lusida-coding.tistory.com/168</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;RMAN(Recovery Manager)?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오라클에서 제공하는 백업, 복구 유틸리티이다. 예전에는 Begin End 백업을 많이 사용했지만, 요즘 회사 중요 메인 시스템의 경우 오라클을 RAC의 ASM을 많이 사용하는 추세라 RMAN을 이용한 백업은 필수가 되어가고 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;RMAN의 이점&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;성능
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;백업을 parallel로 병렬 처리가 가능하다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;압축
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;백업 압축률을 설정해 중복된 데이터가 많다면 백업 용량을 줄일 수 있다.&lt;/li&gt;
&lt;li&gt;기본 압축 옵션은 basic이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;증분 백업
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;db의 데이터가 50에서 100 테라가 넘는다면 Incremental 백업을 이용해 하루에 증가되는 데이터만 백업할 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;암호화
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;암호화를 해서 백업이 가능하다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;백업하는 내용&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Data File&lt;/li&gt;
&lt;li&gt;Control File&lt;/li&gt;
&lt;li&gt;Parameter File&lt;/li&gt;
&lt;li&gt;Archived Redo log&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;백업 계획&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1주일에 한번 월요일에 Full Backup 화수목금토일 Incremental Backup을 한다.&lt;/li&gt;
&lt;li&gt;스토리지 공간이 넉넉하다면 매일 Full Backup을 하는 것을 추천한다.&lt;/li&gt;
&lt;li&gt;백업 성능을 좋게 하려면 디스크 I/O 성능이 좋은 스토리지가 필요하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;RMAN 실습&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;디렉터리 생성 /ARC_STR, /RMANBKP&lt;/li&gt;
&lt;li&gt;Archive 모드 변경&lt;/li&gt;
&lt;li&gt;RMAN 백업&lt;/li&gt;
&lt;li&gt;백업 자동화&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 아카이브 &amp;amp; RMAN BACKUP 디렉터리 생성(root 계정)&lt;/h4&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;## 아카이브 디렉터리 생성
mkdir /ARC_STR
chown oracle.dba /ARC_STR

## RMAN BACKUP 디렉터리 생성
mkdir -p /RMANBKP/control
chown -R oracle.dba /RMANBKP

ls -ld /RMANBKP /ARC_STR
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 디스크 읽기 성능 테스트&lt;/h4&gt;
&lt;pre class=&quot;gradle&quot;&gt;&lt;code&gt;fdisk -l | grep 'Disk /dev/sd'
hdparm -t /dev/sda
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 아키이브 로그 파라미터 변경, 아카이브 로그 모드 변경&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;ALTER SYSTEM SET log_archive_dest='/ARC_STR' SCOPE=SPFILE;
ALTER SYSTEM SET log_archive_format='ARCH_STR_%r_%t_%s.ARC' SCOPE=SPFILE;

-- 아카이브 로그 모드 변경
shutdown immediate;
startup mount;
alter database archivelog;

archive log list;
alter database open;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. RMAN 접속, DB 전체 정보, DB 파일 상태 점검&lt;/h4&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;-- rman 접속
rman target /

-- DB 전체 정보
report schema;

-- DB 파일 상태 점검
validate database;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;validate database는 데이터베이스 안에 있는 블록들에 손상된 블록이 있는지 확인하는 방법이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. RMAN 백업 설정&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;-- 2일 전의 백업까지 
rman target /

CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 2 DAYS;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/RMANBKP/control/control_%F';
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/RMANBKP/control/snapcontrol_STR.f';

-- rman 설정 원복
CONFIGURE RETENTION POLICY CLEAR;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK CLEAR;
CONFIGURE SNAPSHOT CONTROLFILE NAME CLEAR;

-- rman 설정 확인
show all;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6. RMAN 백업&lt;/h4&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- %T (YYYYMMDD) 년월일 포멧
-- %U 시스템 생성 고유 파일 이름 8자리
-- 전체 백업
backup database format '/RMANBKP/STRDB2_full_n_bkp_%T_%U';

-- 전체 백업 + 압축
backup as compressed backupset database format '/RMANBKP/STRDB2_full_c_bkp_%T_%U';

-- 백업 상태 확인
list backup;
list backup summary;

host 'ls -lh /RMANBKP';
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;7. ARCHIVE LOG &amp;amp; BACKUP 삭제(rman에서 수행)&lt;/h4&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;run {
  delete noprompt archivelog all;
  delete noprompt backup;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;8. channel 4개로 Parallel 백업(rman에서 수행)&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;run {
  allocate channel ch1 device type disk format '/RMANBKP/str_%T_full_%U';
  allocate channel ch2 device type disk format '/RMANBKP/str_%T_full_%U';
  allocate channel ch3 device type disk format '/RMANBKP/str_%T_full_%U';
  allocate channel ch4 device type disk format '/RMANBKP/str_%T_full_%U';
  crosscheck archivelog all;
  delete noprompt archivelog all completed before 'trunc(sysdate) -1';
  backup as compressed backupset database tag 'DB_FULL_BACKUP' plus archivelog tag 'ARCHIVELOG';
  backup current controlfile tag 'CONTROLFILE' format '/RMANBKP/str_%T_cont_%U';
  backup spfile tag 'SPFILE' format '/RMANBKP/str_%T_para_%U';
  crosscheck backup;
  delete noprompt backup completed before 'trunc(sysdate) -1';
  release channel ch1;
  release channel ch2;
  release channel ch3;
  release channel ch4;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;9. Linux Shell을 이용한 DB 전체 자동백업과 삭제 스크립트&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;## rman 백업 로그 디렉터리 생성
## oracle 계정
cd /home/oracle
mkdir -p /home/oracle/oraclelog

## rman 백업 스크립트 디렉터리 생성
## oracle 계정
mkdir -p /home/oracle/script

## 임시 nfsbackup 디렉터리 생성
## root 계정
mkdir /nfsbackup
chown oracle.dba /nfsbackup
ls -ld /nfsbackup
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nfsbackup는 실제 운영에서는 백업 서버를 연결해서 원격 디렉터리를 만들지만 테스트할 때는 백업 서버가 없으니 있다고 가정하고 실행한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;10. rman 백업 Shell 스크립트 생성(vi 편집기 사용 안하고 파일 만드는 법)&lt;/h4&gt;
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;-- Channel을 많이 사용하면 DB 전체 SQL 성능 지연 발생할수 있으니 주의 필요!!!
cat &amp;lt;&amp;lt; \\FILE &amp;gt; /home/oracle/script/rman_backup.sh
#!/bin/bash

################################################################################
#  RMAN FULL BACKUP SCRIPT
#    V 1.0    CPU 8Core 권장 스크립트 (Channel 4개 사용)  DBBODA
#                  Channel을 많이 사용하면 DB 전체 SQL 성능 지연 발생할수 있으니 주의 필요!!!
################################################################################
export ORACLE_HOME=/oracle/app/oracle/product/19.0.0.0/db_1
export ORACLE_SID=STR
export PATH=$ORACLE_HOME/bin:$PATH
export DATE=`date +%Y%m%d`
export YDATE=`date -d '1 day ago' '+%Y%m%d'`
export HOSTNAME=`hostname`
export NLS_DATE_FORMAT=&quot;YYYY/MM/DD(DY) HH24:MI:SS&quot;

rman log=/home/oracle/oraclelog/${HOSTNAME}_rman_backup_${DATE}.log &amp;lt;&amp;lt; EOF
connect target /
run {
  allocate channel ch1 device type disk format '/RMANBKP/str_%T_full_%U';
  allocate channel ch2 device type disk format '/RMANBKP/str_%T_full_%U';
  allocate channel ch3 device type disk format '/RMANBKP/str_%T_full_%U';
  allocate channel ch4 device type disk format '/RMANBKP/str_%T_full_%U';
  crosscheck archivelog all;
  delete noprompt archivelog all completed before 'trunc(sysdate) -1';
  backup as compressed backupset database tag 'DB_FULL_BACKUP' plus archivelog tag 'ARCHIVELOG';
  backup current controlfile tag 'CONTROLFILE' format '/RMANBKP/str_%T_cont_%U';
  backup spfile tag 'SPFILE' format '/RMANBKP/str_%T_para_%U';
  crosscheck backup;
  delete noprompt backup completed before 'trunc(sysdate) -1';
  release channel ch1;
  release channel ch2;
  release channel ch3;
  release channel ch4;
}
exit
EOF

## RMAN Backup zip
cd /RMANBKP
zip -r str_full_backup_${YDATE}.zip str_${YDATE}* control/

## Archive zip
cd /ARC_STR
export ARCHFILE=`ls -l --time-style=&quot;+%Y%m%d&quot; | grep ${YDATE} | awk '{print $7}'`
zip ${HOSTNAME}_arc_backup_${YDATE}.zip ${ARCHFILE}

## NFS Backup
cp /RMANBKP/str_full_backup_${YDATE}.zip /nfsbackup/str_full_backup_${YDATE}.zip
cp /ARC_STR/${HOSTNAME}_arc_backup_${YDATE}.zip /nfsbackup/${HOSTNAME}_arc_backup_${YDATE}.zip

## Remove zip 
rm -f /RMANBKP/str_full_backup_${YDATE}.zip
rm -f /ARC_STR/${HOSTNAME}_arc_backup_${YDATE}.zip

## Remove nfs Backup file
export WDATE=`date -d '8 day ago' '+%Y%m%d'`
find /nfsbackup/ -name &quot;*${WDATE}.zip&quot; -exec rm -f {} \\;

FILE
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RMAN Backup zip은 변수 값으로 압축하고 Archive zip도 동일하게 압축한다. NFS 디렉터리에서 전체 백업한 압축 파일, 아카이브 로그 압축 파일을 cp로 복사하고 rm 명령으로 RMAN 백업 디렉터리와 아카이브 디렉터리 zip 압축 파일을 삭제한다. 추가로 nfs 백업 디렉터리의 8일 전 파일을 자동으로 삭제하게 만들었다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;11. shell 스크립트 권한 변경, crontab 추가&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;## shell 스크립트 권한 변경
## oracle 계정
cd /home/oracle/script
chmod 755 rman_backup.sh

--crontab 추가
crontab -e
## RMAN FULL BACKUP
00 02 * * * /home/oracle/script/rman_backup.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;참고&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=PA9VIjbYd4w&amp;amp;t=901s&quot;&gt;https://www.youtube.com/watch?v=PA9VIjbYd4w&amp;amp;t=901s&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PA9VIjbYd4w&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bVdiRF/hyRfImcZen/pa2VhIkpNs4sYub2SwZjw0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PA9VIjbYd4w&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Oracle/Oracle DataBase 관리</category>
      <category>DBA</category>
      <category>DB보다</category>
      <category>rman</category>
      <category>백업</category>
      <category>오라클</category>
      <category>오라클 관리</category>
      <category>증분 백업</category>
      <author>lusida0131</author>
      <guid isPermaLink="true">https://lusida-coding.tistory.com/168</guid>
      <comments>https://lusida-coding.tistory.com/168#entry168comment</comments>
      <pubDate>Wed, 11 Jan 2023 20:34:50 +0900</pubDate>
    </item>
    <item>
      <title>오라클 FLASHBACK을 이용한 빠른 복구 방법</title>
      <link>https://lusida-coding.tistory.com/167</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;FlashBack&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오라클 DB 데이터를 매우 빠른 속도로 복구하는 기술이다. 사용자 실수로 인한 데이터 오류, 테이블 삭제, 또는 데이터베이스 전체에 대해 문제가 발생했을 때 매우 빠른 속도로 복구할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;FlashBack이 필요한 이유&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 쇼핑몰을 운영하는 회사에서 인플레이션으로 인해 사장님이 전체 상품에 대해 5% 인상을 이대리에게 요청한다. 이대리는 상품 테이블을 update 명령어로 5% 인상해야 하는데 실수로 50% 인상을 해버렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FlashBack을 사용안하던 과거에는 실수로 상품 table을 삭제했을 때는 EXP/IMP, DATAPUMP, RMAN이 있는데 EXP/IMP, DATAPUMP는 원하는 시점으로 복구하기가 어렵고 RMAN은 가능하지만 데이터 크기가 크면 복구하는데 오래 걸릴 수 있다. 이럴 때 FlashBack table 기능을 이용하면 간단하게 복구할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;FRA(Fast Recovery Area)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빠르게 복구할 수 있는 공간을 의미하고 백업 데이터 파일들을 통합 관리하는 기능을 제공한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;테이블, 데이터 삭제 복구&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. find 명령어로 spfile위치를 확인한다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;find $ORACLE_HOME -name spfile*
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. spfile 백업&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;cp spfileSTR.ora spfileSTR.ora_20221231
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. UNDO RETENTION 파라미터 변경&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;-- 1Day = 86400sec
show parameter undo_retention
alter system set undo_retention=86400 scope=spfile;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. DB 종료, 재시작&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;-- DB 종료
SHUTDOWN IMMEDIATE
-- DB 시작
STARTUP
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Test 테이블, 데이터 생성 후 삭제&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- 테이블 생성
CREATE TABLE STR.FRA_TEST
(
  FRA_NO  VARCHAR2(20)
);
-- 데이터 1건 입력
INSERT INTO STR.FRA_TEST VALUES(TO_CHAR(SYSDATE,'YYYYMMDD HH24MISS'));
COMMIT;
-- 데이터 확인
SELECT * FROM STR.FRA_TEST;
-- 테이블 삭제
DROP TABLE STR.FRA_TEST;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. FLASHBACK을 이용한 테이블 복구&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;FLASHBACK TABLE username.table_name TO BEFORE DROP;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;테이블은 남아있고 데이터만 삭제 복구&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Test 테이블, 데이터 생성 후 삭제&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- 테이블 생성
CREATE TABLE STR.FRA_TEST
(
  FRA_NO  VARCHAR2(20)
);
-- 데이터 5건 입력
INSERT INTO STR.FRA_TEST VALUES('1');
INSERT INTO STR.FRA_TEST VALUES('2');
INSERT INTO STR.FRA_TEST VALUES('3');
INSERT INTO STR.FRA_TEST VALUES('4');
INSERT INTO STR.FRA_TEST VALUES('5');
COMMIT;
-- INSERT 완료 시간 확인
-- 데이터 복구 할떄는 +10초 정도 여유를 두고 복구를 진행한다. 
SELECT TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI:SS') AS &quot;COMMIT_TIME&quot; FROM DUAL;
-- 데이터 전체 삭제
DELETE FROM STR.FRA_TEST;
COMMIT;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 데이터 복구&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- 데이터 전체 복구
-- (INSERT 완료 시간 확인) 쿼리에 COMMIT_TIME을 확인한다. 
-- 데이터 복구 할떄는 +10초 정도 여유를 두고 복구를 진행한다. (2022/12/19 10:00:00)
INSERT INTO STR.FRA_TEST
SELECT * FROM STR.FRA_TEST
AS OF TIMESTAMP TO_TIMESTAMP('2022/12/19 10:00:00','YYYY/MM/DD HH24:MI:SS');
COMMIT;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;부분 데이터 삭제 복구&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Test 데이터 삭제&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- 부분 데이터 삭제
-- FRA_NO   3   데이터 삭제
DELETE FROM STR.FRA_TEST
WHERE FRA_NO = '3';
COMMIT;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 부분 데이터 복구(원본 테이블은 두고 복제 테이블을 만든다.)&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- CTAS를 이용한 FRA_TEST_20221219_1000 테이블 생성 및 데이터 복구
-- (INSERT 완료 시간 확인) 쿼리에 COMMIT_TIME을 확인한다. 
-- 데이터 복구 할떄는 +10초 정도 여유를 두고 복구를 진행한다. (2022/12/19 10:00:00)
CREATE TABLE STR.FRA_TEST_20221219_1000
AS
SELECT * FROM STR.FRA_TEST
AS OF TIMESTAMP TO_TIMESTAMP('2022/12/19 10:00:00','YYYY/MM/DD HH24:MI:SS');

-- 데이터 1건 복구 확인
SELECT * FROM * STR.FRA_TEST;

-- 테이블 삭제
DROP TABLE STR.FRA_TEST_20221219_1000 PURGE;
DROP TABLE STR.FRA_TEST PURGE;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 복제 테이블에서 원본 테이블과 빠진 데이터를 확인해서 Insert&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- 데이터 1건 복구 SQL
INSERT INTO STR.FRA_TEST
SELECT FRA_NO
FROM STR.FRA_TEST_20221219_1000
WHERE FRA_NO NOT IN (
	SELECT FRA_NO FROM STR.FRA_TEST);
COMMIT;     
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;데이터베이스 전체 복구&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 아카이브 &amp;amp; FRA 디렉터리 생성, root 실행&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;mkdir /FRA
chown oracle.dba /FRA

ls -ld /FRA
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. FRA 파라미터 변경&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;-- 1Day = 1440min defualt
show parameter DB_FLASHBACK_RETENTION_TARGET

ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=20G scope=spfile; -- 용량 설정
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='/FRA' scope=spfile; -- 디렉터리 설정
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. DB 종료 후 Mount 상태로 올려야한다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;SHUTDOWN IMMEDIATE
STARTUP MOUNT
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 아카이브 로그 모드, Flashback 모드로 변경 후 DB Open&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;ALTER DATABASE ARCHIVELOG;
-- 아카이브 로그 확인
ARCHIVE LOG LIST; 
-- Flashback 모드 변경
ALTER DATABASE FLASHBACK ON;
-- Flashback 모드 확인
SELECT FLASHBACK_ON FROM V$DATABASE;
-- DB OPEN
ALTER DATABASE OPEN;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FRA를 사용하려면 아카이브 로그모드와 FlashBack on이 되어있어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 아카이브 &amp;amp; Flashback 상태 확인&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT NAME, LOG_MODE, FLASHBACK_ON FROM V$DATABASE;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FlashBack이 실행되어 있으면 리눅스에서 RVWR 프로세스가 실행 중이다.&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;-- Linux 실행 RVWR(Recovery Writer) 프로세스 확인
ps -efl | grep [r]vwr
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 시작 시간 확인&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT
TO_CHAR(SYSDATE,'YYYY/MM/DD HH24:MI:SS') AS &quot;START_TIME&quot; ,
TIMESTAMP_TO_SCN(SYSDATE) AS &quot;SCN&quot;
FROM DUAL;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. DB mount 상태로 이동 mount 상태에서 복구해야 한다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;STARTUP&amp;nbsp;MOUNT
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. DB 전체 Flashback으로 원하는 시간으로 복구 후 DB를 RESETLOGS로 Open 한다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;-- (시작 시간 확인) 쿼리에 START_TIME을 확인한다. (2022/12/19 10:00:00)
FLASHBACK DATABASE TO TIMESTAMP TO_TIMESTAMP('2022/12/19 10:00:00','YYYY/MM/DD HH24:MI:SS');
-- DB OPEN
ALTER&amp;nbsp;DATABASE&amp;nbsp;OPEN&amp;nbsp;RESETLOGS;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;FRA 관리 방법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. FRA 디렉터리에 어떤 파일들이 있는지 확인, FRA 디렉터리 사용량 확인할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;--  sqlplus / as sysdba 접속
sqlplus / as sysdba
SET LINES 180
COL NAME FOR A20
-- FRA 디렉터리에 어떤 파일들이 있는지 확인, FRA 디렉터리 사용량 확인할 수 있다.
SELECT 
    FILE_TYPE, 
    PERCENT_SPACE_USED, 
    PERCENT_SPACE_RECLAIMABLE, NUMBER_OF_FILES 
FROM V$FLASH_RECOVERY_AREA_USAGE;

SELECT 
    NAME, 
    ROUND(SPACE_LIMIT/1024/1024/1024)   AS &quot;SPACE(GB)&quot;,
    ROUND(SPACE_USED/1024/1024/1024,2)  AS &quot;USED(GB)&quot;
FROM V$RECOVERY_FILE_DEST;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;백업 파일 삭제&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Recovery Manager에 접속 후 백업 파일 삭제&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- rman에서 로그 확인 및 백업 파일 삭제
rman target /

REPORT OBSOLETE;
LIST ARCHIVELOG ALL;

CROSSCHECK BACKUP;
CROSSCHECK ARCHIVELOG ALL;

DELETE EXPIRED BACKUP;
DELETE EXPIRED ARCHIVELOG ALL;
DELETE FORCE OBSOLETE;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;FRA 원상 복구&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 파라미터 원복&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;ALTER SYSTEM RESET UNDO_RETENTION;
ALTER SYSTEM RESET DB_RECOVERY_FILE_DEST_SIZE;
ALTER SYSTEM RESET DB_RECOVERY_FILE_DEST;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. DB 종료 후 Mount 상태로 Open&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;-- DB 종료
SHUTDOWN IMMEDIATE
-- DB 시작(Mount 상태)
STARTUP MOUNT
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Flashback, 아카이브 로그 OFF 후 DB Open&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- Flashback 기능 OFF
ALTER DATABASE FLASHBACK OFF;
-- 아카이브 로그 OFF
ALTER DATABASE NOARCHIVELOG;
-- DB OPEN
ALTER DATABASE OPEN;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. DB 상태 확인&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- DB 상태 확인
SELECT NAME, LOG_MODE, FLASHBACK_ON FROM V$DATABASE;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. FRA 디렉터리 삭제&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;-- root 접속
cd /
rm -rf /FRA
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;참고&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=CqqNRKaVwqg&quot;&gt;https://www.youtube.com/watch?v=CqqNRKaVwqg&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=CqqNRKaVwqg&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/biErfX/hyQ6ZgO6GR/oFJ1GhW3HWT525zFCl606k/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/CqqNRKaVwqg&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Oracle/Oracle DataBase 관리</category>
      <category>DB보다</category>
      <category>flashback</category>
      <category>fra</category>
      <category>Oracle</category>
      <category>데이터</category>
      <category>데이터베이스</category>
      <category>복구</category>
      <category>빠른 복구</category>
      <category>오라클</category>
      <category>테이블</category>
      <author>lusida0131</author>
      <guid isPermaLink="true">https://lusida-coding.tistory.com/167</guid>
      <comments>https://lusida-coding.tistory.com/167#entry167comment</comments>
      <pubDate>Sat, 31 Dec 2022 18:15:22 +0900</pubDate>
    </item>
    <item>
      <title>Oracle AWR 분석 보고서 환경 설정</title>
      <link>https://lusida-coding.tistory.com/166</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;AWR&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Oracle 상태가 어떤지 분석할 때 가장 많이 사용하는 방법입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;vi 파일 수정(꼭 할 필요는 없음)&lt;/h4&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;vi ~/.zshrc # vi로 열어서 아래의 내용을 붙여 넣는다

#Terminal Prompt
export PS1=&quot;%F{cyan}%n@%m%f %F{green}%1~%f %# &quot;

#SQL Developer
export SQLPATH=/Applications/SQLDeveloper.app/Contents/Resources/sqldeveloper/sqldeveloper/bin
alias sqld=&quot;cd $SQLPATH&quot;
alias sqlp=&quot;$SQLPATH/sqldeveloper &amp;amp;&quot;
alias sqlpe=&quot;$SQLPATH/sqldeveloper --AddVMOption=-Duser.language=en &amp;amp;&quot;

#VirtualBox Linux
alias strdb=&quot;ssh oracle@192.168.0.111&quot;
alias strdbf=&quot;sftp oracle@192.168.0.111&quot;

#Safari
alias safari=&quot;open /Applications/Safari.app&quot;

#AWR 환경에 맞는 폴더를 만들어서 입력한다.
alias AWRD=&quot;cd /Volumes/EXT1TB/AWR&quot;

# Lang Set
#export LANG=en_US
#export LANG=ko_KR.UTF-8

source ~/.zshrc
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;AWR 분석에 가장 중요한 기본 분석 주기(DEFUALT 1시간에 8일)&lt;/h4&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT
         DBID
       , SNAP_INTERVAL
       , RETENTION
       , TOPNSQL
FROM DBA_HIST_WR_CONTROL;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;분석 주기 변경&lt;/h4&gt;
&lt;pre class=&quot;lsl&quot;&gt;&lt;code&gt;-- 10분 단위 (보관주기 30일)
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(INTERVAL=&amp;gt;10, RETENTION=&amp;gt;30*24*60);

-- 10분 단위 (보관주기 90일)
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(INTERVAL=&amp;gt;10, RETENTION=&amp;gt;90*24*60);

-- 10분 단위 (보관주기 30일)(TOPNSQL 100)
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(INTERVAL=&amp;gt;10, RETENTION=&amp;gt;30*24*60, TOPNSQL=&amp;gt;'100');

-- 10분 단위 (보관주기 90일)(TOPNSQL 100) -&amp;gt; 업계에서 많이 사용
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(INTERVAL=&amp;gt;10, RETENTION=&amp;gt;90*24*60, TOPNSQL=&amp;gt;'100');

-- 30분 단위 (보관주기 90일)(TOPNSQL 100)
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(INTERVAL=&amp;gt;30, RETENTION=&amp;gt;90*24*60, TOPNSQL=&amp;gt;'100');

-- Default값 변경(60분 단위 8일 보관)
EXEC DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(INTERVAL=&amp;gt;60, RETENTION=&amp;gt;8*24*60, TOPNSQL=&amp;gt;'DEFAULT');
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;TOPNSQL Default값 분석&lt;/h4&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT *
FROM V$PARAMETER
WHERE NAME = 'statistics_level';
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 TYPICAL이면 값이 30이고 ALL이면 100이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWR 보관 주기 관련해서 가장 중요한 건 SYSAUX 테이블스페이스 공간이 충분이 확보되어야 한다. AWR의 interval을 짧게 주고 retension을 길게 주면 빠른 속도로 데이터가 늘어나기 때문에 꼭 확인해주어야 한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;SYSAUX TABLESPACE 상태, 사이즈 확인&lt;/h4&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT 
    TABLESPACE_NAME, 
    FILE_NAME, 
    BYTES/1024/1024 AS &quot;SIZE(GB)&quot; 
FROM DBA_DATA_FILES
WHERE TABLESPACE_NAME = 'SYSAUX'
ORDER BY 1, 2;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;SNAP_ID 분석&lt;/h4&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;SELECT
    DBID,
    SNAP_ID,
    TO_CHAR(END_INTERVAL_TIME, 'YYYY/MM/DD(DY) HH24:MI') AS &quot;END_INTERVAL_TIME&quot;
FROM 
      DBA_HIST_SNAPSHOT
WHERE END_INTERVAL_TIME &amp;gt;= TRUNC(SYSDATE) -1
AND   END_INTERVAL_TIME &amp;lt;  TRUNC(SYSDATE) +1
ORDER BY SNAP_ID;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;AWR 보고서 디렉터리 생성&lt;/h4&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;cd /home/oracle
mkdir AWR
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;AWR 보고서 생성&lt;/h4&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;-- 리눅스 서버 접속(sqlplus / as ysdba 실행)
@$ORACLE_HOME/rdbms/admin/awrrpt.sql
@/oracle/app/oracle/product/19.0.0.0/db_1/rdbms/admin/awrrpt.sql
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;AWR 비교 보고서 생성&lt;/h4&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;-- 리눅스 서버 접속(sqlplus / as ysdba 실행)
@$ORACLE_HOME/rdbms/admin/awrddrpt.sql
@/oracle/app/oracle/product/19.0.0.0/db_1/rdbms/admin/awrddrpt.sql
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWR 보고서에서 가장 많이 보는 건 오라클 이벤트를 확인하고 어디에 문제 있는지 분석하고 TOPSQL을 확인하는 게 중요하다. AWR에서 가장 중요한 건 서버에 들어갈 AWR 일자와 시간을 어떻게 뽑느냐가 관건이다. AWR interval을 짧게 주어야 보다 정확하게 분석이 가능하다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;참고&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=_j8BHtFVRB0&quot;&gt;https://www.youtube.com/watch?v=_j8BHtFVRB0&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=_j8BHtFVRB0&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/setuY/hyQU6Irsaa/ZCXxGdhGCIyVYuQjFB9mVk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/_j8BHtFVRB0&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Oracle/Oracle DataBase 관리</category>
      <category>AWR</category>
      <category>AWR 분석</category>
      <category>DB보다</category>
      <category>데이터베이스</category>
      <category>보고서</category>
      <category>비교 보고서</category>
      <category>오라클</category>
      <author>lusida0131</author>
      <guid isPermaLink="true">https://lusida-coding.tistory.com/166</guid>
      <comments>https://lusida-coding.tistory.com/166#entry166comment</comments>
      <pubDate>Sat, 17 Dec 2022 14:30:31 +0900</pubDate>
    </item>
  </channel>
</rss>