# Native Code > برنامه نویسی در Delphi > بانک های اطلاعاتی در Delphi >  backup گیری اتوماتیک در sqlserver

## free

سلام. خسته نباشید.
 می خواهم هر 2 ساعت یکبار بصورت اتوماتیک sql  از بانک اطلاعاتی موردنظر  پشتیبان تهیه کند البته این تنظیمات را می دانم اما می خواهم در هر بار پشتیبان گیری یک فایل جدید ایجاد شود . در حال حاضر در هر بار پشتبان گیری مدام فایل قبل update  می شود. ممنون می شم راهنمایی کنید.

----------


## m-khorsandi

از چه روشی استفاده کردی؟

----------


## free

Regester server wizard/managment/backup wizard

----------


## reza_rad

شما می تونید از JOB های SQL Server  استفاده کنید.
این job  ها می تونن شامل چند STEP باشند.
توی یک step  می تونید فایل بکاپ قبلی رو کپی کنید به جای دیگه ای از هاردتون مثلا جایی که آرشیو رو نگهداری می کنید .
و توی Step  بعدی بکاپ جدید بگیرید.

برای اینکه هر چند وقت یکبار این عملیت انجام بشه شما می تونید job ها رو schedule  کنید.

job  در SQL server 2000 :
http://www.databasedesign-resource.c...rver-jobs.html

job در SQL Server 2005 :
http://msdn2.microsoft.com/en-us/library/ms190268.aspx

----------


## hsmt132

از خود sql می تونی برای تهیه backup استفاده کنی درضمن می تونی تنظیم کنی که update بشه یا یک فایل جدید ایجاد کنه. همچنین قابیلت schedule یا زمانبندی هم دارد.

----------


## Answer

میتونی از یک کنترل Timer استفاده کنی که و چک کنی که اگر دو ساعت گذشت از بانک یک کپی بگیره به نام جدید مثلا با نام ساعتجاری سیستم BK12:30

----------


## free

ممنون دوستان.
hmst132 من دقیقا می خوام از خود تنظیمات sql  استفاده کنم اما بک آپ جدید را روی فایل قبلی overwrite می کند. تنها مشکل اینه که رو همون فایل بک آپ جدید را قرار می ده.
آقای reza_rad ممنون از لینک مفیدتان. از روی لینک اول مرحله به مرحله همه تنظیمات را انجام دادم اما در قسمت steps/general/command نمی دانم چه کدی باید قرار داده شود در مقال مربوطه مشخص نیست. و فکر می کنم به همین دلیل job اجرا نمی شود.
بیشتر راهنمایی کنید ممنون میشم.

----------


## reza_rad

> آقای reza_rad ممنون از لینک مفیدتان. از روی لینک اول مرحله به مرحله همه تنظیمات را انجام دادم اما در قسمت steps/general/command نمی دانم چه کدی باید قرار داده شود در مقال مربوطه مشخص نیست. و فکر می کنم به همین دلیل job اجرا نمی شود.
> بیشتر راهنمایی کنید ممنون میشم.


برای کد بکاپ گیری از دیتابیس:
http://msdn2.microsoft.com/en-us/library/ms186865.aspx

برای استفاده از دستور بالا باید یک step  جدید ایجاد کنید داخل job و بعد از داخل کومبوی type  گزینه Transact SQL Script(T-SQL) رو انتخاب کنید و داخل باکس command  دستور بکاپ دیتابیس رو بنویسید.

برای کپی کردن فایل قبلی به یه آدرس دیگه روی هارد و rename  کردن اون و نگهداری آرشیو هم یک step  دیگه ایجاد کنید. ولی اینبار از کومبوی type  گزینه Operating System Command(CMDExec ) رو انتخاب کنید. این امکان استفاده از command  های سیستم عامل رو به شما میده. حالا شما می تونید دستور COPY که توی CommandPrompt  می نویسید رو اینجا بنویسید.
سینتکس دستور کپی:
http://www.csulb.edu/~murdock/copy.html
دستور rename  :
http://www.csulb.edu/~murdock/rename.html

----------


## free

متشکرم. اما دقیقا نمی دانم چه کدی را باید دقیقا بنویسم. یعنی باید بک آپ و کپی و تعویش نام را توسط دستورات خودمان انجام دهیم؟؟ اگه براتون امکان داره این دستورات را با یه مثال ساده توضیح دهید.

----------


## Answer

بهترین کار استفاده از دلفی میباشد و تمام بانک رو از توی برنامه بک آپ بگیری و همونی که گفتم

----------


## free

اگر از توی برنامه بخوام بک آپ بگیره باید برنامه همیشه در حالت اجرا باشه .

----------


## m-khorsandi

> بهترین کار استفاده از دلفی میباشد و تمام بانک رو از توی برنامه بک آپ بگیری و همونی که گفتم


دلیلتون رو هم بگید!

----------


## reza_rad

> دقیقا نمی دانم چه کدی را باید دقیقا بنویسم


من که لینک دادم. از همون syntax استفاده کنید.
متاسفانه من نمی تونم از روی سیستمم عکس بگیرم و براتون بفرستم.


ترتیب کار شما همچین چیزی میشه:

یک step  جدید ایجاد کنید.
اول فایل بکاپ قبلی رو rename  کنید.
یعنی کدی مثل کد زیر رو:

RENAME (REN) D:\reportsatfull reportsatfull_old


 در باکس command  بنویسید و type  رو از نوع CMDExec  انتخاب کنید.

حالا یه step  جدید بسازید برای کپی کردن فایل به آدرس دیگه. روش کار مثل بالاست فقط جای rename  کردن باید copy  کنید.

ور درنهایت یک step  برای بکاپ گیری بسازید:

این یک مثال برای بکاپ گیری:

Backup Database [report] To [reportsatfull] with init, nounload, name=N'reportsatfull', noskip, status=10 , noformat

البته جزئیات بیشتر این دستور رو از همون لینک سینتکسی که دادم ببینید.
این کد رو باید در باکس command  بنویسید. و type  رو T-SQL انتخاب کنید.


البته برای اینکه اسم فایل شما هربار تکراری نشه شما باید بتونید اسم رو دینامیک ایجاد کنید مثلا اسم فایل شامل تاریخ و ساعت باشه.
نکته دیگه ای هم که هست اینه که شما باید قبل از اجرای job یه backup device  توی enterprise manager  بسازید. چون دستور بکاپی که بالا نوشتم از همون backup device  استفاده می کنه.

برای ساختن backup device:
برید توی enterprise manager
روی سرور کلیک کنید
management
backup
و ...

اگه جاییش رو متوجه نشدید بگید بیشتر توضیح بدم.

----------


## free

چطور میشه بصورت دینامیکی نام فایل را همراه با تاریخ و ساعت ثبت کرد؟

دستور آخر به این شکل در آمده :

کد:

BACKUP DATABASE [BPaperlessa] TO  DISK = N'G:\test_back\Mybackup.BAK' WITH  NOINIT ,  NOUNLOAD ,  NAME = N'BPaperlessa backup',  NOSKIP ,  STATS = 10,  NOFORMAT 


می خواهم نام فایل شامل تاریخ و ساعت هم باشه.چگونه؟

----------


## free

آقای reza_rad  لطفا راهنمایی نمایید. میخواهم تو این خط آخری که نوشتم براتون فایل Mybackup همراه با تاریخ و ساعت نامگذاری شود. از تابع Getdate() استفاده کردم اما روش استفاده درست آن را در این کد نمی دانم. این تابع می تواند مستقیما همراه با نام فایل آورده شود یا باید در متغییری ذخیره شود؟ چگونه؟
(Help Me Please)

----------


## reza_rad

شما می تونید از این روش برای ایجاد یک استرینگ که شامل تاریخ و ساعت و دقیقه باشه استفاده کنید:(با استفاده از تابع DatePart , GetDate)

declare @MyDate varchar(15)
set @MyDate=(select convert(varchar,datepart(yyyy,getdate()))+convert(  varchar,datepart(mm,getdate()))+convert(varchar,da  tepart(dd,getdate()))+convert(varchar,datepart(hh,  getdate()))+convert(varchar,datepart(mi,getdate())  )+convert(varchar,datepart(ss,getdate())))





حالا اسم فایلتون رو به این اسم عوض کنید.
منتها برای اینکه بتونید از این متغیر که توی T-SQL تعریفش کردید توی CMDExec  استفاده کنید نیاز به این دارید که بتونید دستورات CMDExec  رو از داخل SQL اجرا کنید.
برای اینکار از این sp استفاده کنید:   xp_cmdShell 
البته اگه از sqlserver 2005  استفاده می کنید باید توی تنظیمات اجازه استفاده از این sp رو داده باشید چون sp خطرناکی هست و بطور پیش فرض در 2005  اجازه دسترسی به اون رو کسی نداره.

به اینصورت حالا می تونید عمل کنید:

set @MyDate=(select 'rename d:\YourBackupFile '+@MyDate )
exec xp_cmdshell @MyDate

----------


## free

همه دستورات را به این ترتیب نوشتم اما هیچ اتفاقی در بک آپ گیری نمی افتد و فایل را تغییر نام نمی دهد

declare @MyDate varchar(15)
set @MyDate=(select convert(varchar,datepart(yyyy,getdate()))+convert(  varchar,datepart(mm,getdate()))+convert(varchar,da  tepart(dd,getdate()))+convert(varchar,datepart(hh,  getdate()))+convert(varchar,datepart(mi,getdate())  )+convert(varchar,datepart(ss,getdate())))
BACKUP DATABASE [BPaperlessa] TO  DISK = N'G:\test_back\BPaperlessa backup.BAK'  WITH  NOINIT ,  NOUNLOAD ,  NAME = N'BPaperlessa backup',  NOSKIP ,  STATS = 10,  NOFORMAT 
set @MyDate=(select 'rename G:\test_back\BPaperlessa backup.BAK '+@MyDate )
exec xp_cmdshell @MyDate

----------


## Answer

دوست عزیز میتونی یه برنامه کوچک بنویسی که فقط کار بک آپ گیری رو انجام بده و این برنامه همیشه باز باشه و همونطور که گفتم با یه تایمر بک آپ بگیره یه و این برنامه رو تو ریجیستری ثبت کن تا با Startup بیاد بالا
(البته اگر بخوای جدا از برنامه خودت باشه این کاره خوب)

----------


## Answer

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

----------


## reza_rad

> همه دستورات را به این ترتیب نوشتم اما هیچ اتفاقی در بک آپ گیری نمی افتد و فایل را تغییر نام نمی دهد


آیا اصلا بکاپ گرفته میشه؟
آیا backup device  ساختین؟
یا اینکه مشکل توی تغییر نام فایل هست؟
دو قسمت رو جدا تست کنید.
یعنی یکبار فقط امتحان کنید ببینید یه فایل رو اینجوری rename  می تونید بکنید ...

----------


## free

سلام. ممنون دوستان. آقای reza_rad خیلی ممنون بابت راهنماییتون. مشکلم رفع شد. باید نام فایل را همراه با تاریخ که تغییر می دادم در یک متغییر قرار می دادم و بعد تو دستورات استفاده می کردم. باز هم متشکر.
البته روشی را که استفاده کردم یه کم با توضیحات شما متفاوت بود. من از مسیر wizard/manangmet/backup database اول step  را برای 2 ساعت یکبار تنظیم کردم و سپس در قسمت job ها اون job ی را که ایجاد شده بود در قسمت command به دستور ایجاد شده چند خط فقط جهت تغییر نام فایل اضافه کردم. یعنی لازم نیست از دستورات rename  و کپی استفاده کنیم . همون دستور backup گیری می تونه کار همه را انجام بده به شرطی که نام فایل بک آپ را با متغییر زمان و ساعت ست کنیم.
موفق باشید.

----------


## reza_rad

خواهش می کنم:)
موفق باشید

----------

