معرفی pgVolvra؛ قابلیت بازگردانی (Undo) دقیق برای ابزار مدیریت پایگاه داده Postgres — Muhammad Aqeel: Undo for Postgres, without losing the rest of your day
خلاصه
ابزار pgVolvra امکان بازگردانی دقیق تغییرات نامطلوب در دیتابیس Postgres را بدون نیاز به رولبک کل کلاستر فراهم میکند. این ابزار به صورت کامل با SQL و PL/pgSQL نوشته شده و روی سرویسهای ابری مدیریتشده نیز کار میکند.
مقدمه و زمینه
یکی از کابوسهای رایج توسعهدهندگان و مدیران پایگاه داده زمانی است که یک دستور UPDATE بدون شرط WHERE روی دیتابیس Postgres اجرا میشود. در چنین شرایطی، بازیابی اطلاعات معمولاً یک فرآیند پیچیده و زمانبر است؛ شما باید یک نسخه پشتیبان را در کنار دیتابیس اصلی ریستور کنید، رکوردهای آسیبدیده را استخراج کرده و آنها را به صورت دستی با جدول زندهای که همچنان در حال دریافت ترافیک است، تطبیق دهید. کاربران پایگاه داده Oracle سالهاست که از ویژگی قدرتمندی به نام Flashback برای این کار بهره میبرند، اما Postgres مکانیزم مشابهی برای این سناریو ندارد.
برای حل این مشکل، ابزاری به نام pgVolvra (که توسط Muhammad Aqeel توسعه یافته است) معرفی شده است که به شما اجازه میدهد تغییرات روی رکوردهای جدول را بدون دستکاری بقیه بخشها به عقب بازگردانید.
ابزار pgVolvra چگونه کار میکند؟
ابزار pgVolvra تغییرات رکوردهای جداولی را که انتخاب کردهاید، ثبت میکند. برای هر تغییر، وضعیت قبلی و بعدی رکورد به همراه مشخصات عامل تغییر (actor)، زمان و شناسه تراکنش ذخیره میشود. هنگامی که خطایی رخ میدهد، این ابزار تنها رکوردهای آسیبدیده را به حالت قبل بازمیگرداند و به بقیه دادهها کاری ندارد.
نکته فنی مهم این است که کل موتور این ابزار با دستورات استاندارد SQL و PL/pgSQL پیادهسازی شده است. هیچ افزونه کامپایلشدهای (compiled extension)، تنظیم خاصی در shared_preload_libraries، دسترسی superuser یا دسترسی به سیستم فایل سرور نیاز ندارد. همین محدودیت طراحی هوشمندانه باعث میشود که این ابزار روی پایگاههای داده مدیریتشده (managed Postgres) نیز به راحتی اجرا شود.
قابلیتهای کلیدی و نحوه استفاده
برای استفاده از این ابزار، کافی است اسکریپت مربوطه را روی دیتابیس اجرا کنید و سپس جدول مورد نظر خود را فعال نمایید:
SELECT volvra.enable('public.orders');
از آن لحظه به بعد، تمامی دستورات INSERT، UPDATE و DELETE روی آن جدول ردیابی میشوند. امکانات اصلی این ابزار عبارتند از:
- سفر در زمان (Time Travel): تابع
volvra.as_ofبه شما اجازه میدهد وضعیت جدول را در هر لحظه دلخواهی در گذشته به صورت کاملاًread-onlyو بدون ایجاد تغییر در جدول زنده مشاهده کنید. - سیستم هشداردهی هوشمند: میتوانید تعیین کنید که اگر یک دستور تعداد رکوردهای بیشتری از حد انتظار (مثلاً بیش از ۱۰۰۰ رکورد) را تغییر داد، یک
WARNINGصادر شود تا پیش از تماس کاربران متوجه خطا شوید. - بازگردانی دقیق (Undo): پیش از اجرای عملیات بازگردانی، میتوانید با
volvra.preview_undoسناریوی پیشرو را بررسی کنید و با پارامترconfirm => trueاجازه اجرای نهایی را بدهید. - قوانین ایمنی و مدیریت تداخلها: اگر در فاصله زمانی بین بروز خطا و تشخیص آن، کاربران واقعی تغییری روی همان رکوردها داده باشند، ابزار از بازکوردی کورکورانه خودداری کرده و مانع از بین رفتن دادههای جدید میشود.
آرشیو خارج از دیتابیس و قابلیت ریپلی (Replay)
به صورت پیشفرض، تاریخچه تغییرات در جدول معمولی داخل خود دیتابیس ذخیره میشود. اما یک پردازنده جانبی (companion process) نیز وجود دارد که تغییرات را به صورت JSON خطبهخط همراه با هشهای SHA-256 روی فضای ذخیرهسازی خارج از دیتابیس مینویسد. این قابلیت به شما امکان میدهد حتی اگر دیتابیس اصلی به کلی از دست برود، با استفاده از نسخههای پشتیبان قدیمی و رپلی کردن تغییرات آرشیو شده، اطلاعات از دست رفته را بازیابی کنید.
هزینهها و سربار عملکرد
ثبت تاریخچه تغییرات هزینههای خاص خود را دارد:
- افت توان عملیاتی نوشتن (
write throughput) بین ۱۱ تا ۴۱ درصد متغیر است که دستوراتUPDATEسنگین بیشترین تاثیر را میپذیرند. - هر تغییر ثبتشده فضایی حدود ۳۰۰ تا ۴00 بایت اشغال میکند.
- حجم فایلهای
WAL(Write-Ahead Log) حدود ۲.۲ برابر افزایش مییابد.
نگاه جامعه مهندسی (Hacker News)
در بحثهای انجامشده در هکرنیوز، کاربران به نکات جالبی اشاره کردند. برخی نامگذاری ابزار (pgVolvra) را از نظر آوایی چالشبرانگیز دانستند، در حالی که گروهی دیگر رویکرد مبتنی بر لاگها و تریگرها را بسیار کاربردی توصیف کرده و ابراز امیدواری کردند که پایگاههای داده در آینده چنین قابلیتهایی را به صورت توکار و declarative ارائه دهند.
این مطلب بهصورت کاملاً خودکار و با هوش مصنوعی از مقالهٔ اصلی و بحث هکرنیوز تهیه شده و ممکن است خطا داشته باشد. حقوق مطلب اصلی متعلق به نویسندهٔ آن است. قوانین و گزارش مشکل