سلام دوستان
شاید مانند برخی از فراگیران دیتابیس اوراکل، در خصوص یادگیری دو مفهوم undo data و redo data گاهی دچار مشکل شده باشند. قصد دارم این دو مفهوم رو توصیف کنم.

زمانی که یک کاربر عملیاتی را از طریق session خود آغاز می کند، یک واحد منطقی به نام transaction یا TRN در سرور دیتابیس اوراکل ایجاد می شود که عملیات کاربر در قالب آن اجرا می گردد. در اغلب دیتابیس ها (با توجه به کارکرد) دستوراتی که تغییر به همراه دارند (در قالب TRN) به طور مداوم توسط کاربران صادر می شوند و تا زمانی کاربران دستور commit (تائید تغییر) یا rollback (انصراف از تغییر) را برای TRN خود صادر نکنند، TRN ها بسته نمی شوند. در این شرایط با توجه به ACID! لازم است TRN ها تحت یک مکانیزم دقیق، نظارت و مدیریت شوند تا اول سلامت دیتا که مدام در حال تغییر است تضمین شود و دوم عملیاتی که کاربران جهت تغییر اجرا می کنند، به هدر نرود. به بیان ساده data loss صفر شود.

اول undo data. فرض کنید به عنوان کاربر تغییری در دیتا داده اید و هنوز commit نکرده اید، زیرا قصد دارید از صحت تغییر مطمئن شوید. در این شرایط در عمل TRN عملیات شما هنوز بلاتکلیف است (نه commit شده نه rollback). ناگهان برق قطع می شود و شما فرصت commit یا rollback نمی یابید. تکلیف دیتا چیست؟ شما آن را تغییر داده اید و حالا هیچی. هر بار دیتا تغییر می کند، دیتای قبل از تغییر در قالب undo data در جایی ذخیره می شود. اگر کاربر فرصت بستن TRN را نیابد دیتا توسط undo data به وضعیت اوریجینال خود باز می گردد.

حال redo data. ادامه مثال قبل فرض کنید شما فرصت بستن TRN را یافتید و آن را commit کردید. این بار اتفاقی که می افتد این است که اوراکل فرصت ثبت تغییر شما در data file ها را نمی یابد. تکلیف تغییری که شما تائید کردید چیست؟ توجه کنید شما commit کرده اید و حال با خیال راحت به کارهای دیگرتان می رسید. هر تغییری که در دیتابیس رخ می دهد اطلاعات مربوط به آن تغییر، در قالب redo data ذخیره می شوند. اگر اوراکل تغییر شما را نتواند به دلیل استاپ شدن ناگهانی، در دیتافایلها ثبت نماید، تغییر شما توسط redo data اتوماتیک مجددا اعمال می شود و کار شما هدر نمی رود.

به طور خلاصه undo data دیتای قبل از تغییر است. مثلا اگر علی را به علیرضا تغییر دادید، علی در قالب undo data در جایی ذخیره و باقی می ماند تا commit. در صورتی که rollback بزنید یا به هر دلیل دچار خطای قطعی شوید از undo data برای برگشت تغییر استفاده می شود. redo data دیتا نیست، اطلاعاتی است که تغییر شما را در صورت از دست رفتن مجددا اعمال می کند. انگار یک کاربر می نشیند و مانند شما دستور صادر می کند.


موفق باشید