Gần đây, một khách hàng đang sử dụng trình điều khiển ODBC SQL Server của chúng tôi để kết nối Oracle với SQL Server, đã báo cáo lỗi sau cho chúng tôi:
ORA-28545: error diagnosed by Net8 when connecting to an agent Unable to retrieve text of NETWORK/NCR message 65535 ORA-02063: preceding 2 lines from SQLSERVERLINK
Lỗi "catchall" này có thể xảy ra nếu:
- Môi trường không được đặt đúng cách (ví dụ:LD_LIBRARY_PATH không trỏ đến các thư mục thư viện unixODBC hoặc ODBCSYSINI không trỏ đến thư mục chứa bản sao của odbc.ini nơi ODBC DSN đích được xác định.)
- Thư viện DG4ODBC 64 bit đang được sử dụng với các thư viện ODBC 32 bit và ngược lại.
- SID được chỉ định trong cấu hình DG4ODBC của bạn không chạy trên máy chủ được chỉ định trong tnsnames.ora.
Tuy nhiên khi điều tra không có vấn đề nào trong số này được áp dụng. Chúng tôi nghi ngờ nguyên nhân là do vấn đề định cấu hình sai Oracle, bởi vì mặc dù gỡ lỗi DG4ODBC đã được bật nhưng không có tệp gỡ lỗi DG4ODBC nào được tạo, tức là Oracle không tải được thư viện DG4ODBC.
Trong những trường hợp như vậy, chúng tôi yêu cầu tệp cấu hình Oracle của khách hàng để chúng tôi có thể tái tạo thiết lập của họ, vì khó có thể phát hiện dấu ngoặc nhọn bị thiếu hoặc đặt sai vị trí trong tệp .ora.
Chúng tôi không thể tạo lại lỗi của khách hàng, các tệp cấu hình được cung cấp hoạt động hoàn hảo cho chúng tôi.
Bước tiếp theo là sử dụng strace
để xem xét "ẩn" tệp cấu hình nào đang được tải khi trình nghe Oracle đang được khởi động. Để làm điều này, chúng tôi đã yêu cầu khách hàng:
- Bắt đầu hai phiên shell với tư cách là người dùng Oracle.
- Trong trình bao 1, dừng trình nghe Oracle.
- Khởi động trình nghe bằng lệnh này:
strace -f -o /tmp/easysoft.log -s 512 lsnrctl start
- Trong shell 2, khởi động SQL * PLus và chạy câu lệnh SQL dựa vào liên kết cơ sở dữ liệu DG4ODBC / SQL Server.
- Trong trình bao 2, dừng trình nghe Oracle.
Nhật ký đi lạc, /tmp/easysoft.log, đã chỉ ra vấn đề cơ bản. Ban đầu, trình nghe Oracle có thể tải và đọc listener.ora:
53049 open("/u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora", O_RDONLY) = 3 53049 read(3, "#/u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora Network Configuration File: \n# Generated by Oracle configuration tools.\n\nLISTENER =\n (DESCRIPTION_LIST =\n (DESCRIPTION =\n (ADDRESS = (PROTOCOL = TCP)..., 4096) = 577
Tuy nhiên, thiết lập Oracle của khách hàng là:người dùng A khởi động trình nghe, người này trở thành người dùng B. Điều tiết lộ là người dùng B không có đủ quyền truy cập để tải tệp .ora đó:
53051 open("/u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora", O_RDONLY) = -1 EACCES (Permission denied)
Cuối cùng, đây là nguyên nhân của "ORA 02063" của khách hàng.