آموزش نحوه اجرای اسکریپت های حجیم در SQL SERVER - مقدمه

معمولاً اسکریپت هایی که بصورت روزمره در sql server اجرا می کنیم محدود به چند خط دستور هستند و غالباً شامل دستورات (DML(Data Manipulation Language می باشند. اما در شرایط خاصی لازم است تا اسکریپت های حجیم شامل هزاران خط دستور را در ( SSMS(SQL Server Management Studio اجرا کنیم. فرض کنید شما یک دیتابیس چند گیگا بایتی در sql server 2016 دارید و به هر دلیلی لازم است که این دیتابیس را به یک سرور دیگر که نسخه sql server 2014 در آن نصب شده است منتقل کنید، همانطور که می دانید انتقال دیتابیس از نسخه بالاتر sql server به نسخه پایین تر آن با استفاده از روش های رایج Backup-Restore و یا Detach-Attach امکانپذیر نیست. یکی از روش ها جهت انتقال دیتابیس از نسخه بالاتر sql server به نسخه پایین تر، تبدیل کل دیتابیس به اسکریپت با استفاده از Generate Scripts در سرور مبدأ و اجرای اسکریپت در سرور مقصد است. زمانی که دیتابیس سرور مبدأ چند گیگا بایتی باشد در نتیجه اسکریپت تولید شده نیز حجم زیادی خواهد داشت و با اجرای این اسکریپت در سرور مقصد با خطای کمبود حافظه "Cannot execute script. Insufficient memory to continue the execution of the program" مواجه خواهیم شد. در واقع برای اجرای اسکریپت ها در sql server یک میزان محدود از حافظه تخصیص داده شده است که البته این مقدار پیش فرض قابل تنظیم است و در ادامه نحوه تغییر این مقدار را خواهیم دید. 

مورد دیگری که ممکن است نیاز به اجرای اسکریپت های حجیم در sql server داشته باشیم در استفاده از third party ها است. به عنوان نمونه در بازیابی رکوردهای حذف شده، یک راه حل ممکن استفاده از برنامه ApexSQL Recover است که در نهایت اسکریپت هایی جهت بازیابی رکوردهای حذف شده در اختیار ما قرار می دهد. در صورتی که تعداد رکوردهای حذف شده زیاد باشد در نتیجه اسکریپت تولید شده نیز تعداد خطوط زیادی خواهد داشت و با اجرا کردن آن در سرور با خطای کمبود حافظه مواجه می شویم. در مورد برنامه RedGate SQL data compare جهت مقایسه رکوردهای دو جدول و تولید اسکریپت لازم برای یکسان سازی آن ها نیز ممکن است نیاز به اجرای اسکریپت های حجیم داشته باشیم.


آموزش نحوه اجرای اسکریپت های حجیم در SQL SERVER - راه حل ها

 جهت اجرای اسکریپت های حجیم در sql server چندین روش وجود دارد که شما برحسب شرایط و دسترسی به هر کدام از این راه حل ها می توانید یکی از آنها را انتخاب کنید:

     1. اجرای مرحله به مرحله اسکریپت ها

     2. تغییر در تنظیمات پیش فرض

     3. استفاده از ابزار جانبی

     4. استفاده از SQLCMD 

    اجرای اسکریپت های حجیم - اجرای مرحله به مرحله:

در این روش که به نوعی ساده ترین روش جهت اجرای اسکریپت های حجیم در sql server محسوب می شود. کافیست تا در هر مرحله تنها قسمتی از اسکریپت را انتخاب(highlight) و اجرا کنیم. این روش علی رغم سادگی در برخی از موارد نیاز به دقت زیادی دارد و باید به ارتباط و وابستگی قسمت های مختلف اسکریپت تسلط داشته باشیم. به عنوان مثال، در تصویر زیر، جهت انتقال دیتابیس AdventureWorks2014  به یک سرور با sql server2012 لازم است که از این دیتابیس، اسکریپت تهیه کنیم و سپس اسکریپت تولید شده را در سرور مقصد اجرا کنیم. با توجه به اینکه جهت تولید اسکریپت از حالت Schema and data (انتقال دیتا به همراه Schema) استفاده کرده ایم حجم اسکریپت تولید شده برابر با 535MB می باشد و در اجرای آن با خطای کمبود حافظه مواجه می شویم:

execute-large-scripts-adventureworks

رفع مشکل کمبود حافظه با استفاده از روش اول:

execute-large-scripts-step-by-step

اجرای اسکریپت های حجیم - تغییردر تنظیمات پیش فرض:

 به منظور جلوگیری از ایجاد مشکلات کارایی، در SSMS از اجرای اسکریپت هایی که دارای حجم بیشتز از مقدار تعیین شده در تنظیمات پیش فرض sql server دارند جلوگیری می شود. این تنظیمات در مسیر:

Tools > Options > Text Editor > Transact-SQL > IntelliSense  و گزینه Maximum script size قرار دارد و قابل تغییر می باشد.(مقدار پیش فرض آن در نسخه های مختلف sql server متفاوت است)

execute-large-scripts-setting

execute-large-scripts-notice1نکته: با توجه به تأثیر منفی این روش در کارایی، استفاده آن در سرور عملیاتی و به ویژه در زمان بارِ کاری سرور توصیه نمی شود.

 اجرای اسکریپت های حجیم - ابزار جانبی:

پیشنهاد می کنم به تدریج و با شناخت موارد مختلف در sql server یک جعبه ابزار از نرم افزارهای مفید و کاربردی ایجاد کنید. یکی از این نرم افزارها برنامه BigRunner.WinFormsApp است که از لینک زیر قابل دانلود می باشد:

دانلود برنامه جهت اجرای اسکریپت های حجیم در SQL SERVER با حجم 20 کیلو بایت

execute-large-scripts-bigranner

execute-large-scripts-notice2نکته: جهت اجرای اسکریپت های حجیم SQL در phpmyadmin می توانید از BigDump استفاده کنید.

 اجرای اسکریپت های حجیم - SQLCMD:

همانطور که می دانید SQLCMD یک ابزار command-line است که برای اجرای دستورات T-SQL روی sql server لوکال و یا ریموت از آن استفاده می کنیم.(در قسمت ترفندها نمونه هایی دیگر از کاربردهای آن را خواهیم دید) جهت اجرای اسکریپت های حجیم، اطلاعات را به شکل زیر در خط فرمان(command prompt) وارد می کنیم:

execute-large-scripts-sqlcmd
مثال:
"Sqlcmd –S Bandamir_PC\MSSQL –d AdventureWorks2014 –i “E:\AdventureWorks2014.sql

execute-large-scripts-cmd

execute-large-scripts-notice3نکته: از روش فوق می توانید جهت وارد کردن فایل های حجیم SQL در phpmyadmin نیز استفاده کنید. فرمت دستور به شکل زیر می باشد(استفاده از Shell نرم افزار MySQL):

mysql -u username -p -h localhost DATA-BASE-NAME < data.sql