반응형

명동 닭갈비 빤닭빤닭 아는사람만 가는 곳





닭갈비 좋아하세요??



명동에는 유가네닭갈비가 많이 있는데 


유가네에서 먹지 못한 다른 맛을 느끼고 싶을 때 가는 닭갈비집이 있어 소개해드리려고 합니다.




그곳은 바로 명동에서 줄서서 먹을만한 빤닭빤닭이에요!





평일에는 런치메뉴도 있어서 점심시간에도 주변 직장인들과 학생에게 인기가 많지요


이처럼 낮에는 가성비가 좋고 밤에는 조용하게 술 한잔 하기 좋은 곳이랍니다.


저는 개인적으로 점심때보다는 조용하고 분위기 좋은 저녁때 가는걸 좋아해요!


참고로 런치메뉴 주문시간은 AM11:00 ~ PM 2:00 에요! 




특히 외국인들이 명동거리에는 많지만 외국인들에게는 많이 알려지지 않은 곳이라 조용히 즐길 수 있죠!





위치는 명동역 8번 출구에서 쭉 내려오면 바로 찾을 수 있어요









8번출구에서 쭉~~ 내려오다보면 명동 교자 맞은편 2층에 있어요


입구가 잘 안보여서 못보고 지나칠 수도 있으니 윗쪽을 보고 찾아가세요!






오늘은 비가 와서 다행히 웨이팅 없이 입장했어요


( 런치 때 웨이팅이 싫으시면 12시 안쪽으로 오시면 웨이딩 없이 갈 수 있어요! )










빤닭빤닭의 영업시간은 오전 11시부터 오후 11시50분까지에요



마감시간에 쫓기면서 먹고싶지 않으면 저녁 10시까지는 입장해야겠지요?






입구에는 대표메뉴 닭갈비가 있네요



실 사이즈라고 적혀있는데 2인분인 것 같아요!















이건 빤닭빤닭의 메뉴판이에요


명동답게 외국인을 배려한 다국어 메뉴판이네요 ㅎㅎ







불고기 치즈 닭갈비가 아주 꿀맛인데



오늘은 런치에 왔으니 기본은 닭갈비 2인분 + 치즈사리를 주문했어요



치즈사리가 있으면 매운걸 잘 못먹는 분들도 중화시켜 먹을 수 있으니 매운맛의 강도는 잘 선택하세요~~










반찬은 무쌈, 김치, 샐러드가 나와요





빤닭빤닭의 샐러드는 요거트 드레싱을 사용하고 시리얼을 올려주는데 이 샐러드가 아주 꿀맛이에요!!




닭갈비를 먹다가 달다고 생각 될 때 싸서 먹어 적절한 맛을 찾아 줄 수 있는 완소무쌈















자 드디어 메인 메뉴가 나왔어요!





닭갈비 2인분에 잘 녹아서 나온 치즈치즈치즈





역시 닭갈비 답게 큰 팬에 나온답니다!









먹는 방법은 다 익혀서 나오니 바로 드시면 돼요




닭갈비를 치즈에 묻혀서 퐁듀에 찍어먹듯이 먹으면 되는데




먹다가 치즈가 식으면 팬은 살짝 데우면 촉촉한 치즈를 유지하면서 먹을 수 있으니 맛있는 치즈를 위해 불조절을 잘 해주세요!


( 계속 켜놓고 있어도 치즈가 딱딱해 질 수 있어요! )








저는 특히 깻잎과 같이 먹는걸 좋아하는데 깻잎의 향과 닭갈비의 식감이 합쳐지면 아주 근사한 한입이 돼죠!


 












양이 부족하다 싶으면?





당연 김가루를 솔솔 뿌린 철판볶음밥이죠!





닭갈비에 야채가 남았다면 풀어서 같이 볶아주니 굳이 다 먹을 필요는 없어요!





오히려 너무 깔끔하게 먹으면 민망하니 살짝 남겨주는 센스!!









이렇게 먹으면 2명이서 배부르게 먹을 수 있어요!







전체적인 평가


가격 : ★★★☆☆
        Total 21,000 원 나왔어요~
        점심시간에 직장인 2명이서 1만원씩 내고 먹기에는 저렴한 가격은 아니지만
        저녁에 술한잔 하면서 먹기에는 크게 부담스럽지는 않을것 같아요


분위기 : ★★★★☆
           점심시간에는 좀 어수선할 수 있어요
           하지만 저녁에는 은은한 조명에 진솔한 얘기를 조용히 할 수 있는 분위기가 연출돼요!  
           저녁에 분위기 있는 데이트를 하거나 술한잔 조용히 먹기에는 추천합니다!
   

서비스 : ★★★☆☆
           벨이 없어서 알바분을 부르기가 쉽진 않은데 부르면 밝게 대답해줘서 좋았어요!
           볶음밥을 볶는 것도 깔끔하게 잘 볶아줬어요! 
           
        
내맘대로 맛 별점 : ★★★★☆
                        명동에서 저녁식사 + 술한잔을 동시에 하기에는 너무너무 좋은 곳이에요~
                        약속 잡을 때 상대가 만족해하면서 돌아갈 수 있는 장소로 강추합니다! 












반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,
반응형

오라클 파티션 테이블 샘플(생성 수정 삭제) 및 주의사항




대용량 데이터를 조회 시 조금이라도 더 빠른 데이터의 접근을 위해서는 

테이블을 파티션으로 분할하여 테이블을 생성할 수가 있습니다.





파티션 테이블 생성


CREATE TABLE TB_SALE  ( 
      SALE_DATE          VARCHAR2(8 BYTE)  NOT NULL ,
      SALE_TIME          VARCHAR2(6 BYTE)  NOT NULL ,
      CUST_NO            VARCHAR2(10 BYTE) NOT NULL ,
      SALE_AMT           NUMBER                     ,
      INPUT_DATE         DATE
)
  TABLESPACE TS_DATA
  PARTITION BY RANGE (SALE_DATE) 
 (
 PARTITION PR_TB_SALE_201801  VALUES LESS THAN ('20180201') , 
 PARTITION PR_TB_SALE_201802  VALUES LESS THAN ('20180301') , 
 PARTITION PR_TB_SALE_201803  VALUES LESS THAN ('20180401') , 
 PARTITION PR_TB_SALE_201804  VALUES LESS THAN ('20180501') , 
 PARTITION PR_TB_SALE_201805  VALUES LESS THAN ('20180601') , 
 PARTITION PR_TB_SALE_201806  VALUES LESS THAN ('20180701') , 
 PARTITION PR_TB_SALE_201807  VALUES LESS THAN ('20180801') , 
 PARTITION PR_TB_SALE_201808  VALUES LESS THAN ('20180901') , 
 PARTITION PR_TB_SALE_201809  VALUES LESS THAN ('20181001') , 
 PARTITION PR_TB_SALE_201810  VALUES LESS THAN ('20181101') , 
 PARTITION PR_TB_SALE_201811  VALUES LESS THAN ('20181201') , 
 PARTITION PR_TB_SALE_201812  VALUES LESS THAN ('20190101') , 
 PARTITION PR_TB_SALE_201901  VALUES LESS THAN ('20190201') , 
 PARTITION PR_TB_SALE_201902  VALUES LESS THAN ('20190301') , 
 PARTITION PR_TB_SALE_201903  VALUES LESS THAN ('20190401') , 
 PARTITION PR_TB_SALE_201904  VALUES LESS THAN ('20190501') , 
 PARTITION PR_TB_SALE_201905  VALUES LESS THAN ('20190601') , 
 PARTITION PR_TB_SALE_201906  VALUES LESS THAN ('20190701') , 
 PARTITION PR_TB_SALE_201907  VALUES LESS THAN ('20190801') , 
 PARTITION PR_TB_SALE_201908  VALUES LESS THAN ('20190901') , 
 PARTITION PR_TB_SALE_201909  VALUES LESS THAN ('20191001') , 
 PARTITION PR_TB_SALE_201910  VALUES LESS THAN ('20191101') , 
 PARTITION PR_TB_SALE_201911  VALUES LESS THAN ('20191201') , 
 PARTITION PR_TB_SALE_201912  VALUES LESS THAN ('20200101') 
-- PARTITION PR_TB_SALE_MAX  VALUES LESS THAN (MAXVALUE) 
 ) 
 ;


CREATE UNIQUE INDEX PK_TB_SALE ON TB_SALE (SALE_DATE, SALE_TIME, CUST_NO)
TABLESPACE TS_INDEX LOCAL ;  


ALTER TABLE TB_SALE
  ADD CONSTRAINT PK_TB_SALE PRIMARY KEY (SALE_DATE, SALE_TIME, CUST_NO);


COMMENT ON COLUMN TB_SALE.SALE_DATE IS '매출일자';
COMMENT ON COLUMN TB_SALE.SALE_TIME IS '매출시간';
COMMENT ON COLUMN TB_SALE.CUST_NO   IS '고객번호';
COMMENT ON COLUMN TB_SALE.SALE_AMT  IS '매출 금액';
COMMENT ON TABLE  TB_SALE           IS '고객 매출내역';





파티션 구성 시 마지막에 MAXVALUE 를 주석으로 막은 이유는 

분할해 둔 파티션의 마지막이 임박해오는 경우 SPLIT 보다 파티션 추가가 간편하기 때문입니다!

물론 예기치 않은 데이터가 들어오는 경우 MAXVALUE 를 지정해두는것이 안정적이긴 합니다.



파티션 추가

 ALTER TABLE TB_SALE
 ADD PARTITION PR_TB_SALE_202001 VALUES LESS THAN ('20200201' )
 TABLESPACE TS_INDEX ;





파티션 삭제


ALTER TABLE TB_SALE DROP PARTITION PR_TB_SALE_202001 ;








파티션 분할 (MAXVALUE 파티션 분할)


ALTER TABLE TB_SALE 
SPLIT PARTITION PR_TB_SALE_MAX AT ( '20200201' )
INTO ( PARTITION PR_TB_SALE_202001
     , PARTITION PR_TB_SALE_MAX
     ) ;



MAXVALUE 로 잡혀있던 PR_TB_SALE_MAX 파티션을 2020년 02월 01일 이전 데이터가 입력될 파티션으로 분리하였다.






파티션 TRUNCATE


ALTER TABLE TB_SALE TRUNCATE PARTITION PR_TB_SALE_201801 ;





파티션 테이블 인덱스 생성


CREATE UNIQUE INDEX PK_TB_SALE ON TB_SALE (SALE_DATE, SALE_TIME, CUST_NO)
TABLESPACE TS_INDEX LOCAL ; 






파티션 테이블을 생성할 때 INDEX 설정 시 주의할 사항이 있습니다.

예를 들어 위와 같이 RANGE 파티션을 가진 테이블을 월별로 파티션을 분리한다고 했을 때 

테이블 전체에 INDEX 를 구성하는 것 보다 각각의 파티션 별로 INDEX 를 가지고 있어야 

대용량의 테이블을 조회할 때 더 효과적인 속도를 기대할 수 있습니다.





여기서 테이블스페이스의 INDEX 지정 시 LOCAL INDEX 가 아닌 default 로 설정하거나 GLOBAL INDEX 로 설정할 경우

파티션기준이 아닌 전체 테이블을 기준으로 INDEX 가 만들어지니 주의해야 합니다.





파티션 테이블이 GLOBAL INDEX 로 생성될 경우 테이블의 중간중간 데이터가 삭제되거나 변경된다면 

전체 테이블 기준으로 최적화된 INDEX 가 뒤죽박죽 될 수 있으나

LOCAL 로 생성되는 경우에는 다른 파티션의 INDEX 에는 영향이 가지 않으니 

INDEX 를 사용하는 SQL 인 경우 더 빠른 실행계획을 세울 수 있게 됩니다.




궁금한점이나 잘못된 부분이 있으면 댓글 남겨주세요^^

감사합니다.

반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,
반응형

오라클 MERGE 문 간단한 예제로 한번에 INSERT, UPDATE 처리




UPDATE INSERT 를 동시에 처리하고 싶은 경우가 간혹 존재하는데

이럴 경우 과거 CURSOR 를 사용하거나 UPDATE 를 먼저 처리하고 INSERT 를 처리한 경우가 있습니다.


이제 MERGE 문을 사용하면 SELECT ~ INSERT 시 원하는 조건에 맞는 행은 UPDATE 를, 조건에 맞지 않는 행은 INSERT 를 할 수 있게 되었습니다.







즉,

       이미 존재하는 값은 UPDATE

       신규로 입력된 값은 INSERT






이 처리가 한번에 가능합니다.

그것도 다수의 행을 UPDATE, INSERT 가 가능합니다.

일명 UPSERT 라고도 부르기도 하죠.


오라클에서 제공하는 문법은 아래와 같습니다.




MERGE 문법









이렇게 보시면 복잡하지만 아래예제와 설명을 보면 간단하게 알 수 있습니다!





MERGE INTO 예제

MERGE INTO CUSTOMER C
USING
(
      SELECT USERNO
           , USERNAME
           , ADDRESS
           , PHONE
       FROM NEW_JOIN
      WHERE INPUT_DATE = '20170724'
) N
ON ( C.USERNO = N.USERNO)
WHEN MATCHED THEN
UPDATE
SET C.USERNAME = N.USERNAME
  , C.ADDRESS  = N.ADDRESS
  , C.PHONE    = N.PHONE
WHEN NOT MATCHED THEN
INSERT ( USERNO
       , USERNAME
       , ADDRESS
       , PHONE
       )
 VALUES (
         N.USERNO
       , N.USERNAME
       , N.ADDRESS
       , N.PHONE
 )






위의 간단한 예제는 신규고객이 들어왔을 때 기존 고객테이블에 데이터를 입력하는 업무입니다.

하나씩 문법을 살펴보겠습니다.






MERGE INTO CUSTOMER C : INSERT 또는 UPDATE 할 테이블과 테이블의 ALIAS 를 지정해줍니다.




USING : 원하는 결과를 추출하기 위한 SELECT 문입니다.  이 SELECT 문에서 나온 결과를 INSERT 또는 UPDATE 할 예정입니다.




ON : SELECT 한 결과와 입력하고 싶은 테이블의 UNIQUE 한 값을 매칭하는 연결고리입니다. ( 주로 KEY 값을 사용 )




WHEN MATCHED THEN : SELECT 의 결과가 INSERT 할 테이블에 값이 이미 존재하는 경우 UPDATE 를 실행합니다.




WHEN NOT MATCHED THEN : SELECT 의 결과가 INSERT 할 테이블에 값이 없는 경우 INSERT 를 실행합니다.









업데이트만 하고 싶은 경우에는 아래 WHEN NOT MATCHED THEN 이하 문장을 제거하면 됩니다.


MERGE UPDATE 예제

MERGE INTO CUSTOMER C
USING
(
      SELECT USERNO
           , USERNAME
           , ADDRESS
           , PHONE
       FROM NEW_JOIN
      WHERE INPUT_DATE = '20170724'
) N
ON ( C.USERNO = N.USERNO)
WHEN MATCHED THEN
UPDATE
SET C.USERNAME = N.USERNAME
  , C.ADDRESS  = N.ADDRESS
  , C.PHONE    = N.PHONE





또한 오라클 10g 이후로는 SELECT 한 결과를 UPDATE 뿐 아니라 DELETE 도 처리할 수 있습니다.



MERGE UPDATE DELETE 예제

MERGE INTO CUSTOMER C
USING
(
      SELECT USERNO
           , USERNAME
           , ADDRESS
           , PHONE
       FROM NEW_JOIN
      WHERE INPUT_DATE = '20170724'
) N
ON ( C.USERNO = N.USERNO)
WHEN MATCHED THEN
UPDATE
SET C.USERNAME = N.USERNAME
  , C.ADDRESS  = N.ADDRESS
  , C.PHONE    = N.PHONE
DELETE WHERE SAL >= 3000





이 MERGE 문은 DML 의 문장으로 트랜잭션(TRANSACTION) 단위로 실행되기 때문에 COMMIT, ROLLBACK 을 처리해야 완전한 반영이 됩니다.



이 외에 궁금하신점은 댓글로 문의주시면 답변 달아드리겠습니다.

감사합니다.

반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,
반응형

인터넷 수박 2차 구매 후기



2주전 구매한 수박의 다른 포스팅 바로가기 )



여전히 마트에 가면 수박가격이 천정부지입니다.

좀 먹을만하다 싶은건 거의 2만원에 가까운 수박도 많고 

심지어 요즘에는 품종개량이 많이 되서 미니수박, 애플수박, 노랑수박 , 블랙망고수박같은 아이들도 많더라고요

또, 지역별로 고창수박, 성주수박, 우곡수박, 정읍수박 많이 나오고 있습니다.

하지만 뭔가 앞에 이름이 붙으면 수박가격이 자꾸 올라가는것 같습니다ㅠ



마트에서 구매하면 맛있는 수박을 직접 고를 수 있는 장점이 있지만

지난번에 인터넷에서 수박을 구매한 후 너무너무 좋은 상품이 와서 

이번에도 다시한번 먹어보자 해서 수박을 다시 또 구매해봤습니다!


저번에는 이벤트도 있어서 수박가격이 9900원에 베스킨라빈스 싱글레귤러 콘도 2개나 줘서 엄청 싸게 구매했었는데

이번에는 다른 이벤트 없이 수박만 구매했습니다.



이번수박도 저번의 좋은 기억이 가지고 동일한 판매자에게 구매를 했습니다.


수박 구매 옵션

수박 : 5~6키로

가격 : 9,900원

배송 : 무료




과연 이번에는 어떤 수박이 왔을까요...






아니 이런! 겉부분에 색이 변했네요

흙이 묻어있는 줄 알았는데 씻어도 안지워지더라고요ㅠㅠ

( 그래도 뭐 이정도는 감안하고 먹을만 합니다. )



수박을 잡을 때는 수박을 깨끗히 씻어야 해요

그래야 수박겉부분에 묻은 흙이나 이물질들이 손에 묻어서 내용물이 오염되지 않게 해야 되거든요


수박은 물로만 씻는것이 아니라 베이킹소다를 이용해서 씻으면 더 깨끗하게 씻을 수 있어요!!

저는 베이킹소다를 이곳저곳에 많이 쓰기 때문에 암앤해머 베이킹소다 6kg 짜리 사용하는데 이게 가성비 제일 좋은것 같아요 ㅎㅎ







뽀얀 자태를 뽐내며 수박을 나타났습니다.

저번에는 색이 좀 더 선홍빛이고 좀 더 색상이 맛있는 색이었는데 

이번에는 색이 좀 더 진하다고 해야하나

느낌이 그리 좋진 않습니다






이번 수박은 안에 씨가 어마어마했어요ㅠ

수박씨 바르다 하루가 가는줄..








총평

이번 수박은 저번 수박에 비해 크기도 작고 씨가 많았어요

당도도 저번보다는 조금 덜한 것 같네요

하지만 맛없어서 못먹고 그런건 아닙니다.

저번에 주문한 수박이 9900원짜리 수박치고 너무 좋은게 왔어요!!! 

( 그 때 5~6키로 짜리 물건을 주문했는데 9키로 짜리가 왔으니 뭔가 이상하긴 했죠 ^^; )

기대치가 너무 높아져서 이번에는 조금 실망했지만 다음에는 차라리 더 큰놈을 구매해봐야겠어요!


결론은 시중보다 가격이 저렴하니 한두번쯤은 구매해볼만 한 것 같습니다!

이상 수박킬러의 후기였습니다.




P.S. 그래도 마트보다 저렴하게 샀다고 생각했는데 구매 후 홈플러스에서 수박행사로 4~5키로 였는지 5~6키로 였는지 9900원에 팔더라고요

다음에는 홈플러스에서 구매해보기로 해야겠어요~!








다른 궁금한점 있으면 부담없이 댓글남겨주세요~^^

반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,
반응형

프롤로그

고등학교때는 말라서 180cm 에 60kg초반대의 살이 찌지 않는 체질이었는데 

어느순간 살찌고 큰 덩치로 바뀌더니 살이 전혀 빠지지 않는다.

특히 사무실에서 하루종일 앉아만 있으니 배만 나올수밖에...ㅠㅠ


최근 몇년간 건강검진을 받으러 가면 "내장지방이 많아요", "복부비만이네요" 등등 안좋은 소리만 들어왔다.

그리고 체중이 최대 93kg 까지 나갔을 때는 혈관에서 끈적한 기름이 나오는 병이라도 걸릴것 같아서 어떻게든 빼봐야지 했는데 운동만으로 빠지는데는 한계가 있었다.

유산소 + 근력운동을 병행해서 하루 1시간 30분씩 해도 3~4키로가 빠지고 나면 정체기가 오는데 그 이후로 빼는게 너무 힘들다.


식이조절 해야지 생각만 100번.....

저녁을 아내 혼자 먹게 할순 없으니 퇴근하고 밥차려 먹고 치우면 어느새 10시..

소화시키기도 전에 누워버리니 살이 빠질리가 있나


난 이대로 배불뚝이로 살아야하는가..어떻게 살을 뺄 수 있나....


이때, 회사일로 1년간 혼자 파견나가게 되어 점심을 혼밥의 상황에 마주하게 되었다.

처음 혼밥은 어색했지만 한두달이 지나서는 혼밥도 자연스러워졌다. 특히 구내식당에는 혼밥하는 사람들이 많아서 더욱 익숙해지기 쉬웠다.

혼밥의 기회에 전체적인 칼로리를 낮춰보자하면서 생각한 것이 구운계란!

요즘 계란가격이 금값이라서 정말 비싸지긴 했다.

예전에는 구운계란 한판에 6천원대였는데 요즘에는 1만원이다.

하지만 점심값 대신에 구운계란을 먹는다고 생각하면 저렴한 편이지..라고 위안을 하면서 3판을 과감하게 주문!

구운계란의 유통기한은 꽤 길다.

일반 마트에서 파는 날계란은 대략 3주정도 되는것 같은데 구운계란의 유통기한은 대략 45일정도 되는것 같다.


하루에 5개씩 먹으면 90개정도는 18일이면 끝난다. 출근하는날만 먹는다고 하면 대략 한달안쪽으로 다 먹을수 있는 분량.


편의점에서 파는건 비싸니깐 인터넷으로 구운계란 구매!


거의 3만원가량 주고 구매했는데 다행히 깨진 계란 없이 무사히 배송이 완료되었다.

자 이제 질리지 않고 열심히 다이어트 하는 수밖에....



프롤로그 끝...





주문 후 정확히 이틀뒤 3판의 계란이 왔습니다. 배송도중 몇개씩 깨져서 온다는데 다행히 1개도 깨지지 않고 왔습니다.

좌우의 2판은 구운계란이고 가운데 1판은 훈제계란입니다.

훈제계란은 맥반석에 굽고 참숯에 훈제를 하는 과정으로 만들어진다고 하는데 

실제로 씹어보면 식감이 약간 더 쫄깃쫄깃한 식감이 듭니다. ( 하지만 가격은 2천원 더 비쌌어요 )



구운계란(우)과 훈제계란(좌) 비교샷.

겉과 속의 색이 다르고 했는데 실제로 까보면 안쪽은 거의 차이를 느끼지 못할 정도입니다. 

실제 입으로 물어보면 조금 더 쫄깃한 느낌적인 느낌이 듭니다^^; 

( 훈제계란은 찜질방에서 먹는 그맛에 가깝고 일반 구운계란은 흰자가 조금은 말랑말랑한 느낌이에요!! )





칼로리를 낮추는 식단과 규칙

아침 : 차타고 출근하면서 간단하게 아내와 아임닭 닭가슴살 소세지 1개씩 흡입 ( 60g )

        2개 들었고 100g 당 약 150kcal 정도 되니 아침에 100kcal 조금 안되게 보충

        주로 이녀석들을 먹었는데 간이 약하게 되어 있어서 다이어트 용으로 적당합니다.

        ( 최근에 굽네몰 닭가슴살 후랑크를 먹었는데(마늘, 블랙페퍼, 청량고추) 

         그건 밥반찬용으로 먹어야 할 정도로 짜기에 다이어트용이라면 아임닭을 추천합니다! )




출근~퇴근 : 아 배고프다.. 점심때 몰아먹으면 저녁에 감당안되니 2시간에 1개씩 까먹어야지 하면서

                9시, 11시, 13시, 15시, 17시 이렇게 5개를 먹었습니다.

                

수분보충 : 다이어트 시 수분은 항상 넘치도록 마셔야 합니다.

              어느 기사에서는 하루 물을 2리터를 마시라고 하는데 어떤 사람을 기준으로 그정도 마시라고 하는지는 못봤던것 같아요...

              그런데 서점에서 몸짱아줌마가 쓴 몸매관리책을 봤는데 자기 몸무게의 30을 곱한 만큼의 물을 먹으면 된다고 합니다.

              저의 몸무게가 90kg 이라고 하면 90 x 30 = 2700ml !!

              난 2.7 리터의 물을 마셔야하네..

              여튼 물도 병행해서 마시니 업무시간에 배가 고프진 않습니다. 단점은 화장실을 자주가게 되지만 

              담배도 안피우니 나를 위해 1~2분의 휴식시간을 제공하겠습니다!!^^


저녁 : 그래도 아내와 저녁은 맛있게 먹자!

        한식, 파스타, 피자, 치킨 등 먹고 싶은걸 다 먹었습니다. 단, 폭식만은 하지 말자! 라고 생각하고 먹었습니다. 

        ( 1인분만 먹는것이 중요!! 아주중요!!! )



운동 : 확실히 많이 안먹으니 몸에 힘이 평소보다 없어지긴 합니다.

        과거 운동은 홈트레이닝으로 하루에 1시간 30분을 했다면 이제는 스트레칭 포함 30분만했습니다. 

        ( 매일도 아니고 이틀에 한번정도 했습니다.  거의 몸을 안쓴것 같습니다. )

        대신 점심시간에 걸음을 많이 걸어서 하루 10,000걸음은 걷고 집에 들어왔습니다.


                

이렇게 규칙을 정해서 칼로리를 확실히 낮추니 정체기에서 빠지지 않던 몸무게가 쑥 줄어들게 되었습니다!! ( 야호!! )

( 저의 정체기는 항상 87~88 에서 빠지지 않았습니다. ㅠㅠ )






위의 체중은 윈마이 체중계로 아침마다 몸무게를 재서 어플에 등록해놓았습니다. 

( 사실 중간에 다이어트도 지쳐서 "먹자먹어!!" 하면서 몸무게를 몇달간 재지 않고 잠시 포기했었습니다. 크흡.. )

작년에 최대 93kg 까지 나갔었는데 월 평균 92.1kg 에서 현재 84.6kg까지 내려와있다.

평균치만 해도 거의 8kg 이 빠졌다!


근육량은 별로 늘지 않았지만 우선 80kg 까지만 감량 후 유지하면서 근력운동 위주로 하면 근육량을 늘릴 수 있을 것 같다! 목표는? 

2018년 여름까지!



결론

우리의 몸은 워낙 정직해서 먹은만큼 찌고 안먹은 만큼 빠진다.

단순 다이어트를 한다면 식이조절 >>>>> 넘사벽 >>>>> 운동 인것 같다. 

하지만 너무 안먹으면 몸에 무리가 생길 수 있으니 적당한 칼로리 조절과 과도한 수분보충은 필수!

닭가슴살, 구운계란 다이어트 만세!!






여기까지 읽으시고도 궁금하신 내용이 있으신 친절하게 답변해드리겠습니다!!

어렵게 생각하지 마시고 댓글 남겨주세요^^





반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,
반응형

오라클 SUBSTR 함수 문법과 예제로 마스터하기




문법

SUBSTR(기준문자, 시작위치, 종료위치);

SUBSTR(기준문자, 시작위치);



예제

SELECT SUBSTR('HELLOSQL', 1, 5 );
------------------------------------------
결과 : HELLO


SUBSTR 함수는 결과의 원하는 문자열 자르기를 하기 위해 시작위치와 종료위치를 입력하여 결과의 일부분을 추출하게됩니다.

일반적으로 SUBSTR 은 문자를 자를 때 사용하게 됩니다.




SUBSTR 사용 규칙


 - 시작위치가 0이면 1로 처리됩니다. 

SELECT SUBSTR('HELLOSQL',0,1) FROM DUAL
SELECT SUBSTR('HELLOSQL',1,1) FROM DUAL
 ------------------------------------------
 결과 : H

   


  

 - 시작위치에 양수를 입력하면 문자의 시작부분부터 카운트하여 첫번째 문자를 찾습니다. 

SELECT SUBSTR('HELLOSQL',3,2) FROM DUAL
------------------------------------------
결과 : LL     



 - 시작위치에 음수를 입력하면 문자의 끝부분부터 뒤로 계산하여 첫번째 문자를 찾습니다.

SELECT SUBSTR('HELLOSQL',-3,2) FROM DUAL
------------------------------------------
결과 : SQ         




 - 종료위치가 생략되면, 시작위치 이후의 모든 문자를 리턴합니다.

SELECT SUBSTR('HELLOSQL',3) FROM DUAL
------------------------------------------
결과 : LLOSQL
 

 



  - substring_length가 1보다 작으면 null을 리턴합니다. 

SELECT SUBSTR('HELLOSQL',3,0) FROM DUAL
------------------------------------------
결과 : NULL




  - 시작위치와 종료위치에 소수점을 입력한 경우 자동으로 정수로 변환됩니다. ( 3.8 -> 3 , 3.1 -> 3 )

SELECT SUBSTR('HELLOSQL',3,3.9) FROM DUAL
SELECT SUBSTR('HELLOSQL',3,3.1) FROM DUAL
------------------------------------------
결과 : LLO

     

 - SUBSTR 의 첫번째 파라메터에 들어갈 수 있는 데이터타입은 CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB, NCLOB 중 1개 타입을 사용할 수 있습니다.

    또한, 결과값은 파라메터에 입력한 타입과 동일한 데이터타입을 리턴합니다.

    



 - 시작위치와 종료위치에 입력되어야 할 값은 데이터타입이 NUMBER 타입이거나 NUMBER 타입으로 변환될 수 있는 데이터타입으로 입력해야 합니다. ( 즉, 정수값이 입력되어야 합니다. )








SUBSTR 과 비슷하지만 다른 문자형태를 잘라서 사용하고 싶은 경우 아래의 함수를 이용할 수 있습니다. ( 문법동일 )


SUBSTRB : 문자 대신 바이트를 사용

SUBSTRC : 유니코드 완성형 문자를 사용

SUBSTR2 : UCS2 코드포인트를 사용

SUBSTR4 : UCS4 코드포인트를 사용


위의 함수 중 SUBSTRB 는 1~2년에 한두번 사용해보았으나 그 밑의 함수들은 아직 사용해본적이 한번도 없습니다.




♡공감과 댓글은 저에게 더 큰 힘이 됩니다!

( 로그인하지 않아도 공감버튼은 클릭됩니다. )



반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,
반응형

오라클 다양한 INSERT INTO 방법


INSERT문을 사용하면 테이블에 데이터를 입력할 수가 있습니다.


물론 해당테이블에 INSERT 권한이 있어야 입력이 가능합니다.


이 포스팅에서는 다양한 방법으로 INSERT 처리하는 법을 알아보겠습니다.


INSERT 문법

INSERT INTO dml_table_expression_clause [ t_alias ]
[ (column [, column ]...) ]
VALUES ({ expr | DEFAULT }
          [, { expr | DEFAULT } ]...
       )



INSERT 예제

INSERT INTO EMP e ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( '7499','ALLEN','SALESMAN','7698',SYSDATE,'1600','300','30');
INSERT INTO EMP e ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO ) VALUES ( '7521','WARD' ,'SALESMAN','7698',SYSDATE,'1250','500','30');


INSERT INTO EMP e VALUES ( '7499','ALLEN','SALESMAN','7698',SYSDATE,'1600','300','30');
INSERT INTO EMP e VALUES ( '7521','WARD' ,'SALESMAN','7698',SYSDATE,'1250','500','30');


INSERT INTO EMP e VALUES ( '7369','SMITH','CLERK','7902',SYSDATE,'800',NULL,'20');
INSERT INTO EMP e ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, DEPTNO ) VALUES ( '7369','SMITH','CLERK','7902',SYSDATE,'800','20');


일반적인 INSERT 방법은 위의 문법으로 입력을 하게 됩니다.


아래 두줄의 차이점은 전체 컬럼의 값을 넣느냐 넣지 않느냐로 비교할 수 있는데

5번 라인은 전체 컬럼 기준으로 COMM 컬럼에 NULL 을 명시하여 입력한 CASE 이며

6번 라인은 INSERT 할 컬럼에서 COMM 컬럼을 제외한 컬럼에 직접 값을 입력한 CASE 입니다.

( 동일한 결과를 확인 할 수 있습니다. )






테이블 생성과 데이터 입력을 한번에!

CREATE TABLE SCOTT.EMP_BACKUP AS 
SELECT * 
  FROM SCOTT.EMP
;


또는 테이블 백업 시 데이터도 그대로 넣어야 할 경우도 있습니다.

위와 같이 생성 시 테이블 생성 + 데이터 입력이 동시에 이루어지게 됩니다.


CREATE TABLE SCOTT.EMP_BACKUP AS 
SELECT EMPNO
     , ENAME
     , JOB
     , MGR
     , 2500 AS SAL
     , COMM
     , DEPTNO 
  FROM SCOTT.EMP
 ;

INSERT 와 마찬가지로 데이터는 CREATE TABLE [table_name] AS SELECT 문에서도 원하는 컬럼만 생성하여 컬럼을 생성할 수 있습니다.

이 때, 컬럼의 ALIAS 는 필수입니다!



일반적으로 테이블 백업을 할 때는 위의 방법을 사용할것으로 예상됩니다.




다수의 INSERT 처리

INSERT INTO EMP_BAK
SELECT * FROM EMP
;

INSERT 할 테이블을 지정 후 SELECT 결과를 INSERT 합니다.

INSERT INTO SCOTT.EMP_BAK ( EMPNO, ENAME, JOB, SAL )
 SELECT EMPNO, ENAME, JOB, SUM(SAL)
   FROM SCOTT.EMP
 GROUP BY EMPNO, ENAME, JOB
;

위와 같이 가공한 데이터를 INSERT 할 때 주로 사용합니다.



다수 테이블의 INSERT 처리

INSERT ALL
  INTO EMP_BAK  ( EMPNO, ENAME, JOB )
  INTO EMP_BAK2 ( EMPNO, ENAME, JOB )
  INTO EMP_BAK3 ( EMPNO, ENAME, JOB )
  INTO EMP_BAK4 ( EMPNO, ENAME, JOB )
  INTO EMP_BAK5 ( EMPNO, ENAME, JOB )
SELECT EMPNO, ENAME, JOB 
  FROM EMP
;

사실 다수 테이블에 한번에 INSERT 할 일이 없어서 실제로 써본적은 없지만 이런 방법이 있다는 것만 알아도 될 것 같습니다.



엑셀을 이용한 다수의 INSERT 처리


이건 INSERT 뿐만 아니라 여러방면으로 활용될 수 있는 방법인데

엑셀의 각 열에 데이터를 입력 후 수식을 이용해 문장을 만든 후 INSERT 처리하는 방법입니다.


선행작업 : A B C 열에 데이터를 입력합니다.

-- 수식
="INSERT INTO EMP VALUES('"&A1&"',"&"'"&B1&"',"&"'"&C1&"');"
="INSERT INTO EMP VALUES('"&A2&"',"&"'"&B2&"',"&"'"&C2&"');"
="INSERT INTO EMP VALUES('"&A3&"',"&"'"&B3&"',"&"'"&C3&"');"

-- 값 복사
INSERT INTO EMP VALUES('7369','SMITH','CLERK');
INSERT INTO EMP VALUES('7499','ALLEN','SALESMAN');
INSERT INTO EMP VALUES('7521','WARD','SALESMAN');

값 복사를 통해 위의 결과를 한번에 실행하여 INSERT 가능합니다.





이상으로 테이블 데이터 INSERT 하는 방법에 대해 알아보았습니다.


반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,
반응형

오라클 LOCK 걸린 개체 확인 및 LOCK 해제


오라클이나 다른 DBMS 제품을 사용하는 중에 LOCK 이 걸려본 경험은 다들 한두번씩 있을거라고 봅니다.

일반적으로 TOAD 나 ORANGE 같은 상용제품을 사용할 때는 모니터링툴이 있으니 바로 열어서 확인해볼수 있지만

SQL Developer 같은 무료제품을 사용할 때에는 어떻게 해야 하는지 알 수 없습니다.


사실 모니터링툴도 다 DBMS 에서 관리하고 있는 시스템인데 SQL 로 조회해보면 됩니다.

자주 사용하는 sql 정도는 몇개 저장해두고 사용하면 편하게 쓸 수 있습니다.


일단 LOCK 걸린 객체를 확인해보겠습니다.



1. lock 걸린 개체 확인


SELECT OBJECT_ID
     , SESSION_ID       -- SID
     , ORACLE_USERNAME
     , OS_USER_NAME
  FROM V$LOCKED_OBJECT
;


OBJECT_ID	SESSION_ID	ORACLE_USERNAME		OS_USER_NAME
-----------------------------------------------------------------
163990		401		SCOTT			js
163966		401		SCOTT			js




이걸로는 자세한 내용을 아직 알기 어렵습니다.


그러면 다음으로 해당 sid 와 serial 번호로 락걸린 object name 을 확인해보겠습니다.


2. 해당 sid 와 serial 번호로 락걸린 object name 을 확인


SELECT A.SID
     , A.SERIAL#
     , object_name
     , A.SID || ', ' || A.SERIAL# AS KILL_TASK
  FROM V$SESSION A
 INNER JOIN V$LOCK B
    ON A.SID = B.SID
 INNER JOIN DBA_OBJECTS C
    ON B.ID1 = C.OBJECT_ID
 WHERE B.TYPE  = 'TM'
 ;
   

SID	SERIAL#	OBJECT_NAME	KILL_TASK
------------------------------------------------------------
401	12761	EMP		401, 12761
401	12761	EMP		401, 12761



자 이제 뭔가 OBJECT_NAME 이 보이면서 이 TABLE이 LOCK 이 걸렸구나 라는것을 확인할 수 있습니다.



그럼 LOCK 이 걸린것은 확인했고 LOCK 을 해제하려면 어떻게 해야 할까요?

정답은 마지막에 SID 와 SERIAL# 로 조회된 NUMBER 로 해당되는 SESSION 을 KILL 시키면 됩니다.


          

3. sid 와 시리얼 번호로 세션 해제


 ALTER SYSTEM KILL SESSION '401, 12761'
 ;


뒤에 입력된 숫자인 401, 12761 는 위에서 말씀드린 SID와 SERIAL# 에 대한 값입니다.

편하게 KILL_TASK 라는 값을 복사해서 사용할 수 있게 미리 만들어주었습니다.



 ( ALTER 명령은 별도의 COMMIT 이 필요없는거 다들 아시리라 생각합니다. )

 


이 단계까지 왔으면 LOCK 걸린 테이블의 SESSION 은 해제되었을 것이라고 봅니다.


그런데 위에서 조회된 세션이 단순히 LOCK 걸린것이 아니라 아직 작업중인 SQL 일수도 있다는 생각이 들수도 있습니다.


그럴때는 LOCK 을 발생시킨 SQL 이 뭔지 확인해볼수 있습니다.

 

  

  

4. 락 발생 사용자 및 OBJECT 조회 + 어떤 sql 를 실행중하여 lock 을 걸고 있는지 확인


SELECT DISTINCT T1.SESSION_ID , T2.SERIAL# , T4.OBJECT_NAME , T2.MACHINE , T2.TERMINAL , T2.PROGRAM , T3.ADDRESS , T3.PIECE , T3.SQL_TEXT FROM V$LOCKED_OBJECT T1 , V$SESSION T2 , V$SQLTEXT T3 , DBA_OBJECTS T4 WHERE 1=1 AND T1.SESSION_ID = T2.SID AND T1.OBJECT_ID = T4.OBJECT_ID AND T2.SQL_ADDRESS = T3.ADDRESS ORDER BY T3.ADDRESS, T3.PIECE ; SESSION_ID SERIAL# OBJECT_NAME MACHINE      TERMINAL PROGRAM      ADDRESS PIECE SQL_TEXT -------------------------------------------------------------------------------------------------------------------------------------------- 401      12761 EMP      machine_com1 unknown JDBC Thin Client 230134658 0     INSERT /*+ APPEND */ INTO EMP 401      12761 EMP      machine_com1 unknown JDBC Thin Client 230134658 1     , EMPNO 401      12761 EMP      machine_com1 unknown JDBC Thin Client 230134658 2     , EMPNM 401      12761 EMP      machine_com1 unknown JDBC Thin Client 230134658 3     , DEPTNO



위와 같이 조회되면 맨 우측에 SQL_TEXT 를 조회해보면 어떤 SQL 이 실행되었는지 알 수 있습니다.



이상으로 오라클 TABLE LOCK 조회 및 해제방법에 대해 알아보았습니다.


반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,
반응형

오라클 drop 된 테이블 복원 ( Flashback ) Recycle Bin 에서 테이블 복원


실수로 삭제하지 않아야 할 테이블을 삭제했을 경우 당혹스러울 때가 있는데 오라클에서는 drop 된 테이블도 복원할 수 있는 기능이 있습니다.

바로 Flashback 이라는 기능인데 테이블을 drop 할 때 데이터베이스는 테이블과 연관된 공간을 바로 제거하지는 않습니다.

데이터베이스는 테이블의 이름을 변경하여 관련 오브젝트를 Recycle Bin에 넣습니다.


위에서 말한대로 사용자가 실수로 테이블을 drop 했을 때 복구할 수 있습니다.

이 기능을 Flashback Drop 이라고하며 FLASHBACK TABLE 문을 사용하여 테이블을 복원 가능합니다.

FLASHBACK TABLE 문을 사용하기 전에 Recycle Bin의 작동 방식과 관리방법을 이해하도록 하겠습니다.



FlashBack 에 대한 내용은 4가지 주제로 구성됩니다.



1. Recycle Bin 이란 무엇인가?

2. Recycle Bin 에 있는 객체 조회 및 쿼리방법

3. Recycle Bin 에 있는 객체 제거

4. Recycle Bin 에서 테이블 복원





4. Recycle Bin 에서 테이블 복원


FLASHBACK TABLE ~ TO BEFORE DROP 


위의 문법을 사용하여 Recycle Bin 에서 객체를 복구할 수 있습니다.


Recycle Bin에 있는 테이블이 이름이나 원래 테이블 이름을 지정할 수 있습니다.

선택적으로 RENAME TO 절을 사용하면 복구할 때 테이블의 이름을 변경하여 복구할 수 있습니다.

Recycle Bin 의 이름은 Recycle Bin 에 있는 View 및 Query 에 표시된대로 DBA_RECYCLEBIN 또는 USER_RECYCLEBIN View 에서 가져올 수 있습니다.

FLASHBACK TABLE ... TO BEFORE DROP 문을 사용하려면 테이블을 삭제하는것과 동일한 권한이 필요합니다.



아래의 예제는 TB_USER_INFO 테이블을 지우고 새로운 이름으로 복원하는 방법에 대한 예시입니다.


FLASHBACK TABLE TB_USER_INFO TO BEFORE DROP
   RENAME TO TB_USER_INFO2 ;


시스템에서 생성한 Recycle Bin 의 이름은 테이블을 여러번 삭제한 경우 매우 유용합니다.

예를 들어 Recycle Bin 에 TB_USER_INFO 테이블의 버전이 5가지가 있으며 4번째 버전을 복구하려고 한다고 가정합니다.

두개의 FLASHBACK TABLE 문을 실행하여 이 작업을 수행하거나 아래의 예제와 같이 휴지통을 Query 한 다음 

시스템에서 만든 이름으로 FLASHBACK 할 수 있습니다.

쿼리에 테이블 생성시간을 포함시키면 OBJECT NAME 을 확인 후 정확한 테이블을 복원할 수 있습니다.



SELECT OBJECT_NAME, ORIGINAL_NAME, CREATETIME FROM RECYCLEBIN ;


BIN$UofUBMjLnkDgUOABLqNFXg==$0    TB_USER_INFO    2017-06-22:15:44:26
BIN$UofUBMjMnkDgUOABLqNFXg==$0    TB_USER_INFO    2017-06-22:15:45:26
BIN$UofUBMjNnkDgUOABLqNFXg==$0    TB_USER_INFO    2017-06-22:15:45:52
BIN$UofUBMjOnkDgUOABLqNFXg==$0    TB_USER_INFO    2017-06-22:15:46:08
BIN$UofUBMjPnkDgUOABLqNFXg==$0    TB_USER_INFO    2017-06-22:15:46:17


FLASHBACK TABLE "BIN$UofUBMjOnkDgUOABLqNFXg==$0" TO BEFORE DROP;



Recycle Bin 에서 테이블을 복원할 때 인덱스와 같은 종속된 객체는 원래 이름으로 다시 가져오지 않습니다.

종속된 객체는 시스템에서 생성한 Recycle Bin 의 OBJECT_NAME 을 그대로 유지합니다.

원본 이름으로 복원하려면 종속된 객체의 이름을 수동으로 변경해야 합니다.

종속 객체의 원래 이름을 수동으로 복원하려면 테이블을 복원하기전에 각 종속 객체의 시스템에서 생성한 Recycle Bin 에서 ORIGINAL_NAME을 기록해두어야 합니다.



아래 예시는 TB_USER_INFO 에서 생성한 일부 인덱스의 이름을 원래 이름으로 복원하는 예입니다.

이 예에서는 SCOTT 사용자로 로그인 했다고 가정합니다.


1. 테이블 생성 후 테이블 삭제


CREATE TABLE TB_USER_INFO ( USER_NO VARCHAR2(10 BYTE)
                          , USER_NM VARCHAR2(50 BYTE)
                          , AGE NUMBER
                          , CONSTRAINT "PK_TB_USER_INFO" PRIMARY KEY ( USER_NO )
)
;

DROP TABLE TB_USER_INFO ; 



2. Recycle Bin 에서 복원하기 전에 아래의 쿼리를 실행합니다.


SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE, CREATETIME FROM RECYCLEBIN
ORDER BY CREATETIME;

BIN$UofUBMjZnkDgUOABLqNFXg==$0   TB_USER_INFO      TABLE   2017-06-22:16:04:19
BIN$UofUBMjYnkDgUOABLqNFXg==$0   PK_TB_USER_INFO   INDEX   2017-06-22:16:04:19


3. 테이블을 복원합니다.


FLASHBACK TABLE TB_USER_INFO TO BEFORE DROP ;



4. 아래의 쿼리를 실행하여 TB_USER_INFO 의 인덱스가 시스템에서 생성한 Recycle Bin 에 이름이 있는지 확인합니다.


SELECT INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME = 'TB_USER_INFO';
BIN$UofUBMjYnkDgUOABLqNFXg==$0



5. 아래와 같이 인덱스의 원래 이름을 복원합니다.


ALTER INDEX "BIN$UofUBMjYnkDgUOABLqNFXg==$0" RENAME TO PK_TB_USER_INFO;


시스템에서 생성된 이름은 큰따옴표로 감싸줍니다.



반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,
반응형

오라클 drop 된 테이블 복원 ( Flashback ) Recycle Bin 에서 객체제거


실수로 삭제하지 않아야 할 테이블을 삭제했을 경우 당혹스러울 때가 있는데 오라클에서는 drop 된 테이블도 복원할 수 있는 기능이 있습니다.

바로 Flashback 이라는 기능인데 테이블을 drop 할 때 데이터베이스는 테이블과 연관된 공간을 바로 제거하지는 않습니다.

데이터베이스는 테이블의 이름을 변경하여 관련 오브젝트를 Recycle Bin에 넣습니다.


위에서 말한대로 사용자가 실수로 테이블을 drop 했을 때 복구할 수 있습니다.

이 기능을 Flashback Drop 이라고하며 FLASHBACK TABLE 문을 사용하여 테이블을 복원 가능합니다.

FLASHBACK TABLE 문을 사용하기 전에 Recycle Bin의 작동 방식과 관리방법을 이해하도록 하겠습니다.



FlashBack 에 대한 내용은 4가지 주제로 구성됩니다.



1. Recycle Bin 이란 무엇인가?

2. Recycle Bin 에 있는 객체 조회 및 쿼리방법

3. Recycle Bin 에 있는 객체 제거

4. Recycle Bin 에서 테이블 복원






3. Recycle Bin 에서 객체제거


Recycle Bin 에서 객체를 복원하지 않고 Recycle Bin 의 객체를 제거하고 저장공간을 확보하려면 PURGE 문을 사용하면됩니다.

이 때 권한은 항목을 삭제하는 것과 동일한 권한이 필요합니다.



PURGE 문을 사용하여 테이블을 제거하면 Recycle Bin이나 테이블의 원래 이름에서 테이블을 알 수 있는 고유한 이름을 사용할 수 있습니다.

Recycle Bin 의 이름은 Recycle Bin 오브젝트에 있는 View 나 Query 에 표시된대로 DBA_RECYCLEBIN or USER_RECYCLEBIN View 에서 가져올 수 있습니다.


아래의 예시는 TB_USER_INFO 테이블을 Recycle Bin에 놓았을 때 BIN$Ulu8B5c+Oz3gUOABLqObkg==$0 의 이름으로 바뀝니다.


PURGE TABLE "BIN$Ulu8B5c+Oz3gUOABLqObkg==$0" ;


아래의 문장을 통해 동일한 결과를 얻을수 있습니다.

( 테이블이 DROP 되어 RECYCLEBIN 에 존재하는 경우 사용 가능합니다. )


PURGE TABLE TB_USER_INFO ;



테이블스페이스에 존재하는 모든 Recycle Bin 의 내용을 지우고 싶은 경우, 또는 지정한 사용자의 테이블스페이스의 객체에 있는 Recycle Bin의 내용을 제거할 수 있습니다.


PURGE TABLESPACE ts_01 ;
PURGE TABLESPACE ts_01 USER scott ;


사용자는 아래의 문장을 사용하여 자신이 가진 객체의 Recycle Bin 을 제거하고 여유공간을 확보할 수 있습니다.


PUREGE RECYCLEBIN ;


SYSDBA 권한이 있는 경우 PURGE RECYCLEBIN 대신 PURGE DBA_RECYCLEBIN 을 입력하면 전체 Recycle Bin 을 제거할 수 있습니다.


위에서는 테이블을 삭제하였는데 PURGE 문을 사용하면 Recycle Bin 에서 Index 를 제거하거나 지정된 테이블스페이스에 있는 모든 오브젝트를 Recycle Bin에서 제거할 수 있습니다.



반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,
반응형