學習ORACLE-常用FAQ(2)ORACLE構架體系

第二部分、ORACLE構架體系

原文 第二部分
[Q]ORACLE的有那些數據類型
[A]常見的數據類型有
CHAR固定長度字符域,最大長度可達2000個字節
NCHAR多字節字符集的固定長度字符域,長度隨字符集而定,最多爲2000個字符或2000個字節
VARCHAR2可變長度字符域,最大長度可達4000個字符
NVARCHAR2多字節字符集的可變長度字符域,長度隨字符集而定,最多爲4000個字符或4000個字節
DATE用於存儲全部日期的固定長度(7個字節)字符域,時間作爲日期的一部分存儲其中。除非
通過設置init.ora文件的NLS_DATE_FORMAT參數來取代日期格式,否則查詢時,日期以
DD-MON-YY格式表示,如13-APR-99表示1999.4.13
NUMBER可變長度數值列,允許值爲0、正數和負數。NUMBER值通常以4個字節或更少的字節存儲,最多21字節
LONG可變長度字符域,最大長度可到2GB
RAW表示二進制數據的可變長度字符域,最長爲2000個字節
LONGRAW表示二進制數據的可變長度字符域,最長爲2GB
MLSLABEL只用於TrustedOracle,這個數據類型每行使用2至5個字節
BLOB二進制大對象,最大長度爲4GB
CLOB字符大對象,最大長度爲4GB
NCLOB多字節字符集的CLOB數據類型,最大長度爲4GB
BFILE外部二進制文件,大小由操作系統決定
ROWID表示RowID的二進制數據,Oracle8RowID的數值爲10個字節,在Oracle7中使用的限定
RowID格式爲6個字節
UROWID用於數據尋址的二進制數據,最大長度爲4000個字節
[Q]Oracle有哪些常見關鍵字,不能被用於對象名
[A]以8i版本爲例,一般保留關鍵字不能用做對象名

ACCESS ADD ALL ALTER AND ANY AS ASC AUDIT BETWEEN BY CHAR CHECK CLUSTER COLUMN COMMENT COMPRESS CONNECT CREATE CURRENT DATE DECIMAL DEFAULT DELETE DESC DISTINCT DROP ELSE EXCLUSIVE EXISTS FILE FLOAT FOR FROM GRANT GROUP HAVING IDENTIFIED IMMEDIATE IN INCREMENT INDEX INITIAL INSERT INTEGER INTERSECT INTO IS LEVEL LIKE LOCK LONG MAX EXTENTS MINUS MLSLABEL MODE MODIFY NOAUDIT NOCOMPRESS NOT NOWAIT NULL NUMBER OF OFFLINE ON ONLINE OPTION OR ORDER PCTFREE PRIOR PRIVILEGES PUBLIC RAW RENAME RESOURCE REVOKE ROW ROWID ROWNUM ROWS SELECT SESSION SET SHARE SIZE SMALLINT START SUCCESSFUL SYNONYM SYSDATE TABLE THEN TO TRIGGER UID UNION UNIQUE UPDATE USER VALIDATE VALUES VARCHAR VARCHAR2 VIEW WHENEVER WHERE WITH
詳細信息可以查看v$reserved_words視圖
[Q]怎麼查看數據庫版本
[A] select * from v$version
包含版本信息,核心版本信息,位數信息(32位或64位)等
至於位數信息,在linux/unix平臺上,可以通過file查看,如
file $ORACLE_HOME/bin/oracle
[Q]怎麼查看數據庫參數
[A]show parameter 參數名
如通過show parameter spfile可以查看9i是否使用spfile文件
或者select * from v$parameter
除了這部分參數,Oracle還有大量隱含參數,可以通過如下語句查看:

SELECT NAME  
,VALUE  
,decode(isdefault, 'TRUE','Y','N') as "Default"  
,decode(ISEM,'TRUE','Y','N') as SesMod  
,decode(ISYM,'IMMEDIATE', 'I',  
'DEFERRED', 'D',  
'FALSE', 'N') as SysMod  
,decode(IMOD,'MODIFIED','U',  
'SYS_MODIFIED','S','N') as Modified  
,decode(IADJ,'TRUE','Y','N') as Adjusted  
,description  
FROM ( --GV$SYSTEM_PARAMETER  
SELECT x.inst_id as instance  
,x.indx+1  
,ksppinm as NAME   
,ksppity  
,ksppstvl as VALUE   
,ksppstdf as isdefault  
,decode(bitand(ksppiflg/256,1),1,'TRUE','FALSE') as ISEM  
,decode(bitand(ksppiflg/65536,3),  
1,'IMMEDIATE',2,'DEFERRED','FALSE') as ISYM  
,decode(bitand(ksppstvf,7),1,'MODIFIED','FALSE') as IMOD  
,decode(bitand(ksppstvf,2),2,'TRUE','FALSE') as IADJ  
,ksppdesc as DESCRIPTION   
FROM x$ksppi x  
,x$ksppsv y  
WHERE x.indx = y.indx  
AND substr(ksppinm,1,1) = '_'  
AND x.inst_id = USERENV('Instance')  
)  
ORDER BY NAME

[Q]怎麼樣查看數據庫字符集
[A]數據庫服務器字符集select * from nls_database_parameters,其來源於props$,是表示數據庫的字符集。
客戶端字符集環境select * from nls_instance_parameters,其來源於v$parameter,表示客戶端的字符集的設置,可能是參數文件,環境變量或者是註冊表
會話字符集環境 select * from nls_session_parameters,其來源於v$nls_parameters,表示會話自己的設置,可能是會話的環境變量或者是alter session完成,如果會話沒有特殊的設置,將與nls_instance_parameters一致。
客戶端的字符集要求與服務器一致,才能正確顯示數據庫的非Ascii字符。如果多個設置存在的時候,alter session>環境變量>註冊表>參數文件
字符集要求一致,但是語言設置卻可以不同,語言設置建議用英文。如字符集是zhs16gbk,則nls_lang可以是American_America.zhs16gbk。
[Q]怎麼樣修改字符集
[A]8i以上版本可以通過alter database來修改字符集,但也只限於子集到超集,不建議修改props$表,將可能導致嚴重錯誤。

Startup nomount;
Alter database mount exclusive;
Alter system enable restricted session;
Alter system set job_queue_process=0;
Alter database open;
Alter database character set zhs16gbk;

[Q]怎樣建立基於函數索引
[A]8i以上版本,確保

Query_rewrite_enabled=true
Query_rewrite_integrity=trusted
Compatible=8.1.0以上
Create index indexname on table (function(field));

[Q]怎麼樣移動表或表分區
[A]移動表的語法

Alter table tablename move
[Tablespace new_name
Storage(initial 50M next 50M 
pctincrease 0 pctfree 10 pctused 50 initrans 2) nologging]

移動分區的語法

alter table tablename move (partition partname)
  [update global indexes]

之後之後必須重建索引

Alter index indexname rebuild

如果表有Lob段,那麼正常的Alter不能移動Lob段到別的表空間,而僅僅是移動了表段,可以採用如下的方法移動Lob段

alter table tablename move 
lob(lobsegname) store as (tablespace newts);

[Q]怎麼獲得當前的SCN
[A]9i以下版本

select max(ktuxescnw*power(2,32)+ktuxescnb) from x$ktuxe;

如果是9i以上版本,還可以通過以下語句獲取

select dbms_flashback.get_system_change_number from dual;

[Q]ROWID的結構與組成

[A]8以上版本的ROWID組成
OOOOOOFFFBBBBBBRRR
8以下ROWID組成(也叫受限Rowid)
BBBBBBBB.RRRR.FFFF
其中,O是對象ID,F是文件ID,B是塊ID,R是行ID
如果我們查詢一個表的ROWID,根據其中塊的信息,可以知道該表確切佔用了多少個塊,進而知道佔用了多少數據空間(此數據空間不等於表的分配空間)
[Q]怎麼樣獲取對象的DDL語句
[A]第三方工具就不說了主要說一下9i以上版本的dbms_metadata
1、獲得單個對象的DDL語句

set heading off
set echo off
set feedback off
set pages off
set long 90000
select dbms_metadata.get_ddl('TABLE','TABLENAME','SCAME') from dual;

如果獲取整個用戶的腳本,可以用如下語句

select dbms_metadata.get_ddl('TABLE',u.table_name) from user_tables u;

當然,如果是索引,則需要修改相關table爲index
[Q]如何創建約束的索引在別的表空間上
[A]1、先創建索引,再創建約束
2、利用如下語句創建

create table test
(c1 number constraint pk_c1_id primary key
using index tablespace useridex,
c2 varchar2(10)
) tablespace userdate;

[Q]怎麼知道那些表沒有建立主鍵
[A]一般的情況下,表的主鍵是必要的,沒有主鍵的表可以說是不符合設計規範的。

SELECT table_name
FROM User_tables t 
WHERE NOT EXISTS 
(SELECT table_name
FROM User_constraints c
WHERE constraint_type = 'P'
AND t.table_name=c.table_name)
其它相關數據字典解釋
user_tables        表
user_tab_columns   表的列
user_constraints    約束
user_cons_columns  約束與列的關係
user_indexes       索引
user_ind_columns   索引與列的關係

[Q]dbms_output提示緩衝區不夠,怎麼增加
[A]dbms_output.enable(20000);
另外,如果dbms_output的信息不能顯示,
需要設置
set serveroutput on
[Q]怎麼樣修改表的列名
[A]9i以上版本可以採用rname命令

ALTER TABLE UserName.TabName 
RENAME COLUMN SourceColumn TO DestColumn

9i以下版本可以採用create table …… as select * from SourceTable的方式。
另外,8i以上可以支持刪除列了

ALTER TABLE UserName.TabName 
    SET UNUSED (ColumnName) CASCADE CONSTRAINTS
ALTER TABLE UserName.TabName 
    DROP (ColumnName) CASCADE CONSTRAINTS

[Q]怎麼樣給sqlplus安裝幫助
[A]SQLPLUS的幫助必須手工安裝,shell腳本爲$ORACLE_HOME/bin/helpins
在安裝之前,必須先設置SYSTEM_PASS環境變量,如:
$ setenv SYSTEM_PASS SYSTEM/MANAGER
$ helpins
如果不設置該環境變量,將在運行腳本的時候提示輸入環境變量
當然,除了shell腳本,還可以利用sql腳本安裝,那就不用設置環境變量了,但是,我們必須以system登錄。
$ sqlplus system/manager
SQL> @?/sqlplus/admin/help/helpbld.sql helpus.sql
安裝之後,你就可以象如下的方法使用幫助了
SQL> help index
[Q]怎麼樣快速下載Oracle補丁
[A]我們先獲得下載服務器地址,在http頁面上有
ftp://updates.oracle.com
然後用ftp登錄,用戶名與密碼是metalink的用戶名與密碼
如我們知道了補丁號3095277 (9204的補丁集),則
ftp> cd 3095277
250 Changed directory OK.
ftp> ls
200 PORT command OK.
150 Opening data connection for file listing.
p3095277_9204_AIX64-5L.zip
p3095277_9204_AIX64.zip
……
p3095277_9204_WINNT.zip
226 Listing complete. Data connection has been closed.
ftp: 208 bytes received in 0.02Seconds 13.00Kbytes/sec.
ftp>
知道了這個信息,我們用用flashget,網絡螞蟻就可以下載了。
添加如下連接
ftp://updates.oracle.com/3095277/p3095244_9204_AIX64-5L.zip
或替換後面的部分爲所需要的內容
注意,如果是flashget,網絡螞蟻請輸入認證用戶名及密碼,就是你的metalink的用戶名與密碼!
[Q]如何移動數據文件
[A]1、關閉數據庫,利用os拷貝
a.shutdown immediate關閉數據庫
b.在os下拷貝數據文件到新的地點
c.Startup mount 啓動到mount下
d.Alter database rename datafile ‘老文件’ to ‘新文件’;
e.Alter database open; 打開數據庫
2、利用Rman聯機操作

RMAN> sql "alter database datafile ''file name'' offline";
RMAN> run {
2> copy datafile 'old file location'
3> to 'new file location';
4> switch datafile ' old file location'
5> to datafilecopy ' new file location';
6> }
RMAN> sql "alter database datafile ''file name'' online";

說明:利用OS拷貝也可以聯機操作,不關閉數據庫,與rman的步驟一樣,利用rman與利用os拷貝的原理一樣,在rman中copy是拷貝數據文件,相當於OS的cp,而switch則相當於alter database rename,用來更新控制文件。
[Q]如果管理聯機日誌組與成員
[A]以下是常見操作,如果在OPA/RAC下注意線程號

增加一個日誌文件組
Alter database add logfile [group n] '文件全名' size 10M;
在這個組上增加一個成員
Alter database add logfile member '文件全名' to group n;
在這個組上刪除一個日誌成員
Alter database drop logfile member '文件全名';
刪除整個日誌組
Alter database drop logfile group n;

[Q]怎麼樣計算REDO BLOCK的大小
[A]計算方法爲(redo size + redo wastage) / redo blocks written + 16
具體見如下例子

SQL> select name ,value from v$sysstat where name like '%redo%'; 
NAME VALUE 
---------------------------------------------------------------- ---------- 
redo synch writes 2 
redo synch time 0 
redo entries 76 
redo size 19412 
redo buffer allocation retries 0 
redo wastage 5884 
redo writer latching time 0 
redo writes 22 
redo blocks written 51 
redo write time 0 
redo log space requests 0 
redo log space wait time 0 
redo log switch interrupts 0 
redo ordering marks 0 
SQL> select (19412+5884)/51 + 16 '"Redo black(byte)" from dual; 
Redo black(byte)
------------------ 
512

[Q]控制文件包含哪些基本內容
[A]控制文件主要包含如下條目,可以通過dump控制文件內容看到
DATABASE ENTRY
CHECKPOINT PROGRESS RECORDS
REDO THREAD RECORDS
LOG FILE RECORDS
DATA FILE RECORDS
TEMP FILE RECORDS
TABLESPACE RECORDS
LOG FILE HISTORY RECORDS
OFFLINE RANGE RECORDS
ARCHIVED LOG RECORDS
BACKUP SET RECORDS
BACKUP PIECE RECORDS
BACKUP DATAFILE RECORDS
BACKUP LOG RECORDS
DATAFILE COPY RECORDS
BACKUP DATAFILE CORRUPTION RECORDS
DATAFILE COPY CORRUPTION RECORDS
DELETION RECORDS
PROXY COPY RECORDS
INCARNATION RECORDS
[Q]如果發現表中有壞塊,如何檢索其它未壞的數據
[A]首先需要找到壞塊的ID(可以運行dbverify實現),假設爲,假定文件編碼爲。運行下面的查詢查找段名:

SELECT segment_name,segment_type,extent_id,block_id, blocks 
from dba_extents t
where  file_id = <FID>
AND <BID> between block_id and (block_id + blocks - 1) 

一旦找到壞段名稱,若段是一個表,則最好建立一個臨時表,存放好的數據。若段是索引,則刪除它,再重建。

create table good_table 
as 
select from bad_table where rowid not in 
(select rowid 
from bad_table where substr(rowid,10,6) = <BID>

在這裏要注意8以前的受限ROWID與現在ROWID的差別。
還可以使用診斷事件10231
SQL> ALTER SYSTEM SET EVENTS ‘10231 trace name context forever,level 10’;
創建一個臨時表good_table的表中除壞塊的數據都檢索出來
SQL>CREATE TABLE good_table as select * from bad_table;
最後關閉診斷事件
SQL> ALTER SYSTEM SET EVENTS '10231 trace name context off ';
關於ROWID的結構,還可以參考dbms_rowid.rowid_create函數。
[Q]我創建了數據庫的所有用戶,我可以刪除這些用戶嗎
[A]ORACLE數據庫創建的時候,創建了一系列默認的用戶和表空間,以下是他們的列表
·

SYS/CHANGE_ON_INSTALL or INTERNAL
系統用戶,數據字典所有者,超級權限所有者(SYSDBA)
創建腳本:?/rdbms/admin/sql.bsq and various cat*.sql
建議創建後立即修改密碼
此用戶不能被刪除
·SYSTEM/MANAGER
數據庫默認管理用戶,擁有DBA角色權限
創建腳本:?/rdbms/admin/sql.bsq
建議創建後立即修改密碼
此用戶不能被刪除
·OUTLN/OUTLN
優化計劃的存儲大綱用戶
創建腳本:?/rdbms/admin/sql.bsq
建議創建後立即修改密碼
此用戶不能被刪除

·SCOTT/TIGER, ADAMS/WOOD, JONES/STEEL, CLARK/CLOTH and BLAKE/PAPER.
實驗、測試用戶,含有例表EMP與DEPT
創建腳本:?/rdbms/admin/utlsampl.sql
可以修改密碼
用戶可以被刪除,在產品環境建議刪除或鎖定
·HR/HR (Human Resources), OE/OE (Order Entry), SH/SH (Sales History).
實驗、測試用戶,含有例表EMPLOYEES與DEPARTMENTS
創建腳本:?/demo/schema/mksample.sql
可以修改密碼
用戶可以被刪除,在產品環境建議刪除或鎖定
·DBSNMP/DBSNMP
Oracle Intelligent agent
創建腳本:?/rdbms/admin/catsnmp.sql, called from catalog.sql
可以改變密碼--需要放置新密碼到snmp_rw.ora文件
如果不需要Intelligent Agents,可以刪除

以下用戶都是可選安裝用戶,如果不需要,就不需要安裝
·CTXSYS/CTXSYS
Oracle interMedia (ConText Cartridge)管理用戶
創建腳本:?/ctx/admin/dr0csys.sql
·TRACESVR/TRACE
Oracle Trace server
創建腳本:?/rdbms/admin/otrcsvr.sql
·ORDPLUGINS/ORDPLUGINS
Object Relational Data (ORD) User used by Time Series, etc.
創建腳本:?/ord/admin/ordinst.sql
·ORDSYS/ORDSYS
Object Relational Data (ORD) User used by Time Series, etc
創建腳本:?/ord/admin/ordinst.sql
·DSSYS/DSSYS
Oracle Dynamic Services and Syndication Server
創建腳本:?/ds/sql/dssys_init.sql
·MDSYS/MDSYS
Oracle Spatial administrator user
創建腳本:?/ord/admin/ordinst.sql
·AURORA$ORB$UNAUTHENTICATED/INVALID
Used for users who do not authenticate in Aurora/ORB
創建腳本:?/javavm/install/init_orb.sql called from ?/javavm/install/initjvm.sql
·PERFSTAT/PERFSTAT
Oracle Statistics Package (STATSPACK) that supersedes UTLBSTAT/UTLESTAT
創建腳本:?/rdbms/admin/statscre.sql
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章