系統維護參考手冊(Oracle 9i)

目錄

1 引言 4
1.1 目的 4
1.2 系統介紹 4
1.3 適用範圍 4
1.4 術語 4
1.5 參考資料 4
1.6 注意事項(重要) 4
2 準備工作 5
3 常見系統配置、維護 5
3.1 ORACLE當前庫及其監聽的啓動、關閉 5
3.1.1 Oracle的啓動 5
3.1.2 監聽器的啓動 6
3.1.3 檢查監聽器服務 6
3.1.4 Oracle的關閉 6
3.1.5 監聽器的關閉 6
3.1.6 自動啓動和關閉Oracle 7
3.2 ORACLE帳戶管理 8
3.2.1 查詢用戶信息 8
3.2.2 增加用戶 8
3.2.3 修改用戶密碼 9
3.2.4 刪除用戶 9
3.3 服務命名配置 9
3.4 修改內存結構 10
3.5 ORACLE最大鏈接數兩種修改辦法 10
3.6 導入導出數據 11
3.7 ORACLE聯機在線日誌文件管理 11
3.7.1 查詢聯機在線日誌文件信息 11
3.7.2 修改數據庫聯機在線日誌文件 12
3.8 ORACLE歸檔日誌管理 12
3.8.1 檢查歸檔配置 12
3.8.2 設置歸檔模式和取消歸檔模式 13
3.9 ORACLE存儲信息 14
3.9.1 查詢存儲信息 14
3.9.2 創建表空間 15
3.10 修改某用戶缺省和臨時表空間 15
3.11 ORACLE數據庫的漢字顯示問題 16
3.12 ORACLE卸載方法 17
3.12.1 UNIX 17
3.12.2 WIN 17
4 常見開發操作 18
4.1 常見表字段名操作 18
4.1.1 查看錶字段 18
4.1.2 增加表字段 18
4.1.3 刪除表字段 18
4.1.4 修改表字段類型 19
4.1.5 修改表字段名 19
4.2 表操作 19
4.2.1 查詢表信息 19
4.2.2 創建表 19
4.2.3 刪除表數據(重要) 19
4.2.4 刪除表 21
4.2.5 重命名錶 21
4.2.6 備份表 21
4.3 索引操作 21
4.3.1 查詢索引信息 21
4.3.2 創建索引 22
4.3.3 刪除索引 22
4.3.4 重建索引 22
4.4 SQL語句及存儲過程優化 23
4.4.1 SQL語句是否使用索引 23
4.4.2 SQL語句是否使用了最恰當的索引 24
4.4.3 怎麼提示SQL語句使用固定的索引 24
4.4.4 怎麼提示SQL語句固定使用全表掃描 24
4.4.5 存儲過程是否可以執行更少的、有效的SQL語句 24
4.5 操作阻塞,鎖情況 24
5 FAQ 25
5.1 操作表數據提示數據文件錯誤 25
5.2 從數據庫服務器進程運行中,優化最消耗CPU的SQL語句 25
5.3 導數據到新數據庫指定用戶的缺省表空間 26
5.4 正確安裝數據庫軟件,但無法創建庫 26
5.5 打開數據庫報告關閉錯誤,關閉數據庫報告打開錯誤 27
5.6 用戶不能在數據庫中創建對象 27
5.7 導入導出錯誤 27
5.8 不同版本的數據庫數據導入導出 28
5.9 數據庫掛起問題 28
5.10 多個數據庫操作方法:不同實例間轉換. 28
5.11 查詢錯誤號信息 29
5.12 查看ORACLE系統的版本 29
5.13 查看ORACLE系統安裝了哪些選項 29
5.14 查看ORACLE軟件是幾位數據庫 29
5.15 數據庫起不來,報告ORA-01157和ORA-01110錯誤 29
5.16 ORACLE目錄文件維護 30
文件修改控制 31

 

 

目錄


2 準備工作
 oracle 9i軟件的操作系統安裝用戶名和密碼(用戶名一般爲oracle,組一般爲dba)。
 oracle數據庫的默認管理帳戶和密碼:
 帳戶system的默認密碼爲manager
 帳戶sys的默認密碼爲change_on_install。
(登陸方式爲:
%sqlplus /nolog
SQL>conn sys/change_on_install as sysdba
此時擁有數據庫的最最高級的權限)
3 常見系統配置、維護
3.1 oracle當前庫及其監聽的啓動、關閉
以下講的是一個服務器上只運行一個當前數據庫的情況,多數據庫實例情況參考 “FAQ 5.8”。
3.1.1 Oracle的啓動
1) 以安裝oracle軟件的操作用戶登錄
2) %sqlplus /nolog
3) SQL>connect /as sysdba
4) SQL>startup
5) SQL>exit
驗證:
sqlplus system/manager
SQL>select count(*) from tab;
能正確查詢出數據,即啓動成功。
3.1.2 監聽器的啓動
1) 以安裝oracle軟件的操作用戶登陸
2) %lsnrctl start
或者使用
3) %lsnrctl
4) LSNRCTL> start
5) LSNRCTL>exit
驗證:
%lsnrctl status 查看監聽器狀態報告是否啓動。(查看當前服務器提供的監聽服務也使用該命令)

3.1.3 檢查監聽器服務
%lsnrctl status
3.1.4 Oracle的關閉
1) 以安裝oracle軟件的操作用戶登陸
2) %sqlplus /nolog
3) SQL>connect /as sysdba
4) SQL>shutdown immediate
5) SQL>exit
驗證:
使用操作系統命令ps查看oracle後臺進程無活動,以system帳戶無法登錄oracle執行查詢操作:
查詢oracle後臺進程:%ps –ef | grep ora_
查看oracle內存:%ipcs
只要關閉了數據庫,而系統還有ora_的後臺進程和ipcs能查出oracle內存,則該數據庫已不正常。需通知工程部進行處理。(僅適用單服務器單數據庫實例情況)
登錄驗證與啓動數據庫驗證一樣。

3.1.5 監聽器的關閉
1) 以安裝oracle軟件的操作用戶登陸
2) %lsnrctl stop
3) 或者使用
4) %lsnrctl
5) LSNRCTL> stop
6) LSNRCTL>exit
驗證:
與監聽的啓動驗證一樣。
3.1.6 自動啓動和關閉Oracle
可以配置系統,使得系統每次啓動時自動啓動oracle數據庫,每次shutdown時自動關閉oracle數據庫;oracle數據庫的自動啓動是可選的,但是推薦系統每次shutdown時自動關閉ORACLE數據庫,因爲這樣可以防止不正當的關閉ORACLE數據庫。
ORACLE提供了兩個shell文件來支持數據庫的自動關閉和啓動,他們是位於$ORACLE_HOME/bin的dbshut和dbstart。
dbshut和dbstart涉及了oratab文件的相同實體,所以不可能自動啓動sid1、sid2、sid3而只自動關閉sid1、sid2,不過可以只用dbshut去自動關閉數據庫而不用dbstart,
自動啓動和關閉oracle數據庫。
1. 編輯/var/opt/oracle/oratab文件
oratab文件中數據庫實體爲以下格式:
ORACLE_SID:ORACLE_HOME:{Y|N}
最後一個Y|N域指定是否自動關閉和啓動數據庫,找到要自動啓動的數據庫(即第一個域ORACLE_SID),然後把最後一個域更改爲Y。
即:在該文件末尾,有一行爲如上格式的具體實例.把後面的參數N修改:Y:Y
2. 使用超級用戶在/etc/init.d/目錄中建立dbora文件
3. dbora文件的內容如下所示:
#!/bin/sh
# Set ORA_HOME to be equivalent to the ORACLE_HOME
# from which you wish to execute dbstart and
# dbshut
# set ORA_OWNER to the user id of the owner of the
# Oracle database in ORA_HOME
#使用真實的ORACLE_HOME代替如下路徑.和安裝用戶.
ORA_HOME=/<mount_point>/app/oracle/product/9.0.1.1
ORA_OWNER=oracle
if [! -f $ORA_HOME/bin/dbstart]
then
echo "Oracle startup: cannot start"
exit
fi
case "$1" in
’start’)
# Start the Oracle databases:
# The following command assumes that the oracle login will not
# prompt theuser for any values
su - $ORA_OWNER -c $ORA_HOME/bin/dbstart &
;;
’stop’)
# Stop the Oracle databases:
# The following command assumes that the oracle login will not
# prompt the
# user for any values
su - $ORA_OWNER -c $ORA_HOME/bin/dbshut &
;;
esac
4. 鏈接該文件使得系統自動啓動和關閉數據庫
# ln -s /etc/init.d/dbora /etc/rc0.d/K10dbora
# ln -s /etc/init.d/dbora /etc/rc2.d/S99dbora
5. 注意:在拷貝此教本的時候,注意編輯,否則執行不成功.
6. 在重啓機器後,仍然需要啓動監聽.
驗證:
使用reboot進行驗證,與oracle的啓動驗證一樣。
3.2 Oracle帳戶管理
3.2.1 查詢用戶信息
SQL>select username,default_tablespace,temporary_tablespace,created,account_status from dba_users;

3.2.2 增加用戶
1. % su – oracle,或以安裝oracle軟件的操作用戶登陸
2. 更改ORACLE_SID環境變量爲要增加用戶的數據庫名
3. SQL> connect /as sysdba
4. SQL>create user user_name identified by user_passwd
default tablespace default_tablespace
temporary tablespace temp_tablespace
quota unlimited on default_tablespace;
建立用戶usern_ame,密碼爲user_password,選擇缺省表空間和臨時表空間,一般缺省表空間自己建立,最差情況使用USERS表空間,臨時表空間使用TEMP.
5. SQL> grant connect,resource to user_name;,爲user_name分配權限
驗證:
使用該創建了的用戶登錄,並進行驗證中文字符的方法進行驗證,如果成功,則創建成功。
3.2.3 修改用戶密碼
1.以oracle用戶登錄.
2.%sqlplus /nolog
SQL>connect /as sysdba
SQL>alter user USER_NAME identified by USER_PASSWD;
驗證:
使用該用戶與修改了的密碼登錄,登錄成功即修改密碼成功。
3.2.4 刪除用戶
刪除用戶時候,會從數據字典中刪除該用戶及其相關的模式,同時,如果在該模式中包含任何模式對象,也將立即刪除.使用cascade選項刪除該用戶以及所有相關的對象和依賴於該用戶的外鍵:
1.以oracle用戶登錄.
2.%sqlplus /nolog
SQL>connect /as sysdba
SQL>drop user user_name cascade;
驗證:
在刪除前用該用戶登錄成功,在刪除後,再使用該用戶登錄進行驗證,如果失敗即表示刪除成功或用戶已被lock。
或者使用SQL>select username from dba_users where username=’被刪除用戶名大寫’沒有查詢出記錄即可。
3.3 服務命名配置
用Oracle Ne manager配置服務命名:
1. 在$ORACL_HOME/bin目錄下運行netmgr 啓動Oracle Net manager.
2. 在導航窗格,展開Local>Service Naming.(服務命名)
3. 在工具條裏單擊+。網絡服務名稱嚮導啓動。
4. 在網絡服務名稱域裏輸入名稱(任何用戶想設定的名稱,一般設置爲與目標數據庫相同名稱),然後單擊Next.
5. 選擇客戶端將要監聽的協議(該協議必須已安裝在客戶端上)。單擊Next.
6. 在提供的域裏爲所選擇的協議輸入適當的協議參數,然後單擊呢Next.
7. 輸入目的服務(主機名選擇客戶端的IP,端口號選擇對方啓動的監聽端口號),然後單擊Next.
8. 輸入對方數據庫服務名,設置爲對方數據庫名.
9. 單擊Test,驗證網絡服務名稱能否正常工作,然後單擊Next.
如果測試不成功:
 確認目標數據庫和監聽者正在運行,然後單擊Test.
 單擊Chang Login來改變連接的用戶名稱和密碼,然後單擊Test.
10. 擊Close關閉連接測試對話框。
11. 單擊Finish保存配置,並關閉服務名稱嚮導。
驗證:
使用該服務名進行連接進行測試,如果成功,則表示配置成功:
SQL>sqlplus
username/passwd@net_service_name
SQL>select count(*) from tab;等操作如果成功,即表示配置成功。
3.4 修改內存結構
 如果在創建數據庫時,沒有對內存進行設置,可在安裝完成後,按需要對數據庫的一些內存等參數進行修改:
 修改方法: 可通過alter system set語句修改; 也可通過創建pfile轉化爲spfile修改.
 Alter system set 語句:alter system set 參數表達式 scope=spfile;
 Pfile轉化爲spfile:
SQL>create spfile=”$ORACLE_BASE/oradata/ORACLE_SID/spfile/ORACLE_SID.ora” from pfile=” $ORACLE_BASE/oradata/ORACLE_SID /init ORACLE_SID.ora”
 需修改選項和修改內容爲如下:
#SGA_MAX_SIZE一般設置爲物理內存的2/3.此處設置爲4G

*.SGA_MAX_SIZE=4294967296
*.db_cache_size=524288000
*.db_file_multiblock_read_count=8
*.db_files=160
*.fast_start_mttr_target=900
*.java_pool_size='786432000'
*.large_pool_size='10485760'
*.log_buffer=4194304
*.log_checkpoint_interval=50000
*.open_cursors=900
*.parallel_max_servers=8
*.processes=200
*.shared_pool_size=786432000
*.sort_area_size=5242880

驗證:
使用如下命令,查找相關內存配置是否滿足配置要求:
SQL>show parameters
3.5 Oracle最大鏈接數兩種修改辦法
1. 修改init ORACLE_SID.ora參數文件,但是必須帶參數啓動數據庫纔有效。修改$ORACLE_HOME/dbs/init ORACLE_SID.ora文件中的processes參數的值,然後帶參數重新啓動數據庫即可(SQL>startup pfile=/$ORACLE_HOME/oradata/ ORACLE_SID/init ORACLE_SID.ora)。(修改的數值可以參考$ORACLE_HOME/dbs/init.ora模板文件的提示)
2. 使用oracle 9i的新特性,使用spfile.
Alter system set processes=數值 scope=spfile;
重啓數據庫即可.
 如果不習慣使用spfile,可在安裝後把$ORACLE_HOME/dbs/spfile ORACLE_SID.ora刪除即可.此時數據庫將使用pfile,即原來的init ORACLE_SID.ora文件.
驗證:
與“修改內存結構”的驗證方法一樣。
3.6 導入導出數據
 整個數據庫導入導出:
 導出: exp dbauser/dbapasswd@ ORACLE_SID file=exp_filename log=exp_logfile full=y
 導入: imp dbauser/dbapasswd@ ORACLE_SID full=y ignore=y file=exp_filename log=exp_logfile
 按用戶導入導出:
 導出:exp dbauser/dbapasswd@ ORACLE_SID file=exp_filename log=exp_logfile owner=exp_username
 導入:imp dbauser/dbapasswd@ ORACLE_SID file=exp_file_name log=exp_logfile fromuser=exp_user touser=imp_user
其中方括號內的內容規定如下:
dbauser:具有DBA權限的Oracle用戶名
dbapasswd:dbauser的用戶密碼
sid:Oracle服務名
exp_file_name:導出數據文件的文件名
exp_logfile:導出日誌
exp_user:導出數據文件的用戶名。
Imp_user:準備要將數據導入的用戶名。
驗證:
導出驗證:使用在本機進行導入和在bin模式下FTP到其他機器進行相關導入驗證。
導入驗證:more log文件查詢導入是否成功。

3.7 Oracle聯機在線日誌文件管理
3.7.1 查詢聯機在線日誌文件信息
SQL> select * from v$log;
SQL>select * from v$logfile;

3.7.2 修改數據庫聯機在線日誌文件
如果沒有在創建數據庫時把redo日誌文件大小設置成5M,和分爲5個組,每組兩個redo日誌文件.則需要使用如下方法進行設置.
一般默認安裝後,的redo日誌文件都爲三組三個.
 則增加4組和5組,每組兩個日誌文件,且大小爲5M,命名爲redo04.log,redo14.log和redo05.log,redo15.log.
 使用日誌切換,把當前活動日誌切換到4組.則把1,2,3組drop掉.再用手工刪除該對應的redo日誌文件.
 創建1,2,3組,文件命名分別爲: redo01.log,redo11.log和redo02.log,redo12.log和redo03.log,redo13log.大小都爲5M.

 創建日誌組,且一起創建日誌文件,使用如下命令:
SQL>alter database add logfile group X (‘$ORACLE_BASE/oradata/ ORACLE_SID/redo0X.log’,’ $ORACLE_BASE/oradata/ORACLE_SID/redo1X.log’) size 5M;
 查看當前日誌狀態和日誌切換使用如下命令:
SQL>select * from v$log;
SQL> alter system switch logfile;
 刪除舊的日誌文件使用如下命令:
SQL> alter database drop logfile group X;
手動刪除對應的日誌文件使用系統刪除命令.

(如果文件已經損壞,則可使用如下方法(保守方法: alter database clear logfile group X;):alter database clear unarchived logfile group X;清除,再drop.不進行歸檔,此時需要進行做一個備份,否則數據庫將不能使用其進行恢復.)
驗證:
使用SQL命令查詢修改結果是否符合修改要求。
SQL>select name from v$log;

3.8 Oracle歸檔日誌管理
3.8.1 檢查歸檔配置
%sqlplus /nolog
SQL>archive log list
信息如下(有可能以中文顯示):
SQL> archive log list
Database log mode Archive Mode //說明是否爲歸檔模式,此處是歸檔模式
Automatic archival Enabled //自動歸檔進程是否啓動,此處是自動啓動
Archive destination /usr5/archive //說明第一歸檔目標,此處是/usr5/archive
Oldest online log sequence 51402 //說明就的聯機在線日誌序號
Next log sequence to archive 51404
Current log sequence 51404
SQL>

若要查看是否設置了其他歸檔目標,則使用如下命令檢查:
SQL>show parameters log_archive_dest

3.8.2 設置歸檔模式和取消歸檔模式
數據庫運行模式分爲歸檔和不歸檔模式.一般在確認有足夠的空間存放歸檔日誌文件才使用歸檔模式設置數據庫(推薦:至少有用戶數據的4倍以上的空閒空間,才使用歸檔模式)
3.8.2.1 設置歸檔模式
 歸檔模式的修改,可使用oracle 9i的新特性,使用spfile, 通過alter system set語句完成.
 配置歸檔模式:
 配置好歸檔屬性
 把數據庫放入歸檔模式
 檢查歸檔是否滿足要求

1) 配置好歸檔屬性
a) 設置歸檔目標
% su – oracle,或以oracle用戶登陸
更改ORACLE_SID環境變量爲要增加用戶的數據庫名
SQL> connect /as sysdba
假如需要放入歸檔文件的路徑爲$ORACLE_ARCH_1和$ORACLE_ARCH_2,則進行如下設置歸檔目標:
 SQL>alter system set log_archive_dest_1=”Location=/$ORACLE_ARCH_1” scope=spfile;
 SQL>alter system set log_archive_dest_2=”Location=/$ORACLE_ARCH_2” scope=spfile;
b) 設置歸檔進程
啓動oracle自動歸檔的進程,進行如下設置:
 SQL>alter system set log_archive_start=ture scope=spfile;
c) 設置歸檔文件名稱
設置好歸檔文件的名稱,一般需要帶上SN號,可配置如下:
 SQL>alter system set log_archive_format=”SID_T%TS%S.ORA”
2) 把數據庫放入歸檔模式
 正常關閉數據庫shutdown
 放入歸檔模式
SQL>startup mount
SQL>alter database archivelog
 打開數據庫
SQL>alter database open;
3) 檢查歸檔屬性
SQL>archive log list
 查看歸檔目標是否設置正確,歸檔進程是否已經啓動.數據庫是否已經處於歸檔狀態
驗證:
使用檢查歸檔屬性的方法進行驗證,從報告中即可得出是否配置成功。
3.8.2.2 取消歸檔模式
先檢查數據庫是否已經放入歸檔模式運行,如果已經是歸檔模式運行,則按照如下方法取消歸檔模式:
 取消歸檔模式
% su – oracle,或以oracle用戶登陸
更改ORACLE_SID環境變量爲要增加用戶的數據庫名
SQL> connect /as sysdba
 檢查是否處於歸檔模式
SQL>archive log list
 正常關閉數據庫
SQL>shutdown
 把數據庫放入非歸檔模式
SQL>start mount
SQ.L>alter database noarchivelog
 打開數據庫
SQL>alter database open;
 停止歸檔進程
SQL>archive log stop
 取消歸檔進程自動啓動
SQL>alter system set log_archive_start=false
Scope=spfile;
驗證:
使用檢查歸檔屬性的方法進行驗證,從報告中即可得出是否配置成功。

3.9 Oracle存儲信息
3.9.1 查詢存儲信息
SQL>select * from dba_tablespaces; //檢查邏輯空間信息
SQL>select * from dba_data_files; //檢查邏輯空間與物理空間的信息
SQL>select * from v$datafile; //檢查物理存儲文件的信息

3.9.2 創建表空間
以oracle用戶登錄,執行如下命令創建表空間和該表空間的數據文件

%sqlplus /nolog
%connect /as sysdba
SQL>create tablespace tablespace_name
datafile ‘/$ORACLE_BASE/oradata/ORACLE_SID/datafile_name01.dbf’
size 1000M
autoextend on next 1000M maxsize unlimited
minimum extent 25M
default storage ( initial 50M
next 50M
minextents 1
maxextents unlimited
pctincrease 0);
-----------黑體部分爲可修改部分,其中,最好只修改tablespace_name,和數據文件路徑和數據文件名稱(最好與其他數據文件放在一起),除了名稱與路徑,最好不要做其他修改。
給表空間添加數據文件:
SQL> alter tablespace tablespace_name add
datafile ‘/$ORACLE_BASE/oradata/ORACLE_SID/datafile_name01.dbf’
size 1000M;


驗證:
使用SQL命令查詢是否已經創建成功。
SQL>select tablespace_name from v$tablespaces;
3.10 修改某用戶缺省和臨時表空間
如果在創建用戶時,沒有指定缺省和臨時表空間,則默認都爲SYSTEM表空間。
 修改用戶缺省表空間:
SQL>alter user system default tabspace USERS;
 修改用戶臨時表空間:
SQL>alter user system temporary tabspace TEMP;
驗證:
使用SQL>select * from dba_users where username=’被修改用戶名大寫’;查看即可。
3.11 Oracle數據庫的漢字顯示問題
 注意
在oracle的使用過程中,如果字符集出現錯誤.版本在oracle7以下的,則允許用以下方法修改;如果是oracle8版本,則需要使用其他的命令修改,且原來設置的語言必須爲美國英語;對於9版本.則必須重新創建數據庫.在創建數據庫的過程中設置正確的字符集.
 Oracle7版本字符集修改辦法
在SQL*Plus中insert進的都是中文的,爲什麼一存入服務器後,再select出的就是? ? ?了?
• 錯誤現象:
1、 有的時候,服務器數據先導出,重裝服務器,再導入數據,結果,發生數據查詢是出現的是? ? ?。
2、 有時,服務器設置就有問題,字符集設成單字節了。
• 錯誤原因:
一般這種問題產生的原因是因爲字符集設置不對造成的。
• 解決方法:
1、檢查服務器上Oracle數據庫的字符集,檢查的方法如下:
SQL> connect /as sysdba
連接成功.
SQL> desc props$
列名 可空值否 類型
------------------------------- -------- ----
NAME NOT NULL VARCHAR2(30)
VALUE$ VARCHAR2(2000)
COMMENT$ VARCHAR2(2000)
SQL> col value$ format a40
SQL> select name,value$ from props$;
NAME VALUE$
------------------------------ -------------------------
DICT.BASE 2
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_DATE_FORMAT DD-MON-YY
NLS_DATE_LANGUAGE AMERICAN
NLS_CHARACTERSET ZHS16GBK
NLS_SORT BINARY
NLS_CALENDAR GREGORIAN
NLS_RDBMS_VERSION 7.3.4.0.0
GLOBAL_DB_NAME ORACLE.WORLD
EXPORT_VIEWS_VERSION 3
查詢出記錄.
NLS_CHARACTERSET這個參數應該是ZHS16GBK,如不是,需要修改成此值,修改的方法如下,
SQL*Plus中修改方法:
SQL> update props$ set value$='新字符集' where name='NLS_CHARACTERSET';
操作系統中修改方法:
connect /as sysdba
alter database SID character set ZHS16GBK;
alter database SID national character set ZHS16GBK;
注意修改數據庫字符集後需要重啓數據庫。
2、檢查操作系統WINDOWS中Oracle漢字顯示的字符集,檢查方法如下:
運行regedit,定位到:
HKEY_LOCAL_MACHINESOFTWAREORACLE
找到以下字符串:
NLS_LANG
檢查是否以下內容,如不是,改之,修改方法如下:
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
注意修改數據庫字符集後需要重啓數據庫。

3.12 oracle卸載方法
3.12.1 UNIX
a) 使用安裝嚮導工具卸載
b) 刪除安裝目錄
c) 刪除/var/opt/目錄下的oracle目錄
d) 卸載完成

3.12.2 WIN
e) 使用安裝嚮導工具卸載
f) 用Control Panel(控制面板)中的Services應用程序停止所有ORACLE服務。
g) 運行regedit,選擇HKEY_LOCAL_MACHINESOFTWAREORACLE,按del鍵刪除這個入口。
h) 選擇HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices,滾動這個列表,並刪除所有ORACLE入口
i) 從桌面上、STARTUP組中刪除所有有關ORACLE的組和圖標
j) 刪除與ORACLE有關的文件,選擇ORACLE所在的缺省目錄c:orant,刪除這個入口目錄及所有子目錄,
k) 並從WINDOWS NT目錄(一般爲c:winnt)下刪除以下文件
ORACLE.INI ORADIM80.INI
l) WIN.INI文件中若有[ORACLE]的標記段,刪除該段


4 常見開發操作
4.1 常見表字段名操作
4.1.1 查看錶字段
SQL>desc 表名
如:
SQL> show user
USER is "dbuser"
SQL> desc dbuser2.xtbm
Name Null? Type
----------------------------------------- -------- ----------------------------
XTBM NOT NULL VARCHAR2(20)
XTXX VARCHAR2(50)
THETYPE VARCHAR2(10)
DESCRIPTION VARCHAR2(200)
REMARK VARCHAR2(100)
SQL>
4.1.2 增加表字段
例:
SQL>alter table ne_pcf add (adminstate integer,alarmstatus integer);
(此操作不會修改原有字段的數據,新添加字段數據爲空)

4.1.3 刪除表字段
例:
SQL> alter table table_name drop (system_title, net_title,obj_id,ne_dn);
(此操作不會影響其他字段的數據,直接刪除所列字段名及所有數據)

4.1.4 修改表字段類型
例:
SQL> alter table ne_aaa modify (sw_version varchar2(255));

注意:
 修改字段類型爲不同的數據類型,如從char變到int,則需要該字段的所有數據爲空。
 同類類型修改,如從char(10)變爲char(20),char(30) 到varchar2(30)等變化,不會影響已有數據。


4.1.5 修改表字段名
可行的辦法:
create table 表名(字段名,字段名,字段名…..) select 字段名,字段名,字段名…. From 表名
使用上述語句創建需要的新表,檢查符合要求,數據無丟失後,drop掉原來的表,再把新表改名爲原來的表名即可。
相關操作語句本章查找。

4.2 表操作
4.2.1 查詢表信息
 查詢當前用戶所擁有的表名、表所使用的表空間、表創建時間、表大小
SQL>select s.segment_name,s.tablespace_name,o.created,s.bytes/1024/1024 as table_size_M
from user_segments s,user_objects o
where o.object_type = 'TABLE'
and s.segment_type = 'TABLE'
and o.object_name = s.segment_name;
(查詢當前用戶的表的信息)

4.2.2 創建表
例:
SQL> create table t2 (en varchar(100),intr int) tablespace dbmonitor;
(創建表的時候請指定表空間)

4.2.3 刪除表數據(重要)
刪除表數據的方法:
 刪除表所有數據的最快速方法
SQL> truncate table 表名;
(此方法系統不記錄日誌,一但刪除,將不可恢復)

 刪除滿足指定條件的大表的數據
對於大數據量的表,比如告警表,採集原始表,最好編寫一procedure進行刪除,小批量刪除提交後再進行小批量刪除提交,直到滿足要求。

Procedure範例如下(在SQL>提示符號下,先運行SQL>set serveroutput on,以便存儲過程輸出處理結果):
v_table_name:被刪除的表名
v_once_delete_row_num:一次刪除的行數
v_condition:刪除表的where 條件

create or replace procedure delete_table
(v_table_name varchar2,
v_once_delete_row_num varchar2,
v_condition varchar2)
as
pragma autonomous_transaction;

v_delete number:=0;
begin
while 1=1 loop
EXECUTE IMMEDIATE
'delete from '||v_table_name||' where '||v_condition|| ‘ and rownum <= :cnt’
USING v_once_delete_row_num;
if SQL%NOTFOUND then
exit;
else
v_delete:=v_delete + SQL%ROWCOUNT;
end if;
commit;
end loop;
commit;
DBMS_OUTPUT.PUT_LINE('刪除操作結束!');
DBMS_OUTPUT.PUT_LINE('一共刪除了 '||to_char(v_delete)||' 條記錄');
end;
/

例如:
SQL> set timing on
SQL> exec delete_table('alarminfo_bk','1000','alarmnumber = 0000191105786406');
刪除操作結束!
一共刪除了1條記錄
PL/SQL 過程已成功完成。
已用時間: 00: 03: 26.41
SQL>
刪除時間雖然還是比較長,但可以保證部分大批量無控制刪除時的出錯和消耗UNDO等的性能消費。

4.2.4 刪除表
SQL>drop table 表名;

4.2.5 重命名錶
SQL>rename 表1 to 表2;

4.2.6 備份表
 備份成其他名稱的表
SQL>create table 表名1 as select * from 表名2;

 備份成數據文件
%exp 表所屬用戶名/密碼@服務名 file=定義文件名稱.dat log=定義日誌文件名稱 tables=表名

 備份表結構
沒辦法,要麼:
1) 使用如TOAD等工具進行導出備份。
2) 使用exp 的方法導出數據,再使用imp的方式導入數據庫,只是此時一定要在imp語句末尾加上 show =y,並且寫入日誌文件。這樣纔可以在日誌文件中觀察表結構(導出的表結構不能直接使用,需要整理)。
如:
%exp
dbuser2/dbuser2@userdb file=a.dat tables=ne_msc

% imp dbuser2/dbuser2@userdb file=a.dat log=a.log full=y show=y

4.3 索引操作
4.3.1 查詢索引信息
 查詢某表所有索引及每個索引使用的字段
SQL>select index_name,column_name from user_ind_columns
where table_name = '表名大寫' order by index_name;

 查詢某索引所使用的表空間、索引大小
通過從上面查詢到的索引名稱,可繼續查詢索引詳細信息
SQL>select segment_name,tablespace_name,bytes/1024/1024 as index_size_M from user_segments
where segment_type = 'INDEX'
and segment_name = '索引名稱大寫';

(查詢當前用戶的表的索引信息)


4.3.2 創建索引
(注意:
1) 雖然主鍵僅是一種唯一、非空的約束而已,但創建(刪除)方法與創建一般約束有所不同。
2) 只要索引名稱不重複,索引字段完全一樣,就允許創建無窮多個索引)

 創建主鍵
例:
SQL>alter table tabname_router add primary key(ne_id,port_id,start_time,stop_time);
 創建唯一索引
例:
SQL>create unique index inx_o_tabname_vlr_temp on o_tabname_vlr_temp(ne_id, start_time, stop_time) tablespace rperfdbs;
 創建非唯一索引
例:create unique index idx_bb on t2(a is not null,b);

(可在創建的語句中指定索引使用某個表空間)

4.3.3 刪除索引
 刪除主鍵
例:
SQL>alter table tabname_router drop primary key;
 創建(非)唯一索引
例:
SQL> drop index idx_bb;

4.3.4 重建索引
 一般重建方法
SQL> alter index 索引名稱 rebuild;
(如果這樣重建失敗,則採用下面的方法)

 其他重建方法
1)記錄該索引的屬性(如是否主鍵,是否非空,是否唯一等)。
2) drop 該索引。
3) create 該索引。
(具體語句的語法請參考本章)

4.4 SQL語句及存儲過程優化
4.4.1 SQL語句是否使用索引
使用執行該SQL語句的用戶,執行sqlplus的方式登陸數據庫
SQL>
執行如下語句:
SQL> set autotrace traceonly explain
SP2-0613: Unable to verify PLAN_TABLE format or existence
SP2-0611: Error enabling EXPLAIN report
如果遇到如上錯誤,則執行如下語句(如沒遇到錯誤,則不需要執行如下語句):
SQL> @${ORACLE_HOME}/rdbms/admin/utlxplan

此時輸入欲查詢是否使用索引的SQL語句,如:
SQL> set autotrace traceonly explain;
SQL> select count(*) from SERVICE_MONTHLY_REPORT2;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (AGGREGATE)
2 1 TABLE ACCESS (FULL) OF 'SERVICE_MONTHLY_REPORT2'

SQL>
如通過FULL 標識,我們知道查詢該表時沒有使用索引。

又如:
SQL> select ne_id from o_tabname_stp;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=18)
1 0 INDEX (FULL SCAN) OF 'INX_O_tabname_STP' (UNIQUE)
通過FULL SCAN知道是索引掃描,而且使用的是INX_O_tabname_STP索引。


4.4.2 SQL語句是否使用了最恰當的索引
通過“4.4.1”,判斷是否關鍵被判斷的字段,和查詢的字段都在索引裏,如果是,則一般是使用了恰當的索引。

4.4.3 怎麼提示SQL語句使用固定的索引
/*+ INDEX(tabname_CELLCIRCUIT) */

4.4.4 怎麼提示SQL語句固定使用全表掃描
/*+ FULL(o_tabname_stp) */

例:
通過如下兩個執行計劃可知道提示生效
SQL> select ne_id from o_tabname_stp;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=18)
1 0 INDEX (FULL SCAN) OF 'INX_O_tabname_STP' (UNIQUE)
SQL>
SQL> select /*+ FULL(o_tabname_stp) */ ne_id from o_tabname_stp;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=18)
1 0 TABLE ACCESS (FULL) OF 'O_tabname_STP' (Cost=2 Card=1 Bytes
=18)

4.4.5 存儲過程是否可以執行更少的、有效的SQL語句
1) 確保所有應該使用索引的SQL語句都使用了索引。
2) 通過設計判斷,減少SQL語句的執行次數。
3) 努力減少執行次數多的SQL語句。

4.5 操作阻塞,鎖情況
由於鎖情況比較複雜,此處只講已知某個在操作的用戶出現鎖的情況。
通過如下語句,查詢出當前在被鎖的表,表所屬用戶,操作系統用戶名,通過這些信息,判斷找出製造死鎖的會話sid。
SQL>select o.owner,o.object_name,l.session_id,l.os_user_name
from v$locked_object l,dba_objects o
where o.object_id = l.object_id;
通過sid,使用如下語句,查找出數據庫服務器上操作系統的後臺連接進程或直接使用SQL語句殺死該會話。
1) 查找數據庫服務器後臺進程:
SQL> select spid from v$process where addr =
(select paddr from v$session where sid= &sid);
如上語句,輸入 session的sid ,即可查找相應的數據庫服務器後臺進程,直接使用%kill -9命令殺掉該進程即可。

2) 使用SQL語句殺掉該會話:
SQL> alter system kill session 'sid,serial#';
Sid,serial#可以從v$session視圖查出。

5 FAQ
5.1 操作表數據提示數據文件錯誤
通過檢查,判斷數據文件狀態:
 數據文件狀態不是ONLINE或SYSTEM
請提交工程部或數據庫組處理。
檢查文件狀態方法可通過dbMonitor查看,也可通過 “3.9.1”小節方法查看。

 數據文件狀態是ONLINE
1) 驗證該操作表數據的語句錯誤再次出現。
2) 使用set autotrace traceonly explain的方法檢查該語句是否使用索引。
3) 若使用了索引:則使用 /*+ FULL(表名) */ 的提示方法,選擇表表操作判斷是否問題依然出現。若問題不出現,則drop 該操作使用的索引,重新創建該索引;若問題出現,則exp表數據,drop條,重新創建表。
(若是同時操作多個表,則一個表一個表的使用/*+ table=表名 index=索引名 */ 的提示方法指定表單獨使用索引,逐個排查)

使用set autotrace traceonly explain的方法和使用表提示的方法,請參考“4.4.1”。

5.2 從數據庫服務器進程運行中,優化最消耗CPU的SQL語句
%prstat
獲取PROCESS行爲oracle字樣,CPU超過1%的行的PID,此時使用
%sqlplus “/as sysdba” ----登陸數據庫服務器
SQL> ---------執行如下SQL語句
SELECT /*+ ORDERED */ sql_text FROM v$sqltext a WHERE (a.hash_value, a.address)
IN (SELECT DECODE (sql_hash_value,0, prev_hash_value,sql_hash_value),
DECODE (sql_hash_value, 0, prev_sql_addr, sql_address)
FROM v$session b
WHERE b.paddr =
(SELECT addr FROM v$process c WHERE c.spid = '&pid')) ORDER BY piece ASC;
系統會提示你輸入PID的值: ---輸入剛纔準備的PID值
SQL> -----此時就會查出正在消耗CPU的語句。

使用SQL語句優化的方法優化此SQL語句。

5.3 導數據到新數據庫指定用戶的缺省表空間
我們常常從某臺服務器的一個數據庫exp導數據到另外一臺服務器的一個數據庫,發現imp後,很有可能沒有使用新數據庫的導入用戶的缺省表空間。
使用語句:
SQL> select table_name,tablespace_name from user_tables;
可以查出表使用的表空間。

那是因爲我們創建用戶的時候,沒有回收被創建用戶對錶空間的unlimited tablespace 權限,我們使用語句
SQL>revoke unlimited tablespace from 用戶名;
收回用戶的unlimited tablespace 權限,此時再在默認缺省表空間上分配該權限:
SQL>alter user 用戶名 quota unlimited on 缺省表空間名;
再導入測試,如果還不行,發現總是導入到某個表空間ABC上,則使用如下語句:
SQL>alter user 用戶名 quota 0 on ABC;
回收用戶在該表空間的配額分配權限,重新導入,則一定可以矯正過來。

5.4 正確安裝數據庫軟件,但無法創建庫
現象:
在UNIX正確安裝oracle 9i後,提示安裝成功,但不能使用,提示OS錯誤
分析:
由於操作系統自己和硬件的原因,導致oracle的使用受到限制。
處理:
可通過如下兩種方法解決:
1. 把啓動參數processes參數修改的更底(降低一倍)。
2. 增加/etc/system文件中SEMMSL & SEMMNI的參數值(增加一倍)。Reboot系統再啓動數據庫。
5.5 打開數據庫報告關閉錯誤,關閉數據庫報告打開錯誤
現象:
數據庫不可用,ORACLE關閉時報告數據庫已經打開打開,打開數據庫時報告數據庫已經關閉。
分析:
一般這種情況是因爲非正常關閉數據庫造成,即一般使用abort 參數。還有就是實際用戶定義的$ORACLE_SID與實際創建時候的SID不一樣,這樣系統找不到當前SID爲啓動SID,報告錯誤。
處理:
A) 檢查.cshrc 中配置的$ORACLE_SID與用戶在用戶已經創建了的數據庫SID範圍內。
B) 把需要啓動的數據庫SID設置成當前系統默認SID,使用 setenv ORACLE_SID SID,這樣只在當前窗口有效。關閉該窗口即無效。
C) 使用ipcs查看當前內存等中是否有殘留內存等信息,如果有,使用ipcrm –m清除共享內存,使用ipcrm –s清除下一個。保證清除乾淨。
D) 檢查後臺進程,如果有在運行,直接使用kill -9 殺掉即可。查看:ps –ef |grep ora_
E) 此時再去打開數據庫即可。
5.6 用戶不能在數據庫中創建對象
現象:
用戶以前能正確在數據庫中創建對象,突然不能創建用戶對象。
分析:
此問題是因爲在創建用戶的時候沒有分配配額,用戶使用到一定時候後,就不能再創建對象了。
處理:
設置用戶配額爲無限制。
SQL>alter user user_name quota unlimited on user_default_tablespace;
5.7 導入導出錯誤
現象:
導入導出錯誤爲:imp16,type 852 to 850等字符集錯誤。
分析:
用戶當前配置字符集與安裝時候的配置字符集不一致。
處理:
查看用戶環境變量的NLS_LANG設置是否與與導出的時候一致,要求一致。其次,要求props$中對語言的設置與原來一致。可參考安裝成功後對該.cshrc文件的備份。

5.8 不同版本的數據庫數據導入導出
現象:
直接從一個版本中導出的數據,無法導入到不是同一個版本中的數據庫。
分析:
由oracle自己的軟件機制所決定。
處理:
使用與需要導入的目標數據庫同樣版本的客戶端進行連接,然後在該客戶端進行導出操作即可。

5.9 數據庫掛起問題
現象:
已經進行連接的用戶能夠繼續對數據庫操作,未連接或曾經連接但是已經斷掉的用戶,如果再想連接,就會長時間等待。
關閉數據庫,重新啓動。暫時解決。但是過了三天左右,又開始出現這個問題。
分析:
1) 有可能是數據庫處於歸檔模式,而又沒有啓動歸檔進程或者磁盤沒有空間。
2) 進程產生死鎖。
3) 其他原因
處理:
1) 歸檔進程問題:啓動歸檔進程;磁盤空間問題:清理磁盤空間。
2) 死鎖問題,重啓數據庫即可。
目前一個處理方法:


5.10 多個數據庫操作方法:不同實例間轉換.
現象:
在用戶創建了多個數據庫的時候,需要分別對不同的數據庫進行管理。
分析:
在用戶登錄的時候,啓動用戶環境變量.cshrc,而在.cshrc中已經設置了當前數據庫SID,所以要啓動其他SID數據庫,需要把他變爲當前數據庫SID。
處理:
只要把需要操作的數據庫SID變爲當前SID進行操作即可。有如下兩種方法修改SID爲SID。
比如有兩個數據庫SID分別爲sdh和 sp,在.cshrc文件中定義的當前數據庫爲sdh,今需要對sp進行啓動關閉等操作。
1) 修改.cshrc 文件中的setenv ORACLE_SID sdh項,修改爲希望操作的數據庫SID,即爲setenv ORACLE_SID sp。然後使用source 命令使其生效即可把它變爲當前SID。
2) 使用命令修改。執行%setenv ORACLE_SID sp即可。
此時再使用%sqlplus /nolog
SQL>conn /as sysdba連接的即爲修改了的SID數據庫了。
5.11 查詢錯誤號信息
現象:
在數據庫使用過程中,數據庫會報告一些有如ora-XXXX,imp-XXXX等等錯誤號碼。
分析:
該號碼是發生錯誤,或者oracle系統提示時報告用戶的一個標識。
處理:
使用如下方法獲取該錯誤號碼對應的報告信息:
比如報告ora-0042
%oerr ora 0042
5.12 查看oracle系統的版本
SQL> select banner from sys.v_$version;
5.13 查看oracle系統安裝了哪些選項
SQL> col PARAMETER format a60
SQL> col VALUE format a10
SQL> select * from sys.v_$option;
5.14 查看oracle軟件是幾位數據庫
%cd $ORACLE_HOME/bin
%file oracle

5.15 數據庫起不來,報告ORA-01157和ORA-01110錯誤
現象:
數據庫不能啓動正常運行,報告ORA-01157和ORA-01110錯誤。
分析:
數據庫datafile文件發生損壞或者用戶誤操作刪除數據庫datafile文件。
處理:
1) 如果用戶有備份,利用上次的熱備份進行恢復。
2) 如果沒有備份,且再需要改數據文件,則:
執行一次冷備份,並
%sqlplus /nolog
SQL>connect /as sysdba
SQL>startup mount
SQL>alter database datafile ‘$ORACLE_BASE/oradata/$ORACLE_SID/datafile_name’ offline drop;
//執行該命令後,以後該數據文件不可恢復。
SQL>alter database open
執行一次全庫備份。

問題:如果誤刪了redo log文件,數據庫起不來怎麼辦?
解決:
如果刪掉的日誌文件爲Inactive
sqldba>startup mount
sqldba>alter database drop logfile filename
sqldba>alter database add logfile filename
recover database until cancel
CONTINUE
CONTINUE
<cancel recovery>
alter database open reset logs
如果刪掉的日誌文件爲current 或active, 聯繫oracle 的技術支持部門,然後採取相應的措施


問題:如何修改數據庫的名字?
解決:
sqldba>alter database backup controfile to trace;
在?/rdbms/log目錄下,找到最新生成的trace文件ora_nnnn.trc, nnnn表示一個數字
Edit該trace文件,找到create controlfile命令 ,存於 一個文件ccf.sql
修改舊命令爲: create controlfile set database newdbname resetlogs
CONTINUE
CONTINUE
備份所有舊的control file
編輯initsid.ora, 修改db_name=newdbname
sqldba>startup nomount
sqldba>@ccf
sqldba>alter database open

5.16 Oracle目錄文件維護
Oracle以下目錄的下的相應文件可以直接刪除而不會影響數據庫運行
(注意,bdump,cdump,udump,audit目錄是不可以刪除的,否則數據庫出錯!!!):
 ${ORACLE_BASE}/admin/${ORACLE_SID}/bdump目錄
 *.trc文件
 *.log文件
 ${ORACLE_BASE}/admin/${ORACLE_SID}/cdump目錄
 core_*目錄
 ${ORACLE_BASE}/admin/${ORACLE_SID}/udump目錄
 *.trc文件
 ${ORACLE_HOME}/rdbms/audit目錄
 *.aud文件

以上文件需要按時維護(直接刪除,或備份後再刪除),他們會隨着時間的增長,文件會不斷的變大,或文件數量會不斷的增多,這些文件記錄了數據庫的一些運行信息,在數據庫故障或需要做一些數據庫性能等分析的時候需要使用這些文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章