راهنمای کامل حذف نود خراب از Oracle RAC و آماده‌سازی برای Switchover

سناریوی تست: حذف node3 / pars3 از کلاستر و دیتابیس pars


1) مشخصات محیط تست

کلاستر

  • Oracle RAC 19c
  • 3 نود:
    • node1
    • node2
    • node3 ← نود خراب/خاموش/خارج از دسترس

دیتابیس

  • DB_UNIQUE_NAME=pars
  • Administrator-Managed RAC Database
  • Instanceها:
    • pars1 روی node1
    • pars2 روی node2
    • pars3 روی node3

خانه‌ها

  • Grid Home:

  /u01/app/19c/grid

DB Home:

  /u01/app/oracle/product/19c/dbhome

هدف

حذف کامل ردپای node3 و pars3 از لایه‌های زیر:

  • Service configuration
  • RAC database instance config
  • redo thread
  • SPFILE parameters
  • listener/VIP
  • Clusterware / OCR
  • Oracle Inventory
  • Data Guard Broker (در صورت استفاده)

تا بعد از آن:

  • کلاستر 2 نودی سالم بماند
  • Switchover بدون گیر کردن روی RESOLVABLE GAP انجام شود

2) اصول مهم قبل از شروع

نکات Oracle

طبق مستند Oracle که فرستادید:

قبل از حذف instance:

باید این موارد بررسی/اصلاح شوند:

  1. اگر service دارید، relocate شوند
  2. serviceها طوری modify شوند که روی instanceهای باقی‌مانده اجرا شوند
  3. instance حذف‌شونده (pars3) نه preferred باشد نه available

قبل از حذف node:

  • OCR backup داشته باشید
  • اگر listener در RAC Home روی نود حذف‌شونده هست، disable/stop شود
  • اگر node pinned است، unpin شود
  • اگر VIP باقی مانده، حذف شود
  • node-specific config باید دستی پاک شود

3) خلاصه فازها


فاز 0: Precheck و Backup

فاز 1: بررسی و اصلاح Serviceها

فاز 2: حذف instance pars3 از RAC database config

فاز 3: غیرفعال کردن redo thread 3

فاز 4: پاک‌سازی پارامترهای instance-specific از SPFILE

فاز 5: حذف listener/VIP وابسته به node3

فاز 6: حذف node3 از Clusterware/OCR

فاز 7: اصلاح Inventory برای DB Home و Grid Home

فاز 8: صحت‌سنجی نهایی

فاز 9: پاک‌سازی Data Guard Broker

فاز 10: اجرای Switchover


فاز 0: Precheck و Backup


0.1 گرفتن OCR backup

دستور

ocrconfig -showbackup

ocrconfig -manualbackup

 ocrconfig -showbackup

خروجی:

[root@node1 ~]# ocrconfig -showbackup
PROT-24: Auto backups for the Oracle Cluster Registry are not available
PROT-25: Manual backups for the Oracle Cluster Registry are not available
[root@node1 ~]# ocrconfig -manualbackup

node2     2026/07/13 11:42:47     +DATA:/node-cluster/OCRBACKUP/backup_20260713_114247.ocr.258.1238499767     1191252804
[root@node1 ~]# ocrconfig -showbackup
PROT-24: Auto backups for the Oracle Cluster Registry are not available

node2     2026/07/13 11:42:47     +DATA:/node-cluster/OCRBACKUP/backup_20260713_114247.ocr.258.1238499767     1191252804

 

هدف

اگر در حذف node مشکلی پیش آمد، مرجع بازیابی داشته باشید.


0.2 بررسی وضعیت نودها

دستور

olsnodes -n -s -t

خروجی:

[root@node1 ~]# olsnodes -n -s -t
node1   1       Active  Unpinned
node2   2       Active  Unpinned
node3   3       Inactive        Unpinned

 

0.3 بررسی وضعیت دیتابیس و instanceها

دستور

srvctl config database -d pars
srvctl status database -d pars

 

خروجی:

Database unique name: pars
Database name: pars
Oracle home: /u01/app/oracle/product/19c/dbhome
Oracle user: oracle
Spfile: +DATADG/PARS/PARAMETERFILE/spfile.271.1238345915
Password file: +DATADG/PARS/PASSWORD/pwdpars.256.1238344301
Domain: vahiddb.com
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Server pools:
Disk Groups: FRADG,DATADG
Mount point paths:
Services: APP_SERVICE
Type: RAC
Start concurrency:
Stop concurrency:
OSDBA group: dba
OSOPER group: oper
Database instances: pars1,pars2,pars3
Configured nodes: node1,node2,node3
CSS critical: no
CPU count: 0
Memory target: 0
Maximum memory: 0
Default network number for database services:
Database is administrator managed

 

 

Instance pars1 is running on node node1
Instance pars2 is running on node node2
Instance pars3 is not running on node node3

 

0.4 بررسی threadها

دستور

SELECT thread#, status, enabled FROM v$thread ORDER BY thread#;

خروجی:

SQL> SELECT thread#, status, enabled FROM v$thread ORDER BY thread#;

   THREAD# STATUS ENABLED
---------- ------ --------
         1 OPEN   PUBLIC
         2 OPEN   PUBLIC
         3 CLOSED PUBLIC

 

فاز 1: بررسی و اصلاح Serviceها

طبق مستند Oracle، قبل از حذف instance باید مطمئن شویم هیچ serviceای به pars3 وابسته نیست.


1.1 مشاهده serviceها

دستور

srvctl config service -d pars
srvctl status service -d pars

1.2 اصلاح serviceها

دستور نمونه

srvctl modify service -d pars -s appsvc -preferred pars1,pars2

اگر Available هم داشته باشد:

srvctl modify service -d pars -s appsvc -preferred pars1,pars2 -available ""

1.3 اگر service روی pars3 بالا بوده، relocate/stop شود

دستور

srvctl stop service -d pars -s appsvc
srvctl start service -d pars -s appsvc

فاز 2: حذف instance pars3 از RAC Database Configuration

طبق Oracle:

از SRVCTL برای حذف instance استفاده کنید.

2.2 توقف instance حذف‌شونده

دستور

srvctl stop instance -d pars -i pars3 -f

2.3 حذف instance از config دیتابیس

دستور

srvctl remove instance -d pars -i pars3 -f

 

فاز 3: غیرفعال کردن Redo Thread 3

این مرحله برای سناریوی شما بحرانی است.

طبق مستند Oracle:

بعد از حذف instance، بررسی کنید redo thread حذف/غیرفعال شده باشد. اگر نه، آن را disable کنید.

SELECT thread#, status, enabled FROM v$thread ORDER BY thread#;

خروجی:

این یعنی thread 3 هنوز از دید control file فعال است.


3.2 Disable کردن thread 3

دستور

ALTER DATABASE DISABLE THREAD 3;

3.3 بررسی گروه‌های redo مربوط به thread 3

دستور

SELECT group#, thread#, status FROM v$log ORDER BY thread#, group#;

بعد از DISABLE THREAD، این گروه‌ها ممکن است هنوز در v$log دیده شوند، ولی thread باید غیرفعال باشد.

حالا آنهایی را که مربوط به thread 3  هست،  از دیتابیس drop می کنیم.

فاز 4: پاک‌سازی پارامترهای instance-specific از SPFILE

اگر pars3 در SPFILE پارامتر اختصاصی داشته باشد، باید حذف شود.


4.1 بررسی پارامترهای مربوط به pars3

دستور

SHOW PARAMETER instance_number
SHOW PARAMETER thread
SHOW PARAMETER undo_tablespace

برای بررسی دقیق‌تر:

SELECT sid, name, value
FROM gv$spparameter
WHERE sid='pars3'
  AND value IS NOT NULL
ORDER BY name;

خروجی:

pars3
instance_number
3

4.2 حذف پارامترها

دستور

ALTER SYSTEM RESET instance_number SCOPE=SPFILE SID='pars3';
ALTER SYSTEM RESET thread SCOPE=SPFILE SID='pars3';
ALTER SYSTEM RESET undo_tablespace SCOPE=SPFILE SID='pars3';

فاز 5: حذف Listener / VIP مربوط به node3

طبق مستند Oracle:

اگر listener در RAC Home روی node حذف‌شونده دارید، باید disable و stop شود.


5.1 بررسی listenerها

دستور

srvctl config listener
srvctl status listener

5.2 disable/stop listener روی node3

دستور

srvctl disable listener -l LISTENER -n node3
srvctl stop listener -l LISTENER -n node3

5.3 بررسی VIP نود 3

دستور

srvctl config vip -node node3

5.4 حذف VIP

دستور با کاربر root

srvctl stop vip -vip node3-vip
srvctl remove vip -vip node3-vip

فاز 6: حذف node3 از Clusterware / OCR


6.1 بررسی pinned بودن نود

دستور

olsnodes -s -t

خروجی:

[root@node1 ~]# olsnodes -n -s -t
node1   1       Active  Unpinned
node2   2       Active  Unpinned
node3   3       Inactive        Unpinned

 

6.2 حذف node از OCR / Cluster

دستور

crsctl delete node -n node3

خروجی:

[root@node1 ~]# crsctl delete node -n node3
CRS-4661: Node node3 successfully deleted.
[root@node1 ~]# olsnodes -s -t
node1   Active  Unpinned
node2   Active  Unpinned

فاز 7: اصلاح Oracle Inventory

نکته مهمی که در خروجی شما دیدیم این بود که inventory.xml مرکزی فقط HOMEها را نشان می‌دهد، نه node list را.

پس برای بررسی واقعی node membership باید inventory مربوط به home را چک کنید.

 

فاز 8: صحت‌سنجی نهایی RAC/DB


8.1 بررسی config دیتابیس

دستور

srvctl config database -d pars

8.2 بررسی status دیتابیس

دستور

srvctl status database -d pars

8.3 بررسی threadها

دستور

SELECT thread#, status, enabled FROM v$thread ORDER BY thread#;

8.4 بررسی serviceها

دستور

srvctl config service -d pars
srvctl status service -d pars

8.5 بررسی نودهای کلاستر

دستور

olsnodes -n -s -t

فاز 9: پاک‌سازی Data Guard Broker

اگر Broker استفاده می‌کنید، این مرحله مهم است.


9.1 بررسی وضعیت دیتابیس در Broker

دستور

dgmgrl /
show configuration;
show database verbose 'pars';

در صورتی که دستور validate network را بزنیم، همچنان مشکل وجود دارد:

DGMGRL> VALIDATE NETWORK CONFIGURATION FOR ALL;
Connecting to instance "pars2" on database "pars" ...
Connected to "pars"
Checking connectivity from instance "pars2" on database "pars" to instance "parsdc1" on database "parsdc1"...
Succeeded.
Checking connectivity from instance "pars2" on database "pars" to instance "parsdc2" on database "parsdc2"...
Succeeded.
Connecting to instance "pars1" on database "pars" ...
Connected to "pars"
Checking connectivity from instance "pars1" on database "pars" to instance "parsdc1" on database "parsdc1"...
Succeeded.
Checking connectivity from instance "pars1" on database "pars" to instance "parsdc2" on database "parsdc2"...
Succeeded.
Connecting to instance "pars3" on database "pars" ...
Unable to connect to database using (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=scan)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=pars.vahiddb.com)(CID=(PROGRAM=dgmgrl)(HOST=node1.vahiddb.com)(USER=oracle))(INSTANCE_NAME=pars3)))
ORA-12521: TNS:listener does not currently know of instance requested in connect descriptor

Failed.
[W000 2026-07-13T15:02:44.289+03:30] Failed to attach to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=scan)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=pars.vahiddb.com)(CID=(PROGRAM=dgmgrl)(HOST=node1.vahiddb.com)(USER=oracle))(INSTANCE_NAME=pars3))).
Warning: Cannot connect to instance "pars3" on database "pars".
Connecting to instance "parsdc1" on database "parsdc1" ...
Connected to "parsdc1"
Checking connectivity from instance "parsdc1" on database "parsdc1" to instance "pars2" on database "pars"...
Succeeded.
Checking connectivity from instance "parsdc1" on database "parsdc1" to instance "pars1" on database "pars"...
Succeeded.
Checking connectivity from instance "parsdc1" on database "parsdc1" to instance "pars3" on database "pars"...
ORA-12521: TNS:listener does not currently know of instance requested in connect descriptor
ORA-06512: at "SYS.DBMS_DRS", line 1851
ORA-06512: at line 1

  Connect Descriptor: (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = scan.vahiddb.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = pars.vahiddb.com)))

  Environment Variables:
             TNS_ADMIN:
           ORACLE_HOME: /u01/app/oracle/product/19c/dbhome
           ORACLE_BASE:
             GRID_HOME:

  Initialization Parameters:
        LOCAL_LISTENER:  (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.56.31)(PORT=1521))


Failed.
Checking connectivity from instance "parsdc1" on database "parsdc1" to instance "parsdc2" on database "parsdc2"...
Succeeded.
Connecting to instance "parsdc2" on database "parsdc2" ...
Connected to "parsdc2"
Checking connectivity from instance "parsdc2" on database "parsdc2" to instance "pars2" on database "pars"...
Succeeded.
Checking connectivity from instance "parsdc2" on database "parsdc2" to instance "pars1" on database "pars"...
Succeeded.
Checking connectivity from instance "parsdc2" on database "parsdc2" to instance "pars3" on database "pars"...
ORA-12521: TNS:listener does not currently know of instance requested in connect descriptor
ORA-06512: at "SYS.DBMS_DRS", line 1851
ORA-06512: at line 1

  Connect Descriptor: (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = scan.vahiddb.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = pars.vahiddb.com)))

  Environment Variables:
             TNS_ADMIN:
           ORACLE_HOME: /u01/app/oracle/product/19c/dbhome
           ORACLE_BASE:
             GRID_HOME:

  Initialization Parameters:
        LOCAL_LISTENER:  (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.56.32)(PORT=1521))


Failed.
Checking connectivity from instance "parsdc2" on database "parsdc2" to instance "parsdc1" on database "parsdc1"...
Succeeded.

Oracle Clusterware on database "pars" is available for database restart.

Oracle Clusterware on database "parsdc1" is available for database restart.

Oracle Clusterware on database "parsdc2" is available for database restart.

برای حل این مشکل، pars3  را از اینجا نیز حذف می کنیم:


DGMGRL> REMOVE INSTANCE 'pars3' ON DATABASE 'pars';
Removed instance "pars3" from database "pars"
 و چک مجدد
DGMGRL> VALIDATE NETWORK CONFIGURATION FOR ALL;
Connecting to instance "pars2" on database "pars" ...
Connected to "pars"
Checking connectivity from instance "pars2" on database "pars" to instance "parsdc1" on database "parsdc1"...
Succeeded.
Checking connectivity from instance "pars2" on database "pars" to instance "parsdc2" on database "parsdc2"...
Succeeded.
Connecting to instance "pars1" on database "pars" ...
Connected to "pars"
Checking connectivity from instance "pars1" on database "pars" to instance "parsdc1" on database "parsdc1"...
Succeeded.
Checking connectivity from instance "pars1" on database "pars" to instance "parsdc2" on database "parsdc2"...
Succeeded.
Connecting to instance "parsdc1" on database "parsdc1" ...
Connected to "parsdc1"
Checking connectivity from instance "parsdc1" on database "parsdc1" to instance "pars2" on database "pars"...
Succeeded.
Checking connectivity from instance "parsdc1" on database "parsdc1" to instance "pars1" on database "pars"...
Succeeded.
Checking connectivity from instance "parsdc1" on database "parsdc1" to instance "parsdc2" on database "parsdc2"...
Succeeded.
Connecting to instance "parsdc2" on database "parsdc2" ...
Connected to "parsdc2"
Checking connectivity from instance "parsdc2" on database "parsdc2" to instance "pars2" on database "pars"...
Succeeded.
Checking connectivity from instance "parsdc2" on database "parsdc2" to instance "pars1" on database "pars"...
Succeeded.
Checking connectivity from instance "parsdc2" on database "parsdc2" to instance "parsdc1" on database "parsdc1"...
Succeeded.

Oracle Clusterware on database "pars" is available for database restart.

Oracle Clusterware on database "parsdc1" is available for database restart.

Oracle Clusterware on database "parsdc2" is available for database restart.