سناریوی تست: حذف node3 / pars3 از کلاستر و دیتابیس pars
1) مشخصات محیط تست
کلاستر
- Oracle RAC 19c
- 3 نود:
node1node2node3← نود خراب/خاموش/خارج از دسترس
دیتابیس
DB_UNIQUE_NAME=pars- Administrator-Managed RAC Database
- Instanceها:
pars1رویnode1pars2رویnode2pars3روی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:
باید این موارد بررسی/اصلاح شوند:
- اگر service دارید، relocate شوند
- serviceها طوری modify شوند که روی instanceهای باقیمانده اجرا شوند
- 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.