تجربه من در مهاجرت از MySQL به SQL Server - قسمت دم

Microsoft SQL Server Migration Assistant for MySQL v8.4.0
Microsoft SQL Server Migration Assistant for MySQL v8.4.0

در قسمت قبل توضیح دادم که بعد از چهار سال استفاده از MySQL تصمیم گرفتیم به SQL Server مهاجرت کنیم و برای این کار نیاز بود تا مطمئن بشیم تمامی Table ها، View ها، Function ها و در کل تمام Objectهایی که در MySQL ایجاد کرده بودیم به درستی به SQL Server منتقل بشه.

بعد از کمی جستجو فهمیدیم که Microsoft ابزاری داره که برای Migration از دیتابیس های مختلف از جمله MySQL به SQL Server استفاده میشه. (کلی خوشحال شدیم!) و بلافاصله این ابزار (Migration Assistant) را دانلود و نصب کردیم.

محیط نرم افزار SQL Server Migration Assistant for MySQL
محیط نرم افزار SQL Server Migration Assistant for MySQL

این را بگم که این نرم افزار محیط ساده ای داره و کار کردن باهاش راحته.

در قدم اول باید پروژه ای ایجاد کنیم که شامل تمامی mapping ها و meta-data ها و چیزهایی که Migration Assistant برای انتقال Schema ها و داده ها و ... نیاز داره.

بعدش نوبت به تعریف Connection ها میرسه. یک Connection برای MySQL و یکی هم SQL Server.

نکته ای که وجود داره انتخاب Database مقصد در SQL Server هست که ما برای این کار یک Database خالی ایجاد کردیم به اسم NEWDB و در قسمت Database اتصال به SQL Server مشخص کردیم.

استراتژی که داشتیم این بود که تمامی Schema های تعریف شده در MySQL به این Database جدید در SQL Server منتقل بشه.

یعنی بطور مثال:

 SELECT * FROM MySCHEMA.MyTABLE 

در MySQL تبدیل میشه به:

SELECT * FROM NEWDB.MySCHEMA.MyTABLE

در SQL Server.

بعد از اتصال به MySQL، ابتدا باید مشخص کنیم که Schema ها یا بطور دقیق تر Object ها باید Load بشه.

در قسمت MySQL Metadata Explorer امکان انتخاب Object هایی که قرار هست به SQL Server منتقل بشه وجود داره.

ما بعد از انجام چند بار تست روی یکی دوتا جدول و یک Function تصمیم گرفتیم کل Schema هایی که داشتیم منتقل کنیم، و بعد از اینکه فهمیدیم اوضاع خوبه همه Schema های مورد نظرمون رو انتخاب کردیم.

قدم بعدی هم اینه که Database مقصد را در SQL Server Metadata Explorer تعیین کنیم.

پس تا اینجای کار مشخص کردیم که چه Object هایی از MySQL قرار هست به SQL Server منتقل بشه.

فرآیند Migration در این ابزار شامل دو بخش اصلی میشه:

  • عملیات Convert: معادل هر Object (شامل Table، Function و ...) که در MySQL ایجاد شده باید در SQL Server هم ایجاد بشه. (برای این کار از گزینه Convert Schema استفاده می کنیم. (البته باید روی قسمت MySQL Metadata Explorer کلیک کرده باشیم)
    نکته ای که وجود داره اینه که باید معادل schema و جداولی که در MySQL وجود داره در SQL Server هم ایجاد بشه، پس نیاز هست که SQL Server با MySQL همگام (Synchronize) بشن که گزینه Synchronize with Database در قسمت SQL Server Metadata Explorer اینکار را انجام میده.
  • عملیات Data Migration: که دیتا از جداول مبدا در MySQL به مقصد (SQL Server) منتقل میکنه. (گزینه Migrate Data) در قسمت MySQL Metadata Explorer !

بعد از اتمام عملیات Data Migration که بسته به حجم جداول میتونه زمان بر باشه گزارشی از تعداد جداول منتقل شده و جداولی که در زمان انتقال خطا داشتند یا بصورت منتقل نشدن (Partially Migrated) نمایش داده میشه که امکان ذخیره با فرمت CSV داره.

ما کل پوشه پروژه Migration و گزارش عملیات را در Source Control خودمون ذخیره کردیم تا اگر لازم شد بعدا بتونیم بهش رجوع کنیم.

نکته دیگه ای که وجود داشت این بود که در زمان انتقال Function ها، بعضی Function های ما با خطا منتقل شدن (شرح خطا در بدنه Function ها نوشته شده بود) که به دلیل عدم Convert بعضی دستورات در زمان Convert توسط این ابزار بود که باید خودمون بازنویسی می کردیم. مثل:

M2SS0210: Conversion of  Regexp or Rlike  Operators is not supported.

منظورش اینه که نتونسته Regexp رو Convert کنه!

یا:

M2SS0235: MySQL does not support UNSIGNED INTEGER datatype during CAST/CONVERT

همینطور در بعضی Function ها هم با وجود اینکه Convert انجام شده بود اما نتیجه اجرای Function درست نبود که نیاز به تغییرات جزئی داشت.

نتیجه گیری

کل پروسه مهاجرت با شرایطی که اول کار توضیح دادم شامل این روند شد:

  • برنامه ریزی برای مشخص کردن کارهایی که باید انجام میدادیم و همینطور شناسایی ریسک ها و پیچیدگی ها
  • خانه تکانی قبل از حرکت! (حذف جداول بلا استفاده، انتقال برخی جداول به Schema های دیگه و ...)
  • ذخیره تمامی Function های نوشته شده روی MySQL در Source Control.
  • اجرای عملیات Convert و Data Migration با استفاده از SQL Server Migration Assistant. (البته قبلش بصورت تستی چند جدول و Function منتقل کردیم!)
  • اصلاح Function هایی که Convert آنها به درستی انجام نشده بود.
  • اطمینان از صحت عملکرد و تست مجدد همه Function ها.
  • اصلاح Query های Ad hoc و اصلاح Query های مورد استفاده در Application ها.

در کل باید بگم که این تغییر با وجود اینکه شخصا به MySQL علاقه دارم خوب بود و باعث شد کلی مطلب جدید یاد بگیریم و بتونیم از این به بعد از امکانات SQL Server هم بیشتر استفاده کنیم.