یکی دیگر از قابلیتهای جدید دیتابیس اوراکل در نسخه 23c، ابزار ConnStr است این ابزار خروجی لاگ listener را خوانده و بر اساس آن، برای هر کدام از سرویسها، connection string را به فرمتهای Easy Connect، JDBC و Python نمایش می دهد. علاوه بر آن، این ابزار می تواند برای هر کدام از سرویسها، net service nameای را در فایل tnsnames.ora ایجاد کند.
در حالت پیش فرض اگر سرویس listener پایین باشد، اجرای دستور ConnStr به خطا خواهد خورد:
[oracle@OEL8 ~]$ lsnrctl stop LSNRCTL for Linux: Version 23.0.0.0.0 - Developer-Release on 05-SEP-2023 13:30:35 Copyright (c) 1991, 2023, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST= OEL8)(PORT=1521))) The command completed successfully
[oracle@OEL8 ~]$ connstr Using Listener: LISTENER with Oracle Home: /opt/oracle/product/23c/dbhomeFree No listener endpoints found
بعد از استارت listener، اگر سرویسی رجیستر نشده باشد، ConnStr پیغام The listener supports no services را نمایش می دهد:
[oracle@OEL8 ~]$ lsnrctl start The listener supports no services The command completed successfully
[oracle@OEL8 ~]$ connstr Using Listener: LISTENER with Oracle Home: /opt/oracle/product/23c/dbhomeFree The listener supports no services
همانطور که می دانید، بعد از انتظار چند ثانیه ای، LREG همه سرویسها را به صورت خودکار روی پورت 1521 رجیستر خواهد کرد:
[oracle@OEL8 ~]$ lsnrctl status LSNRCTL for Linux: Version 23.0.0.0.0 - Developer-Release on 05-SEP-2023 13:36:47 Copyright (c) 1991, 2023, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=target)(PORT=1521))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 23.0.0.0.0 - Developer-Release Start Date 05-SEP-2023 13:31:07 Uptime 0 days 0 hr. 5 min. 40 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Default Service FREE Listener Parameter File /opt/oracle/product/23c/dbhomeFree/network/admin/listener.ora Listener Log File /opt/oracle/diag/tnslsnr/OEL8/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=OEL8)(PORT=1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1522))) Services Summary... Service "FREE" has 1 instance(s). Instance "FREE", status READY, has 1 handler(s) for this service... Service "tehranpdb" has 1 instance(s). Instance "FREE", status READY, has 1 handler(s) for this service... The command completed successfully
در این شرایط اگر دستور ConnStr را اجرا کنیم، لیست سرویسها به همراه connection string آنها نمایش داده می شوند:
[oracle@OEL8 admin]$ connstr Using Listener: LISTENER with Oracle Home: /opt/oracle/product/23c/dbhomeFree Service Name: tehranpdb Connection String: OEL8:1521/tehranpdb Service Name: FREE Connection String: OEL8:1521/FREE Connection strings can be used to connect to the specified service name. For SQL*Plus you can use: SQL> connect username@OEL8:1521/tehranpdb For Python you can use: connection = cx_Oracle.connect(user="username", password="password", dsn="OEL8:1521/tehranpdb") For JDBC Thin you can use: OracleDataSource ods = new OracleDataSource(); ods.setURL("jdbc:oracle:thin:@OEL8:1521/tehranpdb"); ods.setUser("username"); ods.setPassword("password"); Connection conn = ods.getConnection(); Write connect strings to tnsnames.ora (Y/N)? (Default: N):
در خط آخر سوالی پرسیده می شود که در صورت انتخاب Y، تمامی net service nameها به tnsnames.ora اضافه خواهند شد:
[oracle@OEL8 ~]$ vi /opt/oracle/product/23c/dbhomeFree/network/admin/tnsnames.ora # ***** tnsnames.ora connection strings auto-generated by connstr on Tue Sep 5 11:46:03 2023 ***** # This file is not needed if using Easy Connect strings. # To use this file, place in your client TNS_ADMIN directory (typically ORACLE_HOME/network/admin/ or instantclient_XX_X/network/admin). # Or, set your TNS_ADMIN environment variable to the directory this file is located in. tehranpdb = (DESCRIPTION = (ADDRESS = (PROTOCOL = tcp)(HOST = OEL8)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = tehranpdb)) ) FREE = (DESCRIPTION = (ADDRESS = (PROTOCOL = tcp)(HOST = OEL8)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = FREE)) )
از طریق سوییچ o می توانیم خروجی را خارج از فایل tnsnames.ora ذخیره کنیم:
[oracle@OEL8 ~]$ connstr -o /home/oracle/tnsnames.test Write connect strings to /home/oracle/tnsnames.test (Y/N)? (Default: N): Y [oracle@OEL8 ~]$ ls -lh /home/oracle/tnsnames.test -rw-r--r-- 1 oracle oinstall 1.2K Sep 5 14:21 /home/oracle/tnsnames.test
در ابتدای متن تاکید شد دستور ConnStr به صورت پیش فرض با listener کار می کند و برای اجرای این دستور باید سرویس listener بالا باشد عبارت “به صورت پیش فرض ” به این دلیل قید شد که اجرای این دستور به اجرای سرویس listener محدود نیست و ConnStr از طریق لاگ listener هم قابل اجرا است حتی زمانی که listener پایین باشد:
[oracle@OEL8 ~]$ lsnrctl status>listener_status.log [oracle@OEL8 ~]$ lsnrctl stop [oracle@OEL8 ~]$ connstr --i listener_status.log Using Listener: LISTENER with Oracle Home: /opt/oracle/product/23c/dbhomeFree Service Name: tehranpdb Connection String: OEL8:1521/tehranpdb Service Name: FREE Connection String: OEL8:1521/FREE Connection strings can be used to connect to the specified service name. For SQL*Plus you can use: SQL> connect username@OEL8:1521/tehranpdb For Python you can use: connection = cx_Oracle.connect(user="username", password="password", dsn="OEL8:1521/tehranpdb") For JDBC Thin you can use: OracleDataSource ods = new OracleDataSource(); ods.setURL("jdbc:oracle:thin:@OEL8:1521/tehranpdb"); ods.setUser("username"); ods.setPassword("password"); Connection conn = ods.getConnection(); File tnsnames.ora exists. Append (Y), Overwrite (O), or Do Nothing (N)? (Default: N):
برای هر کدام از سرویسها هم می توانیم به صورت جداگانه connection string را نمایش دهیم:
[oracle@OEL8 ~]$ connstr tehranpdb OEL8:1521/tehranpdb
در صورت استفاده از سوییچ j،ء connection string مربوط به JDBC نمایش داده خواهد شد:
[oracle@OEL8 ~]$ connstr -j tehranpdb jdbc:oracle:thin:@OEL8:1521/tehranpdb