การนำเข้าสกีมาไปยังพื้นที่ตารางใหม่หรือที่แตกต่างกัน


13

มีวิธีที่สะดวกในการนำเข้าสคีมาใน Oracle 11gR2 โดยใช้สเปซใหม่หรือที่แตกต่างจากที่มาของข้อมูลหรือไม่?

ตัวอย่างเช่นฉันได้ส่งออก BLOG_DATA จาก OLDDB ซึ่งข้อมูลผู้ใช้ทั้งหมดถูกเก็บไว้ในพื้นที่ตาราง USERS

บน NEWDB ฉันต้องการนำเข้า BLOG_DATA schema แต่เก็บวัตถุผู้ใช้ในพื้นที่ตาราง BLOG_DATA สร้างขึ้นเฉพาะสำหรับผู้ใช้นี้

ฉันสร้างผู้ใช้ BLOG_DATA สร้างพื้นที่ตาราง BLOG_DATA และตั้งเป็นพื้นที่เริ่มต้นสำหรับผู้ใช้นั้นและเพิ่มโควต้าไม่ จำกัด ที่เหมาะสม

CREATE TABLESPACE blog_data DATAFILE SIZE 1G;

CREATE USER blog_data IDENTIFIED BY secretpassword DEFAULT TABLESPACE blog_data QUOTA UNLIMITED ON blog_data;

GRANT connect,resource TO blog_data

สคีมาถูกส่งออกจาก OLDDB ด้วยสิ่งที่ชอบ

exp blog_data/secretpassword@OLDDB file=blog_data.dmp 

หลังจากอ่านคำตอบที่ยอดเยี่ยมของฟิลด้านล่างฉันพบว่าตัวเองสงสัย :

เนื่องจากข้อมูลไม่มีที่อื่นที่จะไปให้พ้นจาก tablespace เริ่มต้นซึ่งเป็น tablespace เพียงอันเดียวที่ผู้ใช้มีโควต้า - นี่จะบังคับให้ใส่วัตถุผู้ใช้ทั้งหมดใน tablespace เริ่มต้นอย่างมีประสิทธิภาพหรือไม่

imp blog_data/secretpassword@NEWDB file=blog_data.dmp

ถ้าเช่นนั้นจะวาง schema ของบล็อก_dataทั้งหมดลงในพื้นที่ตาราง blog_data บน NEWDB หรือไม่ มีเหตุผลใดบ้างที่สิ่งนี้ไม่ทำงานหรือว่าฉันจะเจอปัญหาเกี่ยวกับวัตถุบางอย่าง ฯลฯ ?

อัปเดต:

ฉันทำการทดสอบอย่างรวดเร็วและพบว่าสิ่งนี้เป็นจริง Impวางวัตถุใน tablespace เริ่มต้นสำหรับผู้ใช้นั้นหากไม่สามารถวางไว้ใน tablespace เดิม (เช่น tablespace ไม่มีอยู่) คำอธิบายแบบเต็ม: http://www.dolicapax.org/?p=57

ถึงกระนั้นฉันคิดว่าการใช้ Data Pump อย่าง Phil แนะนำอาจเป็นตัวเลือกที่ต้องการ


มันถูกส่งออกโดยใช้expยูทิลิตี้ดั้งเดิมหรือexpdp(ปั๊มข้อมูล) หรือไม่
Philᵀᴹ

ในตัวอย่างมันถูกส่งออกด้วยยูทิลิตี exp ทั่วไปดังที่แสดงไว้ด้านบน ฉันคิดว่าหนึ่งสามารถใช้ expdp และหยิบไฟล์จากเซิร์ฟเวอร์ db เก่าได้ซึ่งจะทำให้การเปลี่ยนไปใช้ tablespace ใหม่นั้นง่ายขึ้นหรือไม่
Roy

ฉันครอบคลุมทั้งในคำตอบของฉัน ใช้ปั๊มข้อมูล - การทำภารกิจนี้ง่ายขึ้น
Philᵀᴹ

คำตอบ:


15

ไม่สามารถระบุ tablespace ที่แตกต่างกันเมื่อนำเข้าโดยใช้impยูทิลิตีoracle อย่างไรก็ตามเป็นวิธีแก้ปัญหาคุณสามารถสร้างตารางล่วงหน้าได้โดยการทำROWS=Nการนำเข้าสู่USERStablespace จากนั้นalter table mytable move tablespace BLOG_DATA;สำหรับแต่ละตารางเพื่อย้ายไปยัง tablespace ใหม่จากนั้นทำการอิมพอร์ตอีกครั้งด้วยIGNORE=Yพารามิเตอร์เพื่อละเว้นข้อผิดพลาดในการสร้างตารางและนำเข้าทั้งหมด ของข้อมูล

หากข้อมูลถูกส่งออกโดยใช้ Data Pump ( expdp), (แยกกันทุกคนควรใช้วันนี้แทนที่จะเป็นมรดกexp/ impยูทิลิตี้เก่า) ที่คุณสามารถนำเข้าสู่พื้นที่ตารางอื่นได้โดยง่ายโดยใช้REMAP_TABLESPACEพารามิเตอร์

เช่น:

impdp scott/tiger@ZOMG file=blog_data.dmp directory=mydir remap_tablespace=USERS:BLOG_DATA

ขอบคุณมาก Phil ฉันสงสัยว่า: หากผู้ใช้ที่นำเข้ามามีโควต้าเฉพาะบนพื้นที่ตารางเริ่มต้นจะบังคับให้วางวัตถุที่นำเข้าทั้งหมดในพื้นที่ตารางเริ่มต้นนั้นโดยไม่คำนึงถึงเค้าโครงบนแหล่งที่มาของข้อมูลหรือไม่
Roy

ฉันกำลังทำงานกับสิ่งที่คล้ายกัน แต่เป็นการย้ายฐานข้อมูลทั้งหมดโดยใช้ expdp / impdp เพราะฉันต้องการให้ QA env ของเราจับคู่การผลิต ถ้าฉันใช้ remap_tablespace มันจะทำการ remap ทุก schema ให้เป็น tablespace อีกอันหนึ่ง แต่ฉันคิดว่าฉันสามารถรันคำสั่ง impdp ได้หนึ่งครั้งต่อ schema และใช้ remap_tablespace สิ่งนี้ควรบรรลุผลสำเร็จ
Nicolas de Fontenay

0

คุณควรทำตามขั้นตอนด้านล่าง: -

  • ส่งออกผู้ใช้
  • ดำเนินการนำเข้าใช้คำสั่งนี้จะนำเข้าข้อมูลและบันทึกคำจำกัดความทั้งหมดลง
    imp system/manager file=export.dmp indexfile=newfile.sql
    newfile.sql
  • วางวัตถุที่จำเป็น
  • เรียกใช้สคริปต์newfile.sqlหลังจากแก้ไขพื้นที่ตาราง
  • นำเข้าจากการสำรองข้อมูลสำหรับวัตถุที่จำเป็น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.