Подключение извне к оракулу в докер-контейнере вызывает проблемы

Мне нужно объяснение этой проблемы, которая у меня есть.

Я установил докер-контейнер с oracle 19 на свой Mac с процессором M1, следуя этому руководству: https://itnext.io/oracle-on-arm-mac-m1-m2-docker-images-99ed67ed6ba6

Докер-контейнер запущен и работает, и я могу подключиться к базе данных с помощью этой строки подключения:

jdbc:oracle:thin:@localhost:1521:ORCLCDB

Я использую для этого пользователя с именем «SYS as SYSDBA» и соответствующим паролем.

Насколько мне известно, также должна быть возможность подключения с использованием этой строки подключения:

jdbc:oracle:thin:@localhost:1521:orclpdb1

Здесь используется тот же пользователь.

Я получаю сообщение об ошибке: ORA-12505, TNS: прослушиватель в настоящее время не знает SID, указанный в дескрипторе подключения.

Я не понимаю, почему я получаю эту ошибку. Может кто-нибудь объяснить?

Это содержимое моего файла tnsnames.ora:

ORCLCDB=localhost:1521/ORCLCDB
ORCLPDB1= 
(DESCRIPTION = 
  (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
  (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = ORCLPDB1)
  )
)

Это результат: lsnrctl status:

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 02-MAY-2024 11:09:33

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

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date                02-MAY-2024 10:37:43
Uptime                    0 days 0 hr. 31 min. 50 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /opt/oracle/product/19c/dbhome_1/network/admin/listener.ora
Listener Log File         /opt/oracle/diag/tnslsnr/8f9c98887a34/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=8f9c98887a34)(PORT=5500))(Security=(my_wallet_directory=/opt/oracle/admin/ORCLCDB/xdb_wallet))(Presentation=HTTP)(Session=RAW))
Services Summary...
Service "175ff9ecdffe0bf1e063020011acc4b1" has 1 instance(s).
  Instance "ORCLCDB", status READY, has 1 handler(s) for this service...
Service "ORCLCDB" has 1 instance(s).
  Instance "ORCLCDB", status READY, has 1 handler(s) for this service...
Service "ORCLCDBXDB" has 1 instance(s).
  Instance "ORCLCDB", status READY, has 1 handler(s) for this service...
Service "orclpdb1" has 1 instance(s).
  Instance "ORCLCDB", status READY, has 1 handler(s) for this service...
The command completed successfully

и это вывод службы lsnrctl:

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 02-MAY-2024 11:21:50

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

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
Services Summary...
Service "175ff9ecdffe0bf1e063020011acc4b1" has 1 instance(s).
  Instance "ORCLCDB", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:1 refused:0 state:ready
         LOCAL SERVER
Service "ORCLCDB" has 1 instance(s).
  Instance "ORCLCDB", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:1 refused:0 state:ready
         LOCAL SERVER
Service "ORCLCDBXDB" has 1 instance(s).
  Instance "ORCLCDB", status READY, has 1 handler(s) for this service...
    Handler(s):
      "D000" established:0 refused:0 current:0 max:1022 state:ready
         DISPATCHER <machine: 8f9c98887a34, pid: 127>
         (ADDRESS=(PROTOCOL=tcp)(HOST=8f9c98887a34)(PORT=43941))
Service "orclpdb1" has 1 instance(s).
  Instance "ORCLCDB", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:1 refused:0 state:ready
         LOCAL SERVER
The command completed successfully

Это сетевые настройки моего докер-контейнера (?):

"NetworkSettings": {
        "Bridge": "",
        "SandboxID": "5350ff9f19145e9b4edac8d3bbfecb6d0d71dd8cbb926dfbbff5a5df650184fc",
        "SandboxKey": "/var/run/docker/netns/5350ff9f1914",
        "Ports": {
            "1521/tcp": [
                {
                    "HostIp": "0.0.0.0",
                    "HostPort": "1521"
                }
            ]
        },
        "HairpinMode": false,
        "LinkLocalIPv6Address": "",
        "LinkLocalIPv6PrefixLen": 0,
        "SecondaryIPAddresses": null,
        "SecondaryIPv6Addresses": null,
        "EndpointID": "2ab49d1627fa8f9b3f332530bfdd01f70625ff48eb86d35dc2435b21281aa522",
        "Gateway": "172.17.0.1",
        "GlobalIPv6Address": "",
        "GlobalIPv6PrefixLen": 0,
        "IPAddress": "172.17.0.2",
        "IPPrefixLen": 16,
        "IPv6Gateway": "",
        "MacAddress": "02:42:ac:11:00:02",
        "Networks": {
            "bridge": {
                "IPAMConfig": null,
                "Links": null,
                "Aliases": null,
                "MacAddress": "02:42:ac:11:00:02",
                "NetworkID": "937f9ef40dec7144bd373b8505b7611207c1f8f699620288b81c0923d3cec830",
                "EndpointID": "2ab49d1627fa8f9b3f332530bfdd01f70625ff48eb86d35dc2435b21281aa522",
                "Gateway": "172.17.0.1",
                "IPAddress": "172.17.0.2",
                "IPPrefixLen": 16,
                "IPv6Gateway": "",
                "GlobalIPv6Address": "",
                "GlobalIPv6PrefixLen": 0,
                "DriverOpts": null,
                "DNSNames": null
            }
        }
    }

Если я запустил ifconfig на хост-компьютере, то это IP-адрес: 172.17.10.58.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я могу объяснить.

  • Подключиться по SID: host:port:SID
  • Подключиться через SERVICE_NAME host:port/SERVICE_NAME

Все это сводится к SID <> SERVICE_NAME.... но и SID, и SERVICE_NAME могут иметь одно и то же значение, но являются разными конструкциями. Так что это сбивает с толку.

SID (System IDentifier) ​​обозначает сам экземпляр базы данных, к которому необходимо подключиться. Если у вас есть кластер БД из 8 узлов, вы каждый раз будете попадать в одну конечную точку экземпляра host:1521:(memory+process). Если вы отключите этот узел, ваши клиенты больше не смогут подключиться. Таким образом, подключение по SID не способствует доступности.

SERVICE_NAME — это абстрактная конструкция, в которой вы можете скрыть чудовище кластера БД, обслуживающего этот SERVICE_NAME. SERVICE_NAME также может иметь множество свойств для высокой доступности (тайм-ауты, повторные попытки, повтор передачи и т. д.). Подключаемая база данных всегда будет отображать свое имя как SERVICE_NAME. Это можно использовать в целях администратора, но не в любом приложении.

Но для большинства ванильных тестовых сред у вас есть только один экземпляр, и подключение по SID будет работать. Но около 20 лет назад Oracle не одобряла этого.... Итак, НИКОГДА не следует подключаться по SID, если только у вас нет очень неудобного приложения, которое не поддерживает SERVICE_NAME.

В вашем конкретном случае используйте (порт по умолчанию 1521, его можно не указывать):

jdbc:oracle:thin:@localhost/orclpdb1

Только CDB ORCLCDB определяется/идентифицируется памятью+процессом, поэтому вы можете подключиться к нему по SID. Ваша PDB orclpdb1 обслуживается памятью+процессом CDB ORCLCDB и доступна только для SERVICE_NAME. Это мультиарендная архитектура базы данных Oracle.

Удачи!

Спасибо. Я не знал разницы между SID и именем службы. Теперь у меня есть связь.

Rob The Ranger 04.05.2024 07:30

Другие вопросы по теме