Мне нужно объяснение этой проблемы, которая у меня есть.
Я установил докер-контейнер с 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.
Я могу объяснить.
host:port:SID
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 и именем службы. Теперь у меня есть связь.