검색해보니까 db를 살려내기 전에 user부터 생성해야했다.
그래서 db를 복구하기 전에 새로운 user를 만들어서 새로 imp 할 db를 관리하고자 했다.
트러블 슈팅 과정
매순간이 트러블슈팅이였긴 했다...
Issue#1 터미널을 어떻게 열지..
설치할 프로그램의 구버전 linux환경은 redhat으로 오른쪽마우스 누르면 터미널 열기가 있었다…
이건 없어서 어떻게하나!
#1 터미널 열기 단축키 지정하기
설정→장치→키보드 설정에서 실행할 명령을 gnome-terminal 으로 설정, 단축키는 마음대로 하면 된다. 나는 Ctrl+Shift+T 로 지정함.
1. 새로운 사용자를 sys계정으로 생성했다.
create user {유저이름} identified by {비밀번호}
sys 계정으로 사용자를 생성했다 이제 권한을 주자!
2. 새로 만든 사용자에게 권한 주기
grant sysdba to {유저 이름}
이 명령어로 사용자에게 sysdba급 권한을 주려고 하니 오류가 났다.
Issue#2 새로운 사용자에게 권한이 부여되지 않는 오류
오류 내용은
ora-01994 Password file missing or disabled
Password file이 없거나 못쓴다고하니 다음과 같은 과정으로 해결하고자 하였다.
1.password file이 없는가?
$ORACLE_HOME/dbs 디렉토리로 이동해서 orapw 파일을 찾아봤는데 있었다… 현재 db명으로 orapw{디비이름} 이렇게 잘만 생성되어있었다.
2.passwordfile이 disable 되엇는가?
parameter를 확인해봤더니
remote_login_passwordfile 의 value : "EXCLUSIVE"
잘만 되어있었음..
sysdba 권한을 주기 때문에 발생하는 문제인가?해서 connect 권한을 주니 또 그냥 된다. ㅋ 너무 열받네
Issue#2.1 새로운 사용자에게 sysdba 권한 부여 안되는 오류
결국 sysdba의 권한을 주지 못하는 문제가 식별되었다. 보안이나 인증에 문제가 발생한듯.
구글링을 통해 db식별 불일치 문제나 (권한 설정에 필요한)보안 및 인증 문제가 발생시에는
username만아니라 db_name, sid, insatnace가 달라서 생기는 문제일 수도 있다는 것을 확인했다.
조금 부연설명하자면, 정확한지는 모르겠으나,, sysdba의 권한으 주기 위해 현재 ORACLE_SID에 대한 인증이 가능해야하는데, 그게 안된듯
3. ORACLE 설정에 문제가 없는지 찾아보자!
1. ORACLE 의 기본경로, SID, OWNER 등에 문제가 없는가?
명령
env | grep ORACLE // 환경변수에서 ORACLE이라는 문자열을 포함한 변수들을 찾음
출력
ORACLE_SID=source ORACLE_BASE=/app ORACLE_HOME=/app ORACLE_OWNWER=ora19c ORACLE_TERM=xterm ORACLE_HOSTNAME=COMBAT21
oracle_sid가 source이다. 근데 왜 source야?
2. 현재 instance 이름 확인
명령
select instance_name from v$instance; // 현재 인스턴스의 이름 확인
출력
INSTANCE_NAME ------------------------------- source
sid와 instance_name은 일치한다.
3. 현재 instance를 실행하고있는 계정 확인(혹시 root는 아닌지? root로 실행하면문제가 생길수 있다고 한다.)
명령
ps -eaf | grep pmon // 현재 실행중인 프로세스를 보여주는 ps 명령어의 결과에서 pmon을 포함하는 프로세스 검색
"pmon"은 Oracle 데이터베이스의 프로세스 중 하나로, Process Monitor의 약자로 데이터베이스의 시작과 종료, 사용자 세션 관리 등을 담당합니다. 따라서 이 명령어는 현재 Oracle 데이터베이스 인스턴스의 상태를 확인하기 위해 사용될 수 있습니다.
출력
ora19c ~~ orq_pmon_source
ora19c ~~~ grep --color=auto pmon
다행히 root로 instance를 실행하고 있지는 않다.
결국 oracle_sid와 instance name 은 source인데 dbname이 combat21 이여서 생긴 문제일것이라고 추측중…
4. dbname을 oracle_sid에 맞춰보자
이제 문제를 알았으니까 NID 도구를 사용하여 db_name을 변경해서 맞춰보려고했다.
근데
nid target=sys/비밀번호 dbname=새로운 db이름 setname=yes
명령어를입력했는데 이번엔 NID—00121 오류가 났다.
nid-00121: database should not be open 오류는 Oracle 데이터베이스의 데이터베이스 ID(Database ID) 변경 작업을 수행하려고 할 때 발생할 수 있는 오류이다. 이미 디비가 열려있는데 디비를 수정하려고하면 이렇게 나온다. 다시 보니까 꽤 직관적인 에러 메시지였다.
그러니까 db가 열려있지 않은 상태에서 nid도구를 사용해야한다는것이다.
db shutdown하고 진행해보자
SQL> shutdown
SQL> exit
$ nid target=sys dbname= 바꿀이름 setname=yes
NID-00106 : login to target database failed with oracle errer
ORA-01034 : oracle not available ORA-27101 : shared meemory realm does not exist
이래도 안되길래 찾아보니까 알고보니 database를 mount는 해놓고 했어야했다!
startup mount로 mount모드로 db를 열고 나서 진행하면 되는 거였음
nid 도구를 사용할땐 db를 완전 shutdown하는게 아니고 mount mode로 start해야한다!
이제 dbname 변경까진 되었는데 dbname 변경 후 다른 설정파일 등에서 변경되지 않은 부분들 다 변경해야한다. spfile, lsnrctl, tnsnames 순으로 변경하려고 한다.
먼저 spfile에서 dbname 변경
5. db 설정파일들에서 dbname을 또한 변경
spfile에서 dbname 변경 시도
SQL> alter system set db_name=source scope=spfile;
하려고 했는데
ora-32001 : white to spfile requested but no spfile is in use 라는 오류가 났다.
말그대로 spfile 사용중이지 않은것..
spfile, pfile 사용 여부 알아보는법
만약,
SQL> show parameter pfile
의 결과가
name type value
-----------------
spfile string (공란)
value 가 비어있는 경우 db가 현재 pfile과 함께 실행되고 있는 것이라고 한다.
spfile을 만든다음에 설정하는게 편하다고 해서 생성 시도,
spfile 생성
SQL> create spfile from pfile;
현재 사용중인 pfile의 내용으로 $ORACLE_HOME/dbs 디렉토리에 spfile을 생성한다. 확인해보자
show parameter pfile
의 결과에서 value가 공란이 아닌 dbs디렉토리로 채워져있을 것이다.
이제 할 수 있다!
spfile 에서 dbname 변경하기
SQL> alter system set db_name=source scope=spfile;
6. 리스너, tnsnames 수정
이부분은 바빠서 기록하는 걸 빼먹었다. 바쁘니까 나중에..
7. 아직도 grant가 안된다고?
분명죄다바꾸고나서 다시 grant 해보니까 아직 password file이 없다고 하길래 ORACLE_HOME/dbs디렉토리 가서 확인해봤다.
하나 이상한점을 꼽자면 현재 oracle_sid가 source인데 orapwSOURCE 파일이 있길래 대소문자를 구분하는지 여부가 궁금했다. 알아보니까 oracle 비밀번호도, password fileㅇ르 확인할때도 대소문자 구분이 기본 설정인데, 아래 명령어 입력시 대소문자 구분을 안할 수 있게 해준다.
oracle 로그인 시 비밀번호 대소문자 구분하지 않게 하기
**alter** system **set** sec_case_sensitive_logon = **FALSE**;
password file 또한 대소문자 구분하지 않게 하기
orapwd file=orapw entries=100 ignorecase=y
Enter **password** **for** SYS :
이런 식으로 대소문자를 구분하지 않도록 설정할 수 있다고한다. 위 명령대로 실행했더니.
됐다! 미친듯이 기쁘군
user create & grant 는 끝 이제 db 복구다.