ในสมัยก่อน Database แต่ละตัวจะแยกกันและจัดการเป็นอิสระด้วยตัวเองไม่เกี่ยวข้องกับ Database ตัวอื่นๆ แต่มีการพัฒนาระบบการจัดการ Database แบบรวมกันที่ส่วนเดียวได้ ด้วยโครงสร้างแบบ Multitenant Database
Oracle database 12c Multitenant คือ feature ใหม่ เปิดตัวครั้งแรกในเวอร์ชั่น 12cR1 ปี 2014 ทำให้สามารถสร้างและจัดการฐานข้อมูลได้หลายตัวมากขึ้นไว้ในฐานข้อมูลใหญ่ตัวเดียวที่เรียกว่า Container Database (CDB) ซึ่งฐานข้อมูลหลายตัวเหล่านั้นเราเรียกว่า Pluggable Databases (PDB) โดยทั้ง CDB และ PDB จะเรียกอีกชื่อเหมือนกันว่า Container
ฐานข้อมูลในเวอร์ชั่นก่อน 12c หรือ ฐานข้อมูลแบบเก่า จะเรียกว่า non-CDBs
โครงสร้างพื้นฐาน
เปรียบเทียบ แบบ non-CDBs และ CDBs
รูปจาก https://www.thegeekdiary.com/oracle-database-server-architecture-overview/
http://mkrishnadba.blogspot.com/2013/09/12c.html
non-CDB SALES and non-CDB HR
รูป ส่วนประกอบของ file ต่างๆ ใน CDB และ PDB
จาก https://avdeo.com/2015/01/16/creating-oracle-12c-multitenant-container-database/
อธิบายเพิ่มเติม
แต่ละ CDB ประกอบด้วย
- Root Container มีได้ 1 อัน ชื่อว่า CDB$ROOT เป็น Master set of data dictionary views ซึ่งมี metadata ที่เกี่ยวข้องกับ root container ตลอดจน pluggable databases ทุกตัวที่อยู่ใน CDB
- Static seed Container มีได้ 1 อัน ชื่อว่า PDB$SEED โดย container ตัวนี้จะอยู่เป็นอิสระมีหน้าที่เป็นเพียง template เพื่อสร้าง data files และ metadata สำหรับ pluggable databases ตัวใหม่ๆที่จะสร้างขึ้นใน CDB
- Pluggable Databases มีได้ 0 - 252 อัน แต่ละ PDB จะจัดการข้อมูลและฟังก์ชั่นต่างๆในตัวเองคล้ายกับ non-CDB database และมันมี data files และ application objects (users, tables, indexes, อื่นๆ) เป็นของตัวเอง เมื่อเราเชื่อมต่อเข้าสู่ PDB ตัวหนึ่งเราจะมองไม่เห็น root container หรือ PDB ตัวอื่นๆ
จาก http://orakitti.blogspot.com/2015/06/oracle-12c-multitenant-practice.html
วิธีแยกประเภทของฐานข้อมูล
ดูค่า CON_ID จาก V$INSTANCE หรือ V$DATABASE
CON_ID = 0 คือ non-CDBs
CON_ID = 1 คือ CDB (CDB$ROOT)
CON_ID = 2 คือ PDB (PDB$SEED)
CON_ID > 2 คือ PDB
ข้อดี
- ส่วนของ memory และ process อยู่ที่ container ที่เดียว
- การโคลนฐานข้อมูลทำง่ายและรวดเร็วขึ้น
- งานพื้นฐานทั่วไป สามารถทำที่ container ที่เดียว เช่น งาน backup
- ทำ patch และ upgrade ฐานข้อมูลที่ container ที่เดียว
User และ Role ของ CDB และ PDB
รูป user ต่างๆที่ใช้งานระบบ
จาก https://docs.oracle.com/database/122/CNCPT/overview-of-the-multitenant-architecture.htm#CNCPT89257
Type ของ User
Common User
- เป็น user ที่สามารถใช้ได้ใน containers ทุกอัน (root Container และ PDBs ทุกอัน)
- เมื่อสร้างเสร็จแล้วจะอยู่ใน root Container และทุก PDB รวมถึง PDB ที่จะถูกสร้างขึ้นในอนาคตด้วย
- สามารถมีสิทธิ์เหมือนกันหรือแตกต่างกันในแต่ละ PDB ได้ โดยต้องถูก grant จากใน PDB นั้นๆเท่านั้น
- Common user ที่เกิดจากระบบสร้างขึ้นเอง เรียกว่า Oracle-supplied คือ user SYS และ SYSTEM
- Common user ที่เกิดจากเราสร้างขึ้นเอง เรียกว่า User-created คือ user ที่ต้องสร้างโดยตั้งชื่อด้วย C## หรือ c## นำหน้า
- ตัวอย่าง จากรูป คือ user c##dba ใน root Container และทุก PDB ซึ่งเป็นคนคนเดียวกัน
Local User
- เป็น user ที่ใช้ได้เฉพาะ PDB นั้นๆเท่านั้น เป็น user ปกติที่ใช้ใน PDB โดยการจัดการจะเหมือนระบบ non-CDB ทั่วๆไป
- แต่ละ PDB สามารถตั้งชื่อ user เหมือนกันได้ แต่จะเป็นคนละคนกันตามแต่ละ PDB ไม่เกี่ยวข้องกัน
- ตัวอย่าง จากรูป คือ user hr ใน hrpdb, hr ใน salespdb, rep ใน salespdb และ rep ใน hrpdb ซึ่งเป็นคนละคนกันในแต่ละ PDB
Type ของ Role
Common Role
- เป็น role ที่สามารถใช้ได้ใน containers ทุกอัน (root และ PDBs ทุกอัน)
- จะคล้ายกับการสร้าง Common user ที่จะอยู่ในทุก PDB ที่อยู่ใน Root container นั้น ตลอดจน PDB ที่ถูกสร้างขึ้นในอนาคต
- Common role ต้องสร้างด้วย C## หรือ c## นำหน้า
Local Role
- เป็น role ที่ใช้ได้เฉพาะ PDB นั้นๆเท่านั้น เป็น role ปกติที่ใช้ใน PDB โดยการจัดการจะเหมือนระบบ non-CDB ทั่วๆไป
- แต่ละ PDB สามารถตั้งชื่อ role เหมือนกันได้ แต่จะเป็นคนละอันกันตามแต่ละ PDB ไม่เกี่ยวข้องกัน