[문과 코린이의 IT 기록장] MSSQL - 데이터 베이스 활용 (백업과 복원, 백업시 초보자 주의사항, MDF, LDF 파일로 복원하기, MDF, LDF 관계 이해, 트랜잭션)
< 참고 강의 영상 >
MSSQL Server 2016 기반의 데이터베이스 입문에서 활용까지 Part.3 대시보드 - 인프런 | 강의 (inflearn.com)
1. 백업과 복원
- 백업시 어느 폴더에 파일이 저장되는가?
* .bak
- 백업파일이 저장되는 폴더는 '쓰기'권한을 부여해준다.
* 백업시 뭔가 쓰기 관련 에러가 난다면, 해당 폴더의 쓰기 권한을 체크한다
* 서버에 악성 바이러스가 올려지는 것을 막기 위해 금지시킨 경우
- 서버가 갑자기 사망(접속이 안됨)시, DB 백업과 복원은 어떻게?
* 먼저 웹 서버 문제인지, DB서버 문제인지 체크한다. (규모가 크지 않은 경우, 웹-DB서버를 함께 운영하는 경우도 존재)
* 물리적 서버(HDD)에 존재하는 경우, 이를 분리해서 MDF / LDF 파일을 확보해, 복원을 수행한다.
ex 1. 백업 방법
* 백업 파일은 다른 폴더에도 저장 가능함. (제거(Remove) 후, Add(추가)를 통해 가능)
** 그러나 C드라이브 루트 디렉토리 자체에서는 불가능함. (C드라이브의 파일 내에서 진행해야 함)
ex 2. 백업 복원
2. 백업시 초보자 주의사항
- 다른 폴더로 백업파일 저장시 '쓰기'권한이 없으면, 저장이 안되므로 주의
ex. C드라이브에 바로 저장하려고 할 경우 => 보통 쓰기권한을 막아놓음.
* 오류 메시지 자체가 이러한 오류로 표시되서 경고해준다. (액세스 거부)
- 기존에 백업해놓은 파일에 덮어쓰기가 가능한가?
* 기본적으로 덮어쓰기가 가능하다.
* 따라서 매번 별도로 백업파일을 만들려고 하지 말고, 그냥 덮어쓰면 된다.
** 그러나 덮어쓴 백업파일이, 데이터 변조가 일어날수도 있음. 이러한 상황을 주의할 필요 존재
3. MDF, LDF 파일로 복원하기
- 기본적인 백업과 복원 외에도, 파일로 복원하는 방법도 잘 숙지해야 한다.
- 갑작스런 장애 발생시, 최우선적으로 MDF/LDF 파일을 확보하도록 한다.
- 반드시, MDF/LDF 파일 모두를 가지고 복원하도록 한다.
* 2개 파일을 모두 가지고 복원하는 것이 가장 좋으며, 갑작스러운 장애시 바쁘다고 MDF 파일만 확보하면 안된다.
- 기본적으로 MSSQL 설치폴더 내, DATA폴더에 생성된다.
ex. 7TO7.mdf / 7TO7_log.ldf
- SSMS에서 복원시에는 '연결' 메뉴를 통해 복원해주면 된다.
4. MDF, LDF 관계 이해
- 데이터베이스명.MDF : 실제 물리적 데이터 파일
- 데이터베이스명_log.LDF : 트랜잭션 로그 파일
* 이 둘의 관계는 트랜잭션의 의미와 개념을 이해하면 쉽게 파악 가능
* 트랜잭션 (SELECT + INSERT + UPDATE 한번에 진행) => LDF 파일 => MDF 파일 거치기 [데이터 무결성 보장]
* 문제 발생 X : Commit / 문제 발생 O : Rollback
ex. 은행 시스템에서의 다운 방지
5. 트랜잭션
- Transaction : 어떤 거래 (DB처리)를 할 때, 단계별로 나눠 처리하는 것을 의미.
* INSERT / UPDATE / DELETE 등의 쿼리문을 복합적으로 수행할 때
* 정전 등 갑작스런 문제 발생시 되돌릴 수 있음.
* 즉, 쿼리 처리를 최종 반영(COMMIT)하기 전에, 처음으로 되돌릴 수 있도록 해준다. 이 기능을 롤백(ROLLBACK)이라고 한다.
- ROLLBACK기능을 통해, 복합 쿼리 수행시 완전 처음 상태로 돌아갈 수 있게 해준다.
- COMMIT과 ROLLBACK 기능으로부터, 보다 안정적인 데이터 처리 작업을 할 수 있다.
ex. 은행 입출금 업무 및 송금처리
- 프로그래밍 언어로 DB연동 프로그램을 개발시에도, 이러한 트랜잭션 처리가 적용되어 운영된다.
- 쿼리 수행시에도, ROLLBACK으로 해놓고, 미리 쿼리 결과를 보면서(PREVIEW) 작업 가능하다. ( COMMIT이 되지 않았기 때문에, 최종 적용된 것은 아니기 때문 - 물리적 실제 파일에 적용 X )
ex.
------------------------------------------------------------------
-- 트랜잭션(TRANSACTION)
------------------------------------------------------------------
-- 먼저 SELECT로 데이터 확인
SELECT * FROM dbo.tbl_sales2
-- [1] 명시적 트랜잭션 : 트랜잭션 이름을 명시함.
-- 명시하지 않은 쿼리문들은 사실 내부적으로 AUTO COMMIT이 된다.
-- 트랜잭션 쿼리문 끝에서 세미콜론(;)은 선택적이다.
-- DELETE만 블록 지정해서 실행되면 완전 삭제되니 주의할 필요가 있다.
-- 반드시 트랜잭션 쿼리문 전체를 블록으로 지정하고 실행한다.
-- 트랜잭션 시작
BEGIN TRANSACTION -- = BEGIN TRAN
-- 복합 쿼리문 작성 (모두 성공하거나 모두 실패만 됨.)
DELETE FROM dbo.tbl_sales2 WHERE p_id = 'GS102'
SELECT * FROM dbo.tbl_sales2
INSERT INTO dbo.tbl_sales2 VALUES (1003, 2, 'GS105',1,220000);
SELECT * FROM dbo.tbl_sales2
-- 여기까지만 수행한 후, 종료하고자 하면, 커밋되지 않은 트랜잭션이 있다고 팝업창이 뜸. (COMMIT할 것인지 ROLLBACK할것인지 결정)
/* ROLLBACK은 처리 결과가 되돌려지고, COMMIT은 최종 적용된다. */
-- = ROLLBACK = ROLLBACK TRAN
ROLLBACK TRANSACTION -- LDF파일 기록 후, MDF파일로 가지 않고, 원래 상태로 모두 돌아감
-- 즉 출력은 삭제되어 나오겠지만, 다시 보면 삭제가 안 되어 있을 것. (실제 레코드 변경 x)
-- =COMMIT = COMMIT TRAN
COMMIT TRANSACTION -- LDF파일 기록 후, 최종 MDF파일 기록
-- 트랜잭션 끝
1) AUTO COMMIT
/* 아무것도 써주지 않더라도, 쿼리문 하나마다 AUTO COMMIT이 이루어짐. (앞뒤로 자동으로 트랜잭션이 이뤄진 것) */
-- BEGIN TRANSACTION
SELECT * FROM dbo.tbl_sales2
-- COMMIT TRANSACTION
-- BEGIN TRANSACTION
DELETE FROM dbo.tbl_sales2 WHERE p_id = 'GS102'
-- COMMIT TRANSACTION
2) 트랜잭션 ROLLBACK 기능을 활용하여, 결과 미리보기
/* 트랜잭션 ROLLBACK 기능을 활용하여 결과 미리보기*/
BEGIN TRANSACTION;
SELECT * FROM dbo.tbl_sales2
DELETE FROM dbo.tbl_sales2 WHERE p_id = 'GS101';
SELECT * FROM dbo.tbl_sales2
ROLLBACK TRANSACTION;
3) 트랜잭션 카운트 (TRANCOUNT)
BEGIN TRAN
SELECT @@TRANCOUNT -- 트랜잭션 카운트 화면에 출력 (1 출력)
UPDATE dbo.tbl_sales2 SET qty = 10 WHERE s2_num=1003
SELECT * FROM dbo.tbl_sales2
SELECT @@TRANCOUNT -- 트랜잭션 카운트 화면에 출력 (1 출력)
ROLLBACK -- COMMIT / ROLLBACK으로 마무리 짓지 않으면, 트랜잭션은 계속 남아있음.
SELECT @@TRANCOUNT -- 트랜잭션 카운트 화면에 출력 (0 출력)
4) TRANSACTION : TRY ~ CATCH
- 기본적으로 트랜잭션은 되면 다 되고, 안되면 다 안되게끔 만드는 것이다. 즉, 100% 적용되거나, 100% 적용되지 않도록 보장하는 것이다.
- TRY...CATCH 구문은 데이터베이스 연결을 닫지 않는 모든 실행 오류를 catch한다.
- TRY 블록 다음에는, 곧바로 연결된 CATCH 블록이 이어져야 한다.
- TRY...CATCH구문은 여러 일괄 처리에 걸쳐서 사용할 수 없다. 즉 여러 Transact-SQL 블록에 걸쳐 있을 수 없다.
-- 데이터 확인
SELECT * FROM dbo.tbl_sales2
BEGIN TRY
BEGIN TRANSACTION;
INSERT INTO dbo.tbl_sales2 VALUES(1004,1,'GS104',1,220000);
INSERT INTO dbo.tbl_sales2 VALUES(1004,2,'GS105',1,500000);
SELECT * FROM dbo.tbl_sales2
-- TRY~CATCH구문을 통해 오류를 잡아서 롤백시키지 않으면, 위 쿼리들이 적용되어 버림.
SELECT 1/0; -- ERROR발생
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION; -- 오류를 발생시킨 거래(트랜잭션) 자체를 모두 롤백해라.
END CATCH
SELECT @@TRANCOUNT -- 0개 나옴
* 유의사항 - 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다. - 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다. - 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :) |