Thứ Ba, 28 tháng 7, 2026

[Case khó] Bật listener trong grid không lên

[Case khó] Bật listener trong grid không lên

1.VẤN ĐỀ

2.NGUYÊN NHÂN

Tham sô trong /etc/hosts không hợp lý

3.GIẢI PHÁP

Trace: strace -f -o /tmp/lsnr_trace.log /u01/app/11.2.0/grid/bin/lsnrctl start, sau đó dùng claude phân tích

Sửa file /etc/hosts, bỏ rào chỗ 127.0.0.1

Bật lại

(grid)$lsnrctl start

Check lại:

[grid@vietdb02 ~]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 28-JUL-2026 02:46:35

Copyright (c) 1991, 2013, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.4.0 - Production
Start Date                28-JUL-2026 02:31:05
Uptime                    0 days 0 hr. 15 min. 30 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/11.2.0/grid/network/admin/listener.ora
Listener Log File         /u01/app/11.2.0/grid/log/diag/tnslsnr/vietdb02/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.0.23.35)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.0.23.37)(PORT=1521)))
Services Summary...
Service "+ASM" has 1 instance(s).
  Instance "+ASM2", status READY, has 1 handler(s) for this service...
Service "vietdbcloud" has 1 instance(s).
  Instance "vietdb2", status READY, has 1 handler(s) for this service...
The command completed successfully

--PHỤ LỤC: KẾT QUẢ PHÂN TÍCH TỪ CHATGPT PRO---

Kết luận nguyên nhân từ lsnr_trace.log

Tôi đã đọc chuỗi strace của lần chạy:

/u01/app/11.2.0/grid/bin/lsnrctl start

Nguyên nhân trực tiếp làm Listener node golddrdb02 khởi động thất bại là:

Tiến trình Listener không phân giải được tên localhost; tiến trình ONS runtime bên trong Listener thoát lỗi, làm tnslsnr kết thúc và lsnrctl nhận TNS-12547: TNS:lost contact.

Bằng chứng quyết định ở cuối trace:

sendto(... DNS query "localhost" ... 127.0.0.1:53)
= -1 ECONNREFUSED

Unable to resolve address for localhost
ONS runtime exiting
exit_group(-1)

TNS-12547: TNS:lost contact
TNS-12560: TNS:protocol adapter error
TNS-00517: Lost contact

Trace cũng cho thấy file /etc/hosts được đọc, nhưng dòng đầu bắt đầu bằng:

#127.0.0.1   localhost ...

nghĩa là ánh xạ localhost có khả năng đang bị comment. Sau đó hệ thống chuyển sang DNS; /etc/resolv.conf trỏ DNS về 127.0.0.1, nhưng trên máy không có DNS service lắng nghe cổng 53 nên trả về ECONNREFUSED.


1. Chuỗi lỗi chính xác

Listener khởi động
   ↓
Tạo local socket sLISTENER thành công
   ↓
Bắt đầu ONS runtime
   ↓
Cần phân giải tên localhost
   ↓
/etc/hosts không trả về do localhost bị comment/không hợp lệ
   ↓
Resolver hỏi DNS 127.0.0.1:53
   ↓
Không có DNS local → Connection refused
   ↓
Unable to resolve address for localhost
   ↓
ONS runtime exiting
   ↓
tnslsnr thoát mã 255
   ↓
lsnrctl mất kết nối với child process
   ↓
TNS-12547: TNS:lost contact

2. Nguyên nhân gốc

2.1. /etc/hosts thiếu ánh xạ hợp lệ cho localhost

Trace đọc:

"#127.0.0.1   localhost localhost..."

Dấu # đứng trước 127.0.0.1 cho thấy dòng localhost đã bị comment.

Cấu hình đúng tối thiểu phải có:

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

Đây là nguyên nhân chính cần sửa đầu tiên.


2.2. /etc/resolv.conf trỏ nameserver về 127.0.0.1 nhưng DNS local không chạy

Trace cho thấy truy vấn DNS được gửi tới:

127.0.0.1:53

và nhận:

ECONNREFUSED

Có hai khả năng:

  • /etc/resolv.conf chứa:
nameserver 127.0.0.1

nhưng named, dnsmasq hoặc local resolver không chạy;

  • hoặc local DNS service đã bị tắt sau reboot/sự cố.

Tuy nhiên, dù DNS có lỗi, localhost vẫn phải được giải quyết qua /etc/hosts. Do đó sửa /etc/hosts là hành động ưu tiên.


3. Các cảnh báo khác trong trace

3.1. Socket cũ /var/tmp/.oracle/sLISTENER

Trace có:

bind(... /var/tmp/.oracle/sLISTENER)
= -1 EADDRINUSE

connect(...)
= -1 ECONNREFUSED

unlink("/var/tmp/.oracle/sLISTENER") = 0
bind(...) = 0
listen(...) = 0

Đây là một stale Unix socket còn sót lại sau khi Listener chết hoặc node bị eviction.

Listener đã tự xử lý:

  1. Phát hiện socket tồn tại.
  2. Kết nối thử nhưng bị từ chối.
  3. Xóa socket cũ.
  4. Bind lại thành công.

Vì vậy đây không phải nguyên nhân cuối cùng làm Listener thất bại.


3.2. Không đổi được quyền thư mục /var/tmp/.oracle

Trace có:

chmod("/var/tmp/.oracle", 01777)
= -1 EPERM

User grid không phải owner của thư mục nên không được chmod.

Nhưng ngay sau đó Listener vẫn:

bind sLISTENER = 0
chmod sLISTENER = 0
listen = 0

Do đó EPERM này chưa phải lỗi quyết định.

Tuy nhiên cần kiểm tra ownership và mode của thư mục:

ls -ld /var/tmp/.oracle

Kỳ vọng thường là:

drwxrwxrwt root root /var/tmp/.oracle

hoặc cấu hình quyền phù hợp do Oracle tạo.


3.3. listener.log đang quá lớn

Trace cho thấy:

listener.log size=37152276908

Tương đương khoảng 37 GB.

Đây là vấn đề vận hành nghiêm trọng, dù chưa phải nguyên nhân trực tiếp trong lần start này.

Hậu quả có thể gồm:

  • Đầy filesystem /u01.
  • I/O tăng cao.
  • Listener start/stop chậm.
  • ADRCI purge lâu.
  • Khó tìm kiếm log.
  • Ảnh hưởng Clusterware nếu /u01 đầy.

4. Biện pháp xử lý ngay

Bước 1 — Backup và sửa /etc/hosts

Chạy bằng root:

cp -p /etc/hosts /etc/hosts.$(date +%Y%m%d_%H%M%S).bak

Kiểm tra:

grep -nE 'localhost|golddrdb01|golddrdb02' /etc/hosts

Bảo đảm có tối thiểu:

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

Đồng thời kiểm tra các hostname RAC:

10.0.23.xx   golddrdb01
10.0.23.35   golddrdb02
10.0.23.xx   golddrdb01-vip
10.0.23.37   golddrdb02-vip

Private IP cũng nên nhất quán theo thiết kế:

192.168.100.xx   golddrdb01-priv
192.168.100.51   golddrdb02-priv

Không map hostname chính về 127.0.0.1.


Bước 2 — Kiểm tra name resolution

getent hosts localhost
getent ahosts localhost
ping -c 2 localhost

Kết quả mong đợi:

127.0.0.1 localhost

Kiểm tra hostname local:

hostname
hostname -f
getent hosts golddrdb02
getent hosts golddrdb02-vip

Bước 3 — Kiểm tra nsswitch.conf

grep '^hosts:' /etc/nsswitch.conf

Khuyến nghị:

hosts: files dns

files phải đứng trước dns để /etc/hosts được tra cứu trước.

Nếu đang là:

hosts: dns files

thì khi DNS local lỗi, việc phân giải tên sẽ bị chậm hoặc thất bại trước khi đọc hosts.


Bước 4 — Kiểm tra /etc/resolv.conf

cat /etc/resolv.conf

Nếu có:

nameserver 127.0.0.1

kiểm tra local DNS:

netstat -lntup | grep ':53'
ps -ef | egrep 'named|dnsmasq|unbound' | grep -v grep

Nếu không chạy local DNS, cần:

  • thay bằng DNS server thật của doanh nghiệp; hoặc
  • khởi động lại local resolver nếu hệ thống chủ đích dùng nó.

Không cần DNS để resolve localhost nếu /etc/hosts đúng.


Bước 5 — Kiểm tra /var/tmp/.oracle

ls -ld /var/tmp/.oracle
ls -la /var/tmp/.oracle | head -50

Kiểm tra process Listener:

ps -ef | grep [t]nslsnr

Nếu không có Listener chạy nhưng còn stale socket:

find /var/tmp/.oracle -maxdepth 1 \
-name 'sLISTENER*' -ls

Chỉ xóa socket cũ khi đã xác nhận không có Listener tương ứng:

rm -f /var/tmp/.oracle/sLISTENER

Không xóa toàn bộ /var/tmp/.oracle.

Khôi phục quyền thư mục nếu sai:

chown root:root /var/tmp/.oracle
chmod 1777 /var/tmp/.oracle

Trước khi áp dụng, nên so sánh với node 1 đang hoạt động tốt:

ls -ld /var/tmp/.oracle

Bước 6 — Xử lý listener log 37 GB

Kiểm tra filesystem:

df -h /u01
du -sh \
/u01/app/11.2.0/grid/log/diag/tnslsnr/golddrdb02/listener

Không nên xóa file khi Listener đang giữ file descriptor mà chưa kiểm tra.

Sau khi Listener đang offline, có thể archive:

cd /u01/app/11.2.0/grid/log/diag/tnslsnr/golddrdb02/listener/trace

mv listener.log \
listener.log.$(date +%Y%m%d_%H%M%S)
touch listener.log
chown grid:oinstall listener.log
chmod 640 listener.log

Hoặc dùng ADRCI purge:

adrci
show homes
set home diag/tnslsnr/golddrdb02/listener
show control
purge -age 10080 -type TRACE
purge -age 10080 -type ALERT

10080 phút tương đương 7 ngày.

Kiểm tra lại dung lượng:

df -h /u01

Bước 7 — Start Listener đúng cách

Với RAC Listener do Clusterware quản lý, dùng user grid:

su - grid
export ORACLE_HOME=/u01/app/11.2.0/grid
export PATH=$ORACLE_HOME/bin:$PATH

Start bằng srvctl:

srvctl start listener -n golddrdb02

Kiểm tra:

srvctl status listener
crsctl status resource ora.LISTENER.lsnr -t
lsnrctl status LISTENER

Trạng thái mong đợi:

ora.LISTENER.lsnr
ONLINE ONLINE golddrdb02

5. Nếu Listener vẫn chưa lên

Chạy:

lsnrctl start LISTENER

Đồng thời kiểm tra:

tail -100 \
/u01/app/11.2.0/grid/log/diag/tnslsnr/golddrdb02/listener/trace/listener.log
tail -100 \
/u01/app/11.2.0/grid/log/diag/tnslsnr/golddrdb02/listener/alert/log.xml

Agent log:

grep -iE \
'LISTENER|TNS-|failed|error|timeout' \
/u01/app/11.2.0/grid/log/golddrdb02/agent/crsd/oraagent_grid/oraagent_grid.log |
tail -200

Kiểm tra port:

netstat -lntp | grep 1521

Kiểm tra listener configuration:

cat /u01/app/11.2.0/grid/network/admin/listener.ora

6. Biện pháp phòng ngừa

6.1. Chuẩn hóa /etc/hosts trên cả hai node

Tạo checksum định kỳ:

md5sum /etc/hosts /etc/nsswitch.conf /etc/resolv.conf

So sánh hai node:

ssh golddrdb01 md5sum \
/etc/hosts /etc/nsswitch.conf /etc/resolv.conf

ssh golddrdb02 md5sum \
/etc/hosts /etc/nsswitch.conf /etc/resolv.conf

Cảnh báo khi có thay đổi ngoài kế hoạch.


6.2. Kiểm tra name resolution hằng ngày

getent hosts localhost
getent hosts golddrdb01
getent hosts golddrdb02
getent hosts golddrdb01-vip
getent hosts golddrdb02-vip

Nếu một tên không resolve đúng, cảnh báo ngay trước khi Clusterware hoặc Listener bị ảnh hưởng.


6.3. Giám sát DNS local

Nếu dùng nameserver 127.0.0.1, cần monitor:

netstat -lnup | grep ':53'

Cảnh báo khi:

  • port 53 không listen;
  • named/dnsmasq dừng;
  • query timeout;
  • local resolver restart.

6.4. Quản lý log Listener bằng ADRCI

Thiết lập purge định kỳ, ví dụ giữ 14–30 ngày tùy yêu cầu vận hành.

Kiểm tra retention:

adrci exec="
set home diag/tnslsnr/golddrdb02/listener;
show control"

Purge định kỳ:

adrci exec="
set home diag/tnslsnr/golddrdb02/listener;
purge -age 20160 -type TRACE;
purge -age 20160 -type ALERT"

20160 phút tương đương 14 ngày.

Giám sát:

find /u01/app/11.2.0/grid/log/diag/tnslsnr \
-type f -size +5G -ls

6.5. Cảnh báo filesystem

Thiết lập cảnh báo:

Mức sử dụng /u01Mức cảnh báo
≥ 75%Warning
≥ 85%Major
≥ 90%Critical
≥ 95%Emergency

Lệnh kiểm tra:

df -P /u01

6.6. Không khởi động Listener thủ công thường xuyên

Trong RAC, dùng:

srvctl start listener
srvctl stop listener
srvctl status listener

Không dùng lsnrctl start như cách vận hành chính vì có thể làm lệch trạng thái Clusterware.

lsnrctl chỉ nên dùng để:

  • chẩn đoán;
  • xem status/services;
  • start thử có kiểm soát khi điều tra.

7. Những dòng không phải nguyên nhân gốc

Các dòng sau không phải nguyên nhân cuối cùng:

ENOENT libclntsh trong thư mục tls/x86_64
ENOENT libdl.so.2 trong GRID_HOME
ENOENT /var/run/nscd/socket
ENOENT /etc/hostid

Đây chủ yếu là quá trình dynamic loader hoặc name service thử nhiều vị trí rồi fallback sang thư viện hệ thống.

Ví dụ:

open GRID_HOME/lib/libdl.so.2 = ENOENT
open /lib64/libdl.so.2 = success

Nên không phải lỗi thư viện.


8. RCA tóm tắt

Sự kiện

Listener local trên golddrdb02 ở trạng thái:

TARGET ONLINE
STATE  OFFLINE

Nguyên nhân trực tiếp

ONS runtime của tnslsnr không phân giải được địa chỉ localhost và thoát lỗi.

Nguyên nhân gốc

  • Dòng 127.0.0.1 localhost trong /etc/hosts bị comment hoặc thiếu.
  • Resolver chuyển sang DNS 127.0.0.1.
  • Không có DNS service hoạt động trên cổng 53 localhost.

Yếu tố góp phần

  • Stale socket /var/tmp/.oracle/sLISTENER.
  • Quyền /var/tmp/.oracle cần chuẩn hóa.
  • listener.log đã tăng lên khoảng 37 GB.
  • Chưa có giám sát thay đổi /etc/hosts và name resolution.

Hành động ưu tiên

# root
cp -p /etc/hosts /etc/hosts.bak.$(date +%Y%m%d_%H%M%S)

# Bổ sung / bỏ comment:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1       localhost localhost.localdomain localhost6 localhost6.localdomain6

getent hosts localhost
grep '^hosts:' /etc/nsswitch.conf
cat /etc/resolv.conf
netstat -lnup | grep ':53'

# grid
srvctl start listener -n golddrdb02
srvctl status listener
lsnrctl status LISTENER

Kết luận cuối: Listener không thất bại vì VIP, port 1521 hoặc thư viện Oracle. Lỗi quyết định là localhost không resolve được, làm ONS runtime thoát, kéo theo tnslsnr chết và trả về TNS-12547. Ngoài ra cần xử lý ngay file listener.log khoảng 37 GB để tránh sự cố đầy /u01.


=============================
TƯ VẤN: Click Here hoặc Hotline/Zalo 090.29.12.888
=============================
Website không chứa bất kỳ quảng cáo nào, mọi đóng góp để duy trì phát triển cho website (donation) xin vui lòng gửi về STK 90.2142.8888 - Ngân hàng Vietcombank Thăng Long - TRAN VAN BINH
=============================
Nếu bạn không muốn bị AI thay thế và tiết kiệm 3-5 NĂM trên con đường trở thành DBA chuyên nghiệp hay làm chủ Database thì hãy đăng ký ngay KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE, được Coaching trực tiếp từ tôi với toàn bộ bí kíp thực chiến, thủ tục, quy trình của gần 20 năm kinh nghiệm (mà bạn sẽ KHÔNG THỂ tìm kiếm trên Internet/Google) từ đó giúp bạn dễ dàng quản trị mọi hệ thống Core tại Việt Nam và trên thế giới, đỗ OCP.
- CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
- Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
2 khóa học online qua video giúp bạn nhanh chóng có những kiến thức nền tảng về Linux, Oracle, học mọi nơi, chỉ cần có Internet/4G:
- Oracle cơ bản: https://bit.ly/admin_1200
- Linux: https://bit.ly/linux_1200
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
cơ sở dữ liệu, cơ sở dữ liệu quốc gia, database, AI, trí tuệ nhân tạo, artificial intelligence, machine learning, deep learning, LLM, ChatGPT, DeepSeek, Grok, oracle tutorial, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,sql tutorial, khóa học pl/sql tutorial, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c/21c/23c/23ai, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail,oracle RAC, ASM, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, postgresql tutorial, mysql tutorial, mariadb tutorial, ms sql server tutorial, nosql, mongodb tutorial, oci, cloud, middleware tutorial, docker, k8s, micro service, hoc solaris tutorial, hoc linux tutorial, hoc aix tutorial, unix tutorial, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master