انتقال داده های پشتیبان از نسخه جدید MS SQL Server به نسخه قدیمی تر

ماقبل تاریخ

یک بار، برای بازتولید یک باگ، به یک نسخه پشتیبان از پایگاه داده تولید نیاز داشتم.

در کمال تعجب، با محدودیت های زیر مواجه شدم:

  1. پشتیبان گیری از پایگاه داده بر روی نسخه ساخته شده است SQL سرور 2016 و با من سازگار نبود SQL سرور 2014.
  2. در رایانه کاری من، سیستم عامل استفاده شده بود ویندوز 7پس نتونستم آپدیت کنم SQL سرور تا نسخه 2016
  3. محصول پشتیبانی شده بخشی از یک سیستم بزرگتر با معماری قدیمی بود و همچنین با سایر محصولات و پایه ها صحبت می کرد، بنابراین ممکن است زمان زیادی برای استقرار آن در ایستگاه دیگری نیاز باشد.

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

بازیابی اطلاعات از یک نسخه پشتیبان

من استفاده از ماشین مجازی را انتخاب کردم اوراکل VM VirtualBox با ویندوز 10 (می توانید یک تصویر آزمایشی برای مرورگر Edge بگیرید از این رو). SQL Server 2016 بر روی ماشین مجازی نصب شد و پایگاه داده برنامه از نسخه پشتیبان بازیابی شد (دستور العمل).

پیکربندی دسترسی به SQL Server در ماشین مجازی

در مرحله بعد، لازم بود اقداماتی انجام شود تا بتوان از بیرون به SQL Server دسترسی پیدا کرد:

  1. برای فایروال، یک قانون برای پرش درخواست پورت اضافه کنید 1433.
  2. مطلوب است که دسترسی به سرور از طریق احراز هویت ویندوز انجام نشود، بلکه از طریق SQL با استفاده از ورود و رمز عبور (تنظیم دسترسی آسانتر است). با این حال، در این مورد، باید به یاد داشته باشید که احراز هویت SQL را در ویژگی های SQL Server فعال کنید.
  3. در تنظیمات کاربر در SQL Server در برگه نقشه برداری کاربران نقش کاربر را برای پایگاه داده بازیابی شده مشخص کنید db_securityadmin.

انتقال داده

در واقع، خود انتقال داده شامل دو مرحله است:

  1. انتقال طرح واره داده ها (جدول، نماها، رویه های ذخیره شده و غیره)
  2. انتقال خود داده ها

انتقال طرحواره داده

ما عملیات زیر را انجام می دهیم:

  1. انتخاب کنید وظایف -> تولید اسکریپت برای یک پایه قابل حمل
  2. اشیایی را که برای انتقال نیاز دارید انتخاب کنید یا مقدار پیش فرض را رها کنید (در این حالت، اسکریپت هایی برای تمام اشیاء پایگاه داده ایجاد می شود).
  3. تنظیمات ذخیره اسکریپت را مشخص کنید. راحت تر است که اسکریپت را در یک فایل یونیکد ذخیره کنید. سپس در صورت شکست نیازی به تکرار مجدد تمامی مراحل ندارید.

هنگامی که اسکریپت ذخیره شد، می توان آن را بر روی سرور اصلی SQL (نسخه قدیمی) اجرا کرد تا پایه مورد نیاز ایجاد شود.

هشدار: پس از اجرای اسکریپت، باید مطابقت بین تنظیمات پایگاه داده از پشتیبان گیری و پایگاه داده ایجاد شده توسط اسکریپت را بررسی کنید. در مورد من، هیچ تنظیمی برای COLLATE در اسکریپت وجود نداشت، که منجر به شکست در هنگام انتقال داده ها و رقصیدن با تنبور برای بازسازی پایگاه داده با استفاده از اسکریپت تکمیل شده شد.

انتقال داده

قبل از انتقال داده ها، باید بررسی تمام محدودیت های پایگاه داده را غیرفعال کنید:

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'

انتقال داده ها با استفاده از جادوگر واردات داده انجام می شود Tasks -> Import Data در SQL Server، جایی که پایگاه داده ایجاد شده توسط اسکریپت قرار دارد:

  1. تنظیمات اتصال به منبع (SQL Server 2016 در ماشین مجازی) را مشخص کنید. من از منبع داده استفاده کردم SQL Server Native Client و احراز هویت SQL فوق الذکر.
  2. تنظیمات اتصال را برای مقصد مشخص کنید (SQL Server 2014 در دستگاه میزبان).
  3. بعد، نقشه برداری را تنظیم کنید. همه باید انتخاب شوند نه فقط خواندنی اشیاء (برای مثال، نماها نیازی به انتخاب ندارند). به عنوان گزینه های اضافی، را انتخاب کنید "اجازه درج در ستون های هویت"در صورت استفاده از چنین مواردی
    هشدار: if، هنگام تلاش برای انتخاب چندین جدول و تنظیم ویژگی آنها "اجازه درج در ستون های هویت" ویژگی قبلاً برای حداقل یکی از جداول انتخاب شده تنظیم شده است، گفتگو نشان می دهد که ویژگی قبلاً برای همه جداول انتخاب شده تنظیم شده است. این واقعیت می تواند گیج کننده باشد و منجر به خطاهای مهاجرت شود.
  4. ما انتقال را شروع می کنیم.
  5. بازیابی بررسی محدودیت:
    EXEC sp_msforeachtable 'ALTER TABLE ? CHECK CONSTRAINT all'

در صورت بروز هر گونه خطایی، تنظیمات را بررسی می کنیم، پایگاه داده ایجاد شده با خطا را حذف می کنیم، آن را دوباره از اسکریپت ایجاد می کنیم، اصلاحات را انجام می دهیم و انتقال داده را تکرار می کنیم.

نتیجه

این کار بسیار نادر است و تنها به دلیل محدودیت های بالا رخ می دهد. رایج ترین راه حل ارتقای SQL Server یا اتصال به سرور راه دور در صورتی که معماری برنامه اجازه می دهد است. با این حال، هیچ کس از کدهای قدیمی و دست های کج توسعه بی کیفیت مصون نیست. امیدوارم که نیازی به این آموزش نداشته باشید، اما اگر همچنان به آن نیاز دارید، به صرفه جویی در زمان و اعصاب بسیار کمک می کند. با تشکر از توجه شما!

فهرست منابع استفاده شده

منبع: www.habr.com