문제 99. 문제 97번 코드를 수정해서 아래와 같이 수행될 수 있게 하기
$sh find_sal.sh scott
scott의 월급은 3000입니다.
awk -F ',' -v name=$1 '$2==toupper(name) {print $6}' emp.csv
sal=`awk -F ',' -v name=$1 '$2==toupper(name) {print $6}' emp.csv` echo "$1 의 월급은 $sal 입니다."
명령어로 수행되는 결과를 sal이라는 변수를 할당하기 위해 백틱을 둘러주었다.
✅ 리눅스에서 dba나 db 엔지니어들이 쉘스크립트를 이용해서 스크립트를 작성하는 이유는
1. db작업을 편하게 수행하려고 (노가다 안하고 자동화)
2. 날것의 데이터를 데이터베이스의 테이블로 구성할 때 리눅스 쉘이 유용하게 사용됨
문제 100. 10번 부서번호인 사원들의 모든 행을 emp.csv에서 출력해보기
awk -F ',' '$8==10 {print $0}' emp.csv
✅ $0은 모든 컬럼을 가져와라라는 뜻
문제 101. 위에서 출력되는 행들을 emp10.csv로 저장
[orcl:~]$ awk -F ',' '$8==10 {print $0}' emp.csv >> emp10.csv [orcl:~]$ cat emp10.csv 7839,KING,PRESIDENT,,1981-11-17,5000,,10 7782,CLARK,MANAGER,7839,1981-05-09,2450,,10 7934,MILLER,CLERK,7782,1982-01-11,1300,,10
✅ 리다이렉션
(>>) 기존 파일 뒤에 내용을 덧붙이는 것
이고,(>) 하나는 기존 파일의 내용을 완전히 덮어쓰는 것
이다.
: 방금 나는 그냥 기존에 emp10.csv를 rm하고 새로 만들었음.
문제 102. (dba게 유용) emp10.csv를 오라클의 테이블로 구성하시오. 테이블명은 emp10으로 생성합니다.
✔️ 가장 쉬운 방법은 sql developer를 이용하는 것.
문제 103. 집에서 sqldeveloper 실행하는 방법을 다음과 같이 해봅니다
1. 모바텀 열기
2. 오라클 유저로 접속
3. x server 활성화 (클릭하지 말고 마우스 올려놓으면 x server is running이라고 뜬다.)
4. 내 아이피 확인( 프롬프트에서 ipconfig)
5. 푸티나 모바텀에서 아래 명령어로 실행
create table emp10
as
select *
from emp
where 1 = 2;
✅ 만든 emp10에 데이터 임포트를 위와같이 한다. 헤더를 체크하고, 다음버튼 누르다가 입사일에 해당하는 열5를 클릭하고 데이터 형식에 RRRR/MM/DD 작성한후 완료한다.
💡 확인 !
문제 104. 부서번호를 물어보게하고 부서번호를 입력하면 해당 부서번호에 해당하는 csv파일이 다음과 같이 생성되게 하시오 !
예제
$ sh generate_deptno.sh
생성하고싶은 데이터의 부서번호를 입력하세요 ! -> 10
emp10.csv 가 생성되면 됨.
답
$ vi generate_deptno.sh echo -n "생성하고 싶은 데이터의 부서번호를 입력하세요!" read deptno awk -F ',' -v num=$deptno '$8==num {print $0}' emp.csv > emp$deptno.csv
✅-n
은 다음라인으로 넘어가지 않게 한다. 쓰지 않으면 그냥 생성하고싶은 데이터의 부서번호를 입력하세요 ! 이 말만 출력하고 다음라인으로 (엔터친것처럼) 넘어간다.
문제 105. 위 스크립트를 이용해서 다음과같이 직업을 물어보게 하고 직업을 입력하면 해당 직업의 csv파일이 생성되게 하세요!
$ vi generate_job.sh echo -n "생성하고 싶은 데이터의 직업을 입력하세요!" read job awk -F ',' -v num=$job '$3==num {print $0}' emp.csv > $job.csv
문제 106. 위 스크립트를 수정해서 소문자로 해도 가능하게
$ sh generate_job.sh --------------------------------- $ vi generate_job.sh echo -n "생성하고 싶은 데이터의 직업을 입력하세요!" read job awk -F ',' -v num=$job '$3==toupper(num) {print $0}' emp.csv > $job.csv
💡 리눅스 쉘 스크립트에서의 loop문 3가지
1. for loop : 범위를 기준으로 반복시키는 loop문
2. while loop : 조건을 기준으로 반복시키는 loop문
3. until loop : 조건을 기준으로 반복시키는 loop문
✅ dba 작업을 편하게 자동화하려면 필수로 알아야하는 쉘스크립트 문법
문법
for 변수 in 범위
do
실행문
done
예제1
$ vi for1.sh
----
#/bin/bash
for i in {1..10}
do
echo $i
done
----
$ sh for1.sh
문제 107. dept.csv를 복사해서 dept1.csv ~ dept100.csv 로 생성하는 쉘스크립트를 작성하세요
$ sh cp_dept.sh 실행하면 생성되도록 !
#/bin/bash for i in {1..100} do cp dept.csv dept$i.csv done $ ls -l dept*.csv
문제 108. 파일중 하나 열어서 파일열고 숫자 20을 200으로 변경
문제 109. dept.csv, dept46.csv와 서로 내용이 차이가 있는지
$ diff --brief dept.csv dept46.csv
: files dept.csv and dept46.csvdiffer (차이가 있으면 이렇게 나온다. 없으면 안나옴)
문제 110. dept.csv, dept1.csv ~ dept100.csv를 비교해서 어느 파일이 차이가 있는지 확인하기
$vi diff_dept.sh ------------------------------ #/bin/bash for i in {1..100} do diff --brief dept.csv dept{i}.csv done
문제 111. (시스템 관리자와 dba에게 유용한 스크립트) database에 있는 데이터 파일들의 사이즈를 확인하기 !
SQL> select file_name from dba_data_files; FILE_NAME -------------------------------------------------------------------------------- +DATA/orcl/datafile/users.259.796857625 +DATA/orcl/datafile/undotbs1.258.796857625 +DATA/orcl/datafile/sysaux.257.796857623 +DATA/orcl/datafile/system.256.796857621 +DATA/orcl/datafile/example.265.796857803
✅ 이거 db관리수업때 !!!!!!!!!!!!!!!! 신경쓰지말기
문제 112. (시스템 관리자와 dba에게 유용한 스크립트) 확장자가 .sh 쉘 스크립트 중에서 사이즈가 100바이트 이상인 파일들만 출력하시오 !
$ ls -l *.sh 얘는 출력되도 엄청 많으면 일일이 100 넘는걸 확인할 수 없다.
$ ls -l *.sh | awk '{print $5}' 이렇게하면 사이즈 부분만가져올 수 있다.
$vi size_100.sh size2=`ls -l *.sh | awk '{print $5}'` for i in $size2 do echo $i done
$vi size_100.sh size2=`ls -l *.sh | awk '{print $5}'` for i in $size2 do if [ ${i:0:3} -gt 100 ]; then echo $i fi done ------ $sh size_100.sh
✅ 대괄호 안 ${i:0:3}
가 아니고 $i
라면 지금 이게 문자형으로 인식이 되어서 100이랑 비교될 수 없다. 이것을 숫자형으로 바꿔주는것이 ${i:0:3}
사이즈가 3자리가 안넘어가므로 3을 써주었다. 아래는 파일명도 나오게 변경
$vi size_100.sh
list=`ls -l *.sh | awk '{print $9}'`
for i in $list
do
size2=`ls -l $i | awk '{print $5}'`
if [ $size2 -gt 100 ]; then
echo $i
fi
done
------
$sh size_100.sh
문제 113. /home/oracle 밑에 size100이라는 디렉토리 생성하기
문제 114. /home/oracle 밑에 있는 100바이트 이상의 확장자 .sh 파일들을 모두 /home/oracle/size100밑으로 이동시키세요 !
$ sh mv_size_100.sh 답: $ vi mv_size_100.sh list=`ls -l *.sh | grep -v mv_size_100.sh | awk '{print $9}'` for i in $list do size2=`ls -l $i | awk '{print $5}'` if [ $size2 -gt 100 ]; then mv /home/oracle/$i /home/oracle/size100/ fi done $ sh mv_size_100.sh
grep -v mv_size_100.sh
를 빼고 하면 얘도 같이 다른경로로넘어가준다. 근데 얘는 기존 /home/oracle밑에 있게하고싶으면 위 grep을 사용해서 하면 된다.
예제1.
리눅스 쉘의 while loop문으로 숫자 1부터 숫자 10까지 출력하기!
$ vi w1.sh #!/bin/bash i=1 while [ $i -le 10 ]; do echo $i i=$((i+1)) done
조건이 트루인 경우에만 두 밑에 반복문 돌려라.
i=$((i+1))
는 증가코드 ! 여기가 11이 되면 11>=10 이 거짓이 되니까 반복문이 거짓이 되어 그만돌게 된다.
예제2.
위 결과를 다시 출력하는데 짝수만 출력하기
$ vi w1.sh #!/bin/bash i=1 while [ $i -le 10 ]; do if [ $((i % 2)) -eq 0 ]; then echo $i fi i=$((i+1)) done
✅ 무언가를 계산할 때 $((계산식)) 이렇게 작성되는것을 볼 수 있다.
문제 115. while loop문으로 구구단 2단 출력하기
$ vi w1.sh #!/bin/bash i=1 while [ $i -le 9 ]; do result=$((2 * i)) echo "2 x $i = $result" i=$((i+1)) done
💡 파이썬과 PL/SQL에는 없는 반복문 (while문이랑 조건이 다르다)
예제1.
until문을 이용해서 숫자 1부터 10까지 출력
$ vi u1.sh ------------------- i=1 until [ $i -gt 10 ] # 조건이 거짓일 동안에만 반복한다. 트루가 되는 순간 반복을 멈춘다. do echo $i i=$((i+1)) done
문제 116. 위 언틸문으로 구구단 2단 출력
#!/bin/bash i=1 until [ $i -gt 9 ]; do result=$((2 * i)) echo "2 x $i = $result" i=$((i+1)) done
$ vi dba.sh
#!/bin/bash echo -e "여기는 운영 db입니다." echo -e "================================" echo " " echo " [1] 오라클에 접속하려면 1번을 누르세요! " echo " " echo -n "원하는 작업을 선택하세요." read aa echo " " case $aa in 1) sqlplus scott/tiger;; esac echo " "
💡 오라클에 접속해서 용량 확인하고 빠져나오는 코드 !
$ vi t.sh
-----------------------------------------------------
export ORACLE_BASE=/u01/app/oracle #오라클 루트 디렉토리
export ORACLE_SID=orcl #오라클 인스턴스 이름 (db이름)
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 #오라클 홈
export PATH=$ORACLE_HOME/bin:$PATH #오라클 홈 디렉토리가 어딘지 환경설정
sqlplus scott/tiger <<EOF
select * from ((select t.tablespace_name,
((t.total_size - f.free_size) / t.total_size) * 100 usedspace
from (select tablespace_name, sum(bytes)/1024/1024 total_size
from dba_data_files
group by tablespace_name) t,
(select tablespace_name, sum(bytes)/1024/1024 free_size
from dba_free_space
group by tablespace_name) f
where t.tablespace_name = f.tablespace_name(+)));
EOF # 스캇으로 접속해서 셀렉트 문장 실행후에 빠져나오려면 위에 <<EOF, 여기 EOF 라고 한다.
# 꼭 이렇게 해주어야 하는건 아니지만 이렇게 많이 쓴다. (AAA해도 됨. 대신 둘다 맞추기)
✅ export 4줄을 써야 sqlplus가 열린다.
$ vi dba.sh
#!/bin/bash
echo -e "
aaa a aa aaa aaa a aaaa
a a a aa a a a a a a
a a aa a a a aaaaaa
a a a aaaaa a a a
a a a a a a a a
aaa a aaa aaa a aaaa
"
echo -e "========================================"
echo " "
echo " [1] 테이블 스페이스의 공간을 확인하려면 1번을 누르세요 "
echo " "
echo -n "원하는 작업을 선택하세요 "
read aa
echo " "
case $aa in
1) sh /home/oracle/t.sh ;;
esac
echo " "
$vi sar.sh ------------------------------------------- sar 1 100 >> sar_2023-821.txt &
$ vi dba.sh
#!/bin/bash
echo -e "
aaa a aa aaa aaa a aaaa
a a a aa a a a a a a
a a aa a a a aaaaaa
a a a aaaaa a a a
a a a a a a a a
aaa a aaa aaa a aaaa
"
echo -e "========================================"
echo " "
echo " [1] 테이블 스페이스의 공간을 확인하려면 1번을 누르세요
[2] 디스크 i/o를 확인하기 위해 sar명령어를 수행하려면 2번을 누르세요"
echo " "
echo -n "원하는 작업을 선택하세요 "
read aa
echo " "
case $aa in
1) sh /home/oracle/t.sh ;;
2) sh /home/oracle/sar.sh ;;
esac
echo " "
$ vi o.sh ----------------------- export ORACLE_BASE=/u01/app/oracle #오라클 루트 디렉토리 export ORACLE_SID=orcl #오라클 인스턴스 이름 (db이름) export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 #오라클 홈 export PATH=$ORACLE_HOME/bin:$PATH #오라클 홈 디렉토리가 어딘지 환경설정 sqlplus scott/tiger <<EOF select reason from dba_outstanding_alerts; EOF
$ vi dba.sh
#!/bin/bash
echo -e "
aaa a aa aaa aaa a aaaa
a a a aa a a a a a a
a a aa a a a aaaaaa
a a a aaaaa a a a
a a a a a a a a
aaa a aaa aaa a aaaa
"
echo -e "========================================"
echo " "
echo " [1] 테이블 스페이스의 공간을 확인하려면 1번
[2] 디스크 i/o를 확인하기 위해 sar명령어를 수행하려면 2번
[3] 현재 데이터베이스에 이슈가 있는지 확인하려면 3번"
echo " "
echo -n "원하는 작업을 선택하세요 "
read aa
echo " "
case $aa in
1) sh /home/oracle/t.sh ;;
2) sh /home/oracle/sar.sh ;;
3) sh /home/oracle/o.sh ;;
esac
echo " "
$ vi tablespace.sql begin for a in (select * from ((select t.tablespace_name, ((t.total_size - f.free_size) / t.total_size) * 100 usedspace from (select tablespace_name, sum(bytes)/1024/1024 total_size from dba_data_files group by tablespace_name) t, (select tablespace_name, sum(bytes)/1024/1024 free_size from dba_free_space group by tablespace_name) f where t.tablespace_name = f.tablespace_name(+))) where usedspace >= 80 ) loop execute immediate 'alter tablespace' || a.tablespace_name || ' add datafile size 100m' ; end loop; end; / # execute immediate 절을 사용하면 PLSQL에서 DDL명령어를 수행할 수 있다.
이거하고 스캇으로 접속해서
@tablespace.sql 돌리고
다시 orcl 돌아와서 sh.tablespace.sql 실행하고 1번눌러 현재 공간 확인한다.
✔️ 줄었다 !
문제 117. add_t.sh라는 이름으로 tablespace.sql을 scott 유저에서 수행하는 쉘스크립트를 만드세요.
$vi add_t.sh
export ORACLE_BASE=/u01/app/oracle #오라클 루트 디렉토리 export ORACLE_SID=orcl #오라클 인스턴스 이름 (db이름) export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 #오라클 홈 export PATH=$ORACLE_HOME/bin:$PATH #오라클 홈 디렉토리가 어딘지 환경설정 sqlplus scott/tiger <<EOF @/home/oracle/tablespace.sql EOF ---------- $sh add_t.sh
문제 118. (리눅스 마지막 문제) dba.sh의 4번에 80% 이상 공간을 차지하고 있는 테이블 스페이스의 공간을 확보하는 아래의 스크립트를 수행하는 코드를 넣으시오 !
$ vi dba.sh
#!/bin/bash
echo -e "
aaa a aa aaa aaa a aaaa
a a a aa a a a a a a
a a aa a a a aaaaaa
a a a aaaaa a a a
a a a a a a a a
aaa a aaa aaa a aaaa
"
echo -e "========================================"
echo " "
echo " [1] 테이블 스페이스의 공간을 확인하려면 1번
[2] 디스크 i/o를 확인하기 위해 sar명령어를 수행하려면 2번
[3] 현재 데이터베이스에 이슈가 있는지 확인하려면 3번
[4] 80% 이상 공간을 차지하고 있는 테이블 스페이스의 공간을 확보하려면 4번"
echo " "
echo -n "원하는 작업을 선택하세요 "
read aa
echo " "
case $aa in
1) sh /home/oracle/t.sh ;;
2) sh /home/oracle/sar.sh ;;
3) sh /home/oracle/o.sh ;;
4) sh /home/oracle/add_t.sh ;;
esac
echo " "
오라클 virtual box 다운로드
cenos 7버젼 다운로드 ➡️ 요고만 하면됨