در پروژههای مهاجرت پایگاهداده از PostgreSQL به Oracle، تفاوتهای اساسی در نحوه رفتار دیتاتایپها، ساختارهای JSON، مدیریت Sequenceها و سینتکس DDL باعث میشود که استفاده از روشهای سرراست یا ابزارهای عمومی همیشه پاسخگوی نیازهای یک سناریوی واقعی و حساس نباشد. این مقاله به معرفی یک جعبهابزار کاربردی مبتنی بر اسکریپتهای Bash اختصاص دارد که فرآیند استخراج، تبدیل ساختار و بارگذاری دادهها را بهصورت گامبهگام و تحت کنترل کامل DBA انجام میدهد.
داستان شکلگیری و انگیزه توسعه این ابزار
مدتی پیش در یک پروژه عملیاتی، مسئولیت انتقال دادهها از یک دیتابیس PostgreSQL به Oracle را بر عهده داشتم. در ابتدا تلاش شد فرایند با ابزار SQL Developer پیش برود، اما در آن محیط عملیاتی بهدرستی لود نشد و کارایی لازم را نداشت. از طرف دیگر، راهاندازی ابزارهای سازمانی سنگین نیز نیازمند پیشنیازهای زیرساختی و پیکربندیهای زمانبر بود.
علاوه بر این، چالش اصلی من دقت و انعطاف در تبدیل تایپهای دادهای خاص مانند JSON و JSONB و همچنین UUID بود. در PostgreSQL این دادهها ساختار خاص خود را دارند و در طرف اوراکل، انتخاب معادل بهینه (مانند Native JSON، ستون CLOB با قید اعتبارسنجی IS JSON، یا VARCHAR2 بسته به نسخه اوراکل) نیازمند تصمیمگیری و نظارت مستقیم متخصص دیتابیس بود.
به همین دلایل، تصمیم گرفتم کل فرایند را بهصورت ۵ مرحله ماژولار و با اتکا به اسکریپتهای سبک Bash، ابزار بومی psql و ابزار پرسرعت SQL*Loader پیادهسازی کنم. این ابزارها مزایای مشخصی دارند:
- استخراج ساختاریافته و تفکیکشده متادیتای PostgreSQL؛
- نگاشت تعاملی و دقیق تایپهای پیچیده (
JSON،UUIDو آرایهها) متناسب با نسخه دیتابیس اوراکل؛ - مدیریت خودکار توالیها (Sequences) و تنظیم مقدار اولیه (Increment) متناسب با بالاترین مقدار ستونهای عددی؛
- تولید کدهای استاندارد DDL برای ساخت اسکیما و جداول در اوراکل؛
- استخراج دادهها در قالب CSV و بارگذاری فوقالعاده سریع با
SQL*Loader؛ - اعمال ایندکسها و قیود (Constraints) پس از اتمام بارگذاری جهت حفظ حداکثر سرعت؛
- شفافیت کامل لاگها و امکان ردیابی سریع خطاها در هر مرحله.
در طراحی و بهبود ساختار این اسکریپتها، از هوش مصنوعی نیز بهعنوان یک دستیار فنی برای بهینهسازی کدهای Bash، اعتبارسنجی عبارات DDL و تدوین مستندات استفاده کردم. این مجموعه ابزار با موفقیت کامل در محیط عملیاتی تست شده و دادهها بدون مشکل منتقل شدهاند.
معماری استقرار و پیشنیازها
نکته مهم در معماری اجرای این ابزار این است که تمام اسکریپتها روی سروری که پایگاهداده اوراکل (مقصد) روی آن مستقر است اجرا میشوند و نیازی به اجرای اسکریپت روی سرور PostgreSQL نیست.
تنها پیشنیاز کلیدی این است که ابزار خط فرمان psql روی همین سرور اوراکل نصب باشد تا بتواند از طریق شبکه به سرور مبدأ وصل شود و دادهها و متادیتا را بخواند. سپس دستورات sqlplus و sqlldr عملیات ایجاد ساختار و لود دادهها را در اوراکل انجام میدهند.
دستورات و پیشنیازها روی سرور اوراکل:
- نصب کلاینت PostgreSQL: در توزیعهای مبتنی بر RHEL مانند Oracle Linux 8/9:
# Install PostgreSQL client sudo dnf install -y postgresql - بررسی در دسترس بودن ابزارهای موردنیاز:
# Verify required CLI binaries which sqlplus which sqlldr which psql - ارتباط شبکه: برقراری ارتباط با پورت پایگاهداده PostgreSQL (پیشفرض ۵۴۳۲) از سمت سرور اوراکل.
مراحل ۵گانه اجرای مهاجرت
۱. استخراج متادیتا (mig1-connect-to-postgres.sh)
با استفاده از psql به سرور PostgreSQL متصل شده و تمامی متادیتاهای مربوط به جداول، ستونها، قیود، ایندکسها، توالیها (Sequences) و تایپهای سفارشی را استخراج میکند.
۲. تبدیل و تطبیق دیتاتایپها (mig2-convert_datatypes.sh)
تایپهای حساسی چون UUID، JSONB، BOOLEAN، TEXT و تایماستمپها را با نظارت DBA به تایپهای معادل در اوراکل مپ کرده و فایل type_mapping.conf را ایجاد میکند.
۳. تولید DDLهای اوراکل (mig3-connect-to-oracle.sh)
کدهای DDL ساخت اسکیما، جداول و توالیها (Sequences) را تولید کرده و آماده اجرا در محیط اوراکل میسازد.
۴. خروجی CSV و لود دادهها با SQL*Loader (mig4-csv-postgres-sqldlr-oracle.sh)
دادهها را از طریق psql به فرمت CSV استخراج کرده و بهکمک فایلهای کنترل (.ctl) با بالاترین کارایی توسط sqlldr وارد اوراکل میکند.
۵. اعمال ایندکسها، قیود و اعتبارسنجی نهایی (mig5-postload-oracle.sh)
در مرحله آخر، ایندکسها و قیود (Foreign Keyها و Checkها) اضافه شده و وضعیت نهایی رکوردها بررسی میشود.
دستورالعمل اجرایی
# Step 1: Clone repository on the Oracle server
git clone https://github.com/vahiddb/postgres-to-oracle-migration.git
cd postgres-to-oracle-migration
# Step 2: Grant execution permissions
chmod +x *.sh
# Step 3: Run the phases sequentially
./mig1-connect-to-postgres.sh
./mig2-convert_datatypes.sh
./mig3-connect-to-oracle.sh
./mig4-csv-postgres-sqldlr-oracle.sh
./mig5-postload-oracle.sh
سلب مسئولیت، محدوده وظایف و نکات مهم
هدف اصلی این ابزار، فقط انتقال صحیح و ایمن دادهها (Data Migration) از مبدأ به مقصد است. با توجه به تفاوتهای بنیادین منطق برنامهنویسی در دیتابیسهای مختلف، نکات زیر بسیار حائز اهمیت است:
- مسئولیت صحتسنجی (Validation): این ابزار یک موتور انتقال داده است. مسئولیت نهایی برای اطمینان از اینکه دادههای منتقلشده با منطق تجاری اپلیکیشن (Business Logic) همخوانی دارند و همچنین تست نهایی صحت دادهها، بر عهده تیم تولیدکننده نرمافزار و توسعهدهندگان اپلیکیشن است، نه DBA.
- مدیریت توالیها (Sequences): اگرچه ابزار سعی در بازسازی توالیها دارد، اما همواره پس از مهاجرت باید مقادیر آخرین ثبتها (Last Inserted IDs) با وضعیت واقعی Sequenceها در دیتابیس اوراکل تطبیق داده شود.
- پشتیبانگیری: اکیداً توصیه میشود پیش از اجرای عملیات، از هر دو پایگاهداده پشتیبان کامل تهیه کنید.
- محیط تست: حتماً قبل از اجرای نهایی در محیط عملیاتی، فرآیند را در یک محیط تست یا Staging کاملاً مشابه با محیط نهایی ارزیابی کنید.
- مسئولیت اجرا: تمامی اسکریپتها تحت کنترل کاربر اجرا میشوند و مسئولیت کامل پیامدهای احتمالی اجرا در محیطهای عملیاتی بر عهده خود کاربر/متخصص پایگاهداده است.
مخزن پروژه در گیتهاب
کدهای این پروژه تحت لایسنس متنباز MIT در گیتهاب در دسترس است و از نظرات، گزارشها و پیشنهادات شما برای بهبود آن استقبال میشود: