# پایگاه‌های داده > SQL Server > مدیریت دیتابیس (Database Administration) > Backup & Restore >  نحوه Backup & Restore گیری از 2008 SQL Server Express

## FremderJunge

سلام دوستان میدونم تاپیک تکراریه ولی من هرچی کد تو پست های قبلی بود رو تست کردم خطا داده ، یک نفر لطف کد یا یک مثال ساده برای Backup & Restore از یک دیتابیس اکسپرس ارسال کنه.

----------


## m.soleimani

> سلام دوستان میدونم تاپیک تکراریه ولی من هرچی کد تو پست های قبلی بود رو تست کردم خطا داده ، یک نفر لطف کد یا یک مثال ساده برای Backup & Restore از یک دیتابیس اکسپرس ارسال کنه.


Backup

Restore

شاد و پیروز باشید./

----------


## FremderJunge

تشکر ویژه از m.soleimani که این ویدیوی آموزشی رو آدرس دادن ولی متاسفانه به اینترنت پرسرعت تا اون هفته دسترسی ندارم که این آموزش رو ببینم اگه کسی مثال کدی هم داره اطف کنه. یه مشکل دیگه اینکه من فعلا برای این پروژه SQl Server Management Studio ندارم بدون اون میشه Backup & Restore گرفت یا نه باید برم گیر بیارم؟

----------


## FremderJunge

سلام کسی یه مثل ساده آپلود کنه مشکل ما حل بشه؟
من خیلی کد چک کردم مشکل ابنجاست که پیغام میده Database در حال استفاده است و نمی تونید از اون بک آپ بگیرید.

----------


## m.soleimani

اگر از منجمنت استدیو استفاده نمی‌کنی به صورت دستی دیتابیس رو stop کن تا دیگه جایی ازش استفاده نکنه برای این کار کافیه که داخل run این دستور رو بنویسی services.msc. از اونجا سرور رو پیدا کن و stop کن کارت که تموم شد میتونی دوباره start کنی./

----------


## FremderJunge

> اگر از منجمنت استدیو استفاده نمی‌کنی به صورت دستی دیتابیس رو stop کن تا دیگه جایی ازش استفاده نکنه برای این کار کافیه که داخل run این دستور رو بنویسی services.msc. از اونجا سرور رو پیدا کن و stop کن کارت که تموم شد میتونی دوباره start کنی./


خودم که دستی میتونم این کارو انجام بدم می خوام تو نرم افزار این کار رو خودش خودکار انجام بده!

----------


## m.soleimani

> خودم که دستی میتونم این کارو انجام بدم می خوام تو نرم افزار این کار رو خودش خودکار انجام بده!


یه چیز غیر اصولی که الان به فکرم می‌رسه و بدون فکر کردن دارم میگم این هست که یه بچ فایل براش بنویسی « در صورتی که بلد باشی » و زمان مورد نیاز فراخوانیش کنی تا خودش بانک رو متوقف کنه و بعد هم با یه برنامه دیگه بانک رو دوباره راه‌اندازی کنه فعلن همین رو توی ذهنم دارم نصفه شبی ولی اگر مورد مناسبی بعدن پیدا کردم حتمن خبرت می‌کنم ./

----------


## FremderJunge

> یه چیز غیر اصولی که الان به فکرم می‌رسه و بدون فکر کردن دارم میگم این هست که یه بچ فایل براش بنویسی « در صورتی که بلد باشی » و زمان مورد نیاز فراخوانیش کنی تا خودش بانک رو متوقف کنه و بعد هم با یه برنامه دیگه بانک رو دوباره راه‌اندازی کنه فعلن همین رو توی ذهنم دارم نصفه شبی ولی اگر مورد مناسبی بعدن پیدا کردم حتمن خبرت می‌کنم ./


مرسی
بچ فایل رو گذاشتم برای مرحله آخر چون چیزی ازش بلد نیستم ولی چاره ای نباشه میرم دنبالش، فعلا ساده ترین کار نوشتن یه دستور که خود فایل اصلی دیتابیس رو کپی پیست کنه. :لبخند گشاده!:

----------


## m.soleimani

> مرسی
> بچ فایل رو گذاشتم برای مرحله آخر چون چیزی ازش بلد نیستم ولی چاره ای نباشه میرم دنبالش، فعلا ساده ترین کار نوشتن یه دستور که خود فایل اصلی دیتابیس رو کپی پیست کنه.


هم‌شهری این‌ رو تست کن ببین نیاز شما رو برطرف می‌کنه یا نه :

 
using System;
using System.Collections.Generic;
using System.Text;
using System.ServiceProcess;
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
string myServiceName = "MSSQL$SQLEXPRESS"; //service name of SQL Server Express
string status; //service status (For example, Running or Stopped)
Console.WriteLine("Service: " + myServiceName);
//display service status: For example, Running, Stopped, or Paused
ServiceController mySC = new ServiceController(myServiceName);
try
{
status = mySC.Status.ToString();
}
catch (Exception ex)
{
Console.WriteLine("Service not found. It is probably not installed. [exception=" + ex.Message + "]");
Console.ReadLine();
return;
}
//display service status: For example, Running, Stopped, or Paused
Console.WriteLine("Service status : " + status);
//if service is Stopped or StopPending, you can run it with the following code.
if (mySC.Status.Equals(ServiceControllerStatus.Stoppe  d) | mySC.Status.Equals(ServiceControllerStatus.StopPen  ding))
{
try
{
Console.WriteLine("Starting the service...");
mySC.Start();
mySC.WaitForStatus(ServiceControllerStatus.Running  );
Console.WriteLine("The service is now " + mySC.Status.ToString());
}
catch (Exception ex)
{
Console.WriteLine("Error in starting the service: " + ex.Message);
}
}
Console.WriteLine("Press a key to end the application...");
Console.ReadLine();
return;
}
}
}


پی‌نوشت : راستی یادم رفت بگم این رفرنس رو هم به پروژه خودت اضافه کن :
 
System.ServiceProcess

----------


## FremderJunge

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

----------


## m.soleimani

> این کد خروجی میده که سرویس شما در حالت اجراست.
> اگه درست متوجه شده باشم با نوشتن یه متد Stop الان باید بشه دیتابیس رو متوقف کرد و بک آپ گرفت.


 بله به همین شکل عمل می‌کنه بعد از این که کارت رو انجام دادی برای این‌که مشکلات بعدی پیش نیاد دوباره سرویس مورد نظر رو راه‌اندازی کن./

----------


## FremderJunge

string strFileName = "BackupFile.bak";
            try
            {
                this.Cursor = Cursors.WaitCursor;
                SqlCommand cmd = new SqlCommand();
                SqlConnection.ClearAllPools();
                cmd.Connection = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirecto  ry|\\mydb.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
                cmd.Connection.Open();
                string dbname = cmd.Connection.Database;
                cmd.Connection.Close();
                string query = "BACKUP DATABASE [" + dbname + "] TO DISK ='c:\\" + strFileName + "' WITH NO_COMPRESSION ,CONTINUE_AFTER_ERROR  ,FORMAT, INIT, NAME = N'accounting-Full Database Backup', SKIP,NOREWIND, NOUNLOAD, STATS = 10";
                cmd.Connection = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirecto  ry|\\mydb.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True;");
                cmd.Connection.Open();
                cmd.CommandText = query;
                cmd.ExecuteNonQuery();
                cmd.Connection.Close();
                this.Cursor = Cursors.Default;
                MessageBox.Show("تهیه نسخه پشتیبان از اطلاعات با موفقیت انجام شد", "پشتیبان گیری", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error Occurd : " + ex.Message);
            }
با کد بالا مشکل BackUp حل شد حالا میرسیم به Restore و دوباره روز از نو

----------


## m.soleimani

> با کد بالا مشکل BackUp حل شد حالا میرسیم به Restore و دوباره روز از نو


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

----------


## FremderJunge

سلام
هر نوع کدی رو برای ریستور امتحان کردم ولی باز خطای میده که پایگاه داده شما در حال استفاده است آیا کدی باید وارد کنم تا ارتباط ها با پایگاه داده رو حذف کنه یا اشکال از جای دیگه است؟
کدی رو هم که دوست عزیز  m.soleimani دادن کل Sql رو Off میکنه و دوباره Run هم نمیکنه در حای که تو برنامه پیغام اجرا میده!

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

----------


## FremderJunge

سلام
کد Restore که به سختی پیداش کردم اینجا میگذارم شاید به درد کسی بخوره.
 try
            {
                this.Cursor = Cursors.WaitCursor;
                SqlCommand cmd = new SqlCommand();
                SqlConnection.ClearAllPools();
                cmd.Connection = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirecto  ry|DataBase.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
                cmd.Connection.Open();
                string dbname = cmd.Connection.Database;
                cmd.Connection.Close();
                string query = "USE [master]; RESTORE DATABASE [" + dbname + "]  FROM  DISK = N'" + TxtAddress.Text + "' WITH NOUNLOAD,  REPLACE,  STATS = 10";
                cmd.Connection = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirecto  ry|DataBase.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
                cmd.Connection.Open();
                cmd.CommandText = query;
                cmd.ExecuteNonQuery();
                cmd.Connection.Close();
                this.Cursor = Cursors.Default;
                MessageBox.Show("نسخه پشتیبان با موفقیت جایگزین شد", "پشتیبان گیری", MessageBoxButtons.OK, MessageBoxIcon.Information);
                this.Close();
            }
            catch
            {
                MessageBox.Show(" خطا در جایگزینی نسخه پشتیبان", "پشتیبان گیری", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

----------


## mobed_6262

البته یه راه ساده تر اینکه اگه به شما پیغام میده که دیتابیس در حال اجراست (که البته در مورد Backup گیری تا به حال من این پیغام را مشاهده نکردم) یه دیتابیس دیگه را به حالت اجرایی ببرید بعد از دیتابیستان Backup بگیرید . 
می تونی از دستور use استفاده کنی .
برای Backup گیری از دیتابیس به نام kamel از روش زیر استفاده کن .
use master
go
backup database kamel to disk='e:\kamel'
go
فقط آدرس باید داخل ' ' باشد

----------


## omp_programmer

با سلام به دوستان برنامه نویس
من دیتابیسم رو در sql management 2012 نوشتم و الان میخوام در سیستم مقصد با sql express 2012  برنامه مو اجرا کنم
برای بکاب گیری از کوئری زیر استفاده می کنم (یعنی اتچ بیس هستش):'BACKUP DATABASE [|DatDirectory|\PhoneBookDB.mdf] TO DISCK = 'save pathارور میده که دیتابیس در این مسیر وجود ندارد در واقع DataDirectory داخل براکت کار نمی کند. چون 
اگر مسیر دیتابیس را به صورت دستی وارد می کنم بکاپ عمل میکند، Application.StartupPath رو هم
امتحان کردم ولی باز جواب نداد :ناراحت:  

اگر دوستان راهنمایی بفرمایند ممنون میشم...

----------

