Thứ Bảy, 21 tháng 8, 2021

Kết nối tới Container Databases (CDB) và Pluggable Databases (PDB) in Oracle Database 12c/19c/21c

Mục đích: Hướng dẫn cách kết nối đến Container Databases (CDB) và Pluggable Databases (PDB) trong Oracle Database 12c/19c/21c

  • Kết nối tới Container Database (CDB)
  • Hiển thị Container hiện tại
  • Chuyển đổi qua lại giữa các Container
  • Kết nối tới Pluggable Database (PDB)
  • Kết nối JDBC tới các PDB
  • Kết nối Data Pump (expdp, impdp)

Kết nối tới Container Database (CDB)

Kết nối với root container cũng giống như kết nối của bất kỳ instance cơ sở dữ liệu nào trước đây. Trên máy chủ cơ sở dữ liệu, bạn có thể sử dụng Xác thực mức Hệ điều hành.

$ export ORACLE_SID=cdb1
$ sqlplus / as sysdba  //-- Xác thực mức Hệ điều hành

SQL*Plus: Release 12.1.0.1.0 Production on Mon Aug 26 15:29:49 2013

Copyright (c) 1982, 2013, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL>

Bạn có thể kết nối với những người dùng thông thường khác theo cách tương tự.

SQL> CONN system/oracle
Connected.
SQL>

Các view V$SERVICES có thể được sử dụng để hiển thị các dịch vụ có sẵn từ cơ sở dữ liệu.

COLUMN name FORMAT A30

SELECT name, pdb
FROM   v$services
ORDER BY name;

NAME			       PDB
------------------------------ ------------------------------
SYS$BACKGROUND                 CDB$ROOT
SYS$USERS                      CDB$ROOT
cdb1                           CDB$ROOT
cdb1XDB                        CDB$ROOT
pdb1                           PDB1
pdb2                           PDB2

6 rows selected.

SQL>

Tiện ích lsnrctl cho phép bạn hiển thị các dịch vụ khác từ dòng lệnh..

$ lsnrctl service

LSNRCTL for Linux: Version 12.1.0.1.0 - Production on 20-MAY-2014 09:01:34

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

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
Services Summary...
Service "cdb1" has 1 instance(s).
  Instance "cdb1", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
Service "cdb1XDB" has 1 instance(s).
  Instance "cdb1", status READY, has 1 handler(s) for this service...
    Handler(s):
      "D000" established:0 refused:0 current:0 max:1022 state:ready
         DISPATCHER 
         (ADDRESS=(PROTOCOL=tcp)(HOST=ol6-121.localdomain)(PORT=21196))
Service "pdb1" has 1 instance(s).
  Instance "cdb1", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
Service "pdb2" has 1 instance(s).
  Instance "cdb1", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:0 refused:0 state:ready
         LOCAL SERVER
The command completed successfully
$

Cách kết nối tới dịch vụ không thay đổi so với các phiên bản Oracle Database trước đó

SQL> -- EZCONNECT
SQL> CONN system/oracle@//localhost:1521/cdb1
Connected.
SQL>

SQL> CONN system/oracle@//192.168.56.101:1521/cdb1
Connected.
SQL>

SQL> -- tnsnames.ora
SQL> CONN system/password@cdb1
Connected.
SQL>

Kết nối sử dụng TNS alias yêu cầu mục nhập trong file "$ORACLE_HOME/network/admin/tnsnames.ora", chẳng hạn như file được hiển thị bên dưới.

CDB1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ol6-121)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = cdb1)
    )
  )

Hiển thị Container hiện tại

Lệnh SHOW CON_NAME và SHOW CON_ID trong SQL*Plus hiển thị tên container  và  ID hiện tại

SQL> SHOW CON_NAME

CON_NAME
------------------------------
CDB$ROOT
SQL>

SQL> SHOW CON_ID

CON_ID
------------------------------
1
SQL>

Chúng cũng có thể được truy xuất bằng cách sử dụng hàm SYS_CONTEXT.

SELECT SYS_CONTEXT('USERENV', 'CON_NAME')
FROM   dual;

SYS_CONTEXT('USERENV','CON_NAME')
--------------------------------------------------------------------------------
CDB$ROOT

SQL>


SELECT SYS_CONTEXT('USERENV', 'CON_ID')
FROM   dual;

SYS_CONTEXT('USERENV','CON_ID')
--------------------------------------------------------------------------------
1

SQL>

Chuyển đổi giữa các Container

Khi đăng nhập vào CDB với tư cách là người dùng có quyền thích hợp, lệnh ALTER SESSION có thể được sử dụng để chuyển đổi giữa các container trong container database:

SQL> ALTER SESSION SET CONTAINER=pdb1;

Session altered.

SQL> SHOW CON_NAME

CON_NAME
------------------------------
PDB1
SQL> ALTER SESSION SET CONTAINER=cdb$root;

Session altered.

SQL> SHOW CON_NAME

CON_NAME
------------------------------
CDB$ROOT
SQL>

Từ Oracle 12.2 trở đi (12.1 không có tính năng này), lệnh ALTER SESSION cũng có thể chỉ định dịch vụ bên trong container. Chúng ta có thể demo điều này bằng cách tạo một dịch vụ mới trong PDB, sau đó chuyển sang dịch vụ đó.

CONN / AS SYSDBA
ALTER SESSION SET CONTAINER=pdb1'

BEGIN
  DBMS_SERVICE.create_service('my_new_service','my_new_service');
  DBMS_SERVICE.start_service('my_new_service');
END;
/

ALTER SESSION SET CONTAINER=pdb1 SERVICE=my_new_service;

COLUMN con_id FORMAT A10
COLUMN service_name FORMAT A30

SELECT SYS_CONTEXT('USERENV', 'CON_ID') AS con_id,
       SYS_CONTEXT('USERENV', 'SERVICE_NAME') AS service_name
FROM   dual;

CON_ID     SERVICE_NAME
---------- ------------------------------
6          my_new_service

SQL>

Kết nối với Pluggable Database (PDB)

Kết nối trực tiếp đến pluggable databases phải được thực hiện bằng dịch vụMỗi pluggable database thêm đăng ký một dịch vụ tự động với listener. Đây là cách bất kỳ ứng dụng nào sẽ kết nối với pluggable database, cũng như cách DBA kết nối để quản trị.

SQL> -- EZCONNECT
SQL> CONN system/oracle@//localhost:1521/pdb1
Connected.
SQL>

SQL> -- EZCONNECT
SQL> CONN system/oracle@//192.168.56.101:1521/pdb1
Connected. SQL> SQL> -- tnsnames.ora SQL> CONN system/oracle@pdb1
Connected. SQL>

Kết nối sử dụngTNS alias yêu cầu ta thêm 1 mục vào trong file "$ORACLE_HOME/network/admin/tnsnames.ora", chẳng hạn như file được hiển thị bên dưới.

PDB1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ol6-121)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = pdb1)
    )
  )

CDB1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ol6-121)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = cdb1)
    )
  )

Người dùng PDB với quyền SYSDBA, SYSOPER, SYSBACKUP, hoặc SYSDG có thể kết nối với một PDB đã shutdown. Tất cả người dùng PDB khác chỉ có thể kết nối khi PDB được mở. Như với cơ sở dữ liệu thông thường, người dùng PDB yêu cầu quyền CREATE SESSION tạo kết nối.

Kết nối JDBC với PDB

Như đã đề cập ở trên để kết nối với một PDB bạn phải sử dụng một dịch vụ. Điều này có nghĩa là theo mặc định, nhiều chuỗi kết nối JDBC sẽ bị đứt. Các chuỗi kết nối JDBC hợp lệ cho Oracle sử dụng định dạng sau.

# Cú pháp
jdbc:oracle:thin:@[HOST][:PORT]:SID
jdbc:oracle:thin:@[HOST][:PORT]/SERVICE

# Ví dụ
jdbc:oracle:thin:@ol6-121:1521:pdb1
jdbc:oracle:thin:@ol6-121:1521/pdb1

Khi kết nối với PDB bằng SID, bạn sẽ nhận được lỗi sau.

ORA-12505, TNS:listener does not currently know of SID given in connect descriptor

Tốt nhất, bạn nên sửa chuỗi kết nối để sử dụng các dịch vụ thay vì SID, nhưng nếu đó là sự cố, tham số listener USE_SID_AS_SERVICE_listener_name có thể được sử dụng.

Chỉnh sửa file "$ORACLE_HOME/network/admin/listener.ora", thêm mục sau, với tên "listener" khớp với tên mà listener bạn sử dụng.

USE_SID_AS_SERVICE_listener=on

Tải lại hoặc khởi động lại listener.

$ lsnrctl reload

Bây giờ cả hai lần thử kết nối sau sẽ thành công vì mọi SID sẽ được coi là dịch vụ.

jdbc:oracle:thin:@ol6-121:1521:pdb1
jdbc:oracle:thin:@ol6-121:1521/pdb1

Kết nối Data Pump (expdp, impdp)

Kết nối với các tiện ích expdp và impdp không thay đổi, miễn là bạn chỉ định một dịch vụ.

expdp user/pass@service ...
expdp \"sys/oracle@service as sysdba\" ... impdp user/pass@service ...
impdp \"system/oracled@service as sysdba\" ...

Kết nối với role SYSDBA dành cho common user. Ví dụ:

expdp scott/oracle@pdb1 tables=EMP,DEPT directory=TEST_DIR dumpfile=EMP_DEPT.dmp logfile=expdpEMP_DEPT.log
expdp \"sys/oracle@pdb1 as sysdba\" tables=EMP,DEPT directory=TEST_DIR dumpfile=EMP_DEPT.dmp logfile=expdpEMP_DEPT.log
expdp \"c##myuser/oracle@pdb1 as sysdba\" tables=EMP,DEPT directory=TEST_DIR dumpfile=EMP_DEPT.dmp logfile=expdpEMP_DEPT.log

Tham khảo thêm:

Hy vọng hữu ích cho bạn.
=============================
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* 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
hoặc
https://bit.ly/oaz_fp
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile: 0902912888
⚡️ Skype: tranbinh48ca
👨 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: http://bit.ly/ytb_binhoraclemaster
👨 Tiktok: https://www.tiktok.com/@binhoraclemaster?lang=vi
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhoracle
👨 Đị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

=============================
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,khóa học pl/sql, 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, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle dataguard, oracle goldengate, oracle weblogic, oracle exadata, hoc solaris, hoc linux, hoc aix

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master