virtual machine share폴더에 sql 스크립트를 넣고 리눅스에서 실행해 보려는데 share폴더가 없길래 폴더를 찾아보기로 했다.
디렉토리 검색, 찾기
- 전체 폴더에서 찾기
find / -name 폴더명 -type d
- 현재폴더(하위 디렉토리까지) 에서 찾기
find ./ -name 폴더명 -type d
열심히 찾아봤는데 거의 모든 디렉토리에 대해서 허가 거부 당했다.
디렉토리 읽기 권한이 없어서 허가 거부당해서 찾을 수 없다는 걸 알고 sudo find를 사용하기로 함!
사용자가 sudo 명령 사용하기 위해 root 계정으로 사용자에게 sudo 권한주기
먼저 su root 명령어로 root 계정으로 전환하고,
/etc/sudoers 파일을 vi 명령으로 열어서
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
해당 부분에 문제가 없는지 확인했다. 주로%wheel 부분이 주석처리되어 있다거나 하는 문제가 있다고 한다.
문제가 없으므로 wheel group은 모든 command를 수행할 권한이 있으니까 아래 명령으로 내가 작업하는 user를 wheel 그룹에 추가했다. (당연히 root만 수행할 수 있음)
usermod --append -G wheel {username}
그다음 내 user로 돌아와서 share폴더를 find 명령으로 찾고,
알아보니까 share폴더에 넣은 스크립트 sql파일의 소유자가 root, 디렉토리들도 root 소유라서 안 찾아지는 거였다.
sql 파일의 소유자가 root다 보니 소유자를 변경시킬까, 파일 권한을 변경할까 하다가, 권한을 변경하기로 했다.
sudo chmod 777 {파일이름} 명령을 통해 777(전체 사용자 읽기, 쓰기, 실행 권한)권한을 주고,
그다음 mv 명령으로 원하는 위치에 옮겨놓았다.
자 다시 초심으로 돌아가,
사실 내가 생성한 user가 스크립트 파일만 실행시키면 생성, 권한 부여 모든 게 정확히 이루어질 거니까, user 생성하기 전, 그러니까 내가 처음 인계받았을 적의 가상환경을 다시 불러와 작업하기로 했다.
다시 처음부터,
1. SID, instance_name, db_name 일치 확인
구버전 oracle에서 확인하면 모든 게 abcd21로 일치했는데,
내 가상환경을 다시 불러왔으니 확인해 보기로 했다.
SQL> select name from v$database; // dbname확인
SQL> select instance_name from v$instance // instancename 확인
$ env | grep ORACLE // SID 및 ORACLE 환경설정 확인
쉣 instance_name이 이상하다. db복구 프로젝트 첫 시도 때는 db_name을 변경해서 일치시켰지만, 내가 추후에 실행할 스크립트 sql파일을 보고 나니까 instance_name과 sid를 db_name에 맞추는 게 낫겠다는 생각이 들어 그렇게 진행했다.
순서는 listener 수정 → spfile||pfile 수정
2. listener.ora 수정하기
/app/network/admin/ 디렉토리에 listener.ora 파일이 있다.(app : 오라클 설치 디렉토리)
vi listener.ora 명령을 통해 SID_name 이라고 되어 있는 부분 수정한다.
나의 경우는 이건 내가 원하는 이름으로 되어있었다. shit
3. spfile || pfile 수정하기
spfile로 로그인하고 있지 않았다.
pfile 이름도 initsource.ora 로 sid가 택도 없이 source로 되어있는 것 확인,
vi initsource.ora 명령어로 내용 바꾸고 rename 해가지고 억지로 pfile을 변경해서!
접속
sqlplus / as sysdba
startup pfile=$ORACLE_HOME/dbs/init{내가 새로 바꾼 sid}.ora
이렇게 수동으로 pfile을 지정해 주면 로그인이 된다. 근데
instance_name을 확인한 결과 아직도 source 그대로이다…..
알고 보니 listener.ora, pfile, 애초에 세션에서 설정된 oracle sid를 모두 변경해야 정상 반영되는 거였고,
echo 'export ORACLE_SID=새로 지정할 sid' >> ~/.bashrc
source ~/.bashrc
위 명령어를 통해 변경했다.
이제야 드디어 sid, instance_name, db_name을 맞췄다!
4. 스크립트 파일 .sql 실행시키기
@@경로\\sql파일.sql
위와 같이 입력하면 스크립트 파일을 생성할 수 있다.
받아온 스크립트 파일을 실행했더니 아래의 오류가 발생했돠
ora-01119 : error in creating database file
ora-27040: file create error, unable to create file
imp 전, 스크립트를 실행하는 상황이었고, 검색해 보니, exp 했던 환경과 경로가 안 맞는 문제이다.
나의 경우는 경로가 당연히 안 맞을 테니까 스크립트 파일 수정하고 다시 함
그런데, 하나의 tablespace에서
ora-01658 unable to create initial extent for segment in tablespace users
에러가 났다, tablespace 공간이 부족하다는 건데, 내가 imp 하기 전 실행시킨 스크립트 파일 안에서 100m로 지정해 준 크기가 db내용이 많아지면서 부족한가 보다
→ 우선 tablespace name과 data file name 확인
tablespace_name 확인
SELECT TABLESPACE_NAME, BLOCK_SIZE
FROM DBA_TABLESPACES
;
data file_name 확인
SELECT FILE_NAME, FILE_ID, TABLESPACE_NAME
FROM DBA_DATA_FILES
WHERE TABLESPACE_NAME = '<방금 찾은 tablespace 이름>'
;
방금 확인한 data file_name을 가지 Datafile 크기를 변경할 수 있다.
Datafile 크기 변경
ALTER DATABASE
DATAFILE '/export/home/oracle/app/oracle/oradata/orcl/users01.dbf'
RESIZE 10M;
imp ignore옵션을 주고 다시 진행해 봤는데 다른 부분(imp 초기에) 또 tablespace 용량이 부족하단 오류가 발생해서 더 이상 뜨거워진 머리를 주체하지 못하고 그냥 아무것도 건들지 않은 가상환경을 다시 불러와서 다시 하기로 했다…
virtual machine share폴더에 sql 스크립트를 넣고 리눅스에서 실행해 보려는데 share폴더가 없길래 폴더를 찾아보기로 했다.
디렉토리 검색, 찾기
- 전체 폴더에서 찾기
find / -name 폴더명 -type d
- 현재폴더(하위 디렉토리까지) 에서 찾기
find ./ -name 폴더명 -type d
열심히 찾아봤는데 거의 모든 디렉토리에 대해서 허가 거부 당했다.
디렉토리 읽기 권한이 없어서 허가 거부당해서 찾을 수 없다는 걸 알고 sudo find를 사용하기로 함!
사용자가 sudo 명령 사용하기 위해 root 계정으로 사용자에게 sudo 권한주기
먼저 su root 명령어로 root 계정으로 전환하고,
/etc/sudoers 파일을 vi 명령으로 열어서
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
해당 부분에 문제가 없는지 확인했다. 주로%wheel 부분이 주석처리되어 있다거나 하는 문제가 있다고 한다.
문제가 없으므로 wheel group은 모든 command를 수행할 권한이 있으니까 아래 명령으로 내가 작업하는 user를 wheel 그룹에 추가했다. (당연히 root만 수행할 수 있음)
usermod --append -G wheel {username}
그다음 내 user로 돌아와서 share폴더를 find 명령으로 찾고,
알아보니까 share폴더에 넣은 스크립트 sql파일의 소유자가 root, 디렉토리들도 root 소유라서 안 찾아지는 거였다.
sql 파일의 소유자가 root다 보니 소유자를 변경시킬까, 파일 권한을 변경할까 하다가, 권한을 변경하기로 했다.
sudo chmod 777 {파일이름} 명령을 통해 777(전체 사용자 읽기, 쓰기, 실행 권한)권한을 주고,
그다음 mv 명령으로 원하는 위치에 옮겨놓았다.
자 다시 초심으로 돌아가,
사실 내가 생성한 user가 스크립트 파일만 실행시키면 생성, 권한 부여 모든 게 정확히 이루어질 거니까, user 생성하기 전, 그러니까 내가 처음 인계받았을 적의 가상환경을 다시 불러와 작업하기로 했다.
다시 처음부터,
1. SID, instance_name, db_name 일치 확인
구버전 oracle에서 확인하면 모든 게 abcd21로 일치했는데,
내 가상환경을 다시 불러왔으니 확인해 보기로 했다.
SQL> select name from v$database; // dbname확인
SQL> select instance_name from v$instance // instancename 확인
$ env | grep ORACLE // SID 및 ORACLE 환경설정 확인
쉣 instance_name이 이상하다. db복구 프로젝트 첫 시도 때는 db_name을 변경해서 일치시켰지만, 내가 추후에 실행할 스크립트 sql파일을 보고 나니까 instance_name과 sid를 db_name에 맞추는 게 낫겠다는 생각이 들어 그렇게 진행했다.
순서는 listener 수정 → spfile||pfile 수정
2. listener.ora 수정하기
/app/network/admin/ 디렉토리에 listener.ora 파일이 있다.(app : 오라클 설치 디렉토리)
vi listener.ora 명령을 통해 SID_name 이라고 되어 있는 부분 수정한다.
나의 경우는 이건 내가 원하는 이름으로 되어있었다. shit
3. spfile || pfile 수정하기
spfile로 로그인하고 있지 않았다.
pfile 이름도 initsource.ora 로 sid가 택도 없이 source로 되어있는 것 확인,
vi initsource.ora 명령어로 내용 바꾸고 rename 해가지고 억지로 pfile을 변경해서!
접속
sqlplus / as sysdba
startup pfile=$ORACLE_HOME/dbs/init{내가 새로 바꾼 sid}.ora
이렇게 수동으로 pfile을 지정해 주면 로그인이 된다. 근데
instance_name을 확인한 결과 아직도 source 그대로이다…..
알고 보니 listener.ora, pfile, 애초에 세션에서 설정된 oracle sid를 모두 변경해야 정상 반영되는 거였고,
echo 'export ORACLE_SID=새로 지정할 sid' >> ~/.bashrc
source ~/.bashrc
위 명령어를 통해 변경했다.
이제야 드디어 sid, instance_name, db_name을 맞췄다!
4. 스크립트 파일 .sql 실행시키기
@@경로\\sql파일.sql
위와 같이 입력하면 스크립트 파일을 생성할 수 있다.
받아온 스크립트 파일을 실행했더니 아래의 오류가 발생했돠
ora-01119 : error in creating database file
ora-27040: file create error, unable to create file
imp 전, 스크립트를 실행하는 상황이었고, 검색해 보니, exp 했던 환경과 경로가 안 맞는 문제이다.
나의 경우는 경로가 당연히 안 맞을 테니까 스크립트 파일 수정하고 다시 함
그런데, 하나의 tablespace에서
ora-01658 unable to create initial extent for segment in tablespace users
에러가 났다, tablespace 공간이 부족하다는 건데, 내가 imp 하기 전 실행시킨 스크립트 파일 안에서 100m로 지정해 준 크기가 db내용이 많아지면서 부족한가 보다
→ 우선 tablespace name과 data file name 확인
tablespace_name 확인
SELECT TABLESPACE_NAME, BLOCK_SIZE
FROM DBA_TABLESPACES
;
data file_name 확인
SELECT FILE_NAME, FILE_ID, TABLESPACE_NAME
FROM DBA_DATA_FILES
WHERE TABLESPACE_NAME = '<방금 찾은 tablespace 이름>'
;
방금 확인한 data file_name을 가지 Datafile 크기를 변경할 수 있다.
Datafile 크기 변경
ALTER DATABASE
DATAFILE '/export/home/oracle/app/oracle/oradata/orcl/users01.dbf'
RESIZE 10M;
imp ignore옵션을 주고 다시 진행해 봤는데 다른 부분(imp 초기에) 또 tablespace 용량이 부족하단 오류가 발생해서 더 이상 뜨거워진 머리를 주체하지 못하고 그냥 아무것도 건들지 않은 가상환경을 다시 불러와서 다시 하기로 했다…