본문 바로가기

oracle

오라클 RMAN 블록 손상 (Block Corruption) 복구 (ORA-01578, ORA-01110) 대부분의 Database 들이 백업/복구 기능을 갖추고 있습니다. 그런데, 보통은 DB 전체를 복구하거나 데이터파일 단위까지 복구하는 정도 입니다. 오라클은 특정 데이터 블록(Data block)이 손상된 경우에, 데이터파일 전체를 복구하지 않고, 손상된 블록만 복구할 수 있습니다. 손상된 블록만 복구하는 것이기 때문에 빠르게 복구할 수 있는 장점이 있습니다. 데이터블록 손상은 여러 이유로 발생할 수 있는데, 일단 블록손상이 발생하면 해당블록에 작업하려고 할 때 아래와 같이 ORA-01578, ORA-01110 에러가 발생합니다. sys 유저에서 v$database_block_corruption 뷰를 조회하면, 정확히 Block Corruption 이 발생한 파일#, 블록# 를 확인할 수 있습니다. 이렇.. 더보기
오라클 RAC에서 Grid, DB 간 환경전환 빠르게 해주는 bash 쉘스크립트 환경파일 생성 Oracle RAC DB 서버에는 $ORACLE_HOME 이 두개 존재합니다. Oracle S/W 가 2군데 설치되어 있는 것이죠. 아래와 같이 grid 홈과 Oracle DB 홈이 있습니다. grid 는 CRS 또는 GI 라고도 하죠~ ** grid 홈 export ORACLE_HOME=/u01/app/19.0.0/grid export ORACLE_SID=+ASM1 ** DB 홈 export ORACLE_HOME=/u02/app/oracle/product/19.0.0/dbhome_1 export ORACLE_SID=RAC1 grid 와 oracle db 를 하나의 유저내에 만들어 넣을 수도 있고, 다른 유저로 나눠서 설치하기도 합니다. RAC 를 운영하다 보면, grid 환경과 oracle db 환경을.. 더보기
파티션키 컬럼에 대해서 Update 를 하는 경우 (ORA-14402 에러) (Enable Row Movement) 오라클 파티션(Partition) 테이블에 대해서 Update 하려고 할때, 파티션 키컬럼에 대해서도 Update 하게 되는 경우가 있을 수 있습니다. 그런데, 파티션키 컬럼을 변경하는 것은 일반 컬럼값 변경하는 경우와는 조금 다르게 생각해야 합니다. 파티션테이블의 데이터들이 모두 파티션 키컬럼값에 따라 어느 파티션으로 들어갈지가 정해지는 것인데, 이걸 그냥 값만 Update 해버리면 안되겠죠~ Update 가 일어나는 순간 다른 적절한 파티션으로 옮겨져야 합니다. 이것을 가능하게 해주는 Table 옵션이 "Enable Row Movement" 입니다. 파티션 Table 에 이 옵션을 걸어주지 않고 그냥 파티션키값을 변경하려고 하면 아래와 같이 ORA-14402 에러가 발생합니다. (아래의 경우는 SAL.. 더보기
Plan 이 변하는 SQL 을 찾아서 Plan을 고정할 수 있는 프로그램 (SQLArea) - SPM 이용 오라클 DBMS 를 운영하다보면, 잘 실행되던 SQL 쿼리가 이상하게 가끔씩 느려지는 경우를 경험하게 됩니다. 이유는 Plan(실행계획) 이 바뀌기 때문입니다. 정확하게 말하자면, 하나의 SQL에 대해서 Plan 이 하나가 아닙니다. 이게 Oracle 11g 부터 추가된 Adaptive Cursor Sharing 기능 때문입니다. 데이터를 조회할때 데이터에 따라 대상건수가 너무 크게 다른 경우가 있기 때문에 하나의 Plan 만으로 실행하는 것은 너무 비효율적입니다. 예를 들어, 위 테이블에 대해 select * from ACS_TEST where col1 = :Var1; 과 같은 SQL Query 가 실행되는 경우, Var1 = 'A' 로 조회할때는 Index 를 타는 것이 좋고, Var1 = 'C' 로.. 더보기
사용하지 않는 인덱스 찾기 - Index 모니터링 걸지 않고 확인하는 방법 (v$sql_plan, dba_hist_sql_plan) 앞 글에서 Index 에 Monitoring 을 걸어서 사용여부를 확인하는 방법에 대해 살펴봤습니다. 그런데, 모든 Index 에 monitoring 을 잔뜩 걸기가 쫌 거시기 한 경우~ 사용할 수 있는 방법이 있습니다. 물론 완전하지는 않지만.... v$sql_plan 뷰와 dba_hist_sql_plan 딕셔너리에서 조회하는 방법입니다. Oracle DB 에서 실행되는 모든 SQL은 파싱되면서 정보를 라이브러리캐시(Library Cache)에 기록하게 되는데, 여기에서 Plan 정보를 조회할 수 있는 뷰가 v$sql_plan 입니다. 따라서, 여기에 Index 정보가 들어있다면, 적어도 언제가 한번 이상은 해당 인덱스를 사용한 적이 있다는 의미가 됩니다. v$sql_plan 은 메모리에 있는 정보를 .. 더보기
Oracle 샘플 테스트 데이터 생성 프로그램 다운로드 (Data Maker) Oracle DBMS 기능 및 SQL 테스트할 때 사용할 수 있는 샘플/테스트 데이터 생성 프로그램을 만들어봤습니다. 무료툴이니 제한없이 맘껏 사용하시고^^, 궁금한 사항은 이 페이지 아래에 댓글로 문의주시기 바랍니다. 이 툴의 용도는 Oracle DB 안에 테스트용 테이블을 만들어주는 것입니다. Oracle DB 에서 보통 테스트 용도로 많이 사용되는 테이블들은 오라클에서 제공하는 샘플 스키마 scott 유저 또는 hr 유저입니다. 이들 테이블들을 쉽게 만들어주는 기능을 구현해봤습니다. 그리고, 한글이름, 주민등록번호, 핸드폰번호, 우편번호 등의 컬럼의 데이터를 가진 사용자테이블도 생성해주는 기능도 함께 구현되었습니다. 만들수 있는 최대건수는 1천만건 입니다. * 프로그램 다운로드 - v1.1 (202.. 더보기
테이블 자동 시리얼 번호 컬럼 Auto Increment Identity Column (오라클 12c 신기능) MySQL 에 auto_increment 라는 컬럼 키워드가 있습니다. 데이터가 들어올때마다 자동으로 시리얼 번호를 붙여주는 기능입니다. Oracle 에도 이런 똑같은 기능이 12.1 버전부터 생겼습니다. create table TEMP_AUTO ( col_id number generated as identity, col_text varchar2(50) ); 위와 같이 generated as identity 키워드를 붙여주면 MySQL 의 auto_increment 와 똑같은 동작을 합니다. 아래와 같이 TEMP_AUTO 테이블에 데이터를 Insert 할때, col_id 컬럼을 넣지 않으면 자동으로 순차번호가 부여되어 Insert 됩니다. insert into TEMP_AUTO (col_text) val.. 더보기
오라클 정규표현식 함수 regexp_replace 샘플예제 (날짜 포맷 변경하기 SQL문) 지난번에 Oracle Regular Expression 함수 regexp_replace( ) 의 기본적인 기능을 살펴봤습니다. 이번에는 조금 더 복잡한 경우를 구현해보고자 합니다. 날짜 포맷이 서양에서 많이 사용하는 'MM/DD/YYYY' 형태로 되어 있는 것을 'YYYY/MM/DD' 로 바꾸고, 구분문자 '/' 도 '-' 로 바꿔 보겠습니다. 먼저, 'MM/DD/YYYY' -> 'YYYY/MM/DD' 변환을 해야 합니다. 뒤에있는 년도(YYYY)를 분리해서 앞으로 가져와야 합니다. 문자열을 분리하기 위해서는 패턴문자열에 괄호 ( ) 로 서브패턴들을 감싸주면 됩니다. 첫번째 ( ) 안에 감싸진 패턴이 \1 이 되고, 두번째 ( ) 안에 감싸진 패턴 결과가 \2 가 되는식입니다. [0-9]{2} 는 "숫자.. 더보기