[Case khó] Bật listener trong grid không lên
1.VẤN ĐỀ
2.NGUYÊN NHÂN
3.GIẢI PHÁP
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àmtnslsnrkết thúc vàlsnrctlnhậnTNS-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.confchứ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ý:
- Phát hiện socket tồn tại.
- Kết nối thử nhưng bị từ chối.
- Xóa socket cũ.
- 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/dnsmasqdừ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 /u01 | Mứ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 localhosttrong/etc/hostsbị 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/.oraclecầ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/hostsvà 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