▶ 백업, 복구
백업
1.close 백업 -- 가장완벽, 가장 안전, shutdown 후 백업.
2.open 백업 --> 아카이브 파일이 활성화 되어있어야 한다.
--> 로그파일에 있는게 다른 곳에 저장이 되어있어야하는데 그게 아카이브 파일
*로그파일은 백업불가. 계속 기록을 해야하기 때문에!
*!cp 의 느낌표는 os의 명령어를 edit안에서 실행시키는 명령어
복구 (총 13가지)
1. noarchive mode--닫힌복구 - 편할라고 학원에서 사용
다른위치에 복구(imsy)
1. archive mode
완전복구(4가지) - 실제로 회사에서 쓰는 방법
1) 닫힌 데이터베이스 복구(System tablespace 문제시-shutdown)
2) 열린 데이터베이스 복구(일반 tablespace 문제시-offline)
3) 다른위치에 datafile복구(imsy)
4) 백업하지 않은 datafile복구
불완전복구(3가지)
1) 시간기반 복구
2) 취소기반 복구(아카이브 로그의 손실발생)
3) 백업control파일을 이용한 복구(아카이브로그가 아닌 ctl파일에서복구)
log파일 복구(4가지)
1)대기 상태 그룹의 멤버문제
2)대기 상태 그룹의 문제(2가지: Open, Close복구)
3)Current 로그 장애(2가지: Open, Close복구)
4)전체삭제(2가지 : 모든 Redolog파일 삭제, 모든 Control파일 삭제)
2. 에러가 발생된 데이터 복구시키다 에러가 발생했을때
1) 에러 발생
2) 셧다운
3) 복구하다 에러 발생 --> 에러가 발생된 데이터베이스 백업
왜? ==> 복구에 실패했을때, 에러난 데이터 백업받은 걸 다시 복구하여 다시 복구 시도
4) 복구
=========================================================================
*복구 실습을 위한 선행작업
*ARCHIVE LOG MODE가 실행중인지 확인 = ARCHIVE LOG가 활성화 되어있는지 확인
-- ARCHIVE LOG MODE 활성화 되어 있지 않지 않은 상태
------------------------------------------------------------------------------------
SYS@TestDB> archive log list
데이터베이스 로그 모드 아카이브 모드가 아님
자동 아카이브 사용 안함으로 설정됨
아카이브 대상 USE_DB_RECOVERY_FILE_DEST
가장 오래된 온라인 로그 순서 33
현재 로그 순서 35
------------------------------------------------------------------------------------
*log.sql 스크립트 실행 : 로그 그룹, 로그 멤버 상태에 대한 정보 확인
v$log : 로그 그룹에 대한 정보
v$logfile : 로그 멤버에 대한 정보.
-- log.sql 파일 내용 ↓↓↓↓↓
COL MEMBER FORMAT A29
select a.group#,member,bytes,sequence#,b.status
from v$logfile a,v$log b
where a.group#=b.group#
ORDER BY a.group#
/
------------------------------------------------------------------------------------------------------------------
SYS@TestDB> @log <-- 스크립트 파일 형태로 사용할 때 (=@log.sql)
GROUP# MEMBER BYTES SEQUENCE# STATUS
---------- ----------------------------- ----------- --------- ---------------
1 C:\APP\ITWILL\ORADATA\TESTDB\REDO01.LOG 52428800 34 INACTIVE
2 C:\APP\ITWILL\ORADATA\TESTDB\REDO02.LOG 52428800 35 CURRENT
3 C:\APP\ITWILL\ORADATA\TESTDB\REDO03.LOG 52428800 33 INACTIVE
------------------------------------------------------------------------------------------------------------------
*ARCHIVE LOG 활성화
<-- archive mode는 꼭 archive 파일 생성 후 archive mode로 변경 해야 한다.
1. shutdown immediate
------------------------------------------------------
SYS@TestDB> shutdown immediate
데이터베이스가 닫혔습니다.
데이터베이스가 마운트 해제되었습니다.
ORACLE 인스턴스가 종료되었습니다.
------------------------------------------------------
2. C:\aDisk 경로에 arc1, arc2 두개의 파일 생성 -- 아카이브 파일 멀티 플렉싱!
3. C:\app\itwill\product\11.2.0\dbhome_1\database에 있는
INITtestdb.ORA (파라미터 파일)에 아래 내용 추가 저장.
-- log_archive_dest_1='location=c:\adisk\arc1'
-- log_archive_dest_2='location=c:\adisk\arc2'
-- log_archive_format=%s_%t_%r.arc
4. startup mount (mount 상태)
------------------------------------------------------
SYS@TestDB> startup mount
ORACLE 인스턴스가 시작되었습니다.
Total System Global Area 3390558208 bytes
Fixed Size 2180464 bytes
Variable Size 1862273680 bytes
Database Buffers 1509949440 bytes
Redo Buffers 16154624 bytes
데이터베이스가 마운트되었습니다.
------------------------------------------------------
5. 데이터베이스를 ARCHIVE LOG 모드로 변경
------------------------------------------------------
SYS@TestDB> alter database archivelog;
데이타베이스가 변경되었습니다.
------------------------------------------------------
6. 데이터베이스 OPEN
------------------------------------------------------
SYS@TestDB> alter database open;
데이타베이스가 변경되었습니다.
------------------------------------------------------
*ARCHIVE LOG MODE가 실행중인지 확인
-- 아카이브 모드 실행됨.
------------------------------------------------------------------------------------
SYS@TestDB> archive log list
데이터베이스 로그 모드 아카이브 모드 <-- (아카이브 모드가 아님 --> 아카이브모드로 변경 확인.)
자동 아카이브 사용으로 설정됨
아카이브 대상 c:\adisk\arc2
가장 오래된 온라인 로그 순서 33
아카이브할 다음 로그 35
현재 로그 순서 35
------------------------------------------------------------------------------------
*switch.sql 스크립트 실행 : 사용할 로그 파일 변경, checkpoint 실행
-- switch.sql 파일 내용 ↓↓↓↓↓
ALTER SYSTEM SWITCH LOGFILE; -- 사용할 로그파일 변경
ALTER SYSTEM CHECKPOINT; -- checkpoint 발생
/
----------------------------------------------------------------------------
SYS@TestDB> @switch
시스템이 변경되었습니다.
시스템이 변경되었습니다.
----------------------------------------------------------------------------
--> C:\aDisk\arc1, arc2 폴더에 아카이브 파일 생성 됨
----------------------------------------------------------------------------
SYS@TestDB> @switch <- 한번 더 실행
시스템이 변경되었습니다.
시스템이 변경되었습니다.
----------------------------------------------------------------------------
*실습을 위해 에러를 발생시키기 전 정상 DB 백업
----------- 닫힌 백업 --------------------------------------------------------
1. DB 종료 (shutdown immediate)
2. D드라이브에 백업을 위한 폴더 생성 (폴더명 : 20190129archive)
3. D드라이브에 백업 진행
-- oradata에 있는 파일 20190129archive 폴더에 복붙
-- database에 있는 INITtestdb.ORA, PWDTestDB.ora파일 20190129archive 폴더에 복붙
4. startup.
--------------------------------------------------------------------------------
1. 완전복구
1) 닫힌 데이터베이스 복구(System tablespace 문제시-shutdown)
1. SYSTEM TABLESPACE 문제 발생 시키기
*switch.sql 스크립트 실행
*test.sql 스크립트 실행
---- 스크립트 내용 ----
create table test
(no number)
tablespace system;
insert into test values (10);
commit;
@switch
insert into test values (20);
commit;
@switch
insert into test values (30);
commit;
@switch
insert into test values (40);
commit;
@switch
insert into test values (50);
commit;
@switch
insert into test values (60);
commit;
@switch
--------------------------------------------
SYS@TestDB> @test.sql
테이블이 생성되었습니다.
1 개의 행이 만들어졌습니다.
커밋이 완료되었습니다.
시스템이 변경되었습니다.
시스템이 변경되었습니다.
1 개의 행이 만들어졌습니다.
커밋이 완료되었습니다.
시스템이 변경되었습니다.
시스템이 변경되었습니다.
1 개의 행이 만들어졌습니다.
커밋이 완료되었습니다.
시스템이 변경되었습니다.
--------------------------------------------
*SYSTEM Tablespace에 Table 생성 확인
------------------------------------------------------------------
SYS@TestDB> select tablespace_name from dba_tables
2 where table_name='TEST';
TABLESPACE_NAME
------------------------------
SYSTEM
------------------------------------------------------------------
*SYSTEM Tablespace 삭제
system 테이블 스페이스는 지우고 셧다운시켜야하나
파일이 지워지지 않으므로 셧다운(shutdown immediate) 시키고 파일을 지움.
--> 하드디스크가 망가진 상태와 같음
*Startup --> 오류 발생 : SYSTEM Tablespace는 Oracle DB 그 자체라서 없으면 실행을 DB를 오픈 시킬 수 없다.
--------------------------------------------------------------------------------------------------
SYS@TestDB> startup
ORACLE 인스턴스가 시작되었습니다.
Total System Global Area 3390558208 bytes
Fixed Size 2180464 bytes
Variable Size 1862273680 bytes
Database Buffers 1509949440 bytes
Redo Buffers 16154624 bytes
데이터베이스가 마운트되었습니다.
ORA-01157: 데이터 1 파일을 식별 또는 잠금 할 수 없습니다- DBWR 추적 파일을
보십시오
ORA-01110: 1 데이터 파일: 'C:\APP\ITWILL\ORADATA\TESTDB\SYSTEM01.DBF'
--------------------------------------------------------------------------------------------------
*에러가 발생한 Tablespace 및 에러 내용 확인
--------------------------------------------------------------------------------------------------
SYS@TestDB> select b.tablespace_name,a.name,b.error
2 from v$datafile a, v$datafile_header b
3 where a.file# = b.file#;
SYS@TestDB> save error.sql; -- 스크립트 파일로 저장.
file error.sql(이)가 생성되었습니다
TABLESPACE_NAME NAME ERROR
------------------------------ ------------------------------ ---------------
C:\APP\ITWILL\ORADATA\TESTDB\ FILE NOT FOUND --> 파일을 찾을 수 없음.
SYSTEM01.DBF
SYSAUX C:\APP\ITWILL\ORADATA\TESTDB\S
YSAUX01.DBF
UNDOTBS1 C:\APP\ITWILL\ORADATA\TESTDB\U
NDOTBS01.DBF
USERS C:\APP\ITWILL\ORADATA\TESTDB\U
SERS01.DBF
TABLESPACE_NAME NAME ERROR
------------------------------ ------------------------------ ---------------
EXAMPLE C:\APP\ITWILL\ORADATA\TESTDB\E
XAMPLE01.DBF
--------------------------------------------------------------------------------------------------
2. 복구
* 20190129archive 폴더에서 백업한 SYSTEM01.DBF 파일
C:\app\itwill\oradata\TestDB 복붙
* ARCHIVE LOG 파일로 데이터 복구
--------------------------------------------------------------------------------------------------
SYS@TestDB> recover database;
ORA-00279: 변환 1700581가 (01/29/2019 10:19:23에서 생성된) 스레드 1에
필요합니다
ORA-00289: 제안 : C:\ADISK\ARC2\37_1_996676866.ARC
ORA-00280: 변환 1700581(스레드 1를 위한)가 시퀀스번호 37에 있습니다
로그 지정: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00279: 변환 1702889가 (01/29/2019 10:43:59에서 생성된) 스레드 1에
필요합니다
ORA-00289: 제안 : C:\ADISK\ARC2\38_1_996676866.ARC
ORA-00280: 변환 1702889(스레드 1를 위한)가 시퀀스번호 38에 있습니다
로그 지정: {<RET>=suggested | filename | AUTO | CANCEL}
auto <-- 자동으로 데이터 가져옴
ORA-00279: 변환 1703268가 (01/29/2019 10:51:30에서 생성된) 스레드 1에
필요합니다
ORA-00289: 제안 : C:\ADISK\ARC2\39_1_996676866.ARC
ORA-00280: 변환 1703268(스레드 1를 위한)가 시퀀스번호 39에 있습니다
ORA-00279: 변환 1703274가 (01/29/2019 10:51:34에서 생성된) 스레드 1에
필요합니다
ORA-00289: 제안 : C:\ADISK\ARC2\40_1_996676866.ARC
ORA-00280: 변환 1703274(스레드 1를 위한)가 시퀀스번호 40에 있습니다
ORA-00279: 변환 1703282가 (01/29/2019 10:51:42에서 생성된) 스레드 1에
필요합니다
ORA-00289: 제안 : C:\ADISK\ARC2\41_1_996676866.ARC
ORA-00280: 변환 1703282(스레드 1를 위한)가 시퀀스번호 41에 있습니다
로그가 적용되었습니다.
매체 복구가 완료되었습니다.
--------------------------------------------------------------------------------------------------
* SYSTEM01.DBF 파일 복구되어 Database 오픈 가능
------------------------------------------
SYS@TestDB> alter database open;
데이타베이스가 변경되었습니다.
------------------------------------------
* 복구가 정상적으로 이루어 졌는지 확인
-- 에러 없음
--------------------------------------------------------------------------------------------------
SYS@TestDB> @error
TABLESPACE_NAME NAME ERROR
------------------------------ ------------------------------ ---------------
SYSTEM C:\APP\ITWILL\ORADATA\TESTDB\
SYSTEM01.DBF
SYSAUX C:\APP\ITWILL\ORADATA\TESTDB\S
YSAUX01.DBF
UNDOTBS1 C:\APP\ITWILL\ORADATA\TESTDB\U
NDOTBS01.DBF
USERS C:\APP\ITWILL\ORADATA\TESTDB\U
SERS01.DBF
TABLESPACE_NAME NAME ERROR
------------------------------ ------------------------------ ---------------
EXAMPLE C:\APP\ITWILL\ORADATA\TESTDB\E
XAMPLE01.DBF
--------------------------------------------------------------------------------------------------
* test 테이블과 테이블 안의 데이터 복구 확인 -- 완료
----------------------------------------------------
SYS@TestDB> select * from test;
NO
----------
10
20
30
40
50
60
6 개의 행이 선택되었습니다.
====================================================================================
2) 열린 데이터베이스 복구(일반 tablespace 문제시-offline) -- users01.dbf
- DB Shutdown immedate 시킨 후 TESTDB폴더에 있는 파일 지움
- 20190129archive 폴더에 있는 백업한 파일 중 INITtestdb.ORA, PWDTestDB.ora 제외하고 나머지 파일
TESTDB 폴더에 복붙.
- arc1, arc2 폴더에 있는 archive 파일 중 2개(실습을 위해 두번 실행했던 파일)만 남기고 삭제.
- DB startup
1. SYSTEM TABLESPACE 문제 발생 시키기
* switch.sql 스크립트 파일 실행
-------------------------------------
SYS@TestDB> @switch
시스템이 변경되었습니다.
시스템이 변경되었습니다.
-------------------------------------
* ST 계정 생성 및 권한부여
--------------------------------------------------
SYS@TestDB> create user st
2 identified by st
3 default tablespace users
4 temporary tablespace temp
5 quota unlimited on users;
사용자가 생성되었습니다.
SYS@TestDB> grant connect, resource to st;
권한이 부여되었습니다.
--------------------------------------------------
* ST 계정의 기본 테이블스페이스 확인
-------------------------------------------------------------------------------
SYS@TestDB> select username, default_tablespace from dba_users
2 where username='ST';
USERNAME DEFAULT_TABLESPACE
------------------------------ ------------------------------
ST USERS
-------------------------------------------------------------------------------
* test.sql 파일 수정
-------------------------------------------------------------------------------
create table st.test
(no number)
insert into st.test values (10);
commit;
@switch
insert into st.test values (20);
commit;
@switch
insert into st.test values (30);
commit;
@switch
insert into st.test values (40);
commit;
@switch
insert into st.test values (50);
commit;
@switch
insert into st.test values (60);
commit;
@switch
SYS@TestDB>@test <-- test.sql 스크립트 파일 실행
SYS@TestDB> select * from st.test; <-- test.sql 정상으로 실행되어 테이블과 데이터가 잘 들어갔는지 확인
NO
----------
10
20
30
40
50
60
6 개의 행이 선택되었습니다.
-------------------------------------------------------------------------------
* 원래는 파일 삭제 후 offline인데 삭제가 안되서
usrs01.dbf 파일 offline 시키고 삭제
-------------------------------------------------------------------------------
SYS@TestDB> alter tablespace users offline;
테이블스페이스가 변경되었습니다.
-------------------------------------------------------------------------------
-- users01.dbf 파일 삭제
* hutdown immediate (셧다운)
* startup
2. 복구
* 백업파일에서 users01.dbf 파일만 가져옴
-- 기존에 있던 파일들과 패밀리가 아닌상태
* 같은 패밀리로 복구
------------------------------------------------------------------------------------------
SYS@TestDB> @dt
TABLESPACE_NAME STATUS CONTENTS EXTENT_MAN SEGMEN
------------------------------ --------- --------- ---------- ------
SYSTEM ONLINE PERMANENT LOCAL MANUAL
SYSAUX ONLINE PERMANENT LOCAL AUTO
UNDOTBS1 ONLINE UNDO LOCAL MANUAL
TEMP ONLINE TEMPORARY LOCAL MANUAL
USERS OFFLINE PERMANENT LOCAL AUTO
EXAMPLE ONLINE PERMANENT LOCAL AUTO
6 개의 행이 선택되었습니다.
------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
SYS@TestDB> recover tablespace users;
ORA-00279: 변환 1700581가 (01/29/2019 10:19:23에서 생성된) 스레드 1에
필요합니다
ORA-00289: 제안 : C:\ADISK\ARC2\37_1_996676866.ARC
ORA-00280: 변환 1700581(스레드 1를 위한)가 시퀀스번호 37에 있습니다
로그 지정: {<RET>=suggested | filename | AUTO | CANCEL}
auto
------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
SYS@TestDB> alter tablespace users online;
테이블스페이스가 변경되었습니다.
------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
SYS@TestDB> @dt
TABLESPACE_NAME STATUS CONTENTS EXTENT_MAN SEGMEN
------------------------------ --------- --------- ---------- ------
SYSTEM ONLINE PERMANENT LOCAL MANUAL
SYSAUX ONLINE PERMANENT LOCAL AUTO
UNDOTBS1 ONLINE UNDO LOCAL MANUAL
TEMP ONLINE TEMPORARY LOCAL MANUAL
USERS ONLINE PERMANENT LOCAL AUTO
EXAMPLE ONLINE PERMANENT LOCAL AUTO
6 개의 행이 선택되었습니다.
------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
SYS@TestDB> select * from st.test;
NO
----------
10
20
30
40
50
60
6 개의 행이 선택되었습니다.
------------------------------------------------------------------------------------------
'IT 개발 > Oracle SQL' 카테고리의 다른 글
2) DATABASE - SQL Join (0) | 2020.07.05 |
---|---|
Oracle 17일차 (백업, 복구) (2) (0) | 2019.01.30 |
Oracle SQL 16일차 ( Rebuild (인덱스의 재구축), 제약조건지연, Profile, Previlege, Role 관리, SQLLDR) (0) | 2019.01.28 |
Oracle 15일차 (2) (0) | 2019.01.27 |
Oracle 15일차 (1) (0) | 2019.01.26 |