บล็อกนี้กล่าวถึงการแยกฐานข้อมูลแบบเสียบได้ (PDB) หนึ่งฐานข้อมูลจากฐานข้อมูล sourcecontainer (CDB) และการแนบกับ CDB เป้าหมาย สำหรับวัตถุประสงค์ของบล็อกนี้ PDB คือฐานข้อมูลที่เราบันทึกฐานข้อมูลที่เกี่ยวข้องกับแอปพลิเคชันทั้งหมดของเรา
แนะนำตัว
CDB มีฐานข้อมูล PDB ที่เป็นศูนย์หรือมากกว่าที่เกี่ยวข้องกับแอปพลิเคชันต่างๆ และมีคอนเทนเนอร์รูทเพียงตัวเดียวที่เก็บข้อมูลเมตาที่เกี่ยวข้องกับ Oracle® และผู้ใช้ทั่วไป ชื่อของคอนเทนเนอร์รูทคือ CDB$ROOT
. คอนเทนเนอร์รูทยังมี PDB หนึ่งเมล็ด PDB$SEED
. PDB เริ่มต้นนี้เป็นเทมเพลตที่ระบบจัดหาให้ซึ่ง CDB สามารถใช้เพื่อสร้าง PDB ใหม่ได้ PDB เป็นฐานข้อมูลเดียวกับที่เราใช้ในสภาพแวดล้อมที่ไม่ใช่คอนเทนเนอร์ ในเวอร์ชัน 12c Oracle ได้แนะนำคอนเทนเนอร์นี้และคุณลักษณะ PDB ซึ่งช่วยให้คุณสามารถเพิ่ม PDB ตามความต้องการทางธุรกิจของคุณได้ ตัวอย่างเช่น คุณสามารถสร้างฐานข้อมูล PDB ที่มีข้อมูลแผนกขายในแอปพลิเคชันการขาย และข้อมูลแผนกทรัพยากรบุคคล (HR) ในแอปพลิเคชัน HR
การถอดปลั๊ก PDB หมายถึงการถอดฐานข้อมูล PDB ออกจาก CDB ต้นทางและแนบกับ CDB เป้าหมาย
ในบล็อกนี้ CDB ต้นทาง TEST12
มีสอง PDB PDB1
และ PDB2
. CDB เป้าหมาย DEV12
, รับ PDB ที่ไม่ได้เสียบปลั๊ก
ถอดปลั๊กและเสียบตัวอย่าง PDB
ในส่วนนี้ คุณจะได้เรียนรู้วิธีถอดปลั๊ก PDB1
และ PDB2
จากแหล่ง CDBTEST12
และเสียบเข้ากับ CDB เป้าหมาย DEV12
.
ก่อนทำการเปลี่ยนแปลง PDB ต้นทางคือ MOUNTED
ดังแสดงในภาพต่อไปนี้:
ตรวจสอบความเข้ากันได้ของ PDB กับ CDB เป้าหมาย
ก่อนเริ่มการทำงานของปลั๊ก ตรวจสอบให้แน่ใจว่า PDB ที่จะเสียบเข้ากับโฮสต์ CDB ใหม่ หากเข้ากันไม่ได้ การทำงานของบล็อก PL/SQL ต่อไปนี้จะทำให้เกิดข้อผิดพลาด:
. oraenv
[enter dev12 at the prompt]
sqlplus / as sysdba
set serveroutput on
DECLARE
compatible BOOLEAN := FALSE;
BEGIN
compatible := DBMS_PDB.CHECK_PLUG_COMPATIBILITY(
pdb_descr_file => '/home/oracle/app/oradata/TEST12/pdb1/pdb1.xml ');
if compatible then
DBMS_OUTPUT.PUT_LINE('Is pluggable PDB1 compatible? YES');
else DBMS_OUTPUT.PUT_LINE('Is pluggable PDB1 compatible? NO');
end if;
END;
/
set serveroutput on
DECLARE
compatible BOOLEAN := FALSE;
BEGIN
compatible := DBMS_PDB.CHECK_PLUG_COMPATIBILITY(
pdb_descr_file => '/home/oracle/app/oradata/pdb2/pdb2.xml');
if compatible then
DBMS_OUTPUT.PUT_LINE('Is pluggable PDB2 compatible? YES');
else DBMS_OUTPUT.PUT_LINE('Is pluggable PDB2 compatible? NO');
end if;
END;
/
ปิด PDB
ปิด PDB เพื่อให้สามารถถอดปลั๊กได้โดยการรันคำสั่งต่อไปนี้SQL*Plus®:
. oraenv
[enter test12 at the prompt]
sqlplus / as sysdba
alter pluggable database pdb1 close immediate;
alter pluggable database pdb2 close immediate;
PDB ต้นทางควรอยู่ในสถานะเมานต์ closed
.
ถอดปลั๊ก PDB
หลังจากปิด PDB แล้ว ให้สร้างไฟล์รายการ XML ไฟล์ XML นี้มีข้อมูลเกี่ยวกับชื่อและเส้นทางแบบเต็มของพื้นที่ตาราง รวมถึงไฟล์ข้อมูลสำหรับ PDB ที่ไม่ได้เสียบปลั๊ก
ถอดปลั๊ก PDB ที่ปิดแล้วระบุพาธและชื่อของไฟล์ XML โดยรันคำสั่งต่อไปนี้:
alter pluggable database pdb1 unplug into '/home/oracle/app/oradata/TEST12/pdb1/pdb1.xml';
alter pluggable database pdb2 unplug into '/home/oracle/app/oradata/pdb2/pdb2.xml';
วาง PDB ที่ปิดและเก็บไฟล์ข้อมูลไว้โดยเรียกใช้คำสั่งต่อไปนี้:
drop pluggable database pdb1 keep datafiles;
drop pluggable database pdb2 keep datafiles;
ตรวจสอบสถานะของ PDB ที่ไม่ได้เสียบปลั๊กโดยรันคำสั่งต่อไปนี้:
select pdb_name, status from cdb_pdbs where pdb_name in ('PDB1', 'PDB2');
[you will see no rows]
exit
เสียบปลั๊ก PDB
คุณสามารถเสียบ PDB เข้ากับ CDB เป้าหมายโดยใช้วิธี COPY, NOCOPY หรือวิธี CLONE MOVE
เสียบด้วยวิธี COPY
ในการใช้วิธีการ COPY เพื่อเสียบ PDB ให้สร้างและกำหนดปลายทางสำหรับไฟล์ข้อมูลใหม่ เสียบ PDB ที่ไม่ได้เสียบเข้ากับ CDB เป้าหมาย จากนั้นคัดลอกไฟล์ข้อมูลของ PDB ที่ไม่ได้เสียบปลั๊ก
สร้างไดเร็กทอรีปลายทางโดยการรันคำสั่งต่อไปนี้:
mkdir /home/oracle/app/oradata/DEV12/pdb1
sqlplus / as sysdba
ใช้ไฟล์ข้อมูลของ PDB ที่ไม่ได้เสียบปลั๊กเพื่อเสียบ PDB ลงใน CDB และคัดลอกไฟล์ข้อมูลไปยังตำแหน่งใหม่โดยเรียกใช้คำสั่งต่อไปนี้:
create pluggable database pdb_plug_copy using '/home/oracle/app/oradata/TEST12/pdb1/pdb1.xml '
COPY
FILE_NAME_CONVERT=('/home/oracle/app/oradata/TEST12/pdb1','/home/oracle/app/oradata/DEV12/pdb1');
ตรวจสอบสถานะและโหมดเปิดของ PDB ที่เสียบไว้โดยเรียกใช้คำสั่งต่อไปนี้:
select pdb_name, status from cdb_pdbs where pdb_name='PDB_PLUG_COPY';
select open_mode from v$pdbs where name='PDB_PLUG_COPY';
List the data files of the plugged PDB.
select name from v$datafile where con_id=3;
exit
ผลลัพธ์ของการดำเนินการเหล่านี้จะแสดงในรูปต่อไปนี้:
เสียบปลั๊กด้วยวิธี NOCOPY
วิธีนี้ใช้ไฟล์ข้อมูลของ PDB ที่ไม่ได้เสียบปลั๊กเพื่อเสียบ PDB เข้ากับ CDB เป้าหมายโดยไม่ต้องสร้างหรือใช้สำเนาใดๆ
ในการใช้วิธี NOCOPY เพื่อเสียบ PDB ให้รันคำสั่งต่อไปนี้:
create pluggable database pdb_plug_nocopy using '/home/oracle/app/oradata/pdb2/pdb2.xml'
NOCOPY
TEMPFILE REUSE;
การดำเนินการนี้ใช้เวลาไม่กี่วินาที ไฟล์ข้อมูลดั้งเดิมของ PDBnow ที่ไม่ได้เสียบปลั๊กนั้นเป็นของ PDB ที่เสียบปลั๊กใหม่ใน CDB โฮสต์ใหม่ ไฟล์ที่มีชื่อเดียวกันกับไฟล์ temp ที่ระบุในไฟล์ XML จะปรากฏในตำแหน่งเป้าหมาย ดังนั้น TEMPFILE_REUSE
จำเป็นต้องมีประโยค
ตรวจสอบสถานะและโหมดเปิดของ PDB ที่เสียบไว้โดยเรียกใช้คำสั่งต่อไปนี้:
select pdb_name, status from cdb_pdbs where pdb_name='PDB_PLUG_NOCOPY';
select open_mode from v$pdbs where name='PDB_PLUG_NOCOPY';
ผลลัพธ์ของการดำเนินการเหล่านี้แสดงอยู่ในภาพต่อไปนี้:
แสดงรายการไฟล์ข้อมูลของ PDB ที่เสียบไว้โดยรันคำสั่งต่อไปนี้:
select name from v$datafile where con_id=3;
select name from v$datafile where con_id=4;
exit
เสียบปลั๊กด้วยวิธี CLONE MOVE
หากต้องการใช้วิธี CLONE MOVE เพื่อเสียบ PDB ให้สร้างและกำหนดปลายทางสำหรับไฟล์ข้อมูลใหม่ ใช้ไฟล์ข้อมูลของ PDB ที่ไม่ได้เสียบปลั๊กเพื่อเสียบ PDB เข้ากับ CDB เป้าหมาย จากนั้นจึงย้ายไฟล์ข้อมูลไปยังตำแหน่งอื่น
สร้างไดเร็กทอรีปลายทางโดยการรันคำสั่งต่อไปนี้:
mkdir /home/oracle/app/oradata/DEV12/clone
sqlplus / as sysdba
เสียบ PDB เข้ากับ CDB และย้ายไฟล์ข้อมูลไปยังตำแหน่งใหม่โดยเรียกใช้คำสั่งต่อไปนี้:
create pluggable database pdb_plug_move using '/home/oracle/app/oradata/TEST12/pdb1/pdb1.xml '
MOVE
FILE_NAME_CONVERT=('/home/oracle/app/oradata/TEST12/pdb1','/home/oracle/app/oradata/DEV12/clone ');
ข้อความแสดงข้อผิดพลาดปรากฏขึ้นเนื่องจากตัวระบุเฉพาะส่วนกลาง (GUID) ไม่ซ้ำกัน PDB1
ถูกเสียบไว้แล้วโดยใช้วิธีการ COPY ซึ่งทำให้เกิดความขัดแย้งกับ GUID ดังที่แสดงในภาพต่อไปนี้:
ในการแก้ไขปัญหานี้ ให้รันโค้ดต่อไปนี้ด้วย AS CLONE
อนุประโยค:
create pluggable database pdb_plug_move
AS CLONE using '/home/oracle/app/oradata/TEST12/pdb1/pdb1.xml '
MOVE
FILE_NAME_CONVERT=('/home/oracle/app/oradata/TEST12/pdb1','/home/oracle/app/oradata/DEV12/clone');
ตรวจสอบสถานะและโหมดเปิดของ PDB ที่เสียบไว้โดยเรียกใช้คำสั่งต่อไปนี้:
select pdb_name, status from cdb_pdbs where pdb_name='PDB_PLUG_MOVE';
select open_mode from v$pdbs where name='PDB_PLUG_MOVE';
แสดงรายการไฟล์ข้อมูลของ PDB ที่เสียบไว้โดยรันคำสั่งต่อไปนี้:
select name from v$datafile where con_id=5;
ผลลัพธ์ของการดำเนินการเหล่านี้แสดงอยู่ในภาพต่อไปนี้:
เปิด PDB ที่เสียบปลั๊ก
ในการเปิด PDB และสิ้นสุดการทำงานของปลั๊ก ให้รันคำสั่งต่อไปนี้:
alter pluggable database pdb_plug_nocopy open;
alter pluggable database pdb_plug_copy open;
alter pluggable database pdb_plug_move open;
เชื่อมต่อกับ PDB ที่เสียบปลั๊กและตรวจสอบชื่อคอนเทนเนอร์ที่คุณเชื่อมต่อด้วยการรันคำสั่งต่อไปนี้:
connect sys/*****@localhost:1521/pdb_plug_nocopy AS SYSDBA
show con_name
connect sys/******@localhost:1521/pdb_plug_copy AS SYSDBA
show con_name
connect sys/******@localhost:1521/pdb_plug_move AS SYSDBA
show con_name
exit
ย้าย PDB กลับไปที่ CDB ต้นทาง
ปิดฐานข้อมูลที่เสียบได้ทั้งหมดโดยเรียกใช้คำสั่งต่อไปนี้:
. oraenv
[enter dev12 at the prompt]
sqlplus / as sysdba
alter pluggable database all close immediate;
ถอดปลั๊ก pdb_plug_copy
ฐานข้อมูลเพื่อให้คุณสามารถใช้เพื่อสร้างpdb1
.ขึ้นใหม่ ฐานข้อมูลโดยรันคำสั่งต่อไปนี้:
alter pluggable database pdb_plug_copy unplug into '/home/oracle/app/oradata /pdb_plug_copy.xml';
วาง pdb_plug_copy
ฐานข้อมูลโดยรันคำสั่งต่อไปนี้:
drop pluggable database pdb_plug_copy;
ถอดปลั๊กแล้วปล่อย pdb_plug_nocopy
ฐานข้อมูลเพื่อให้คุณสามารถใช้มันเพื่อสร้าง pdb2
ฐานข้อมูลโดยเรียกใช้คำสั่งต่อไปนี้:
alter pluggable database pdb_plug_nocopy unplug into '/home/oracle/app/oradata /pdb_plug_nocopy.xml';
drop pluggable database pdb_plug_nocopy keep datafiles;
วาง pdb_plug_move
ฐานข้อมูลโดยรันคำสั่งต่อไปนี้:
drop pluggable database pdb_plug_move;
เสียบ pdb1
ฐานข้อมูลกลับเข้าไปใน TEST12
CDB โดยเรียกใช้คำสั่งต่อไปนี้:
connect sys/*****@localhost:1521/test12 as sysdba
create pluggable database pdb1 AS CLONE using '/u01/app/oracle/oradata/pdb_plug_copy.xml'
MOVE
FILE_NAME_CONVERT=(' /home/oracle/app/oradata/DEV12/pdb1',' /home/oracle/app/oradata/TEST12/pdb1');
เสียบ pdb2
ฐานข้อมูลกลับเข้าไปใน TEST12
CDB โดยรันคำสั่งต่อไปนี้:
create pluggable database pdb2 using '/u01/app/oracle/oradata/pdb_plug_nocopy.xml' nocopy tempfile reuse;
เปิด pdb1
และ pdb2
โดยรันคำสั่งต่อไปนี้:
alter pluggable database pdb2 open;
alter pluggable database pdb1 open;
exit
บทสรุป
การถอดปลั๊กและเสียบปลั๊ก PDB สามารถลดความซับซ้อนในการถ่ายโอนไฟล์ระหว่างเซิร์ฟเวอร์ และลดโอกาสเกิดข้อผิดพลาดจากมนุษย์ ตัวอย่างเช่น คุณสามารถใช้ patchin หนึ่งช็อตสำหรับฐานข้อมูล PDB ทั้งหมด ในขณะที่ในสภาพแวดล้อมที่ไม่ใช่คอนเทนเนอร์ คุณจะต้องใช้โปรแกรมแก้ไขกับฐานข้อมูลทั้งหมดแยกกัน การสำรองข้อมูลและงานบำรุงรักษาอื่นๆ ทำได้ง่ายกว่ามากในสภาพแวดล้อมคอนเทนเนอร์และ PDB การมีไฟล์เดียวเพื่อถ่ายโอนระหว่างเซิร์ฟเวอร์นั้นง่ายกว่าเพราะคุณไม่สามารถลืมโอนไฟล์อย่างน้อยหนึ่งไฟล์โดยไม่ได้ตั้งใจ
หวังว่าบล็อกนี้จะช่วยให้คุณมีความคิดที่ดีขึ้นเกี่ยวกับเวอร์ชัน 12c PDB และ CDB ที่เป็นประโยชน์ต่อฐานข้อมูลที่ไม่ใช่คอนเทนเนอร์
ใช้แท็บคำติชมเพื่อแสดงความคิดเห็นหรือถามคำถาม
เรียนรู้เพิ่มเติมเกี่ยวกับบริการฐานข้อมูลของเรา