ESC را فشار دهید تا بسته شود

زمیوس آموزش، یادگیری و سرگرمی

راهنمای کامل پکیج DBMS_REDEFINITION در Oracle | تغییر ساختار جدول بدون downtime

آیا می‌توان در اوراکل ساختار جدول را تغییر داد بدون اینکه سرویس متوقف شود؟

بله، می‌شود! با استفاده از پکیج قدرتمند DBMS_REDEFINITION، شما می‌توانید جدول‌های خود را در زمان اجرا و بدون قطع شدن دسترسی کاربران بازطراحی کنید.

این ابزار بی‌نظیر برای تغییر ساختار جداول حجیم، بدون نیاز به downtime یا از کار افتادن سیستم، طراحی شده است.

اگر می خواهید در این بخش از مقاله آموزش اوراکل از پکیج های اوراکلی در مورد پکیج DBMS_RESOURCE_MANAGER بیشتر آشنا بشید، پیشنهاد می شود نوشته زیر را مطالعه کنید:

در این نوشته شما می خوانید

📌 DBMS_REDEFINITION چیست؟

  • DBMS_REDEFINITION یک پکیج PL/SQL در Oracle است که امکان تغییر ساختار جداول را بدون متوقف کردن سرویس به شما می‌دهد.

  • به‌عبارت ساده، اگر بخواهید:

  • ستون اضافه یا حذف کنید،
  • نوع داده‌ی ستون را تغییر دهید،
  • جدول را پارتیشن‌بندی کنید،
  • جدول را به یک tablespace جدید منتقل کنید،
    می‌توانید همه این‌ها را در زمان اجرا (Online) و بدون اختلال در سرویس انجام دهید.

🎯 موارد استفاده واقعی از DBMS_REDEFINITION

  • تغییر طراحی جداول به‌صورت زنده (live)
  • تبدیل جدول غیرپارتیشن به جدول پارتیشن‌شده (مناسب برای حجم‌های بالا)
  • انتقال جدول از یک tablespace به دیگری برای بهینه‌سازی حافظه
  • اعمال تنظیمات فشرده‌سازی روی جداول برای کاهش مصرف دیسک
  • بازنویسی ساختار جدول قدیمی بدون حذف یا export/import داده

📚 آموزش گام‌به‌گام استفاده از DBMS_REDEFINITION

▶️ مرحله ۱: بررسی امکان بازتعریف جدول

قبل از هر کاری باید ببینیم آیا جدول موردنظر قابلیت بازتعریف دارد یا خیر:

				
					BEGIN
  DBMS_REDEFINITION.CAN_REDEF_TABLE(
    uname        => 'HR',
    tname        => 'EMPLOYEES',
    options_flag => DBMS_REDEFINITION.CONS_USE_ROWID); 
    -- ya CONS_USE_PK
END;

				
			

📌 اگر جدول کلید اصلی دارد، بهتر است از CONS_USE_PK استفاده شود.

▶️ مرحله ۲: ساخت جدول موقت با ساختار جدید

				
					CREATE TABLE employees_new (
  employee_id     NUMBER PRIMARY KEY,
  first_name      VARCHAR2(100),
  last_name       VARCHAR2(100),
  department_id   NUMBER,
  hire_date       DATE
);

				
			

می‌خواهید ستون اضافه یا حذف کنید؟ کافی‌ست در این جدول جدید تغییرات دلخواه را اعمال کنید.

▶️ مرحله ۳: شروع بازتعریف

				
					BEGIN
  DBMS_REDEFINITION.START_REDEF_TABLE(
    uname        => 'HR',
    orig_table   => 'EMPLOYEES',
    int_table    => 'EMPLOYEES_NEW',
    options_flag => DBMS_REDEFINITION.CONS_USE_ROWID);
END;

				
			

در اینجا Oracle شروع به کپی کردن داده‌ها از جدول اصلی به جدول جدید می‌کند.

▶️ مرحله ۴: کپی وابستگی‌ها مثل ایندکس، تریگر و …

				
					BEGIN
  DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(
    uname             => 'HR',
    orig_table        => 'EMPLOYEES',
    int_table         => 'EMPLOYEES_NEW',
    copy_indexes      => DBMS_REDEFINITION.CONS_ORIG_PARAMS,
    copy_triggers     => TRUE,
    copy_constraints  => TRUE,
    copy_privileges   => TRUE,
    copy_statistics   => FALSE);
END;

				
			

در این مرحله می‌توانید تمام ایندکس‌ها، constraintها و… را نیز به جدول جدید منتقل کنید.

▶️ مرحله ۵: همگام‌سازی داده‌ها (در صورت تغییر هنگام اجرا)

				
					BEGIN
  DBMS_REDEFINITION.SYNC_INTERIM_TABLE(
    uname      => 'HR',
    orig_table => 'EMPLOYEES',
    int_table  => 'EMPLOYEES_NEW');
END;

				
			

اگر کاربر در حین عملیات تغییراتی در جدول اصلی داده، با این دستور اطلاعات جدول موقت را به‌روز می‌کنیم.

▶️ مرحله ۶: پایان بازتعریف و اعمال جدول جدید

				
					BEGIN
  DBMS_REDEFINITION.FINISH_REDEF_TABLE(
    uname      => 'HR',
    orig_table => 'EMPLOYEES',
    int_table  => 'EMPLOYEES_NEW');
END;

				
			

در این لحظه Oracle به‌طور خودکار جدول اصلی را با ساختار جدید جایگزین می‌کند.

▶️ مرحله ۷ (اختیاری): حذف جدول موقت

				
					DROP TABLE employees_new;

				
			

اگر جدول موقت پس از عملیات باقی مانده، می‌توانید آن را حذف کنید.

⚠️ محدودیت‌ها و نکات حیاتی پکیج DBMS_REDEFINITION

مورد توضیح
کلید اصلی یا ROWID جدول باید Primary Key داشته باشد یا از ROWID استفاده کند.
نوع ستون‌ها ستون‌هایی با datatype خاص یا LOB خارجی قابل بازتعریف نیستند.
محدودیت‌های ساختاری جدول‌هایی که از object type یا nested table استفاده می‌کنند پشتیبانی نمی‌شوند.
کارایی عملیات سریع است اما در زمان پیک توصیه نمی‌شود.

✅ مزایای DBMS_REDEFINITION نسبت به روش‌های سنتی

ویژگی مزیت
بدون downtime کاربران همچنان به جدول دسترسی دارند.
صرفه‌جویی در زمان بدون نیاز به export/import یا rename دستی
مناسب برای Big Data مخصوصاً در پروژه‌هایی با میلیون‌ها ردیف
انعطاف‌پذیر قابل استفاده برای طیف وسیعی از تغییرات ساختاری

سوالات متداول درباره پکیج DBMS_REDEFINITION در Oracle

خیر، تنها در برخی لحظات کوتاه ممکن است قفل‌های سبک اعمال شود ولی قفل DDL وجود ندارد.

بله، یکی از کاربردهای محبوب DBMS_REDEFINITION تبدیل جدول معمولی به جدول پارتیشن‌شده است.

از Oracle 9i به بعد در دسترس است، ولی در نسخه‌های جدیدتر مانند ۱۲c و ۱۹c با عملکرد بهینه‌تر.

✍️ جمع‌بندی نهایی

اگر دنبال روشی هستید که:

  • ساختار جدول‌ها را بدون اختلال تغییر دهید،
  • حجم زیادی از داده‌ها را مدیریت می‌کنید،
  • در سیستم‌های حساس کار می‌کنید که downtime غیرقابل‌قبول است،

پکیج DBMS_REDEFINITION یک راه‌حل ایده‌آل و قدرتمند است.

📥 اگر سوالی داری یا مشکلی در اجرای این پکیج داری، در بخش کامنت‌ها بپرس یا همین حالا با ما تماس بگیر.

سؤالی درباره این مقاله داری؟

اگر نکته‌ای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفت‌وگوی واقعی 💬

برو به صفحه پرسش و پاسخ

میثم راد

من یه برنامه نویسم که حسابی با دیتابیس اوراکل رفیقم! از اونایی ام که تا چیزی رو کامل نفهمم،ول کن نیستم، یادگرفتن برام مثل بازیه، و نوشتن اینجا کمک می کنه تا چیزایی که یاد گرفتم رو با بقیه به شریک بشم، با هم پیشرفت کنیم.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *