[20141105]不同使用者訪問oracle資料庫.txt

lfree發表於2014-11-05

[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)
                unset   ORACLE_SID
                export  ORACLE_SID=dben1
                unset   NLS_LANG
                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<=5;
        ID C2
---------- --------------------
       100 1
         2 2
         3 3
         4 4
         5 5
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
uid=503(oracle11g) gid=501(oinstall) groups=501(oinstall),502(dba)

$ 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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-1321046/,如需轉載,請註明出處,否則將追究法律責任。

相關文章