Oracle筆記(六)

[第一章] Oracle 數據庫體系結構
物理結構
邏輯結構
內存結構
進程結構

[數據庫管理員DBA(Database Administrator)]
DBA職責:
。Oracle核心軟件安裝與產品升級
。爲數據庫系統分配存儲空間及規劃未來存儲需求
。創建數據庫存儲結構
。用戶權限與角色管理
。監視與控制用戶對數據庫的存儲
。維護數據庫安全
。完成數據庫備份與恢復
。監視與優化數據庫性能

一、物理結構:數據庫是由構成數據庫的操作系統文件所組成。
UNIX:/u01/app/oracle/oradata/db_name/ *.*
Windows NT/2000: D:/Oracle/oradata/db_name/*.*

//爲保證數據安全,只要將此目錄中的所有文件備份即可。 Control0X.CTL文件(X爲1,2,3)是一樣的,只要有一個完好就可以。

包含三類物理文件:
1、數據文件(DataFiles):存儲數據庫數據的文件,表、索引、存儲過程等都存儲在數據文件中。

[*]查詢數據文件信息:
SQL> select * from dba_data_files;

/* 數據文件的大小隻是表示有多少存儲數據的空間,並不表示數據量的大小。*/

[*]查詢表空間空閒空間:
SQL> select * from dba_free_space;  // 顯示結果中包括碎片
SQL>select tablespace_name, sum(bytes) from dba_free_space
 group by tablespace_name;
 
[*] 表空間碎片合併命令:
SQL> alter tablespace 表空間名 coalesce;

SQL> alter tablespace temp coalesce;

[*]數據塊大小控制參數:db_block_size = 2K - 32K
在數據庫安裝後,數據塊大小不得修改。

系統缺省值如下:
Oracle7, Oracle8, Oracle8i 8.1.5: 2048(2K)

Oracle8i 8.1.6: 8192(8K)

Oracle8i 8.1.7: 8192(8K)

這個參數存儲在d:/oracel/admin/db_name/pfile/init.ora文件中。

SQL> select bytes, blocks, blocks*8192, file_name from dba_data_files;

數據文件的大小都是數據塊的整數倍。數據塊的大小在數據庫安裝之前確實,數據庫安裝之後就不能再修改。

[*] 顯示數據塊大小:
(1) d:/svrmgrl
SVRMGR> connect internal/oracle

SVRMGR> show parameter db_black_size

SQL> select value form v$parameter where name='db_block_size'; (小寫)

[1.1] 在Oracle數據庫中,數據文件大小可以修改,命令如下:
SQL> Alter database datafile '數據文件名及路徑' resize xxM;

SQL> alter database datafile 'd:/oracle/oradata/ora8i/system01.dbf' resize 100m;
// 上一行中ora8i在具體系統中應該是相應的數據庫名

更改之前,查詢相應磁盤是否有空閒空間。
用相同的方法可以壓縮數據文件的大小,但不能小於已經存儲的數據的大小。

[1.2] 在Oracle8i數據庫中,數據文件的大小可以自動擴展,命令如下:
SQL> Alter database datafile '數據文件名及路徑' autoextend on;  --//該數據文件允許自動擴展(缺省)

SQL> Alter database datafile '數據文件名及路徑' autoextend off; --//該數據文件不允許自動擴展

[*] 查詢數據文件自動擴展屬性:
SQL> select bytes, autoextensible, maxbytes, file_name from dba_data_files;

SQL> Alter database datafile '數據文件名及路徑' autoextend on
 next 50m  -- // 每次擴展50M
 maxsize 1000m ; --// 最大擴展到1000M,如果unlimited,則受磁盤大小的限制
 
[*] 查詢每次擴展量:
SQL> select bytes, increment_by, file_name from dba_data_files;

[安全起見,建議把自動擴展關閉]


[C.1] Sun Enterprise 6500: 8 * 34G
system01.dbf ==> 33G

SQL> Alter table emp deallocate unused;  --// 壓縮表未用空間

2、日誌文件(Redo log files):記錄數據庫修改前後的信息,用於數據庫恢復。

每一個數據庫至少有兩個日誌文件組,每組有一個或多個日誌成員文件。每個組的成員文件的缺省大小是1M。

[*]假設有三個組,每個組有三個成員文件,Oracle的日誌工作流程(概括起來爲循環覆蓋):

(1) 每個組中的日誌成員文件之間的關係是鏡像關係,每個成員分別存儲到不同的物理磁盤上,只有全部損壞,這個組纔算損壞。如果只有一個成員,則這個數據庫是不安全的。

(2) 在同一個時刻,只有一個組在工作。當第一組不能全部存放要記錄的數據時,則轉換到第二組,如果第二組仍然寫不下,則轉到第三組,第三組仍然存不下,則再轉回到第一組。如果第一組日誌的歸檔模式爲歸檔日誌,則第一組日誌中存儲的數據歸檔到磁盤或者磁帶上,然後數據被覆蓋,如果是非歸檔日誌(默認模式,建議改變爲歸檔模式),則新的數據直接覆蓋第一組的數據,這種情況就會造成數據丟失。

[*] 確認數據庫(日誌)歸檔方式:
SQL> select log_mode from v$database;

SVRMGR> archive log list

[C*] Oracle的數據庫恢復
不完全數據庫恢復:通過備份來回退,會造成部分數據的丟失
完全數據庫恢復:數據不會丟失。
兩種情況下都需要用到日誌,日誌對於數據庫的恢復至關重要。

[*]
(1) 在線日誌:v$log  // 當前使用的日誌,current
SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
         1          1        199    1048576          1 NO  CURRENT                 153302 2002年04月
         2          1        197    1048576          1 NO  INACTIVE                112335 2002年04月
         3          1        198    1048576          1 NO  INACTIVE                132450 2002年04月
        
[如果當前日誌文件損壞,則數據庫無法恢復。(打死也恢復不了)。]
[C*]日誌文件組的名稱是:REDO0X.LOG(X=1,2,3)。
[對於Oracle數據庫來說,還有一個關鍵文件是SYSTEM01.DBF,如果這個文件壞了,整個數據庫系統無法啓動,數據也會全部丟失。]

[!!! 一定要做好數據庫及日誌的備份!!!]

日誌文件:v$logfile  // 日誌文件
歸檔日誌:v$archived_log  // 日誌組切換時歸檔到磁盤或者磁帶上的日誌

(4) 歷史日誌:v$log_history  // 日誌的歷史記錄
SQL> select * from v$log_history;

[*] Redo Log 文件鏡像
(1) 一組中Redo Log文件具有相同的信息。
(2) 選擇合適的日誌文件大小(不能太小,太小容易導致頻繁的切換,從而導致過多的磁盤I/O,降低系統的性能)。
[C*] 內存的多少對數據庫系統性能的影響是最重要的,日誌雖然對系統性能有影響,但沒有內存關鍵,內存一定要大。

[C*] Oracle數據庫最大化參數:
maxlogmembers: 最大值是5,缺省值是2。
maxlogfiles:最大254,缺省32個。 // 最大的日誌文件個數
maxdatafiles:最大65534, 缺省254。
maxloghistory:最大65534,缺省65534
maxinstances: 最大63,缺省1。

[組不需要太多,至少三個,四個一般就可以了]

[C* 不同日誌文件組的文件大小可以不同,兩個組中文件的個數也可以不同]
(3) 組中的成員同時被更新。
... [請參考PowerPoint教程]

[*] 日誌切換:
DBA強制日誌切換命令:SQL> alter system switch logfile;


[*] 在Oracle中,文件的擴展名沒有任何意義,從以下數據字典中查詢相應的文件的文件名
(1) 表空間文件*.dbf: dba_data_file, v$datafile
(2) 日誌文件*.log: v$logfile
(3) 控制文件*.ctl: v$controlfile

SQL> select * from v$log;

查詢數據文件同步號:SQL> seelct file#, checkpoint_change#, from v$datafile;

控制文件同步號:SQL> select checkpoint_change# from v$database;

/* 隨着日誌的切換或者時間的推移,文件的同步號不斷改變,如果上述同步號不一致,表明數據庫出現問題;由此,不能將不同機器上的單個數據庫文件互相拷貝,因爲同步號不一致,只能把一臺機器上的所有數據文件同時拷貝到另一臺機器上纔可以使用。Oracle的同步號以控制文件(*.ctl)中的爲準。 */

Oracle不提供修改同步號的命令。如果在一個數據庫中出現同步號不一致的情況,說明這個數據庫的數據已經有不一致的部分,原因可能是進行了不完全恢復,只有當數據完全恢復後,同步號才能重新變得一致。

SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
         1          1        199    1048576          1 NO  CURRENT                 153302 2002年04月
         2          1        197    1048576          1 NO  INACTIVE                112335 2002年04月
         3          1        198    1048576          1 NO  INACTIVE                132450 2002年04月
上述顯示結果中的SEQUENCE#的最大值是65534,如果達到最大值,會自動清零,從頭開始。


[*]日誌管理與配置命令
A. 增加日誌文件組:
SQL> Alter database ADD
 logfile group n('第一個日誌成員文件','第二個日誌成員文件') size xxM;
// n爲組號。第二個日誌成員文件爲可選的,兩個成員文件最好放到不同的物理磁盤上。

SQL>Alter database ADD
 logfile group 4('d:/oracle/oradata/ora8i/log41.log', 'd:/oracle/oradata/ora8i/log42.log')
 size 5m;

SQL>Alter database ADD
 logfile group 4('d:/oracle/oradata/ora8i/log41.log', 'd:/oracle/oradata/ora8i/log42.log')
 REUSE; // 如果在相應的路徑下存在同名文件,請加Reuse直接覆蓋原來的文件。
 

[C*]: Oracle不提供修改原來的日誌組的屬性(文件大小)的命令,解決辦法是先創建新的,然後刪除舊的

// ************************************* 實際操作內容 ************************************************
SQL> Alter database ADD
  2   logfile group 4('d:/oracle/oradata/ora54/ReDo41.log', 'd:/oracle/oradata/ora54/ReDo42.log')
  3   size 5m;


數據庫已更改。

SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
         1          1        199    1048576          1 NO  CURRENT                 153302 2002年04月
         2          1        197    1048576          1 NO  INACTIVE                112335 2002年04月
         3          1        198    1048576          1 NO  INACTIVE                132450 2002年04月
         4          1          0    5242880          2 YES UNUSED                       0

SQL> alter system switch logfile;

系統已更改。

SQL> /

系統已更改。

SQL> /

系統已更改。

SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
         1          1        199    1048576          1 NO  INACTIVE                153302 2002年04月
         2          1        201    1048576          1 NO  INACTIVE                153435 2002年04月
         3          1        202    1048576          1 NO  CURRENT                 153436 2002年04月
         4          1        200    5242880          2 NO  INACTIVE                153434 2002年04月
/*****************************************************************************************************/

B. 刪除日誌文件組:
SQL> Alter database DROP logfile group n;

說明:(1)Current, Active組不得刪除,如果是歸檔日誌組,要求先歸檔,否則,該組狀態爲ACTIVE,不能刪除。
(2) 數據庫只有兩個日誌組時,不得刪除。
(3) 邏輯刪除後,再刪除物理文件。切記:不要刪除錯了文件,尤其是在UNIX下,最好在刪除之間檢查正在使用的物理文件,(當然,如果刪除之前先備份文件更好)如下命令:
SQL> select * from v$logfile;

C. 增加日誌成員文件:
SQL> Alter database ADD logfile member '成員文件名及路徑' to group n;

D. 刪除日誌成員文件:
SQL> Alter database DROP logfile member '成員文件名及路徑';

說明:(1) Current, Active組的成員不得刪除;
(2) 日誌組只有一個成員時,不得刪除成員,可以刪除組。

3、控制文件(Control Files):是描述數據庫結構的二進制文件。包括:
 。數據庫名db_name
 。數據庫創建的時間
 。全部數據文件名及路徑
 。全部日誌文件名及路徑
 。數據庫恢復時所需的同步信息
// 控制文件只需要一個,但在oradata目錄下有三個,另兩個是鏡像,三個文件內容相同。

(1) 查詢數據庫跟蹤文件信息(跟蹤文件記錄所有影響控制文件修改的命令):
D:/oracle/admin/db_name/bdump/SIDalrt.log // SID視具體情況而定
/u01/app/oracle/admin/db_name/bdump/alert_sid.log

// 這個文件時間長了之後會變得很大,因此需要定期刪除。

(2) 建議設置:
 。至少設置兩個控制文件並保存於不同的磁盤。
 。在數據庫參數文件中的Control_files指明控制文件。
  . 控制文件可以鏡像,可以在安裝或者安裝完成後進行配置
  .
 
[(2).C] 數據庫參數文件名稱及路徑:
Unix:
/u01/app/oracle/admin/db_name/pfile/initSID.ora

Windows NT/2000:
D:/oracle/admin/db_name/pfile/init.ora

指明控制文件的參數:
control_files = ('file1', 'file2', 'file3')
例:
control_files = ( "D:/Oracle/oradata/ora54/control01.ctl",
    "D:/Oracle/oradata/ora54/control02.ctl",
    "D:/Oracle/oradata/ora54/control03.ctl")
   
(3) 查詢控制文件名及路徑:
SQL> select * from v$controlfile;

(4) 控制文控鏡像方法:
A. 關閉數據庫
B. 複製控制文件到目標路徑
C. 修改參數文件control_files,包含新的控制文件
D. 重啓數據庫

[DBA的圖形界面管理工具:DBA Studio]
啓動DBA Studio, 選擇“登錄到Management Server”:
登錄用戶:sysman, 密碼:oem_temp(默認,登錄成功後要求修改)

在登錄之前,要求Management Server服務已經啓動,同時已經在系統控制檯Console中搜索並增加(配置)了Management Server要管理的數據庫。

二、邏輯結構:
數據庫的邏輯結構包括:
。表空間(Tablespaces)
。段(Segments)
。區(Extents)
。數據塊(Data Blocks)

數據塊->區->段->表空間->(邏輯)數據庫
(1) 表空間://對應四種不同的段類型,Oracle有四種對應的表空間
 。數據表空間
 。索引表空間: INDX
 。臨時表空間: TEMP
 。回退表空間: RBS

(2) 段(Segments)的四種類型:
 。數據段:用來存儲基表數據
 。索引段:存儲索引數據
 。臨時段:用於排序(Order by)、彙總等
 。回退段:用於事務回退,rollback語句使用

// 臨時段和回退段佔的空間固定,不能增大。
// Oracle中最複雜的就是回退段管理。
// 每個段的結構都大致相同,即包含若干個區,每個區的大小又是數據塊的整數倍。
// 表空間是Oracle中最大的邏輯結構

1、表空間(Tablespaces):
(1)表空間的特點與作用:
。控制數據庫數據磁盤分配

。跨越磁盤存儲數據

。表空間通過離線(Offline)、在線(online)控制數據可用性。

[A]設置表空間offline、online、read only、read write屬性:
SQL> Alter tablespace 表空間名 offline;
SQL> Alter tablespace 表空間名 online;  // 正常狀態
SQL> Alter tablespace 表空間名 read only;
SQL> Alter tablespace 表空間名 read write; // 正常狀態

[system表空間不得offline]

[B]查詢表空間信息:
SQL> select * from dba_tablespaces;
SQL> select tablespace_name, status from dba_tablespaces;

。完成部分數據庫的備份與恢復

。表空間通過數據文件來擴大,表空間大小等於構成該表空間的所有數據文件大小之和。

[A] 查詢表空間與數據文件之間的關係:
SQL> select tablespace_name, file_name from dba_data_files;

2、段(Segments):
(1) 數據段:存儲基表數據的段,由Create table命令產生。用戶在創建基表時,則自動在用戶缺省表空間中創建一個數據段。
[A]查詢用戶與用戶缺省表空間對應關係:
SQL>select username, default_tablespace from dba_users;
[B] 查詢表與所在表空間的對應關係:
SQL> select table_name, tablespace_name from user_tables;

如果一個表有分區,則用上面這個命令無法查詢表所使用的表空間,因爲表使用了多個表空間。查詢方法如下:
SQL> select partition_name, segment_type, tablespace_naem from user_extents
 where segment_name = 'EMPLOYEE';

(2)、索引段:存儲索引數據的段,由Create index命令產生。用戶在創建索引時,則自動在用戶缺省表空間中創建一個索引段。
[A] 索引與所在表空間的對應關係:
SQL> select index_name, tablespace_name from user_indexes;

[B] 使用索引表空間創建索引:
SQL> create index emp_job on emp(job) tablespace indx;
// 如果不加tablespace indx,則索引默認創建在用戶缺省表空間中。

(3)臨時段:用戶排序、彙總時臨時工作空間。臨時段表空間在DBA創建用戶時確定。創建用戶時未指定臨時表空間,則系統自動使用system表空間作爲臨時表空間使用。臨時表空間公用(temp)。
[A] 查詢用戶及所使用的臨時表空間:
SQL> select username, temporary_tablespace from dba_users;

// 建議不要使用system作爲用戶的臨時表空間,因爲容易導致碎片。

[B]DBA可以修改用戶的臨時表空間
SQL> Alter user 用戶名 temporary tablespace temp;

(4) 回退段:用於用戶在回退事務時使用。回退段由DBA創建,全體用戶公用。
[A] 查詢回退段及所對應的表空間:
SQL> select segment_name, tablespace_name, status from dba_rollback_segs;

[B]爲什麼要設回退段?
回退段是數據庫的一部分,是Oracle 數據庫的一個重要參數,其設計是否正確直接影響到數據庫的動態性能。Rollback 段的使用用於保存一個事務的操作,以便在某些情況下回退或取消操作。 每個Oracle數據庫都有多個回退段。

[C] 回退段的作用
。併發操作時,保證數據的讀一致性。
。使用 SQL語句rollback回退一個事務的操作。
。事務恢復的需要。

[D]回退段操作舉例
。由於語句錯誤回退一個事務。
。回退一個事務、或回退事務到一個保存點(SavePoint)。
。由於異常進程中斷而回退。
。在例程恢復中回退所有未完成的事務。

// delete操作是最消耗回退段的操作

[E]回退段使用原則
。根據事務大小及數量確定回退段。 // 每四個用戶至少對應一個回退段
。每個事務必須對應一個回退段。
。一個事務可以根據回退段中“最少使用原則”來自動對應一個回退段。
[C*]只有delete、insert、update三個命令使用回退段
// 回退段可以自動動態擴展,但不能無限擴展。

/* 如果回退段都已經被用戶佔用,那麼再增加新用戶,則新用戶使用所有回退段中磁盤擴展量最小的回退段(與其它用戶共 享使用),這就是“最少使用原則”。因此,回退段可以共享。
*/

。在創建數據庫後,應爲系統創建回退段,事務越多,回退段應越多。

3、區(Extents):區是磁盤空間分配最小單位。每一個區的大小都是數據塊的整數倍(用戶可以指定,默認是5倍)。

SQL> select segment_type, extent_id, bytes, blocks from user_extents where segment_name = 'EMP';
 
(1)區大小控制參數(磁盤存儲參數):
// 下面這五個參數對磁盤存儲有直接影響
Initial:初始區大小
Next: 增長區大小
Minextents:區的最小個數
Maxextents:區的最大個數
Pctincrease:區的增長百分比

SQL> Create table sales(
 s1 char(20),
 s2 char(20)
 Storage( initial 10K --// 第一個分區的大小
   next 10K  --// 第二個分區的大小
   minextents 1 --// 最少一個分區
   maxextents 121 --// 最多121個分區
   pctincrease 50); -- // 區的增長比例爲50%。
以上語句中的Storage部分,在建表時如果不寫是要隱含執行的。
1Block = 2K
第一個分區:Initial = 10K = 1Blocks * 5
第二個分區:Next = 10K
第三個分區= Next + next * 50% = 10K + 5K => 變成blocks的整數倍 = 16K
第四個分區 = 第三個分區 * ( 1 + 50%)
...

例:SQL> Create table sales(s1 char(20), s2 char(20)
  Storage(initial 100K next 200K minextents 2 maxextents 121 pctincrease 0);

/* 區太小,會導致區的數目太多,進一步導致磁盤碎片的產生。而區太大,則容易浪費空間。因此,要選擇合適的分區大小。最好的辦法是根據數據量的大小給表只分一個區。*/
估算分區的大小的方法:以上面例子中的表爲例:
(1) 1 行 = 40B
(2) 1block = 2048B , 2048B - 2048 * 20% - 標識= 1547
// 2048 * 20% 表示給一個塊兒留的剩餘空間,標識是用來存儲表中每行在塊中的位置的信息,其大小可以通過查詢V$type_size來獲得
(3) 1547 / 40 = A
(4) 假設表中可能有1百萬行的數據(最大數據量),則1000000/A*2K = B 兆。

則 initial 爲 B兆, 此時next值不要太大,因爲initial區中已經分配了足夠的空間,假設是100M,那麼可以把Next設置成1M。

(2) 區存儲參數可以用於:表空間、表、段(回退段)、索引

(3) 存儲參數優先使用原則:
實體級參數> 表空間級對應參數> 系統缺省參數

實體級參數:指建立實體(如建表)時指定的存儲參數
表空間級對應參數:可以從dba_tablespaces數據字典中查詢。

(4) 查詢實體的存儲參數:
SQL> select initial_extent, next_extent, min_extents, max_extents, pct_increase
 from user_tables
 where table_name = 'EMP';

[C* 有時SQL*Plus中查詢某個字段較多的表時,屏幕寬度不夠,而滾動條又不能橫向滾動,此時修改環境變量中的arraysize參數,將緩衝區寬度修改一下,默認是1000,可以修改成500,保存設置後即可使用橫向滾動條。]

(5)存儲參數的修改:
SQL> Alter table emp
 Storage (next 200k maxextents 2000 pctincrease 50); -- // 五個參數中只有這3個能夠修改

4、數據塊(Blocks): 數據文件存儲空間單位,I/O最小單位。數據塊大小由參數db_block_size決定,數據庫創建後不得修改。
(1)查詢數據塊大小:
SQL> select value from v$parameter where name = 'db_block_size';


//

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