ORACLE 移動數據文件 控制文件 重做日志文件


ORACLE數據庫有時候需要對存儲進行調整,增加分區、IO調優等等,此時需要移動數據文件、重做日志文件、控制文件等等,下文結合例子總結一下這方面的知識點。

進行數據文件、重做日志文件、控制文件的遷移前,需要總體了解一下當前Linux服務器的磁盤、分區信息,以及服務器文件使用情況,如下所示

查看Linux服務器的文件使用情況

   1: [root@DB-Server ~]# df -h
   2:  
   3: Filesystem Size Used Avail Use% Mounted on
   4:  
   5: /dev/mapper/VolGroup00-LogVol00
   6:  
   7: 78G 7.1G 67G 10% /
   8:  
   9: /dev/sdb1 78G 184M 74G 1% /u02
  10:  
  11: /dev/sdc1 78G 184M 74G 1% /u03
  12:  
  13: /dev/sdd1 78G 9.1G 65G 13% /u04
  14:  
  15: /dev/sda1 99M 23M 71M 25% /boot
  16:  
  17: tmpfs 7.9G 0 7.9G 0% /dev/shm
  18:  

clip_image002

查看Linux 服務器的磁盤、分區情況。如下所示,這台服務器,4個物理硬盤,6個邏輯分區

   1: [root@DB-Server ~]# fdisk -l
   2:  
   3: Disk /dev/sda: 128.8 GB, 128849018880 bytes
   4: 255 heads, 63 sectors/track, 15665 cylinders
   5: Units = cylinders of 16065 * 512 = 8225280 bytes
   6:  
   7:    Device Boot      Start         End      Blocks   Id  System
   8: /dev/sda1   *           1          13      104391   83  Linux
   9: /dev/sda2              14       15665   125724690   8e  Linux LVM
  10:  
  11: Disk /dev/sdb: 85.8 GB, 85899345920 bytes
  12: 255 heads, 63 sectors/track, 10443 cylinders
  13: Units = cylinders of 16065 * 512 = 8225280 bytes
  14:  
  15:    Device Boot      Start         End      Blocks   Id  System
  16: /dev/sdb1   *           1       10443    83883366   83  Linux
  17:  
  18: Disk /dev/sdc: 85.8 GB, 85899345920 bytes
  19: 255 heads, 63 sectors/track, 10443 cylinders
  20: Units = cylinders of 16065 * 512 = 8225280 bytes
  21:  
  22:    Device Boot      Start         End      Blocks   Id  System
  23: /dev/sdc1   *           1       10443    83883366   83  Linux
  24:  
  25: Disk /dev/sdd: 85.8 GB, 85899345920 bytes
  26: 255 heads, 63 sectors/track, 10443 cylinders
  27: Units = cylinders of 16065 * 512 = 8225280 bytes
  28:  
  29:    Device Boot      Start         End      Blocks   Id  System
  30: /dev/sdd1   *           1       10443    83883366   83  Linux
  31:  
  32: Disk /dev/dm-0: 85.8 GB, 85899345920 bytes
  33: 255 heads, 63 sectors/track, 10443 cylinders
  34: Units = cylinders of 16065 * 512 = 8225280 bytes
  35:  
  36: Disk /dev/dm-0 doesn't contain a valid partition table
  37:  
  38: Disk /dev/dm-1: 18.9 GB, 18924699648 bytes
  39: 255 heads, 63 sectors/track, 2300 cylinders
  40: Units = cylinders of 16065 * 512 = 8225280 bytes
  41:  
  42: Disk /dev/dm-1 doesn't contain a valid partition table

clip_image004

控制文件移動

控制文件是ORACLE中最重要的文件之一,控制文件一般默認是三個。ORACLE數據庫系統在需要更新控制文件的時候,就會自動同時更新多個控制文件。當其中一個控制文件出現損壞時,系統會自動啟用另外的控制文件。只有當ORACLE數據庫管理員運氣比較背的時候,即所有控制文件都出現損壞,此時ORACLE數據庫就無法正常啟動了。

關於控制文件,通常采用分散放置,多路復用的原則。 即只要將控制文件多路復用在多塊硬盤上,一般來說控制文件一起損壞的幾率很小。所以采用多路復用控制文件可以在很大程度上提高控制文件的安全性。最重要的是,在控制文件轉換的過程之中,不會有停機現象的產生。

關於多路復用的原理其實很簡單,就是在ORACLE數據庫服務器上將控制文件存放在多個磁盤分區或者多塊硬盤上。所以通過把控制文件存放在不同的硬盤上,ORACLE數據庫就能夠避免出現單點故障的風險。

另外一個提高IO性能的方法就是將控制文件放置在裸設備(Raw device)上,記得三年前,第一次在AIX上看到控制文件為/dev/raw/raw1這種方式時,當時很是迷惑,同事告知是裸設備時,才知道有這么東東。

   1: [oracle@DB-Server ~]$ sqlplus / as sysdba
   2:  
   3: SQL*Plus: Release 10.2.0.4.0 - Production on Fri Apr 11 09:10:53 2014
   4:  
   5: Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.
   6:  
   7:  
   8: Connected to:
   9: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit Production
  10: With the Partitioning, OLAP, Data Mining and Real Application Testing options
  11:  
  12: SQL> desc v$controlfile;
  13:  Name                                      Null?    Type
  14:  ----------------------------------------- -------- ----------------------------
  15:  STATUS                                             VARCHAR2(7)
  16:  NAME                                               VARCHAR2(513)
  17:  IS_RECOVERY_DEST_FILE                              VARCHAR2(3)
  18:  BLOCK_SIZE                                         NUMBER
  19:  FILE_SIZE_BLKS                                     NUMBER
  20:  
  21: SQL> SET LINESIZE 1400;   
  22: SQL> COL STATUS FOR A7
  23: SQL> COL NAME FOR A60 
  24: SQL> COL BLOCK_SIZE FOR 999999
  25: SQL> COL FILE_SIZE_BLKS FOR 9999999
  26: SQL> SELECT * FROM V$CONTROLFILE;
  27:  
  28: STATUS  NAME                                                         IS_ BLOCK_SIZE FILE_SIZE_BLKS
  29: ------- ------------------------------------------------------------ --- ---------- --------------
  30:         /u01/app/oracle/oradata/epps/control01.ctl                   NO       16384            430
  31:         /u01/app/oracle/oradata/epps/control02.ctl                   NO       16384            430
  32:         /u01/app/oracle/oradata/epps/control03.ctl                   NO       16384            430
  33:  
  34: SQL> 

 

clip_image006

如上所示,所有的控制文件都位於/u01/app/oracle/oradata/epps目錄下,也就是說位於邏輯分區/dev/sda2 ,磁盤/dev/sda中。這個顯然是不合理的。完全違反分散放置,多路復用的原則。例如我將控制文件分散放置到硬盤sda、sdb、sdc上。可以分散IO。提高IO性能。下面是操作步驟。

Step 1: 在/u02, /u03等目錄新建文件夾/oradata/epps

   1: [oracle@DB-Server u02]$ mkdir -p ./oradata/epps
   2: [oracle@DB-Server u02]$ cd /u03
   3: [oracle@DB-Server u03]$ mkdir -p ./oradata/epps
   4:  
   5:  
   6: [oracle@DB-Server u01]$ mkdir oradata
   7: [oracle@DB-Server u01]$ cd oradata/
   8: [oracle@DB-Server oradata]$ ls
   9: [oracle@DB-Server oradata]$ mkdir epps

Step 2: 檢查是否以spfile啟動

   1: SQL> show parameter spfile;
   2:  
   3: NAME                                 TYPE        VALUE
   4: ------------------------------------ ----------- ------------------------------
   5: spfile                               string      /u01/app/oracle/product/10.2.0
   6:                                                  /db_1/dbs/spfileepps.ora

Step 3: 修改控制文件位置

   1: SQL> alter system set control_files=
   2:   2  '/u01/oradata/epps/control01.ctl',
   3:   3  '/u02/oradata/epps/control02.ctl',
   4:   4  '/u03/oradata/epps/control03.ctl'
   5:   5  scope=spfile;
   6:  
   7: System altered.

Step 4:關閉數據庫實例

   1: SQL> shutdown immediate;
   2: Database closed.
   3: Database dismounted.
   4: ORACLE instance shut down.

Step 5:移動控制文件

   1: SQL> ! mv /u01/app/oracle/oradata/epps/control01.ctl  /u01/oradata/epps 
   2:  
   3: SQL> ! mv /u01/app/oracle/oradata/epps/control02.ctl  /u02/oradata/epps/             
   4:  
   5: SQL> ! mv /u01/app/oracle/oradata/epps/control03.ctl  /u03/oradata/epps/

Step 6:啟動數據庫

   1: SQL> startup
   2: ORACLE instance started.
   3:  
   4: Total System Global Area 5033164800 bytes
   5: Fixed Size                  2090848 bytes
   6: Variable Size             956303520 bytes
   7: Database Buffers         4060086272 bytes
   8: Redo Buffers               14684160 bytes
   9: Database mounted.
  10: Database opened.

Step 7:驗證控制文件是否移動到其它分區

   1: SQL> SELECT * FROM V$CONTROLFILE;
   2:  
   3: STATUS  NAME                                                         IS_ BLOCK_SIZE FILE_SIZE_BLKS
   4: ------- ------------------------------------------------------------ --- ---------- --------------
   5:         /u01/oradata/epps/control01.ctl                              NO       16384            430
   6:         /u02/oradata/epps/control02.ctl                              NO       16384            430
   7:         /u03/oradata/epps/control03.ctl                              NO       16384            430
   8:  
   9: SQL>

clip_image008

移動重做日志文件

聯機日志文件又叫重做日志文件,記錄了對數據庫修改的信息,包括用戶對數據修改和數據庫管理員對數據庫結構的修改。它主要用於在發生故障的時候和數據庫備份文件配合恢復數據庫,一般發生故障有2個情況:一個是介質損壞另外一個是用戶誤操作。每個數據庫至少有兩個日志文件組,每組至少包含1個或者多個日志成員,這里要多個日志成員的原因是防止日志文件組內某個日志文件損壞后及時提供備份,所以同一組的日志成員一般內容信息相同,但是存放位置不同,就就是采用多路復用。

如下所示,這里有個問題:重做日志每個組只有一個組成員(member),沒有采用多路復用,那么我們先將這三個重做日志文件移動至/u01/oradata/epps/目錄下,然后增加組成員,采用多路復用。避免redo log files 的單點故障。重做日志在ORACLE數據庫中IO操作非常頻繁,所以需要將同一組的成員分散至不同的磁盤。關於聯機重做日志,一般是將redo log file移動到裸設備或I/0快的磁盤中

   1: SQL> col status for a8
   2: SQL> select * from v$log;
   3:  
   4:  GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS   FIRST_CHANGE# FIRST_TIM
   5: ------- ---------- ---------- ---------- ---------- --- -------- ------------- ---------
   6:       1          1         38   52428800          1 NO  INACTIVE       1092664 10-APR-14
   7:       2          1         39   52428800          1 NO  CURRENT        1116851 10-APR-14
   8:       3          1         37   52428800          1 NO  INACTIVE       1069283 10-APR-14
   9:  
  10: SQL> col member for a60
  11: SQL> col is_recovery_dest_file for a3
  12: SQL> select * from v$logfile;
  13:  
  14:  GROUP# STATUS   TYPE    MEMBER                                                       IS_
  15: ------- -------- ------- ------------------------------------------------------------ ---
  16:       3 STALE    ONLINE  /u01/app/oracle/oradata/epps/redo03.log                      NO
  17:       2          ONLINE  /u01/app/oracle/oradata/epps/redo02.log                      NO
  18:       1          ONLINE  /u01/app/oracle/oradata/epps/redo01.log                      NO
  19:  
  20: SQL> shutdown immediate;
  21: Database closed.
  22: Database dismounted.
  23: ORACLE instance shut down.
  24: SQL> ! mv /u01/app/oracle/oradata/epps/redo03.log /u01/oradata/epps/     
  25:  
  26: SQL> ! mv /u01/app/oracle/oradata/epps/redo01.log /u01/oradata/epps/
  27:  
  28: SQL> ! mv /u01/app/oracle/oradata/epps/redo02.log /u02/oradata/epps/
  29:  
  30: SQL> ! mv /u02/oradata/epps/redo02.log  /u01/oradata/epps/
  31:  
  32: SQL> startup mount;
  33: ORACLE instance started.
  34:  
  35: Total System Global Area 5033164800 bytes
  36: Fixed Size                  2090848 bytes
  37: Variable Size             956303520 bytes
  38: Database Buffers         4060086272 bytes
  39: Redo Buffers               14684160 bytes
  40: Database mounted.
  41: SQL> alter database rename file '/u01/app/oracle/oradata/epps/redo01.log'
  42:   2  to '/u01/oradata/epps/redo01.log';
  43:  
  44: Database altered.
  45:  
  46:  
  47: SQL> alter database rename file '/u01/app/oracle/oradata/epps/redo02.log'
  48:   2  to '/u01/oradata/epps/redo02.log';
  49:  
  50: Database altered.
  51:  
  52: SQL> alter database rename file '/u01/app/oracle/oradata/epps/redo03.log'
  53:   2  to '/u01/oradata/epps/redo03.log';
  54:  
  55: Database altered.
  56:  
  57: SQL> alter database open;
  58:  
  59: Database altered.
  60:  
  61: SQL> 

clip_image010

   1: SQL> alter database add logfile member '/u03/oradata/epps/redo01_02.log' to group 1;
   2:  
   3: Database altered.
   4:  
   5: SQL> alter database add logfile member '/u03/oradata/epps/redo02_02.log' to group 2;
   6:  
   7: Database altered.
   8:  
   9: SQL> alter database add logfile member '/u03/oradata/epps/redo03_03.log' to group 3;
  10:  
  11: Database altered.
  12:  
  13: SQL> col member for a60
  14: SQL> col is_recovery_dest_file for a3
  15: SQL> select * from v$logfile;
  16:  
  17:     GROUP# STATUS  TYPE    MEMBER                                                       IS_
  18: ---------- ------- ------- ------------------------------------------------------------ ---
  19:          3         ONLINE  /u01/oradata/epps/redo03.log                                 NO
  20:          2         ONLINE  /u01/oradata/epps/redo02.log                                 NO
  21:          1         ONLINE  /u01/oradata/epps/redo01.log                                 NO
  22:          1 INVALID ONLINE  /u03/oradata/epps/redo01_02.log                              NO
  23:          2 INVALID ONLINE  /u03/oradata/epps/redo02_02.log                              NO
  24:          3 INVALID ONLINE  /u03/oradata/epps/redo03_03.log                              NO
  25:  
  26: 6 rows selected.
  27:  
  28: SQL> alter system switch logfile;
  29:  
  30: System altered.
  31:  
  32: SQL> alter system switch logfile;
  33:  
  34: System altered.
  35:  
  36: SQL> alter system switch logfile;
  37:  
  38: System altered.
  39:  
  40: SQL> select * from v$logfile;
  41:  
  42:     GROUP# STATUS  TYPE    MEMBER                                                       IS_
  43: ---------- ------- ------- ------------------------------------------------------------ ---
  44:          3         ONLINE  /u01/oradata/epps/redo03.log                                 NO
  45:          2         ONLINE  /u01/oradata/epps/redo02.log                                 NO
  46:          1         ONLINE  /u01/oradata/epps/redo01.log                                 NO
  47:          1         ONLINE  /u03/oradata/epps/redo01_02.log                              NO
  48:          2         ONLINE  /u03/oradata/epps/redo02_02.log                              NO
  49:          3         ONLINE  /u03/oradata/epps/redo03_03.log                              NO
  50:  
  51: 6 rows selected.
  52:  
  53: SQL> 

clip_image012

數據文件調優

由於采用基本安裝方式,像system、uno、temp等表空間的數據文件都放置於/u01/app/oracle/oradata/epps/下,下面我將這些系統表空間的數據文件移動至/u01/oradata/epps下,因為我們需要定期備份/u01/app這個目錄,而數據文件通過RMAN備份,所以將這些系統表空間數據從/u01/app/目錄下移走就有必要.

   1: [oracle@DB-Server epps]$ ls
   2: example01.dbf  sysaux01.dbf  system01.dbf  temp01.dbf  undotbs01.dbf  users01.dbf
   3: [oracle@DB-Server epps]$ pwd
   4: /u01/app/oracle/oradata/epps
   5: [oracle@DB-Server epps]$ pwd
   6: /u01/app/oracle/oradata/epps
   7: [oracle@DB-Server epps]$ exit
   8: exit
   9:  
  10: SQL> select tablespace_name from dba_tablespaces;
  11:  
  12: TABLESPACE_NAME
  13: ------------------------------
  14: SYSTEM
  15: UNDOTBS1
  16: SYSAUX
  17: TEMP
  18: USERS
  19: EXAMPLE
  20:  
  21: 6 rows selected.

表空間example數據文件移動

   1: SQL> alter tablespace example offline normal;
   2:  
   3: Tablespace altered.
   4:  
   5: SQL> ! mv /u01/app/oracle/oradata/epps/example01.dbf  /u01/oradata/epps/
   6:  
   7: SQL> alter database rename file '/u01/app/oracle/oradata/epps/example01.dbf'
   8:   2  to '/u01/oradata/epps/example01.dbf';
   9:  
  10: Database altered.
  11:  
  12: SQL> alter tablespace example online;
  13:  
  14: Tablespace altered.
  15:  
  16: SQL> 

表空間sysaux數據文件移動

   1: SQL> alter tablespace sysaux offline normal;
   2:  
   3: Tablespace altered.
   4:  
   5: SQL> ! mv /u01/app/oracle/oradata/epps/sysaux01.dbf  /u01/oradata/epps/
   6:  
   7: SQL> alter database rename file '/u01/app/oracle/oradata/epps/sysaux01.dbf'
   8:   2  to '/u01/oradata/epps/sysaux01.dbf';
   9:  
  10: Database altered.
  11:  
  12: SQL> alter tablespace sysaux online;
  13:  
  14: Tablespace altered.

表空間users數據文件移動

   1: SQL> alter tablespace users offline normal;
   2:  
   3: Tablespace altered.
   4:  
   5: SQL> ! mv /u01/app/oracle/oradata/epps/users01.dbf  /u01/oradata/epps/
   6: SQL> alter tablespace users rename datafile '/u01/app/oracle/oradata/epps/users01.dbf'
   7:   2  to '/u01/oradata/epps/users01.dbf';
   8:  
   9: Tablespace altered.
  10:  
  11: SQL> alter tablespace users online;
  12:  
  13: Tablespace altered.

UNDO表空間調整

   1: SQL> create undo tablespace undotbs
   2:   2  datafile '/u01/oradata/epps/undotbs.dbf' size 2G
   3:   3  autoextend on
   4:   4  next 100m
   5:   5  maxsize 8G;
   6:  
   7: Tablespace created.
   8:  
   9: SQL> select count(1) from v$transaction;
  10:  
  11:   COUNT(1)
  12: ----------
  13:          0
  14:  
  15:  
  16:  
  17: SQL> alter system set undo_tablespace=undotbs scope=both;
  18:  
  19: System altered.
  20:  
  21: SQL> drop tablespace undotbs1 including contents and datafiles;
  22:  
  23: Tablespace dropped.

臨時表空間調整

   1: SQL> create temporary tablespace TEMP1
   2:   2  tempfile '/u02/oradata/epps/temp01.dbf'
   3:   3  size 2G 
   4:   4  autoextend on
   5:   5  next 100m
   6:   6  maxsize unlimited;
   7:  
   8: Tablespace created.
   9:  
  10: SQL> alter database default temporary tablespace temp1;
  11:  
  12: Database altered.
  13:  
  14:  
  15: SQL> drop tablespace temp including contents and datafiles;
  16:  
  17: Tablespace dropped.

System表空間調整

   1: SQL> shutdown immediate;
   2: Database closed.
   3: Database dismounted.
   4: ORACLE instance shut down.
   5: SQL> ! mv /u01/app/oracle/oradata/epps/system01.dbf /u01/oradata/epps/
   6:  
   7:  
   8: SQL> startup mount;
   9: ORACLE instance started.
  10:  
  11: Total System Global Area 5033164800 bytes
  12: Fixed Size                  2090848 bytes
  13: Variable Size             956303520 bytes
  14: Database Buffers         4060086272 bytes
  15: Redo Buffers               14684160 bytes
  16: Database mounted.
  17: SQL> alter database rename file '/u01/app/oracle/oradata/epps/system01.dbf'
  18:   2  to '/u01/oradata/epps/system01.dbf';
  19:  
  20: Database altered.
  21:  
  22: SQL> alter database open;
  23:  
  24: Database altered.

參考資料:

http://blog.csdn.net/tianlesoftware/article/details/7346212


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM