歡迎光臨
每天分享高質量文章

故障診斷:SLES12平臺資料庫啟動失敗ORA-27300

點擊▲關註 “資料和雲”   給公眾號標星置頂

更多精彩 第一時間直達

作者
| 張維照,雲和恩墨技術專家,Oracle ACEA,2006年起從事資料庫管理工作,2009年轉 Oracle,從事過多套 TB
級省級工商、醫療、交通、人社、電信運營等資料庫維護優化工作,擅長Oracle
資料庫性能問題的分析與解決,Oracle資料庫故障分析,Oracle資料庫升級遷移。

 

近日新裝的一套ORACLE 12.2  RAC on SLES 12在使用srvctl start database 有時失敗,
alert log 中出現ORA-27300、ORA-27301、ORA-27302錯誤, 從錯誤不難看出是OS資源資源限制,
這可能以後使用SUSE的用戶會是個常見問題, 因為這是SLES
12的預設引數限制,而且ORACLE的安裝文件和最佳實踐中也未提到該引數(至少當前沒有找到)。

 

警告日誌:

2018-11-19 09:29:03.940000 +08:00
Process P01E died, see its trace file
Process startup failed, error stack:
Errors in file /oracle/app/oracle/diag/rdbms/anbob/anbob1/trace/anbob1_psp0_32198.trc:
ORA-27300: OS system dependent operation:fork failed with status: 11
ORA-27301: OS failure message: Resource temporarily unavailable
ORA-27302: failure occurred at: skgpspawn3
2018-11-19 09:29:04.940000 +08:00
Process P01F died, see its trace file
Process startup failed, error stack:
Errors in file /oracle/app/oracle/diag/rdbms/anbob/anbob1/trace/anbob1_psp0_32198.trc:
ORA-27300: OS system dependent operation:fork failed with status: 11
ORA-27301: OS failure message: Resource temporarily unavailable
ORA-27302: failure occurred at: skgpspawn3

 

註意:
從當前的錯誤fork failed with status: 11可以大概猜測是最大行程數限制導致fork()行程時失敗, 另外一處是psp0行程fork() Pnnn的行程。

 

PSP 追蹤檔案

[email protected]:/home/oracle> vi /oracle/app/oracle/diag/rdbms/anbob/anbob1/trace/anbob1_psp0_32198.trcTrace file /oracle/app/oracle/diag/rdbms/anbob/anbob1/trace/anbob1_psp0_32198.trcOracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit ProductionBuild label:    RDBMS_12.2.0.1.0_LINUX.X64_170125ORACLE_HOME:    /oracle/app/oracle/product/12.2.0/db_1System name:    LinuxNode name:      kdanbob01Release:        4.4.21-69-defaultVersion:        #1 SMP Tue Oct 25 10:58:20 UTC 2016 (9464f67)Machine:        x86_64Instance name: anbob1Redo thread mounted by this instance: 0 Oracle process number: 4Unix process pid: 32198, image: [email protected] (PSP0)
*** 2018-11-19T09:15:26.133868+08:00Process startup failed, error stack:ORA-27300: OS system dependent operation:fork failed with status: 11ORA-27301: OS failure message: Resource temporarily unavailableORA-27302: failure occurred at: skgpspawn3OS - DIAGNOSTICS----------------loadavg : 42.40 27.56 11.09Memory (Avail / Total) = 176425.47M / 515676.77MSwap (Avail / Total) = 32768.00M /  32768.00MMax user processes limits(s / h) =  65536 / 65536
[email protected]:/home/oracle> ulimit -acore file size (blocks, -c) 0data seg size (kbytes, -d) unlimitedscheduling priority (-e) 0file size (blocks, -f) unlimitedpending signals (-i) 2062629max locked memory (kbytes, -l) unlimitedmax memory size (kbytes, -m) unlimitedopen files (-n) 65536pipe size (512 bytes, -p) 8POSIX message queues (bytes, -q) 819200real-time priority (-r) 0stack size (kbytes, -s) 10240cpu time (seconds, -t) unlimitedmax user processes (-u) 16384virtual memory (kbytes, -v) unlimitedfile locks (-x) unlimited

 

什麼是PSP流程?

The first process that will be started when we start instance is PSP
process. This is called PROCESS SPAWNER. This process is introduced in
10g and is responsible for creating and managing other oracle backgroung
processes.

 

Pnnn行程都知道是並行行程,查看並行相關的引數

SQL> show parameter parallel

PARAMETER_NAME                                               TYPE        VALUE
------------------------------------------------------------ ----------- ---------------------------------
containers_parallel_degree                                   integer     65535
fast_start_parallel_rollback                                 string      LOW
parallel_adaptive_multi_user                                 boolean     FALSE
parallel_degree_limit                                        string      CPU
parallel_degree_policy                                       string      MANUAL
parallel_execution_message_size                              integer     16384
parallel_force_local                                         boolean     TRUE
parallel_instance_group                                      string
parallel_max_servers                                         integer     60
parallel_min_percent                                         integer     0
parallel_min_servers                                         integer     60
parallel_min_time_threshold                                  string      AUTO
parallel_servers_target                                      integer     60
parallel_threads_per_cpu                                     integer     2
recovery_parallelism                                         integer     8
SQL> @pd containers_parallel_degree
Show all parameters and session values from x$ksppi/x$ksppcv...

      INDX I_HEX NAME                            VALUE                          DESCRIPTION
---------- ----- ------------------------------ ------------------------------ ---------------------------------------
      4749  128D containers_parallel_degree     65535                          Parallel degree for a CONTAINERS() query

 

提示:
開始我以為是12cR2 新特性導致的該問題,containers_parallel_degree
當使用containers()查詢或打開PDB時並行度的上限值, 當前環境是個非CDB樣式的資料庫, 不過我個人還是建議在12.2
中使用多租戶,哪怕是1PDBs, 在19c NO-CDB都是NO supperted。
如果只是因為是不想用CDB而多SCHEMA樣式,我認為CDB優點更多:

言歸正傳回到剛纔的問題,trace檔案中提示系統max user process是65536, oracle用戶限制是16384,
這些引數配置可以通過/etc/security/limits.conf修改,通過ulimit -a命令驗證,
手動ps了一下oracle和grid用戶行程根本沒有那麼(少於400), 在MOS中找到一篇符合這個問題的NOTE ,  SLES 12:
Database Startup Error with ORA-27300 ORA-27301 ORA-27303 While Starting
using Srvctl (文件 ID 2340986.1)

From SLES12 onwards, systemd is used instead of initd and the OHASD server is only allowed to open a maximum of 512 tasks.

SYSTEMD從SLES12後用Systemd 取代 SysV的Init, 有SYSTEMD init程式管理
OHASD服務,SYSTEMD也就是PID=1的那個程式,有它來統一管理啟動,也是為了標準化系統啟動和管理,可以並行啟動等優點加快了啟動速度,但是SYSTEMD是一個很受爭議的東西,因為很多過去系統命令不得不放棄重新學習,有些人反對為了那一點啟動上的提升而引入了這個一個體積龐大的強耦合程式,違背了”keep
simple, keep stupid”的
Unix 哲學,知乎上有篇吐槽Systemd的貼子,但是在新版LINUX上是主推Systemd。同樣LINUX 7以後同樣預設也是使用Systemd init啟動程式。

 

在LINUX 6及以前的版本查’max user processes’ 使用 ‘ulimit -a’ ,但是以LINUX7(SLES12)
後引入了Systemd, Systemd可以管理所有系統資源,不同的資源統稱為Unit,  以後就可能需要查DefaultTasksMax
(default value is 512).

DefaultTasksMax   ==>systemd limited maximum number of
tasks that may be created in the unit.This setting also effect maxpid
value on OS.

 

$  >  systemctl status ohasd
● ohasd.service – LSB: Start and Stop Oracle High Availability Service
Loaded: loaded (/etc/init.d/ohasd; bad; vendor preset: disabled)
Active: active (exited) since Mon 2018-11-19 11:36:59 CST; 23h ago
Docs: man:systemd-sysv-generator(8)
Process: 12385 ExecStart=/etc/init.d/ohasd start (code=exited, status=0/SUCCESS)
Tasks: 726 (limit: 65535) — 這個值在修改前應該是512

 

解決辦法

Configure the value of DefaultTasksMax to 65535 in the
file /etc/systemd/system.conf or or set the TasksMax value properly for
the ohasd systemd service.

 

 

這裡我們使用的解決方法是修改/etc/systemd/system.conf  把DefaultTasksMax改成 了65535,當然也可以直接改成’infinity’ 無限。修改引數需要重啟操作系統生效。

 

建議在SLSE 12或以後的版本,或LINUX 7等以後的版本時,先瞭解一下系統變化,對於過去版本中資源限制如:nproc
、nofile、memlock
在以後OS版本中有DefaultTasksMax、DefaultLimitNOFILE、DefaultLimitMEMLOCK替代,
可能Oracle 在以後的安裝文件或最佳實踐中會增加該內容。

 

原創:張維照

    赞(0)

    分享創造快樂