راهنمای استفاده از SAMPLE در expdp برای استخراج داده‌های تصادفی در اوراکل

یکی از مشکلات رایج در محیط‌های عملیاتی و تستی، گرفتن بخشی از داده‌های یک دیتابیس برای بررسی، انتقال یا تست است. Oracle Data Pump (expdp) قابلیتی به نام SAMPLE دارد که می‌تواند به شما کمک کند بخشی از داده‌های یک یا چند جدول را استخراج کنید، بدون اینکه نیاز باشد کل داده‌ها را کپی کنید.

در این مقاله، روش صحیح استفاده از SAMPLE در expdp را در دو سناریو بررسی کرده و مشکلات مربوط به جداول لاگ، foreign key و constraint‌ها را حل خواهیم کرد.

SAMPLE چیست و چگونه کار می‌کند؟

پارامتر SAMPLE در expdp امکان استخراج تصادفی درصدی از داده‌های هر جدول را فراهم می‌کند. این روش سریع است، اما باید توجه داشت که:

  • SAMPLE بر اساس بلاک‌های داده‌ای (Data Blocks) عمل می‌کند، نه تعداد رکوردها.
  • این روش تضمین نمی‌کند که دقیقاً درصد مشخصی از داده‌ها را دریافت کنید.
  • روی تمامی جداول اعمال می‌شود، اما می‌توان آن را برای جداول خاص محدود کرد.
  • برای جداول BLOB و CLOB کار می‌کند، اما ممکن است تمام مقادیر را نگه ندارد.

برای اینکه این سناریو رو بررسی کنیم در اسکیمای hr یک جدول بزرگ می سازیم که جداول لاگ اسکیماهای عملیاتی را شبیه سازی کنیم. معمولا اسکیماها دارای جداول پایه و جداول لاگ هستند که اکثر حجم دیتابیس مربوط به جداول لاگ هست.

sys@orcl(41)>  create table hr.log_table as select * from dba_extents;

Table created.

Elapsed: 00:00:02.05
sys@orcl(41)> insert into hr.log_table select * from hr.log_table;

7888 rows created.

Elapsed: 00:00:00.04
sys@orcl(41)> /

15776 rows created.

Elapsed: 00:00:00.03
sys@orcl(41)> /

31552 rows created.

Elapsed: 00:00:00.04
sys@orcl(41)> /

63104 rows created.

Elapsed: 00:00:00.08
sys@orcl(41)> /

126208 rows created.

Elapsed: 00:00:00.12
sys@orcl(41)> /
/
commit;

sys@orcl(42)> select count(*) from "HR"."LOG_TABLE";

  COUNT(*)
----------
   1009664

سناریوی اول این است که ده درصد از کل داده های hr را export بگیریم:

[oracle@oracle8101924 ~]$ expdp directory=oracle_base dumpfile=sample_10_percent.dmp logfile=sample_10_percent.log schemas=hr sample=10

Export: Release 19.0.0.0.0 - Production on Sat Feb 8 05:58:43 2025
Version 19.25.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

Username: sys@orclpdb as sysdba
Password:

Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
FLASHBACK automatically enabled to preserve database integrity.
Starting "SYS"."SYS_EXPORT_SCHEMA_01":  sys/********@orclpdb AS SYSDBA directory=oracle_base dumpfile=sample_10_percent.dmp logfile=sample_10_percent.log schemas=hr sample=10
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/TABLESPACE_QUOTA
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/PROCEDURE/PROCEDURE
Processing object type SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE
Processing object type SCHEMA_EXPORT/VIEW/VIEW
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/TRIGGER
. . exported "HR"."LOG_TABLE"                            5.908 MB  101087 rows
. . exported "HR"."EMPLOYEES"                            10.17 KB       9 rows
. . exported "HR"."LOCATIONS"                            7.320 KB       2 rows
. . exported "HR"."JOB_HISTORY"                          6.843 KB       0 rows
. . exported "HR"."JOBS"                                 6.445 KB       1 rows
. . exported "HR"."DEPARTMENTS"                          6.523 KB       2 rows
. . exported "HR"."COUNTRIES"                            5.937 KB       2 rows
. . exported "HR"."REGIONS"                              5.476 KB       0 rows
Master table "SYS"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYS.SYS_EXPORT_SCHEMA_01 is:
  /u01/app/oracle/sample_10_percent.dmp
Job "SYS"."SYS_EXPORT_SCHEMA_01" successfully completed at Sat Feb 8 06:01:28 2025 elapsed 0 00:01:19

 

همانطور که می بینید، تنها حدود ده درصد از داده های جداول گرفته شده است. حالا ببینیم در زمان import چه اتفاقی برای وابستگی های بین جداول می افتد.

من کاربر را به hrtest2 تغییر نام میدهم تا اسکیمای اصلی دست نخورده بماند:

[oracle@oracle8101924 ~]$ impdp directory=oracle_base dumpfile=sample_10_percent.dmp logfile=imp_sample_10_percent.log remap_schema=hr:hrtest2

Import: Release 19.0.0.0.0 - Production on Sat Feb 8 06:01:57 2025
Version 19.25.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

Username: sys@orclpdb as sysdba
Password:

Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Master table "SYS"."SYS_IMPORT_FULL_01" successfully loaded/unloaded
Starting "SYS"."SYS_IMPORT_FULL_01":  sys/********@orclpdb AS SYSDBA directory=oracle_base dumpfile=sample_10_percent.dmp logfile=imp_sample_10_percent.log remap_schema=hr:hrtest2
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/TABLESPACE_QUOTA
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
. . imported "HRTEST2"."LOG_TABLE"                       5.908 MB  101087 rows
. . imported "HRTEST2"."EMPLOYEES"                       10.17 KB       9 rows
. . imported "HRTEST2"."LOCATIONS"                       7.320 KB       2 rows
. . imported "HRTEST2"."JOB_HISTORY"                     6.843 KB       0 rows
. . imported "HRTEST2"."JOBS"                            6.445 KB       1 rows
. . imported "HRTEST2"."DEPARTMENTS"                     6.523 KB       2 rows
. . imported "HRTEST2"."COUNTRIES"                       5.937 KB       2 rows
. . imported "HRTEST2"."REGIONS"                         5.476 KB       0 rows
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/PROCEDURE/PROCEDURE
Processing object type SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE
Processing object type SCHEMA_EXPORT/VIEW/VIEW
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
ORA-39083: Object type REF_CONSTRAINT:"HRTEST2"."DEPT_LOC_FK" failed to create with error:
ORA-02298: cannot validate (HRTEST2.DEPT_LOC_FK) - parent keys not found

Failing sql is:
ALTER TABLE "HRTEST2"."DEPARTMENTS" ADD CONSTRAINT "DEPT_LOC_FK" FOREIGN KEY ("LOCATION_ID") REFERENCES "HRTEST2"."LOCATIONS" ("LOCATION_ID") ENABLE

ORA-39083: Object type REF_CONSTRAINT:"HRTEST2"."DEPT_MGR_FK" failed to create with error:
ORA-02298: cannot validate (HRTEST2.DEPT_MGR_FK) - parent keys not found

Failing sql is:
ALTER TABLE "HRTEST2"."DEPARTMENTS" ADD CONSTRAINT "DEPT_MGR_FK" FOREIGN KEY ("MANAGER_ID") REFERENCES "HRTEST2"."EMPLOYEES" ("EMPLOYEE_ID") ENABLE

ORA-39083: Object type REF_CONSTRAINT:"HRTEST2"."COUNTR_REG_FK" failed to create with error:
ORA-02298: cannot validate (HRTEST2.COUNTR_REG_FK) - parent keys not found

Failing sql is:
ALTER TABLE "HRTEST2"."COUNTRIES" ADD CONSTRAINT "COUNTR_REG_FK" FOREIGN KEY ("REGION_ID") REFERENCES "HRTEST2"."REGIONS" ("REGION_ID") ENABLE

ORA-39083: Object type REF_CONSTRAINT:"HRTEST2"."LOC_C_ID_FK" failed to create with error:
ORA-02298: cannot validate (HRTEST2.LOC_C_ID_FK) - parent keys not found

Failing sql is:
ALTER TABLE "HRTEST2"."LOCATIONS" ADD CONSTRAINT "LOC_C_ID_FK" FOREIGN KEY ("COUNTRY_ID") REFERENCES "HRTEST2"."COUNTRIES" ("COUNTRY_ID") ENABLE

ORA-39083: Object type REF_CONSTRAINT:"HRTEST2"."EMP_MANAGER_FK" failed to create with error:
ORA-02298: cannot validate (HRTEST2.EMP_MANAGER_FK) - parent keys not found

Failing sql is:
ALTER TABLE "HRTEST2"."EMPLOYEES" ADD CONSTRAINT "EMP_MANAGER_FK" FOREIGN KEY ("MANAGER_ID") REFERENCES "HRTEST2"."EMPLOYEES" ("EMPLOYEE_ID") ENABLE

ORA-39083: Object type REF_CONSTRAINT:"HRTEST2"."EMP_DEPT_FK" failed to create with error:
ORA-02298: cannot validate (HRTEST2.EMP_DEPT_FK) - parent keys not found

Failing sql is:
ALTER TABLE "HRTEST2"."EMPLOYEES" ADD CONSTRAINT "EMP_DEPT_FK" FOREIGN KEY ("DEPARTMENT_ID") REFERENCES "HRTEST2"."DEPARTMENTS" ("DEPARTMENT_ID") ENABLE

ORA-39083: Object type REF_CONSTRAINT:"HRTEST2"."EMP_JOB_FK" failed to create with error:
ORA-02298: cannot validate (HRTEST2.EMP_JOB_FK) - parent keys not found

Failing sql is:
ALTER TABLE "HRTEST2"."EMPLOYEES" ADD CONSTRAINT "EMP_JOB_FK" FOREIGN KEY ("JOB_ID") REFERENCES "HRTEST2"."JOBS" ("JOB_ID") ENABLE

Processing object type SCHEMA_EXPORT/TABLE/TRIGGER
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Job "SYS"."SYS_IMPORT_FULL_01" completed with 7 error(s) at Sat Feb 8 06:03:55 2025 elapsed 0 00:00:35

 

همانطور که انتظار داشتیم، با توجه به نبود parent key اکثر constraint ها به مشکل برخورد. اگر میخواهید که این مشکل پیش نیاید و این قسمت ignore شود باید در زمان impdp از گزینه exclude=constraint استفاده کنید که کلیه constraint ها وارد نمی شوند. اما این روش شاید مشکلاتی برای تیم تولید که محیطی مشابه با محیط عملیاتی می خواهند، ایجاد میکند.

 

سناریو دوم. شناسایی و انتخاب جداولی که حجم زیاد دارند و انتخاب smaple تنها بر روی آنها:

 

[oracle@oracle8101924 ~]$ expdp directory=oracle_base dumpfile=sample_one_table.dmp logfile=sample_one_table.log schemas=hr sample=HR.LOG_TABLE:10

Export: Release 19.0.0.0.0 - Production on Sat Feb 8 05:50:11 2025
Version 19.25.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

Username: sys@orclpdb as sysdba
Password:

Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
FLASHBACK automatically enabled to preserve database integrity.
Starting "SYS"."SYS_EXPORT_SCHEMA_01":  sys/********@orclpdb AS SYSDBA directory=oracle_base dumpfile=sample_one_table.dmp logfile=sample_one_table.log s                               chemas=hr sample=HR.LOG_TABLE:10
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/TABLESPACE_QUOTA
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/PROCEDURE/PROCEDURE
Processing object type SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE
Processing object type SCHEMA_EXPORT/VIEW/VIEW
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/TRIGGER
. . exported "HR"."LOG_TABLE"                            5.885 MB  100707 rows
. . exported "HR"."EMPLOYEES"                            17.08 KB     107 rows
. . exported "HR"."LOCATIONS"                            8.437 KB      23 rows
. . exported "HR"."JOB_HISTORY"                          7.195 KB      10 rows
. . exported "HR"."JOBS"                                 7.109 KB      19 rows
. . exported "HR"."DEPARTMENTS"                          7.125 KB      27 rows
. . exported "HR"."COUNTRIES"                            6.367 KB      25 rows
. . exported "HR"."REGIONS"                              5.546 KB       4 rows
Master table "SYS"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYS.SYS_EXPORT_SCHEMA_01 is:
  /u01/app/oracle/sample_one_table.dmp
Job "SYS"."SYS_EXPORT_SCHEMA_01" successfully completed at Sat Feb 8 05:52:34 2025 elapsed 0 00:01:02

 

تنها جدول log_table با حجم ده درصد export گرفته شد و مابقی جداول که پایه هستند و مورد نیاز، بصورت کامل آمده اند. حالا impdp را برای این دامپ تست می کنیم:

 

[oracle@oracle8101924 ~]$ impdp directory=oracle_base dumpfile=sample_one_table.dmp logfile=imp_sample_one_table.log remap_schema=hr:hrtest

Import: Release 19.0.0.0.0 - Production on Sat Feb 8 05:54:53 2025
Version 19.25.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

Username: sys@orclpdb as sysdba
Password:

Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Master table "SYS"."SYS_IMPORT_FULL_01" successfully loaded/unloaded
Starting "SYS"."SYS_IMPORT_FULL_01":  sys/********@orclpdb AS SYSDBA directory=oracle_base dumpfile=sample_one_table.dmp logfile=imp_sample_one_table.log remap_schema=hr:hrtest
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/TABLESPACE_QUOTA
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
. . imported "HRTEST"."LOG_TABLE"                        5.885 MB  100707 rows
. . imported "HRTEST"."EMPLOYEES"                        17.08 KB     107 rows
. . imported "HRTEST"."LOCATIONS"                        8.437 KB      23 rows
. . imported "HRTEST"."JOB_HISTORY"                      7.195 KB      10 rows
. . imported "HRTEST"."JOBS"                             7.109 KB      19 rows
. . imported "HRTEST"."DEPARTMENTS"                      7.125 KB      27 rows
. . imported "HRTEST"."COUNTRIES"                        6.367 KB      25 rows
. . imported "HRTEST"."REGIONS"                          5.546 KB       4 rows
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/PROCEDURE/PROCEDURE
Processing object type SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE
Processing object type SCHEMA_EXPORT/VIEW/VIEW
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/TRIGGER
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Job "SYS"."SYS_IMPORT_FULL_01" successfully completed at Sat Feb 8 05:56:51 2025 elapsed 0 00:00:35

 

نتیجه موفقیت آمیز بود و هیچ constraint ی را نیز غیر فعال نکردیم.