Transcript
Page 1: UNIX SHELL IN DBA EVERYDAY

UNIX SHELL IN DBA EVERYDAY

:~> ps -ef | grep pmon | grep -v grep

Page 2: UNIX SHELL IN DBA EVERYDAY

WHAT IS UNIX?Dance bar in Ashdod, Israel

Page 3: UNIX SHELL IN DBA EVERYDAY

DO NOT DANCE• examples is not tested on production

• one size does not fits all

• before copy and paste, check manual

• afterwards check manual

Page 4: UNIX SHELL IN DBA EVERYDAY

• how to get shell • echo $SHELL • how to roll shell • examples • real life • resources

UNIX SHELL IN DBA EVERYDAY

Page 5: UNIX SHELL IN DBA EVERYDAY

SHELL IS SEXY!

# who | grep -i blonde | date; cd ~; unzip; touch; strip; finger; mount; gasp; yes; uptime; umount; sleep

Page 6: UNIX SHELL IN DBA EVERYDAY

• who - show who is logged on • grep - print lines matching a pattern • mount - mount a filesystem • touch - change file timestamps • strip - discard symbols from object files • finger - user information lookup program • umount - unmount a filesystem • gasp - a preprocessor for assembly programs • yes - output a string repeatedly until killed

# who | grep -i blonde | date; cd ~; unzip; touch; strip; finger; mount; gasp; yes; uptime; umount; sleep

SHELL IS SEXY!

Page 7: UNIX SHELL IN DBA EVERYDAY

SHELL IS SEXY!

Page 8: UNIX SHELL IN DBA EVERYDAY

SHELL IS SEXY!

Page 9: UNIX SHELL IN DBA EVERYDAY

SHELL IS SEXY!

Page 10: UNIX SHELL IN DBA EVERYDAY

SHELL IS SEXY!

Page 11: UNIX SHELL IN DBA EVERYDAY

WHY ME?• read founded and existing scripts • automate systems or databases • manual or scheduled tasks from shell side • monitoring • backups • multiple databases tasks

Page 12: UNIX SHELL IN DBA EVERYDAY

HOW TO GET SHELL?

Page 13: UNIX SHELL IN DBA EVERYDAY

CLIENTS • PuTTY

• KiTTY

• SuperPutty

• SecureCRT

http://www.chiark.greenend.org.uk/~sgtatham/putty/

http://www.9bis.net/kitty/

https://code.google.com/p/superputty/

http://www.vandyke.com/products/securecrt/

http://en.wikipedia.org/wiki/Comparison_of_SSH_clients

Page 14: UNIX SHELL IN DBA EVERYDAY

$ echo $SHELL

Page 15: UNIX SHELL IN DBA EVERYDAY

SHELL• sh - Bourne shell • ksh - Korn shell • bash - Bourne-Again shell • csh - C shell • tcsh, zsh, rc, es (10+)

http://en.wikipedia.org/wiki/Unix_shell

Page 16: UNIX SHELL IN DBA EVERYDAY

SHELL sh csh ksh bash tcsh zsh rc es Job control N Y Y Y Y Y N N Aliases N Y Y Y Y Y N N Shell functions Y(1) N Y Y N Y Y Y Command history N Y Y Y Y Y L L Command line editing N N Y Y Y Y L L Vi Command line editing N N Y Y Y(3) Y L L Emacs Command line editing N N Y Y Y Y L L User name look up N Y Y Y Y Y L L Login/Logout watching N N N N Y Y F F Filename completion N Y(1) Y Y Y Y L L Username completion N Y(2) Y Y Y Y L L Hostname completion N Y(2) Y Y Y Y L L History completion N N N Y Y Y L L Builtin artithmetic evaluation N Y Y Y Y Y N N Can follow symbolic links invisibly N N Y Y Y Y N N Periodic command execution N N N N Y Y N N Custom Prompt (easily) N N Y Y Y Y Y Y Underlying Syntax sh csh sh sh csh sh rc rc Freely Available N N N(4) Y Y Y Y Y Can cope with large argument lists Y N Y Y Y Y Y Y Has non-interactive startup file N Y Y(5) Y(5) Y Y N N Has non-login startup file N Y Y(5) Y Y Y N N Has anonymous functions N N N N N N Y Y List Variables N Y Y N Y Y Y Y Full signal trap handling Y N Y Y N Y Y Y Local variables N N Y Y N Y Y Y Exceptions N N N N N N N Y

Page 17: UNIX SHELL IN DBA EVERYDAY

KSH vs. BASH

$ typeset -l lowercase_only $ lowercase_only="WiBbLe" $ echo $lowercase_only wibble

lowercase_only=$(echo "WiBbLe" | tr "[:upper:]" "[:lower:]")

Page 18: UNIX SHELL IN DBA EVERYDAY

KSH vs. BASH

a=$(( b+c ))

let a=b+c

Page 19: UNIX SHELL IN DBA EVERYDAY

KSH vs. BASH

bash-3.1$ echo wibble | read variable bash-3.1$ echo $variable !

bash-3.1$

$ echo wibble | read variable $ echo $variable wibble $

Page 20: UNIX SHELL IN DBA EVERYDAY

KSH vs. BASH• bash is much easier to set a prompt that displays the current directory • ksh has associative arrays and bash doesn’t • ksh handles loop syntax a bit better • bash handles getting exit codes from pipes in a cleaner way • ksh has the print command which is way better than the echo command • bash has tab completions • ksh has the syntax cd old new which replaces old with new in your

directory and cd over there !

pwd - /foo/bar/barfoo/one/bar/bar/foo/bar cd to /foo/bar/barfoo/two/bar/bar/foo/bar ksh - cd one two bash - cd ../../../../../two/bar/bar/foo/bar

Page 21: UNIX SHELL IN DBA EVERYDAY

HOW TO ROLL SHELL?

Page 22: UNIX SHELL IN DBA EVERYDAY

SHEBANG

• #!/bin/ksh • special comment for interpreter • no bang, script run in current shell • shell may be on different hosts in different

locations

Page 23: UNIX SHELL IN DBA EVERYDAY

PROCESS RUN• cmd1 && cmd2 - run cmd1; if it returns 0 (success), run cmd2

• cmd1 || cmd2 - run cmd1; if it returns non-zero, run cmd2

• cmd1 & cmd2 - run cmd1 and also cmd2

• (ls -1) - run the command "ls -1" in a sub shell

• cmd1 | cmd2 - run cmd1 and output as input to cmd2

Page 24: UNIX SHELL IN DBA EVERYDAY

PIPEReal UNIX pipe

Page 25: UNIX SHELL IN DBA EVERYDAY

REDIRECTION

• command > outfile - redirect output to file

• command >> outfile - redirect output and append to file

• command 2> outfile - redirect STDERR

• command &> outfile - redirect STDOUT and STDERR

• tee - redirect STDOUT to file and STDOUT

Page 26: UNIX SHELL IN DBA EVERYDAY

REDIRECTION# ls # ls > file # ls | tee file # ls | tee –a file # ls | tee file1 file2 file3

mailx –s ‘alert.log errors’ [email protected] < \ tail -10 alert_$ORACLE_SID.log | grep ORA-|\ tee error.log !

Page 27: UNIX SHELL IN DBA EVERYDAY

FLUSH

# > alert_ORCL.log

Page 28: UNIX SHELL IN DBA EVERYDAY

IF• [ -a FILE ] True if FILE exists. • [ -d FILE ] True if FILE exists and is a directory. • [ -h FILE ] True if FILE exists and is a symbolic link. • [ -s FILE ] True if FILE exists and has a size greater than zero. • [ -r FILE ] True if FILE exists and is readable. • [ -w FILE ] True if FILE exists and is writable. • [ -x FILE ] True if FILE exists and is executable. • [ -O FILE ] True if FILE exists and is owned by the effective user ID. • [ -G FILE ] True if FILE exists and is owned by the effective group ID. • [ -L FILE ] True if FILE exists and is a symbolic link.

Page 29: UNIX SHELL IN DBA EVERYDAY

IF• [ -z STRING ] True of the length if "STRING" is zero. • [ -n STRING ] True if the length of "STRING" is non-zero. • [ STRING1 == STRING2 ] True if the strings are equal. • [ STRING1 != STRING2 ] True if the strings are not equal. • [ STRING1 < STRING2 ] True if "STRING1" sorts before

"STRING2" lexicographically in the current locale. • [ STRING1 > STRING2 ] True if "STRING1" sorts after

"STRING2" lexicographically in the current locale. • [ ARG1 OP ARG2 ] "OP" is one of -eq, -ne, -lt, -le, -gt or -ge.

Page 30: UNIX SHELL IN DBA EVERYDAY

IF

• [ ! EXPR ] True if EXPR is false.

• [ EXPR1 -a EXPR2 ] True if both EXPR1 and EXPR2 are true.

• [ EXPR1 -o EXPR2 ] True if either EXPR1 or EXPR2 is true.

Page 31: UNIX SHELL IN DBA EVERYDAY

IFif [ -f alert_ORCL.log ]; then echo "alert_ORCL.log exists." fi

if [ "$STATUS" == "PRIMARY" ]; then echo "Database status - ${STATUS}" else echo "Database not in correct mode (${STATUS})" exit 0; fi

if [ "$num_of_beer" -gt "3" -a "$num_of_beer" -lt "5" ]; then echo "You've worked hard enough for today." fi

Page 32: UNIX SHELL IN DBA EVERYDAY

FOR WHILE• for loop

for FILE in udump/*.trc do tkprof $FILE $FILE.out sort=exeela,fchela,prsela done

• while loop

COUNTER=0 while [ $COUNTER -lt 10 ]; do echo The counter is $COUNTER let COUNTER=COUNTER+1 done

Page 33: UNIX SHELL IN DBA EVERYDAY

INPUT• get data from user

stty -echo echo -n “Please enter sys password: " read pw stty echo

cont=n echo -n "Do you really want to continue? (y/n) " read cont if [ "$cont" != "y" ]; then echo "Quitting..." exit fi

Page 34: UNIX SHELL IN DBA EVERYDAY

OPEN PORTSecho "Scanning TCP ports..." for p in {1..1023} do (echo >/dev/tcp/localhost/$p) >/dev/null 2>&1 && echo "$p open" done

Page 35: UNIX SHELL IN DBA EVERYDAY

TOOLSET• grep - searching for text pattern • awk - script language for text-processing • ps - information on running processes • find - searching for files • sed - stream editor for filtering and transforming text • watch - execute a program periodically • wc - counting lines/chars • cat - join files

http://en.wikipedia.org/wiki/List_of_Unix_programs

Page 36: UNIX SHELL IN DBA EVERYDAY

GREP

• grep -f badORA.txt alert_PROD.log

badORA.txt ORA-00600 ORA-1653 ORA-00257

• more alert_PROD.log | grep ORA-• grep -r ORA- admin/*

Page 37: UNIX SHELL IN DBA EVERYDAY

AWK

• more /etc/passwd | grep oracle | awk -F: '{print $3}'

http://www.catonmat.net/blog/awk-one-liners-explained-part-one/

• AWK one liners

awk '1; { print "" }'

awk 'BEGIN { ORS="\n\n" }; 1'

awk '{ print } { print "" }'

• awk '{pattern + action}' {filenames}

• cat /etc/oratab | awk -F: '{if ($1=="ORCL") print $2 }'

Page 38: UNIX SHELL IN DBA EVERYDAY

ONE LINERS• http://www.pement.org/awk/awk1line.txt

!

!

• http://sed.sourceforge.net/sed1line.txt

# delete trailing whitespace (spaces, tabs) from end of each line awk '{sub(/[ \t]+$/, "")};1' ! # change "scarlet" or "ruby" or "puce" to "red" awk '{gsub(/scarlet|ruby|puce/, "red")}; 1' ! # print any line where field #5 is equal to "abc123" awk '$5 == "abc123"'

Page 39: UNIX SHELL IN DBA EVERYDAY

http://www.cheat-sheets.org/saved-copy/awk_quickref.pdf

Page 40: UNIX SHELL IN DBA EVERYDAY

PROCESS KILLING

!

• ps -ef | grep LOCAL=NO | awk '{print "kill -9 " $2}' | sh !

• ps -ef | grep LOCAL=NO | awk '{print $2}' | xargs kill -9 !

• killall oracle

Page 41: UNIX SHELL IN DBA EVERYDAY

WATCH• watch -tn 0.2 'ps -o cmd -C zabbix_server -C zabbix_agentd'

Page 42: UNIX SHELL IN DBA EVERYDAY

ALIAS

# alias name=value # alias name='command' # alias name='command arg1 arg2' # alias name='/path/to/script'

Page 43: UNIX SHELL IN DBA EVERYDAY

ALIAS• alias ..='cd ..' • alias ...='cd ../..' • alias rm='rm -i’ • alias mv="mv -iv" • alias grep="grep -i” • alias mkdir='mkdir -pv’ • alias df='df -H' • alias du='du -ch'

Page 44: UNIX SHELL IN DBA EVERYDAY

ALIAS• alias mount='mount |column -t’

!

!

• alias path='echo -e ${PATH//:/\\n}'

/dev/sda1 on / type ext4 (rw,errors=remount-ro)proc on /proc type proc (rw,noexec,nosuid,nodev)sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)none on /sys/fs/fuse/connections type fusectl (rw)none on /sys/kernel/debug type debugfs (rw)none on /sys/kernel/security type securityfs (rw)udev on /dev type devtmpfs (rw,mode=0755)devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)

/usr/local/sbin/usr/local/bin/usr/sbin/usr/bin/sbin/bin/usr/games

Page 45: UNIX SHELL IN DBA EVERYDAY

ALIAS• alias ports='netstat -tulanp’

Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program nametcp 0 0 127.0.0.1:11211 0.0.0.0:* LISTEN - tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN - tcp 0 0 0.0.0.0:55255 0.0.0.0:* LISTEN - tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN - tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN - tcp 0 0 136.169.15.197:80 210.97.192.220:55544 TIME_WAIT - tcp 0 0 136.169.15.197:80 180.76.6.213:35700 TIME_WAIT - tcp 0 0 136.169.15.197:80 180.76.5.189:29922 TIME_WAIT - tcp 0 416 136.169.15.197:55255 87.110.183.173:24426 ESTABLISHED - tcp6 0 0 :::4949 :::* LISTEN - tcp6 0 0 :::55255 :::* LISTEN - tcp6 0 0 :::25565 :::* LISTEN 15500/java udp 0 0 127.0.0.1:11211 0.0.0.0:* - udp 0 0 0.0.0.0:68 0.0.0.0:* -

Page 46: UNIX SHELL IN DBA EVERYDAY

ALIAS• alias last="find . -type f -print0 | xargs -0 stat -c'%Y

:%y %12s %n' | sort -nr | cut -d: -f2- | head"

2013-12-10 16:53:07.000000000 +0200 31750 ./.bash_history2013-12-08 13:02:26.000000000 +0200 35 ./.lesshst2013-12-05 18:23:23.000000000 +0200 17962 ./.viminfo2013-10-31 16:51:20.000000000 +0200 6630 ./.ssh/known_hosts2013-08-21 12:58:51.000000000 +0300 273 ./pwd2013-08-20 16:01:42.000000000 +0300 432 ./.vim/.netrwhist2013-08-04 12:47:09.000000000 +0300 111891750 ./vegetarisms.sql.zip2013-01-14 08:18:13.000000000 +0200 163 ./.mysql_history2013-01-13 12:46:18.000000000 +0200 69632 ./skriesim_2013.xls2012-11-14 10:13:49.000000000 +0200 105 ./Scripts/ezermala.sh

Page 47: UNIX SHELL IN DBA EVERYDAY

ALIAS• alias cpp=“rsync --progress -ravz”

• alias most='du -hsx * | sort -rh | head -10’

• alias usage='du -ch 2> /dev/null |tail -1’

• alias untar='tar -zxvf ’

• alias nocomment='grep -Ev '\''^(#|$)'\'''

Page 48: UNIX SHELL IN DBA EVERYDAY

ALIASbu() { cp $@ [email protected]`date +%y%m%d`; echo "`date +%Y-%m-%d` backed up $PWD/$@" >> ~/.backups.log; } alias backup=bu

Page 49: UNIX SHELL IN DBA EVERYDAY

ALIAS

• alias instances='ps -ef | grep -v grep | grep dbw | cut -d _ -f 3‘

• alias sid=‘env | grep ORACLE_SID’

• alias alert='tail -100 $ORACLE_BASE/admin/$ORACLE_SID/bdump/alert_$ORACLE_SID.log | more’

Page 50: UNIX SHELL IN DBA EVERYDAY

ALIAS

# alias

# unalias name # unalias -a

# \name

Page 51: UNIX SHELL IN DBA EVERYDAY

BONUS ALIAS

doskey /macrofile=\doskey.mac

doskey.mac

ls=dir $* /o/w cat=type $* rm=del $* lsl=dir $* /o/p quit=exit

Page 52: UNIX SHELL IN DBA EVERYDAY

BRACE• cp admin/ORCL/pfile/initORCL.ora{,.bak}

!

• cp admin/ORCL/pfile/initORCL.ora admin/ORCL/pfile/initORCL.ora.bak

• ls *.{trc,log}

Page 53: UNIX SHELL IN DBA EVERYDAY

HISTORY

Page 54: UNIX SHELL IN DBA EVERYDAY

SUDO !!Run last command from history

Page 55: UNIX SHELL IN DBA EVERYDAY

SPYhistory | awk '{print $2}' | sort | uniq -c | sort -n | tail

7 ps 9 exit 9 rm 12 more 19 sqlplus 20 vi 22 pwd 85 cd 109 df 185 ls

Page 56: UNIX SHELL IN DBA EVERYDAY

SPACE USAGE

Page 57: UNIX SHELL IN DBA EVERYDAY

SPACE USAGE• du

• find . -type f -print0 | xargs -0 du | sort -n | tail -10 | cut -f2 | xargs -I{} du -sh {}

• find . -type d -print0 | xargs -0 du | sort -n | tail -10 | cut -f2 | xargs -I{} du -sh {}

• find . -type d -exec du -sk {} \; | sort -n -k 1

Page 58: UNIX SHELL IN DBA EVERYDAY

SPACE USAGE# sh get_largest_files.sh /root 10 ![SIZE (BYTES)] [% OF DISK] [OWNER] [LAST MODIFIED ON] [FILE] !913608 0% root 2012-08-25 17:33:33 /root/test.h.gch 73164 0% root 2012-09-18 11:06:02 /root/mem.log 38772 0% root 2012-08-02 15:17:39 /root/install.log 22455 0% root 2012-09-17 21:09:15 /root/.bash_history 4890 0% root 2012-08-25 17:33:33 /root/a.out 170 0% root 2012-09-03 20:10:44 /root/userinfo.sh 385 0% root 2012-09-07 01:02:02 /root/test.sh 23 0% root 2012-08-25 16:58:19 /root/test.h 175 0% root 2012-08-25 17:04:46 /root/test.c.good 134 0% root 2012-08-25 17:32:57 /root/test.c !Total disk size: 23792652288 Bytes Total size occupied by these files: 1053776 Bytes [ 0% of Total Disc Space ] !*** Note: 0% represents less than 1% ***

http://www.thegeekscope.com/linux-script-to-find-largest-files/

Page 59: UNIX SHELL IN DBA EVERYDAY

LOAD GENERATION

Page 60: UNIX SHELL IN DBA EVERYDAY

LOAD GENERATION• cat /dev/urandom > md5sum &

• dd if=/dev/zero of=/dev/null

• while true; do /bin/true; done

• yes > /dev/null &

!

• dd if=/dev/random of=/tmp/largefile bs=1024 count=4000000

fulload() { dd if=/dev/zero of=/dev/null | dd if=/dev/zero of=/dev/null & }; fulload; read; killall dd

Page 61: UNIX SHELL IN DBA EVERYDAY

LOAD GENERATION• stress --cpu 2 --timeout 60

#!/bin/bash duration=120 # seconds instances=4 # cpus endtime=$(($(date +%s) + $duration)) for ((i=0; i<instances; i++)) do while (($(date +%s) < $endtime)); do :; done & done

http://linuxdrops.com/how-to-produce-high-cpu-load-memory-io-or-stress-test-a-linux-server/

Page 62: UNIX SHELL IN DBA EVERYDAY

FORK BOMB

:(){ :|:& };:

http://en.wikipedia.org/wiki/Fork_bomb

bomb() { bomb | bomb & }; bomb

Page 63: UNIX SHELL IN DBA EVERYDAY

REAL LIFE

Page 64: UNIX SHELL IN DBA EVERYDAY

say() { echo $1 | tee -a oraup_stat.txt } !up_db() { say ">>>>>>>> ORACLE_SID=$ORACLE_SID, celju augshaa..." sqlplus "/ as sysdba" <<EOF | tee -a oraup_stat.txt startup exit EOF } !if [ ! -f $ORACLE_HOME/bin/oracle ]; then say "Nav uzstadita ORACLE_HOME." exit else say "ORACLE_HOME=$ORACLE_HOME" fi !if [ $# -eq 0 ]; then say ">>> Nav noraditi parametri" die() fi !while [ $# -ne 0 ]; do export ORACLE_SID=$1 up_db done

Page 65: UNIX SHELL IN DBA EVERYDAY

TEST ENVIr paceltas sekojoshas datubaazes: ====================================================================================================================== DB SID Memory ORACLE_HOME and Product Version Actual Database Version ---------------------------------------------------------------------------------------------------------------------- APVDIG 1029 M /export/home/oracle/product/10.2.0 10.2.0.4.0 64-bit 10.2.0.4.0 64-bit ARHTEST 545 M /export/home/oracle/product/8.1.7 8.1.7.4.0 32-bit 8.1.7.4.0 32-bit EBRTEST 1895 M /export/home/oracle/product/11.2.0. 11.2.0.2.0 64-bit 11.2.0.2.0 64-bit ECRMUAT 1496 M /export/home/oracle/product/11.2.0. 11.2.0.3.0 64-bit 11.2.0.3.0 64-bit IDM 856 M /export/home/oracle/product/11.2.0. 11.2.0.3.0 64-bit 11.2.0.3.0 64-bit MBPTEST 1736 M /export/home/oracle/product/11.2.0. 11.2.0.3.0 64-bit 11.2.0.3.0 64-bit PRO11 515 M /export/home/oracle/product/11.2.0. 11.2.0.2.0 64-bit 11.2.0.2.0 64-bit RMSTEST 429 M /export/home/oracle/product/10.2.0 10.2.0.4.0 64-bit 10.2.0.4.0 64-bit ROSMET11 856 M /export/home/oracle/product/11.2.0. 11.2.0.3.0 64-bit 11.2.0.3.0 64-bit SMTEST 183 M /export/home/oracle/product/9.2.0.1 9.2.0.8.0 64-bit 9.2.0.8.0 64-bit SYMDW 1511 M /export/home/oracle/product/9.2.0.1 9.2.0.8.0 64-bit 9.2.0.8.0 64-bit SYMIBM 4903 M /export/home/oracle/product/9.2.0.1 9.2.0.8.0 64-bit 9.2.0.8.0 64-bit SYMUAT 6503 M /export/home/oracle/product/9.2.0.1 9.2.0.8.0 64-bit 9.2.0.8.0 64-bit TPENS11 828 M /export/home/oracle/product/11.2.0. 11.2.0.3.0 64-bit 11.2.0.3.0 64-bit TPENSNEW 588 M /export/home/oracle/product/11.1.0 11.1.0.7.0 64-bit 11.1.0.7.0 64-bit TRISD 960 M /export/home/oracle/product/11.2.0. 11.2.0.3.0 64-bit 11.2.0.3.0 64-bit UFTEST 381 M /export/home/oracle/product/10.2.0 10.2.0.4.0 64-bit 10.2.0.4.0 64-bit VOIS11T 884 M /export/home/oracle/product/11.2.0. 11.2.0.3.0 64-bit 11.2.0.3.0 64-bit ====================================================================================================================== Kopaa DB: 19 26472 M

Page 66: UNIX SHELL IN DBA EVERYDAY

_run_sql() { selekts=`sqlplus "/ as sysdba"<<endsql set head off; set serveroutput on; declare x number; i number; n number; comp varchar2(255); vers varchar2(255); c varchar2(1000); begin select count(*) into x from dba_views where view_name = 'DBA_REGISTRY' and rownum = 1; if x = 0 then -- versijas zem 9.0.0.0.0 c := 'select product, version from product_component_version where product like ''Oracle%Enterprise Edition%'' or product like ''Oracle%Server%'''; else -- versijas virs 9.0.0.0.0 c := 'select comp_name, version from dba_registry where comp_name like ''Oracle%Catalog Views%'''; end if; i := dbms_sql.open_cursor; dbms_sql.parse(i, c, dbms_sql.native); dbms_sql.define_column(i, 1, comp, 255); dbms_sql.define_column(i, 2, vers, 255); n := dbms_sql.execute(i); if dbms_sql.fetch_rows(i) > 0 then dbms_sql.column_value(i, 1, comp); dbms_sql.column_value(i, 2, vers); dbms_output.put_line('>>>'||comp||' '||vers||'<<<'); end if; dbms_sql.close_cursor(i); end; / select '>>>'||length(addr)*4||'<<<' from v\\$process where ROWNUM = 1; exit endsql` echo $selekts }

Page 67: UNIX SHELL IN DBA EVERYDAY

for pmonproc in `ps -ef -o pid,args | grep pmon | grep -v grep | grep -v sed | \ sed 's/\(.*\) ora_pmon_\(.*\)/\1 \2/' | sort -k 2`; do ! orastr=`_run_sql` orver=`echo $orastr | sed 's/.*Release \([^ ]*\) .*/\1/1'` orabinv=`file $env_orahome/bin/oracle | sed 's/.*ELF \(.*\)-bit .*/\1/'` typeset -L35 env_orahome typeset -R11 orver typeset -R11 prodshortver echo "$dbsid $mem2 M $env_orahome $orver $orabinv-bit\c" ! prodver=`echo $orastr | perl -ne 's/.*?>>>(.*?)<<<.*/\1/ && print'` prodshortver=`echo $prodver | sed 's/.* \([^ ]*\)/\1/'` prodbytes=`echo $orastr | perl -ne 's/.*>>>(.*?)<<<.*/\1/ && print'` vermat=`echo $prodshortver | awk '{if ($0 == $orver) {print 0} else {print 1}}'` echo " $prodshortver $prodbytes-bit" if [ $vermat -ne 0 -o $prodbytes -ne $orabinv ]; the echo " ^ ^ ^ ^ ^ ^ !!!!!!! NESAKRIIT VERSIJAS !!!!!!! ^ ^ ^ ^ ^ ^" fi !!done

Page 68: UNIX SHELL IN DBA EVERYDAY

env_orahome=`pargs -e "$pid" | grep "ORACLE_HOME=" | awk '{print $2}' | sed 's/.*=\(.*\)/\1/'` env_ldlib=`pargs -e "$pid" | grep "LD_LIBRARY_PATH" | awk '{print $2}' | sed 's/.*=\(.*\)/\1/'` env_path=`pargs -e "$pid" | grep ^PATH= | awk '{print $2}' | sed 's/.*=\(.*\)/\1/'` env_orabase=`pargs -e "$pid" | grep "ORACLE_BASE=" | awk '{print $2}' | sed 's/.*=\(.*\)/\1/'` env_orasid=`pargs -e "$pid" | grep "ORACLE_SID=" | awk '{print $2}' | sed 's/.*=\(.*\)/\1/'` env_nlsl=`pargs -e "$pid" | grep "NLS_LANG=" | awk '{print $2}' | sed 's/.*=\(.*\)/\1/'` ! mem=`pmap "$pid" 2>/dev/null | tail -1 | awk '{ print $2 }'` mem2=`echo $mem | awk '{split($0,a,"K"); print a[1]}'` mem2=`expr $mem2 / 1024` memtot=`expr $memtot + $mem2` ! if [ "$env_path" -eq "" ]; then env_path="/usr/bin:/etc:/usr/ccs/bin/:/usr/local/bin:/usr/usb:.:"$env_orahome/bin fi PATH="$env_path" LD_LIBRARY_PATH="$env_ldlib" ORACLE_BASE="$env_orabase" ORACLE_HOME="$env_orahome" ORACLE_SID="$env_orasid" NLS_LANG="$env_nlsl" export PATH LD_LIBRARY_PATH ORACLE_BASE ORACLE_HOME ORACLE_SID NLS_LANG

Page 69: UNIX SHELL IN DBA EVERYDAY

oracle@test-dbs>pargs -e 9298 9298: ora_pmon_IDM envp[0]: SKGP_SPAWN_DIAG_PRE_EXEC_TS= envp[1]: SKGP_HIDDEN_ARGS= envp[2]: SKGP_SPAWN_DIAG_POST_FORK_TS= envp[3]: SKGP_SPAWN_DIAG_PRE_FORK_TS= envp[4]: ORACLE_SPAWNED_PROCESS=1 envp[5]: MANPATH=/usr/share/man:/usr/local/share/man/:/opt/local/share/man/ envp[6]: TERM=vt100 envp[7]: SHELL=/bin/bash envp[8]: NLS_LANG=AMERICAN_AMERICA.AL32UTF8 envp[9]: ODBC_HOME=/export/home/oracle/odbc64 envp[10]: USER=oracle envp[11]: LD_LIBRARY_PATH=/export/home/oracle/odbc64/lib:/export/home/oracle/product/11.2.0.3/lib:/usr/lib:/usr/openwin/lib:/usr/local/lib:/usr/dt/lib envp[12]: ORACLE_SID=IDM envp[13]: ORACLE_BASE=/export/home/oracle envp[14]: TNS_ADMIN=/export/home/oracle/product/11.2.0.3/network/admin envp[15]: PATH= envp[16]: PWD=/export/home/oracle/admin/IDM/pfile envp[17]: EDITOR=vi envp[18]: PS1=\\u@\\h> envp[19]: SHLVL=1 envp[20]: HOME=/export/home/oracle envp[21]: ODBCINI=/export/home/oracle/odbc64/odbc.ini envp[22]: DISPLAY=test-dbs:10.0 envp[23]: ORACLE_HOME=/export/home/oracle/product/11.2.0.3 envp[24]: _=/export/home/oracle/product/11.2.0.3/bin/sqlplus envp[25]: OLDPWD=/export/home/oracle/admin/IDM envp[26]: ORA_NET2_DESC=8,1

Page 70: UNIX SHELL IN DBA EVERYDAY

TOPP PID USERNAME SIZE RSS STATE PRI NICE TIME CPU PROCESS/NLWP 3587 oracle 6522M 6518M cpu6 1 0 0:00:14 4.9% oracle/1 3587 :15 ora_j002_SYMUAT 2011 oracle 495M 479M sleep 59 0 0:01:42 1.7% oracle/71 2011 :42 oracleRMSTEST (LOCAL=NO) 15441 oracle 1501M 1483M sleep 49 0 0:16:26 1.3% oracle/1 15441 :26 oracleECRMUAT (LOCAL=NO) 18128 oracle 6504M 6500M sleep 5 0 1:51:00 1.1% oracle/1 18128 :00 oracleSYMUAT (LOCAL=NO) 27174 oracle 1500M 1483M sleep 48 0 0:01:21 0.5% oracle/1 27174 :22 oracleECRMUAT (LOCAL=NO) 3255 oracle 6510M 6507M sleep 32 0 0:00:02 0.2% oracle/1 23255 :42 ora_dia0_PRO11 20861 oracle 399M 392M sleep 57 0 34:05:31 0.1% tnslsnr/1 20861 :31 /export/home/oracle/product/9.2.0.1/bin/tnslsnr NET9 -inherit 2953 oracle 1500M 1482M sleep 26 0 0:00:13 0.1% oracle/1 2953 :13 oracleECRMUAT (LOCAL=NO) 3591 oracle 6504M 6500M sleep 52 0 0:00:00 0.1% oracle/1 3591 :00 ora_j004_SYMUAT 2014 oracle 446M 417M sleep 59 0 0:00:44 0.1% oracle/15 2014 :44 ora_lgwr_RMSTEST 2010 oracle 444M 426M sleep 1 0 0:01:44 0.1% oracle/258 2010 :44 ora_dbw0_RMSTEST 29354 oracle 1502M 1480M sleep 1 0 8:17:49 0.1% oracle/1 29354 :49 ora_dia0_ECRMUAT 2012 oracle 441M 425M sleep 1 0 0:01:11 0.0% oracle/258 2012 :11 ora_dbw1_RMSTEST 3522 oracle 4904M 4900M sleep 55 0 0:00:00 0.0% oracle/1 3522 :01 ora_j002_SYMIBM 3821 oracle 855M 625M sleep 59 0 0:00:00 0.0% oracle/1 3821 :00 ora_j001_IDM 8178 oracle 1898M 1879M sleep 56 0 0:23:22 0.0% oracle/1 8178 :22 ora_psp0_EBRTEST 8222 oracle 1900M 1881M sleep 59 0 3:50:20 0.0% oracle/1 8222 :21 ora_dia0_EBRTEST 3819 oracle 856M 626M sleep 59 0 0:00:00 0.0% oracle/1 3819 :00 ora_j000_IDM 3777 oracle 1899M 1883M sleep 53 0 0:00:00 0.0% oracle/1 3777 :00 ora_p019_EBRTEST 10501 oracle 6508M 6503M sleep 1 0 0:06:01 0.0% oracle/1 10501 :02 oracleSYMUAT (LOCAL=NO) 3769 oracle 1899M 1883M sleep 52 0 0:00:00 0.0% oracle/1 3769 :00 ora_p015_EBRTEST 3767 oracle 1899M 1883M sleep 52 0 0:00:00 0.0% oracle/1 3767 :00 ora_p014_EBRTEST 3761 oracle 1899M 1883M sleep 53 0 0:00:00 0.0% oracle/1 3761 :00 ora_p011_EBRTEST 3743 oracle 1899M 1883M sleep 54 0 0:00:00 0.0% oracle/1 3743 :00 ora_p002_EBRTEST 3771 oracle 1899M 1883M sleep 53 0 0:00:00 0.0% oracle/1 3771 :00 ora_p016_EBRTEST 3787 oracle 1899M 1883M sleep 54 0 0:00:00 0.0% oracle/1 3787 :00 ora_p024_EBRTEST 3589 oracle 6503M 6500M sleep 59 0 0:00:00 0.0% oracle/1 3589 :00 ora_j003_SYMUAT 3789 oracle 1899M 1883M sleep 54 0 0:00:00 0.0% oracle/1 3789 :00 ora_p025_EBRTEST 3813 oracle 1899M 1883M sleep 55 0 0:00:00 0.0% oracle/1 3813 :00 ora_p037_EBRTEST 3824 oracle 432M 416M sleep 58 0 0:00:00 0.0% oracle/1 3824 :00 ora_j000_RMSTEST Total: 689 processes, 9160 lwps, load averages: 1.63, 1.37, 1.29

Page 71: UNIX SHELL IN DBA EVERYDAY

#!/usr/bin/perl !$bg = $ARGV[0]; !$pid_list = ''; if ($bg ne '') { foreach (split(/\n/,`ps -ef | grep $bg | grep -v grep`)) { @top=split(/\s+/," ".$_); $pid_list = $pid_list.$top[2].","; print $_."\n"; } } if ($pid_list ne '') {$pid_list = " -p $pid_list";} !while (1 eq 1) { system("clear"); $pid=""; foreach (split(/\n/,`prstat -n 30 $pid_list 1 1`)) { @top=split(/\s+/," ".$_); $ps_line ="";$ps=""; if ($pid eq "PID") { @ps = split(/\n/,`ps -ef | grep $top[1] | grep -v grep`); $ps_line = substr($ps[0],9,6)." ".substr($ps[0],47,length($ps[0])); } else { $pid=$top[1]; } print $_." ".$ps_line."\n"; } `sleep 10`; }

Page 72: UNIX SHELL IN DBA EVERYDAY

ALERT.LOG• alert.log smart error checkMon Aug 19 17:36:13 2013 Errors in file /export/home/oracle/admin/ORCL/bdump/symuat_j003_20936.trc: ORA-12012: error on auto execute of job 4469813 ORA-20777: Kïûda -20777 ORA-20777: Kïûda 100 ORA-01403: no data foundprocedûrâ 0 KK_FG_RMSACCT_UNprocedûrâ 0 RP_AB_RMSACCT_UN ORA-06512: at "MASTER.ERROR_REG", line 70 ORA-06512: at "MASTER.RP_AB_RMSACCT_UN", line 292 ORA-06512: at line 1

• adrciADR Home = /u01/app/oracle/product/11.1.0/db_1/log/diag/rdbms/orclbi/orclbi: ***************************************************************************** INCIDENT_ID PROBLEM_KEY CREATE_TIME ----------------- ------------------------- --------------------------------- 3808 ORA 603 2007-06-18 21:35:49.322161 -07:00 3807 ORA 600 [4137] 2007-06-18 21:35:47.862114 -07:00 3805 ORA 600 [4136] 2007-06-18 21:35:25.012579 -07:00 3804 ORA 1578 2007-06-18 21:35:08.483156 -07:00 4 rows fetched

Page 73: UNIX SHELL IN DBA EVERYDAY

function get_errors ($cmd) { foreach (split("\n",$cmd) as $row) { preg_match( "/^(\S+\s+\S+\s+\d+)\s+\d+:\d+:\d+\s+(\d+)/x", $row, $match ); if (isset($match[0])) { $starting = 1; $grouping[] = $group; $group=$row."\n"; } else { if ($starting == 1) $group.=$row."\n"; } } ! $grouping_ora = array(); foreach ($grouping as $row) { $ja=0; if (check_group($row, "ORA-")) { ! if (check_group($row,"ORA-01554")) $ja=1; if (check_group($row,"ORA-3136")) $ja=1; if (check_group($row,"SYSTOR")) $ja=1; if ((check_group($row,"12333"))&&(check_group($row, "ORA-00600"))) $ja=1; if ($ja == 0) {$grouping_ora[]=trim($row);} } $ja=0; if (check_group($row, "Failure to extend rollback segment")) { $grouping_ora[]=trim($row); } $ja=0; if (check_group($row, "WARNING")) { if (check_group($row,"Starting ORACLE instance")) $ja=1; if ($ja == 0) {$grouping_ora[]=trim($row);} } } return $grouping_ora; }

Page 74: UNIX SHELL IN DBA EVERYDAY

DB BACKUP

• RMAN backup • one script • flexible configuration

Page 75: UNIX SHELL IN DBA EVERYDAY

# datu bazes statusa noskaidrosana STATUS_SQL="select DATABASE_ROLE FROM v\$database;\nexit\n" STATUS=`echo $STATUS_SQL | sqlplus -S / as sysdba | tail -2| head -1` !echo $STATUS !if [ "$STATUS" == "PRIMARY" ]; then echo "Database status - ${STATUS}" else echo "Database not in correct mode (${STATUS})" exit 0; fi

Page 76: UNIX SHELL IN DBA EVERYDAY

# # backup konfiguracija # !# --------------------------------------------------------------------------- # Ikdienas backup # FULL - pilnais backup (incremental 0) # INCR - inkrementals backup (incremental 1) !IKDIENAS_BACKUP.1=INCR IKDIENAS_BACKUP.2=INCR IKDIENAS_BACKUP.3=INCR IKDIENAS_BACKUP.4=INCR IKDIENAS_BACKUP.5=INCR IKDIENAS_BACKUP.6=INCR IKDIENAS_BACKUP.0=FULL !!# --------------------------------------------------------------------------- # Papildus backup. Tiek noteikts pec datuma (yyyy.mm.dd) # MONTH - izpildit backup menesea lentaas # QUART - izpildit backup kvartala lentaas # YEAR - izpildit backup gada lentaas !PAPILDUS_BACKUP.2012.05.31=MONTH PAPILDUS_BACKUP.2012.06.30=QUART PAPILDUS_BACKUP.2012.07.31=MONTH PAPILDUS_BACKUP.2012.08.31=MONTH PAPILDUS_BACKUP.2012.09.29=QUART PAPILDUS_BACKUP.2012.10.18=FULL PAPILDUS_BACKUP.2012.10.19=FULL

Page 77: UNIX SHELL IN DBA EVERYDAY

# check for business backup required PAPILDUS_BACKUP=`cat ${BACKUP_CFG} | grep -v "#" | grep "PAPILDUS_BACKUP.${D_DATE}" | awk 'BEGIN {FS="="} {print $2} '` IKDIENAS_BACKUP=`cat ${BACKUP_CFG} | grep -v "#" | grep "IKDIENAS_BACKUP.${D_WEEK_DAY}" | awk 'BEGIN {FS="="} {print $2} '` !BACKUP_TIME=28; !if [ "${PAPILDUS_BACKUP}" = "MONTH" ] ; then # start business backup BACKUP_TIME=120; BACKUP_TAPE=tdpo_monthly.opt BACKUP_LEVEL=0; BACKUP_TAG=${PAPILDUS_BACKUP}` date '+%Y%m' ` # elif [ "${IKDIENAS_BACKUP}" = "INCR" ] ; then BACKUP_TIME=28; BACKUP_TAPE=tdpo.opt PAPILDUS_BACKUP=INCR BACKUP_LEVEL=1; BACKUP_TAG=${PAPILDUS_BACKUP}` date '+%Y%m%d' ` # elif [ "${IKDIENAS_BACKUP}" = "FULL" ] ; then BACKUP_TIME=28; BACKUP_TAPE=tdpo.opt PAPILDUS_BACKUP=FULL BACKUP_LEVEL=0; BACKUP_TAG=${PAPILDUS_BACKUP}` date '+%Y%m%d' ` # fi

Page 78: UNIX SHELL IN DBA EVERYDAY

cat > $RUNCMD <<! connect target /; !# Parameters set section CONFIGURE ENCRYPTION FOR DATABASE OFF; CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 28 DAYS; CONFIGURE CONTROLFILE AUTOBACKUP ON; CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE 'sbt_tape' TO 'online_ctl_%F.ctl'; CONFIGURE CHANNEL DEVICE TYPE 'sbt_tape' PARMS 'ENV=(TDPO_OPTFILE=/usr/tivoli/tsm/client/oracle/bin64/${BACKUP_TAPE})' FORMAT 'backup_df_%t_%s_%p_%c' MAXPIECESIZE 100G; CONFIGURE DEVICE TYPE 'sbt_tape' PARALLELISM 2 BACKUP TYPE TO BACKUPSET; CONFIGURE DEFAULT DEVICE TYPE TO SBT; CONFIGURE ARCHIVELOG DELETION POLICY TO SHIPPED TO ALL STANDBY; !run { set duplex 1; backup incremental level ${BACKUP_LEVEL} database tag '${BACKUP_TAG}' KEEP UNTIL TIME 'sysdate + ${BACKUP_TIME}' LOGS; backup current controlfile; backup spfile format 'spfile_%d_%s_%T_dbid%I.ora' tag 'spfile ${BACKUP_TAG}'; backup as compressed backupset archivelog all delete input filesperset=20; } ! !# ${ORACLE_HOME}/bin/rman msgno cmdfile=${RUNCMD} log=${RMANLOG} 1>>${RUNLOG} 2>&1

Page 79: UNIX SHELL IN DBA EVERYDAY

# log apvienosans un parsesana cat ${RMANLOG} | sed 's/^RMAN-[0-9][0-9][0-9][0-9][0-9]\:.//g' >> ${RUNLOG} cat ${RMANLOG_DEL} | sed 's/^RMAN-[0-9][0-9][0-9][0-9][0-9]\:.//g' >> ${RUNLOG} cat ${RMANLOG_CTRL} | sed 's/^RMAN-[0-9][0-9][0-9][0-9][0-9]\:.//g' >> ${RUNLOG} !!# ORA- kludu pievienosana log faila sakumaa grep ORA- ${RUNLOG} > /tmp/ora_errors.log cat /tmp/ora_errors.log ${RUNLOG} > /tmp/tempfile ; mv /tmp/tempfile ${RUNLOG} !!cat ${RUNLOG} | ${MAILER} -s "BACKUP at `date` on ${ORACLE_SID} DONE `head -1 /tmp/ora_errors.log`" $MAILTO

Page 80: UNIX SHELL IN DBA EVERYDAY

HA WORKAROUND• AIX hardware • Oracle Database on ASM • Oracle DataGuard + Observer • Full HA tests • Service Request + AIX support

Page 81: UNIX SHELL IN DBA EVERYDAY

HA WORKAROUND!

• database is PHYSICAL STANDBY (RULE_1) • if dgmgrl show configuration hang (RULE_2) • has errors "DMON: Database ora is still

working on the task." (RULE_3) • manual failover

Page 82: UNIX SHELL IN DBA EVERYDAY

#setup home . /home/oracle/oracleDB.sh !RUN_NODE=secondary RUN_CHECK_NODE=primary RUN_SLEEP=10 LOG_SLEEP=60 LOG_TAIL=10 RUN_HOME=/home/oracle/local/dg

Page 83: UNIX SHELL IN DBA EVERYDAY

!INSTANCE_COUNT=`ps -ef | grep master.sh | grep -v grep | grep -v $$ | wc -l` if [ $INSTANCE_COUNT != 0 ]; then date echo "Instance $$" ps -ef | grep master.sh exit 0 fi

Page 84: UNIX SHELL IN DBA EVERYDAY

echo "RULE 1 check" !STATUS_SQL="select DATABASE_ROLE FROM v\$database;\nexit\n" STATUS=`echo $STATUS_SQL | sqlplus -S / as sysdba | tail -2| head -1` !if [ "$STATUS" == "PHYSICAL STANDBY" ]; then echo "\tOK" echo "\tDatabase status - ${STATUS}" else echo "\tDatabase not correct mode (${STATUS})" exit 0; fi

Page 85: UNIX SHELL IN DBA EVERYDAY

#!/bin/sh !#setup dgmgrl home . /home/oracle/oracleDB.sh !# start check configuration dgmgrl <<EOL connect sys/master; show configuration verbose; EOL

DG_STATUS.SH

Page 86: UNIX SHELL IN DBA EVERYDAY

echo "RULE 2 check" !NOW=`date` echo "\tCheck time - ${NOW}" echo "\tSleep time - ${RUN_SLEEP} sec" echo "\tSleeping..." sh $RUN_HOME/DG_status.sh > /dev/null 2>&1 & sleep $RUN_SLEEP !NOW=`date` echo "\tCheck time - ${NOW}" !PROCESS=`ps -ef | grep DG_status.sh | grep -v grep` PROCESS_COUNT=`ps -ef | grep DG_status.sh | grep -v grep | wc -l` !echo "\tProcess count - ${PROCESS_COUNT}" !if [ $PROCESS_COUNT != 0 ]; then echo "\tOK" echo "\t${PROCESS}" else echo "\tDG configuration check run normaly"; exit 0 fi

Page 87: UNIX SHELL IN DBA EVERYDAY

echo "RULE 3 check" !sleep $LOG_SLEEP !NOW=`date` echo "\tCheck time - ${NOW}" !# DG log faila atrasanas vietas noskaidrosana DIAG_DEST_SQL="select value from v\$parameter where name='diagnostic_dest';\nexit\n" DIAG_DEST=`echo $DIAG_DEST_SQL | sqlplus -S / as sysdba | tail -2| head -1` DGLOG_FILE="${DIAG_DEST}/diag/rdbms/${RUN_NODE}/${RUN_NODE}/trace/drc${RUN_NODE}.log" DGLOG_ERROR="DMON: Database ${RUN_CHECK_NODE} is still working on the task.” !if [ -f $DGLOG_FILE ]; then echo "\tDGLOG_FILE=${DGLOG_FILE}" echo "\tDGLOG_ERROR='${DGLOG_ERROR}'" echo "\tLOG_TAIL=${LOG_TAIL}" else echo "DG log file don't exists - ${DGLOG_FILE} (diagnostic_dest=${DIAG_DEST})" exit 0 fi !LINE=`tail -${LOG_TAIL} ${DGLOG_FILE} | grep "${DGLOG_ERROR}"` LINE_COUNT=`tail -${LOG_TAIL} ${DGLOG_FILE} | grep "${DGLOG_ERROR}" | wc -l` !if [ $LINE_COUNT != 0 ]; then echo "\tOK" echo "\tLINE_COUNT=${LINE_COUNT}" echo "\t${LINE}" else echo "\tNO errors in log file"; exit 0 fi

Page 88: UNIX SHELL IN DBA EVERYDAY

# te jataisa ir failover dgmgrl <<EOL connect sys/master; failover to ${RUN_NODE} EOL

FAILOVER

Page 89: UNIX SHELL IN DBA EVERYDAY

RESOURCES

Page 90: UNIX SHELL IN DBA EVERYDAY

explainshell.com

Page 91: UNIX SHELL IN DBA EVERYDAY

www.commandlinefu.com

Page 92: UNIX SHELL IN DBA EVERYDAY

dotfiles.org

Page 93: UNIX SHELL IN DBA EVERYDAY

TWITTER

Page 94: UNIX SHELL IN DBA EVERYDAY

MYSELF

• Signis Vāvere

• AS SEB banka

• database analyst

• http://lv.linkedin.com/in/signis

Page 95: UNIX SHELL IN DBA EVERYDAY

SQL> set pagesize 0 SQL> set head off SQL> with Mx as (select 60 as MaxWidth from dual) select decode ( sign(floor(MaxWidth /2)-rownum) , 1 , lpad( ' ', floor(MaxWidth /2)-(rownum-1)) || rpad( '*', 2*(rownum-1)+1, ' *') , lpad( '* * *', floor(MaxWidth/2)+3) ) from all_tables ,Mx where rownum < floor(MaxWidth /2) + 6;

HAVE YOURSELF A MERRY LITTLE CHRISTMAS

Page 96: UNIX SHELL IN DBA EVERYDAY

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * !35 rows selected.


Top Related