Oracle 單機架構下,多個例項可以同時開啟同一套資料庫檔案嗎?

chenoracle發表於2022-10-15

架構說明:

Oracle 主備架構,兩個資料庫例項,一套資料庫檔案,不是RAC,也不是DG,資料庫檔案存放在NFS儲存上,透過第三方軟體進行故障檢測和切換的。

通常情況下只有1個節點掛載NFS儲存,open資料庫,另一個資料庫節點不掛載NFS儲存。

資料庫切換時,需要停庫,將NFS掛載到另一個資料庫節點上,然後啟庫。

疑問:

如果在資料庫節點1 open資料庫的情況下,節點2掛載NFS儲存後,能否可以開啟資料庫?

1.節點2能否開啟資料庫,能開啟到哪一階段,nomount?mount?open?

2.節點2如果不能開啟資料庫,會報什麼錯誤?

3.節點2嘗試開啟資料庫,會對節點1資料庫有影響嗎?

環境說明:

NFS伺服器:

IP 192.168.31.58

用於存放Oracle資料庫檔案。

資料庫伺服器1:

Oracle 11.2.0.4.0 單機

IP 192.168.31.100

資料庫伺服器2:

Oracle 11.2.0.4.0 單機

IP 192.168.31.100

測試過程:

1.NFS伺服器上,啟動nfs服務

NFS 192.168.31.58

[root@mysql02 oradata]# cat /etc/exports
###/oradata 192.168.8.41(rw,insecure)
/oradata *(rw,insecure)
[root@mysql02 oradata]# systemctl status nfs-server.service

2.節點1掛載NFS儲存,並啟動資料庫

192.168.31.100

[root@cjcos02 /]# mount -t nfs -o rw,bg,hard,nointr,nolock,rsize=65536,wsize=65536,tcp,vers=3,timeo=600 192.168.31.58:/oradata /oradata 
[root@cjcos02 /]# df -h /oradata
Filesystem              Size  Used Avail Use% Mounted on
192.168.31.58:/oradata   47G   33G   15G  70% /oradata

[root@cjcos02 /]# showmount -e 192.168.31.58
Export list for 192.168.31.58:
/oradata *

[oracle@cjcos02 ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Sat Oct 15 10:08:39 2022
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area 1152450560 bytes
Fixed Size    2252584 bytes
Variable Size  738197720 bytes
Database Buffers  402653184 bytes
Redo Buffers    9347072 bytes
Database mounted.
Database opened.

3.節點2掛載NFS儲存,嘗試啟動儲存,並啟動資料庫

[root@mysql01 ~]# ls /oradata/
[root@mysql01 ~]# mount -t nfs -o rw,bg,hard,nointr,nolock,rsize=65536,wsize=65536,tcp,vers=3,timeo=600 192.168.31.58:/oradata /oradata 
[root@mysql01 ~]# ls /oradata/
cjc  cjc.tar.gz  initcjc.ora  spfilecjc.ora

節點2啟動資料庫

[oracle@mysql01 ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Sat Oct 15 10:28:52 2022
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
Connected to an idle instance.

可以nomount

SQL> startup nomount
ORACLE instance started.
Total System Global Area 1152450560 bytes
Fixed Size    2252584 bytes
Variable Size  738197720 bytes
Database Buffers  402653184 bytes
Redo Buffers    9347072 bytes

不能mount,更不能open

SQL> alter database mount;
alter database mount
*
ERROR at line 1:
ORA-00600: internal error code, arguments: [kccsbck_first], [1], [3760275324],
[], [], [], [], [], [], [], [], []

SQL> select status from v$instance;
STATUS
------------------------------------
STARTED

檢視告警日誌

報錯:ORA-00600: internal error code, arguments: [kccsbck_first], [1], [3760275324]

具體日誌如下:

Sat Oct 15 10:29:33 2022
alter database mount
Errors in file /oracle/app/oracle/diag/rdbms/cjc/cjc/trace/cjc_ora_3698.trc  (incident=2553):
ORA-00600: internal error code, arguments: [kccsbck_first], [1], [3760275324], [], [], [], [], [], [], [], [], []
Incident details in: /oracle/app/oracle/diag/rdbms/cjc/cjc/incident/incdir_2553/cjc_ora_3698_i2553.trc
Sat Oct 15 10:29:44 2022
Dumping diagnostic data in directory=[cdmp_20221015102944], requested by (instance=1, osid=3698), summary=[incident=2553].
Sat Oct 15 10:29:45 2022
Use ADRCI or Support Workbench to package the incident.
See Note 411.1 at My Oracle Support for error and packaging details.
ORA-600 signalled during: alter database mount...
Sat Oct 15 10:30:09 2022
Sweep [inc][2553]: completed
Sweep [inc2][2553]: completed

檢視600錯誤說明

ORA-600 [kccsbck_first] (Doc ID 139013.1)

兩個例項不能同時掛載一套資料庫(非RAC、OPS架構),也不會出現資料損壞。

詳細資訊如下:

DESCRIPTION:
  We receive this error because we are attempting to be the first 
  thread/instance to mount the database and cannot because it appears that 
  at least one other thread has mounted the database already.
  We therefore abort the mount attempt and log this error.
 
ARGUMENTS:          
  Arg [a] thread number which has database mounted
  Arg [b] mount id of the thread
 
FUNCTIONALITY:      
  CONTROL FILE COMPONENT
 
IMPACT:             
  PROCESS FAILURE
  GENERALLY NON CORRUPTIVE - No underlying data corruption. Although see
                             Alert in Note:137322.1 for Tru64

最後看下最開始的疑問:

如果在資料庫節點1 open資料庫的情況下,節點2也掛載NFS儲存,能否可以開啟資料庫?

1.節點2能否開啟資料庫,能開啟到哪一階段,nomount?mount?open?

不能開啟資料庫,只能到nomount階段。

2.節點2如果不能開啟資料庫,會報什麼錯誤?

ORA-00600: internal error code, arguments: [kccsbck_first], [1], [3760275324]

3.節點2嘗試開啟資料庫,會對節點1資料庫有影響嗎?

無影響。

在複習下Oracle資料庫啟動過程:

如何啟動例項

在執行startup nomount時:

1.讀取引數檔案以確定初始化引數的值;

2.根據初始化引數設定分配SGA;

3.啟動Oracle後臺程式;

4.開啟警報日誌和跟蹤檔案,並以有效的引數語法將所有顯式引數設定寫入警報日誌。

在這個階段,沒有資料庫與例項關聯。

需要NOMOUNT狀態的場景包括資料庫建立以及某些備份和恢復操作。

How an Instance Is Started

When Oracle Database starts an instance, it proceeds through stages.

The stages are as follows:

Searches for a server parameter file in a platform-specific default location and, if not found, for a text initialization parameter file (specifying STARTUP with the SPFILE or PFILE parameters overrides the default behavior)

Reads the parameter file to determine the values of initialization parameters

Allocates the SGA based on the initialization parameter settings

Starts the Oracle background processes

Opens the alert log and trace files and writes all explicit parameter settings to the alert log in valid parameter syntax

At this stage, no database is associated with the instance. Scenarios that require a NOMOUNT state include database creation and certain backup and recovery operations.

如何裝載資料庫

例項裝載資料庫以將資料庫與此例項關聯。

1.要裝載資料庫,例項將獲取control_files初始化引數中指定的資料庫控制檔案的名稱,並開啟這些檔案。

2.Oracle資料庫讀取控制檔案,以查詢開啟資料庫時將嘗試訪問的資料檔案和聯機重做日誌檔案的名稱。

3.在裝入的資料庫中,資料庫是關閉的,只有資料庫管理員才能訪問。管理員可以在完成特定維護操作時關閉資料庫。但是,資料庫不可用於正常操作。

如果Oracle資料庫允許多個例項併發裝載同一資料庫,那麼CLUSTER_DATABASE初始化引數設定可以使資料庫對多個例項可用。資料庫行為取決於設定:

(1)如果裝載資料庫的第一個例項的CLUSTER_DATABASE為false(預設值),則只有此例項才能裝載資料庫。

(2)如果第一個例項的CLUSTER_DATABASE為true,則其他例項可以裝載資料庫,前提是其CLUSTER_DATABACE引數設定設定為true。可以裝載資料庫的例項數受建立資料庫時指定的預定最大值的限制。

How a Database Is Mounted

The instance mounts a database to associate the database with this instance.

To mount the database, the instance obtains the names of the database control files specified in the CONTROL_FILES initialization parameter and opens the files. Oracle Database reads the control files to find the names of the data files and the online redo log files that it will attempt to access when opening the database.

In a mounted database, the database is closed and accessible only to database administrators. Administrators can keep the database closed while completing specific maintenance operations. However, the database is not available for normal operations.

If Oracle Database allows multiple instances to mount the same database concurrently, then the CLUSTER_DATABASE initialization parameter setting can make the database available to multiple instances. Database behavior depends on the setting:

If CLUSTER_DATABASE is false (default) for the first instance that mounts a database, then only this instance can mount the database.

If CLUSTER_DATABASE is true for the first instance, then other instances can mount the database if their CLUSTER_DATABASE parameter settings are set to true. The number of instances that can mount the database is subject to a predetermined maximum specified when creating the database.

如何開啟資料庫

開啟裝載的資料庫可用於正常的資料庫操作。

任何有效使用者都可以連線到開啟的資料庫並訪問其資訊。通常,資料庫管理員會開啟資料庫以供一般使用。

開啟資料庫時,Oracle資料庫將執行以下操作:

1.在非撤消表空間的表空間中開啟聯機資料檔案

2.如果資料庫先前關閉時表空間處於離線狀態,則當資料庫重新開啟時,表空間及其相應的資料檔案將處於離線狀態。

3.獲取撤消表空間

如果存在多個撤消表空間,則undo_TABLESPACE初始化引數指定要使用的撤消表空間。如果未設定此引數,則選擇第一個可用的撤消表空間。

4.開啟聯機重做日誌檔案

How a Database Is Opened

Opening a mounted database makes it available for normal database operation.

Any valid user can connect to an open database and access its information. Usually, a database administrator opens the database to make it available for general use.

When you open the database, Oracle Database performs the following actions:

Opens the online data files in tablespaces other than undo tablespaces

If a tablespace was offline when the database was previously shut down, then the tablespace and its corresponding data files will be offline when the database reopens.

Acquires an undo tablespace

If multiple undo tablespaces exists, then the UNDO_TABLESPACE initialization parameter designates the undo tablespace to use. If this parameter is not set, then the first available undo tablespace is chosen.

Opens the online redo log files

只讀模式

預設情況下,資料庫以讀/寫模式開啟。在此模式下,使用者可以更改資料,在聯機重做日誌中生成重做。

或者,您可以以只讀模式開啟,以防止使用者事務修改資料。

注意:預設情況下,物理備用資料庫以只讀模式開啟。

只讀模式將資料庫訪問限制為只讀事務,而只讀事務不能寫入資料檔案或聯機重做日誌檔案。

但是,資料庫可以執行恢復或更改資料庫狀態的操作,而無需生成重做。例如,在只讀模式下:

1.資料檔案可以離線和聯機。但是,不能使永久表空間離線。

2.離線資料檔案和表空間可以恢復。

3.控制檔案可用於更新資料庫狀態。

4.使用CREATE Temporary TABLESPACE語句建立的臨時表空間是讀/寫的。

5.可以繼續寫入作業系統稽核跟蹤、跟蹤檔案和警報日誌。

Read-Only Mode

By default, the database opens in read/write mode. In this mode, users can make changes to the data, generating redo in the online redo log. Alternatively, you can open in read-only mode to prevent data modification by user transactions.

Note:By default, a physical standby database opens in read-only mode.

Read-only mode restricts database access to read-only transactions, which cannot write to data files or to online redo log files. However, the database can perform recovery or operations that change the database state without generating redo. For example, in read-only mode:

Data files can be taken offline and online. However, you cannot take permanent tablespaces offline.

Offline data files and tablespaces can be recovered.

The control file remains available for updates about the state of the database.

Temporary tablespaces created with the CREATE TEMPORARY TABLESPACE statement are read/write.

Writes to operating system audit trails, trace files, and alert logs can continue.

資料庫檔案檢查

如果例項嘗試開啟資料庫時,任何資料檔案或重做日誌檔案都不存在,或者檔案存在但一致性測試失敗,則資料庫返回錯誤。可能需要介質恢復。

Database File Checks

If any of the data files or redo log files are not present when the instance attempts to open the database, or if the files are present but fail consistency tests, then the database returns an error. Media recovery may be required.

Open階段的一致性校驗

在資料庫Open的過程中,Oracle將會讀取資料檔案頭塊和控制檔案資訊,將兩者進行對比,如果滿足校驗,則可以正常開啟資料庫;

如果存在異常,則可能丟擲相應異常資訊,要求使用者介入處理。


Oracle在Open階段將要進行很多校驗檢查,其中主要的校驗包括以下兩項:

1.第一次檢查資料檔案頭中的檢查點計數(Checkpoint cnt)是否和控制檔案中的檢查點計數(Checkpoint cnt)一致。

此步驟檢查用以確認資料檔案是來自同一版本,而不是從備份中恢復而來(因為Checkpoint Cnt不會被凍結,會一直被修改)。

如果檢查點計數檢查透過,則資料庫進行第二次檢查。

查詢語句如下:

(1)系統檢查點SCN、SYSTEM CHECKPOINT SCN

存在控制檔案,在系統執行checkpoint後,Oracle會更新當前控制檔案中的SYSTEM CHECKPOINT SCN。

該SCAN是全域性範圍的,當發生檔案級別的SCN時,例如表空間改成只讀狀態,則不會更新此SCN。

SELECT CHECKPOINT_CHANGE# FROM V$DATABASE;

(2)檔案檢查點SCN、Datafile Checkpoint SCN

存在控制檔案,表示該資料檔案最近一次執行檢查點操作時的SCAN,例如表空間改為只讀、BEGIN BACKUP或將某個資料檔案設定為OFFLINE等。

SELECT FILE#,CHECKPOINT_CHANGE#,TO_CHAR(CHECKPOINT_TIME,'YYYY-MM-DD HH24:MI:SS') CPTIME FROM V$DATAFILE;

(3)開始SCN、資料檔案頭SCN、START SCN

存在於各個資料檔案標頭檔案

SELECT FILE#,CHECKPOINT_CHANGE# FROM V$DATAFILE_HEADER;

即,檢查記錄在控制檔案中V$DATAFILE表CHECKPOINT_CHANGE#值和記錄在資料檔案頭中V$DATAFILE_HEADER表的CHECKPOINT_CHANGE#是否相同,不相同需要進行介質恢復。

2.第二次檢查資料檔案頭的開始SCN和控制檔案中記錄的該檔案的結束SCN是否一致,如果控制檔案中記錄的結束SCN等於資料檔案頭的開始SCN,則不需要對那個檔案進行恢復。

如果此前資料庫異常崩潰,則結束SCN會保持在最大值(無窮大),資料庫必須執行例項恢復以確保一致性。

對每個資料檔案都完成檢查後,開啟資料庫,鎖定資料檔案,同時將每個資料檔案的結束SCN設定為無窮大(稍後將詳細解釋這個過程)。

查詢語句如下:

(4)結束SCN(START SCN,END SCN)

儲存在控制檔案,主要用來檢查資料庫啟動過程中是否需要例項恢復。

當End SCN不等於START SCN,資料庫需要例項恢復。

SELECT FILE#,LAST_CHANGE# FROM V$DATAFILE;

即,檢查記錄在資料檔案頭中V$DATAFILE_HEADER表的CHECKPOINT_CHANGE#值和記錄在控制檔案中V$DATAFILE表LAST_CHANGE#是否一致,不相同需要進行例項恢復。


測試資料檔案offline。

SQL> select tablespace_name,file_id from dba_data_files order by 2;
TABLESPACE_NAME   FILE_ID
------------------------------ ----------
SYSTEM1
SYSAUX2
UNDOTBS13
USERS4
CJCTBS5
CHENTBS 6
6 rows selected.

執行offline

SQL> alter database datafile 5 offline;

手動生成檢查點

SQL> alter system checkpoint;

系統檢查點SCN、SYSTEM CHECKPOINT SCN

SQL> SELECT CHECKPOINT_CHANGE# FROM V$DATABASE;
CHECKPOINT_CHANGE#
------------------
   1056968

檔案檢查點SCN、Datafile Checkpoint SCN

可以看到FILE# 5的SCN不在更新。

SQL> SELECT FILE#,CHECKPOINT_CHANGE#,TO_CHAR(CHECKPOINT_TIME,'YYYY-MM-DD HH24:MI:SS') CPTIME FROM V$DATAFILE;
     FILE# CHECKPOINT_CHANGE# CPTIME
---------- ------------------ -------------------
 1      1056968 2022-10-15 14:03:51
 2      1056968 2022-10-15 14:03:51
 3      1056968 2022-10-15 14:03:51
 4      1056968 2022-10-15 14:03:51
 5      1056438 2022-10-15 13:58:08
 6      1056968 2022-10-15 14:03:51
6 rows selected.

開始SCN、資料檔案頭SCN、START SCN

OFFLINE檔案頭的SCN不在更新

SQL> SELECT FILE#,CHECKPOINT_CHANGE# FROM V$DATAFILE_HEADER;
     FILE# CHECKPOINT_CHANGE#
---------- ------------------
 1      1056968
 2      1056968
 3      1056968
 4      1056968
 5      1056438
 6      1056968
6 rows selected.

結束SCN(START SCN,END SCN)

SQL> SELECT FILE#,LAST_CHANGE# FROM V$DATAFILE;
     FILE# LAST_CHANGE#
---------- ------------
 1
 2
 3
 4
 51056893
 6
6 rows selected.



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

相關文章