oracle 환경설정 및 imp까지의 총정리
1. 현재 계정에 sudo 권한주기
su root; // root계정 접속
/etc/sudoers 경로 에서
Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
위 부분 이상없는지 확인
usermod --append -G wheel {username}
이제 username 이름의 user가 sudo 명령 사용 가능
2. sid, instance, dbname 일치 시키기 위해 ORACLE_SID, instance_name 수정하기
2.1. listener.ora 파일에서 sid 수정
$ORACLE_HOME/network/admin/
위 경로에 있음 vi로 수정하자
2.2. spfile || pfile 수정하기
나의 경우는 spfile을 사용중이지 않으므로 pfile 수정
pfile은 $ORACLE_HOME/dbs/ 에 위치해있다.
pfile 이름 수정 및 내용 수정
rename 명령어 사용법 : rename (적용 범위) (교체할 문자) (파일 명)
rename init{oldname}.ora init{newname}.ora init{oldname}.ora
vi initsource.ora
명령어로 내용 바꾸기
2.3. 세션 설정 sid 변경
echo 'export ORACLE_SID=새로 지정할 sid' >> ~/.bashrc
source ~/.bashrc
위 명령어를 통해 변경했다.
2.4. 변경 완료 후 확인
SQL> select name from v$database; // dbname확인
SQL> select instance_name from v$instance // instancename 확인
$ env | grep ORACLE // SID 및 ORACLE 환경설정 확인
2.5. oracle 용 user 생성 및 권한 부여
sys 계정으로 user 생성 및 sysdba, connect, user table 등의 필요한 수정권한 주기
create user myuser identified by 비밀번호
grant sysdba to myuser;
grant connect, resource, dba to myuser;
alter user myuser quota unlimited on users;
이제 스크립트 에서 데이터파일 size 잘 수정했는지 확인하고, 스크립트 실행!
SQL> @@경로\\sqlfile.sql
아래는 내가 사용한 full imp 명령
imp file=/home/ora19c/rcb21.dmp' full=y
db를 import하던 중 특정 테이블에서(항상 거기서) 에러가 발생했다
imp-00009 : abnormal end of export file
imp-00028 : partial import of previous table rolled back: 600000 rows rolled back
Import terminated successfully with warnings.
파일의 끝이 이상할린 없을텐데… 여기서 좀 고생했다. 다시 맘먹고 구글링하면서,
우선적으로 내가 고려하지 않은 imp 명령의 옵션이 있는지 생각했는데,
https://www.dba-village.com/village/dvp_forum.OpenThread?ThreadIdA=34446
여기서 recodelength 옵션을 건드려볼 것을 권했고, recodelength에 대해서 알아보던 중, 내가 dmp파일의 character set을 전혀 고려하지 않았었다는 것을 깨달았다.
파일 character set 확인
파일의 character set을 확인하려면
od -b expdat.dmp | more
명령어를 입력한 후 결과를 확인하면 되는데, 위 명령어는,
- od: "octal dump", 파일의 내용을 8진법 바이트 형식으로 표시하는 명령어. 파일을 바이트 단위로 읽어서 해당 바이트의 8진법 으로 출력.
- -b: "od" 명령어에 대한 옵션으로, 파일의 내용을 8진법 바이트 형식으로 출력하도록 지시합니다.
- |: 파이프 기호, 명령어의 출력을 다른 명령어의 입력으로 보내는 데 사용됩니다. 여기서는 "od" 명령어의 출력을 "more" 명령어의 입력으로 보냅니다.
- more: 터미널에서 텍스트를 페이지 단위로 출력하는 도구입니다. 출력이 화면을 넘어가는 경우에 스크롤링을 통해 페이지마다 내용을 볼 수 있도록 함. 위의 경우에는 파일의 윗부분만 필요하니까 사용했다.
아무튼 위의 명령어를 입력하면 file의 내용이 8진법 바이트 형식으로 표현되는데,
이 때,
첫 번째 byte 값의 경우로 나눌 수 있다.
001 : oracle v5,6 ASCII
002 : oracle v5,6 EBCDIC
003 : oracle v7
003인 경우는 어떤 캐릭터셋인지 2,3번째 byte를 character set 판별에 사용하면 된다.
000 001 : US&ASCII
000 002 : WE8DEC
000 037 : WE8ISO8859P1
003 110 KO16KSC5601
003 147 UTF8
참고한사이트
http://gilab.kr/dbtech/bbs/?bo_c=1010&bo_v=125
나의 경우는
000000 003 003 147 ~~~~~~~~~~
000020 ~~~~~~~~~~~~~~~~~~
와 같은 식으로 byte 변환되었으므로 UTF8 로 Encoding된것을 확인할 수 있다.
내 DB의 character set 확인
seelct * from nls_database_parameters where parameter = 'NLS_CHARACTERSET' ;
햇을 때 나오는게 내 dB의 character set으로 나의 경우는 UTF8과 호환되는 AL32UTF8이므로 문제없음,
recordlength는 필수 옵션이 아니고 레코드의 최대 길이를 지정해주는 옵션인데,
가장 긴 최대길이 65535로 옵션을 주고 수행해봤는데 안된다..
compress=y 에 대한잘못된 정보 주의
만약 해당 dmp 파일을 exp할 당시 binary mode로 ftp 전송할 때 만약 file size가 너무 크면 compress 옵션을 y로 주고 했어야 정상 imp가 되었을 것이라고 하는 잘못된 답변이 있는데,
아래 사이트 보면 엄청 혼나고있다. 그럼 이건 원인이아닌거같은데…
https://www.dbasupport.com/forums/showthread.php?45317-IMP-00009-abnormal-end-of-export-file
혹시 exp 한 oracle 버전이 imp할 버전보다 상위버전이 아닌지?
정말 고려해보지못한 문제이다. 왜냐면 실장님이 걍 oracle 깔고 sw 깔고 CentOS pc째로 줬으니까…
더 이상 물러날 곳이 없어서 실장님께 db 주인과 컨택할 수 있게 해달라고 했다.
db exp한 곳에 문의해보니 19.9.,0.0.0, 현재 내 버전은 19.3.0.0.0이다.
http://www.koreaoug.org/install/9667
위 사이트를 참고하여 oracle 버전을 업데이트하기로 햇다.
db 버전 확인은 어떻게 했냐면..
현재 DB 버전 및 구성 확인
SET LINESIZE 200
COL NAME FOR A12
COL OPEN_MODE FOR A10
COL ACTION FOR A10
COL ACTION_TIME FOR A11
COL DESCRIPTION FOR A30
COL PATCH_TYPE FOR A10
COL SOURCE_VERSION FOR A15
COL TARGET_VERSION FOR A15
SELECT A.CON_ID
,B.NAME
,B.OPEN_MODE
,TO_CHAR (A.ACTION_TIME, 'YYYYMMDD') ACTION_TIME
,A.PATCH_ID
,A.PATCH_TYPE
,A.ACTION
,A.DESCRIPTION
,A.SOURCE_VERSION
,A.TARGET_VERSION
FROM CDB_REGISTRY_SQLPATCH A, V$CONTAINERS B
WHERE a.con_id = B.CON_ID
ORDER BY CON_ID, PATCH_ID;
위 명령어를 통해 현재 19.3 버전으로 설치된 것을 확인했다.
19.9 버전으로 patch update 하기 위해서 opatch 버전 업데이트 후 진행하려했으나,
oracle 설치는 괜찮은데 oracle 업데이트관련해서는 모두 oracle support 에 접근 가능한 계정이 필요해서, 그냥 다시 빈 가상 환경에 oracle 21c를 설치하는 방법으로 회귀..
oracle 19.9 → 21.3 으로의 imp는 괜찮다고 한다.