[20141105]不同使用者通路oracle資料庫.txt
--我們有一台機器,上面安裝了兩個資料庫,字元集不一樣。要通路和操作是要切換ORACLE_SID以及NLS_LANG環境變量。
--非常繁瑣,而且容易出錯,非常不友善。
--自己也想了幾種方式:
1.建立一個腳本,用來切換使用者:
# cat chsid
#! /bin/bash
##############
# Desc : switch oracle sid , change sid and env NLS_LANG
######################################################
case "$1" in
dbcn1|cn1)
unset ORACLE_SID
export ORACLE_SID=dbcn1
unset NLS_LANG
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
;;
dben1|en1)
export ORACLE_SID=dben1
export NLS_LANG=AMERICAN_AMERICA.US7ASCII
*)
echo "$0 ORACLE_SID"
esac
--執行時使用 . chsid en1或者source chsid en1,就可以實作切換。
--注意前面要使用一個. 或者source ,不然環境變量的修改無效,我不知道什麼往上傳環境變量(子程序到父程序傳遞環境變量,好像不行)。
2.建立一個新使用者,這樣比較科學一些,不容易出錯。
--簡單記錄一下步驟。
$ id
uid=503(oracle11g) gid=501(oinstall) groups=501(oinstall),502(dba)
--建立新使用者包含oracle的全部組。
# useradd oraen -g oinstall -G dba
[root@hisdg IP=40 ~ 6]# passwd oraen
Changing password for user oraen.
New UNIX password:
BAD PASSWORD: it is too short
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
--再修改.bash_profile環境變量,就ok了。
3.讀寫存在問題嗎?
--這個一直是我擔心的問題,測試以後不存在。
# ls -l users01.dbf
-rw-r----- 1 oracle11g oinstall 805314560 2014-11-05 02:08:11 users01.dbf
--可以發現使用者oracle11g有讀寫權限,而組oinstall僅僅有讀權限。sqlplus通路執行執行DML可以嗎?測試看看。
SCOTT@test> select * from t;
ID C2
---------- --------------------
1 1
2 2
3 3
4 4
5 5
SCOTT@test> update t set id=100 where id=1;
1 row updated.
SCOTT@test> commit ;
Commit complete.
SCOTT@test> select * from t where rownum ID C2
100 1
SCOTT@test> alter system checkpoint;
System altered.
--為什麼能成功呢?
SCOTT@test> select spid from v$process where addr in (select paddr from v$session where sid in (select sid from v$mystat where rownum=1));
SPID
------
14416
$ ps -ef
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
...
4 S root 14380 11086 0 76 0 - 17836 wait 10:08 pts/3 00:00:00 su - oraen
4 S oraen 14381 14380 0 76 0 - 14175 wait 10:08 pts/3 00:00:00 -bash
0 S oraen 14415 14381 0 76 0 - 15372 - 10:08 pts/3 00:00:00 sqlplus
0 S 503 14416 14415 0 76 0 - 453967 pipe_w 10:08 ? 00:00:00 oracletest (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
--可以發現程序号=14416的使用者503,就是oracle11g。
--注意如果使用者名的長度大于8位,ps 顯示UID是使用者id。oracle11g的使用者id就是503.
# id oracle11g
$ ls -l `which oracle `
-rwsr-s--x 1 oracle11g oinstall 232272740 2013-03-21 09:02:54 /u01/app/oracle11g/product/11.2.0/db_2/bin/oracle
--可以發現執行檔案oracle帶有s權限,這樣當使用者調用執行它時,可以繼承指令的uid以及gid,這樣使用者就具有了通路資料檔案的權限。
--unix/linux下一些管理指令都具有這樣的特性。比如修改密碼的程式。
# ls -l `which passwd`
-r-s--x--x 1 root root 27728 2005-06-17 22:40:47 /usr/bin/passwd