
آیا میتوان در اوراکل ساختار جدول را تغییر داد بدون اینکه سرویس متوقف شود؟
بله، میشود! با استفاده از پکیج قدرتمند 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 یک راهحل ایدهآل و قدرتمند است.
📥 اگر سوالی داری یا مشکلی در اجرای این پکیج داری، در بخش کامنتها بپرس یا همین حالا با ما تماس بگیر.
سؤالی درباره این مقاله داری؟
اگر نکتهای در این مقاله برات مبهم بود یا خواستی بیشتر بدونی، همین حالا برام بنویس تا دقیق و صمیمی پاسخت رو بدم — مثل یه گفتوگوی واقعی 💬
برو به صفحه پرسش و پاسخ
دیدگاهتان را بنویسید