PDA

View Full Version : backup , Restore database



ammarkarimi
دوشنبه 11 شهریور 1387, 08:55 صبح
سلام این کد های بک آپ و رستور برنامه منه هر دوش اررور میده.
کمککککککککککککککککککککککک ککک


واسه بک آپ :


private void btn_backup_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(@"data source=.; initial catalog=dabirkhane; integrated security=true");
SqlCommand com = new SqlCommand("backup Database dabirkhane to disk='" + txt_path_backup.Text + "'", con);
con.Open();
int result = com.ExecuteNonQuery();
if (result > 0)
MessageBox.Show("backup compelete.");
con.Close();
}

واسه رستور :


private void btn_restore_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(@"data source=.; initial catalog=dabirkhane; integrated security=true");
SqlCommand com = new SqlCommand("Restore Database dabirkhane From disk ='"+txt_path_restore.Text+"'"+"With File=1,Norecovery'" , con);
con.Open();
int result = com.ExecuteNonQuery();
if (result > 0)
MessageBox.Show("Restore compelete.");
con.Close();
}

Blackk_lightt
دوشنبه 11 شهریور 1387, 12:37 عصر
سلام
چه اروری میده ؟
بگو شاید بتونم کمکت کنم

ammarkarimi
دوشنبه 11 شهریور 1387, 14:35 عصر
از این خط می گیره

int result = com.ExecuteNonQuery();


کلا چه جوری میشه نوشت؟کسی بلد نیست راهنمایی کنه.
خواهشا کسی نگه سرچ کن که این ها رو از سرچ در آوردم)

ammarkarimi
دوشنبه 11 شهریور 1387, 14:36 عصر
اصلا کد بالا را بی خیال !
شما کد بکآپ و رستور رو ندارید.

pars.engineer
دوشنبه 11 شهریور 1387, 17:45 عصر
از این خط می گیره



int result = com.ExecuteNonQuery();




خوب اين كه معلومه كه از اين خط خطا مي گيرد. اينكه چه خطايي مي گيرد مهم است.
به هر حال براي backUp كد زير را استفاده كنيد.




objCommand =

newSqlCommand("BACKUP DATABASE YourDataBase TO DISK = N'" + txtDataFileName.Text + "'" +


" WITH NOFORMAT, NOINIT, NAME = N'mydb-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10", objConnection);

objConnection.Open();

intSuccessRecovery = objCommand.ExecuteNonQuery();
objConnection.Close();







روش Restore هم در لينك زير كاملا توضيح داده ام.

http://barnamenevis.org/forum/showthread.php?t=118712

موفق باشيد.

bachebahal_1363
دوشنبه 11 شهریور 1387, 18:58 عصر
اگر خوب جستجو می کردی یه چیزای بهتری پیدا می کردی .
من در تاپیک زیر یک برنامه قرار دادم که با استفاده از SqlDmo می تونی به راحتی BackUpو Restore کنی :
نمایش تاپیک (http://barnamenevis.org/forum/showthread.php?t=112590)

دانلود مستقیم برنامه (http://barnamenevis.org/forum/attachment.php?attachmentid=20427&d=1216048972)

ammarkarimi
دوشنبه 11 شهریور 1387, 19:03 عصر
کد بکاپ رو به صورت زیر تغییر دادم

private void btn_backup_Click(object sender, EventArgs e)
{
SqlConnection objConnection = new SqlConnection("server=.; database=db_test; integrated security=true");
SqlCommand objCommand =new SqlCommand("BACKUP DATABASE db_test TO DISK ='c:\\b.bak' WITH NOFORMAT, NOINIT, NAME = N'mydb-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10", objConnection);
objConnection.Open();
int Successbackup = objCommand.ExecuteNonQuery();
if (Successbackup > 0)
MessageBox.Show("backup compelete.");
objConnection.Close();
}
ولی مسیج باکس کامپلت اجرا نمی شه.(بعد از زدن دکمه backup)
وبا هر بار زدن دکمه backup ، دو مگ به حجم فایل بکاپ اضافه می شه .چه کار کنم؟؟؟؟؟؟؟؟؟؟؟

ammarkarimi
دوشنبه 11 شهریور 1387, 20:03 عصر
WITH NOFORMAT, NOINIT, NAME = N'mydb-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
میشه بگید هر کدوم از این پارامتر ها چکار می کنه؟
فکر کنم یکیش برای ریپلیس رو بانک قبلی باشه.

pars.engineer
دوشنبه 11 شهریور 1387, 20:48 عصر
میشه بگید هر کدوم از این پارامتر ها چکار می کنه؟


استفاده از اين پارامترها ضروري نيست و اغلب زماني كاربرد دارند كه بخواهيم فايل پشتيبان را بر روي نوار ذخيره كنيم.
به عنوان مثال NoUnload مشخص مي كند كه نوار پس از خاتمه پشتبان، خارج نشود و يا NoRewind مشخص مي كند كه نوار پس از خاتمه پشتيبان گيري به عقب بر گردانده نشود.
Stats فواصل زماني اطلاع رساني پيشرفت كار را مشخص مي كند و وقتي برابر 10 است بدين معناست كه پس از انجام 10 درصد از عمليات پشتيبان گيري SQL پيام مناسب را بر گرداند.

در مورد مشكل شما نيز چون NOINIT ست شده است، پس از هر بار پشتيبان گيري اطلاعات جديد به ادامه فايل قبلي اضافه مي شود و اگر آن را به INIT تغيير دهيد، هر بار اطلاعات قبلي از بين خواهد رفت.

در مورد MessageBox هم، بايد بدانيد كه تابع ExecuteNonQuery تعداد سطر هايي را مورد اثر قرار گرفته اند، بر مي گرداند، و در هنگام اجراي دستور BackUp معمولا يك عدد منفي بر گردانده خواهد شد.(اغلب اوقات -1) پس كدتان را به صورت زير تغيير دهيد.




if (Successbackup != 0)
MessageBox.Show("backup compelete.");





موفق باشيد

ammarkarimi
سه شنبه 12 شهریور 1387, 00:14 صبح
آقا دمت گرم.درست شد.
ولی با رستور مشکل دارم

کد رستور :

SqlConnection SqlCon = new SqlConnection("server=.; database=dabirkhane; integrated security=true");
SqlCommand SqlCom = new SqlCommand();
SqlCon.Open();
SqlCom.CommandText =
"ALTER DATABASE dabirkhane SET SINGLE_USER WITH ROLLBACK IMMEDIATE" +
" USE master; RESTORE DATABASE dabirkhane FROM DISK ='" + txt_path_restore.Text + "'";
SqlCom.Connection = SqlCon;
SqlCom.ExecuteNonQuery();
SqlCon.Close();

//*******************

SqlCon.Open();
SqlCom.CommandText =
"ALTER DATABASE dabirkhane SET MULTI_USER ";
SqlCom.Connection = SqlCon;
SqlCom.ExecuteNonQuery();
SqlCon.Close();
MessageBox.Show("بازگردانی اطلاعات با موفقیت انجام شد");

کد رستور این خطا رو می ده :

The tail of the log for the database "dabirkhane" has not been backed up. Use BACKUP LOG WITH NORECOVERY to backup the log if it contains work you do not want to lose. Use the WITH REPLACE or WITH STOPAT clause of the RESTORE statement to just overwrite the contents of the log.
RESTORE DATABASE is terminating abnormally.

bachebahal_1363
سه شنبه 12 شهریور 1387, 01:35 صبح
آقا می شه بگی دم کی گرم؟
از کد کی استفاده کردی که درست شد ، که حالا برای restore به مشکل بر خورد کردی ؟

ammarkarimi
سه شنبه 12 شهریور 1387, 13:51 عصر
از کد pars.engineer
البته برنامه شما رو هم دیدم.(ولی هنگ کردم خوب نوشته شده بود(عالی) ولی من تو بانک تازه کارم)
از شمام سپاسگزارم

ammarkarimi
سه شنبه 12 شهریور 1387, 13:52 عصر
حالا می تونی بگی مشکل من (تو پست 11) چیه؟

mohammady2
سه شنبه 12 شهریور 1387, 14:15 عصر
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace DataBR
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//پشتیبان گیری از بانک اطلاعاتی
SqlConnection con = new SqlConnection();
con.ConnectionString = "Data Source=(local)\\SQLEXPRESS;database=aaa;Integrated Security=SSPI";
SqlCommand cmd = new SqlCommand();
try
{
con.Open();
//BACKUP DATABASE نام بانک اطلاعاتی TO DISK = 'مسیر پشتیبان گیری بانک اطلاعاتی'
string query = "BACKUP DATABASE aaa TO DISK = 'C:\\database\\aaabackup.MDF'";
cmd.CommandText = query;
cmd.Connection = con;
cmd.ExecuteNonQuery();
con.Close();
MessageBox.Show("پشتیبان گیری به درستی انجام شد");
}
catch
{
MessageBox.Show("اشکال در ارتباط با بانک اطلاعاتی");
}

}
private void button2_Click(object sender, EventArgs e)
{
//بازیابی بانک اطلاعاتی
SqlConnection con = new SqlConnection();
con.ConnectionString = "Data Source=(local)\\SQLEXPRESS;database=aaa;Integrated Security=SSPI";
SqlCommand cmd = new SqlCommand();
try
{
con.Open();
//USE master RESTORE DATABASE [نام بانک اطلاعاتی] FROM DISK = 'مسیر فایل بانک اطلاعاتی'
string query = "USE master RESTORE DATABASE [aaa] FROM DISK = 'C:\\DataBase\\aaabackup.MDF'";
cmd.CommandText = query;
cmd.Connection = con;
cmd.ExecuteNonQuery();
con.Close();
MessageBox.Show("بازیابی به درستی انجام شد");
}
catch
{
MessageBox.Show("اشکال در ارتباط با بانک اطلاعاتی");
}
}
}
}

ammarkarimi
سه شنبه 12 شهریور 1387, 14:59 عصر
mohammady2 جان.کد شما رو آزمایش کردم.رستورش اررور زیر رو می ده :

Exclusive access could not be obtained because the database is in use.
RESTORE DATABASE is terminating abnormally.
Changed database context to 'master'.

mohammady2
سه شنبه 12 شهریور 1387, 17:08 عصر
ببین عزیز اگ برنامه رو در یک پروژه ساده با یه فرم انجام بدی میبینی جواب میده مشکل اینجاست که تو وسط اجرای برنامهت میخوای ریاستور کنی .به فرض اگه قبل از لاگین شدن به برنامت یعنی باز شدن دیتابیست این کد رو امتحان کنی میبینی جواب میده حالا منم دنبال اینم که میشه بدون خروج از برنامه ارتباط رو قطع و ری استور کرد؟

ammarkarimi
سه شنبه 12 شهریور 1387, 21:23 عصر
ببین عزیز اگ برنامه رو در یک پروژه ساده با یه فرم انجام بدی میبینی جواب میده مشکل اینجاست که تو وسط اجرای برنامهت میخوای ریاستور کنی .به فرض اگه قبل از لاگین شدن به برنامت یعنی باز شدن دیتابیست این کد رو امتحان کنی میبینی جواب میده حالا منم دنبال اینم که میشه بدون خروج از برنامه ارتباط رو قطع و ری استور کرد؟

پست های اول این تایپیک رو نگاه کن.یک کدی هست که نمی دونم سینگل یوزر می کنه و ... از این حرف ها...
ببین چیزی سر در می یاری؟

jozef_rezaei
پنج شنبه 16 آبان 1387, 18:47 عصر
سلام به همه
زود تر مشكل رو حل كنيد من هم اين مشكل رو دارم
اگه تونستم حلش كنم حتما" به همه مي گم
خيلي ممنوع از كد هاي خوبي كه در وبلاگ گذاشتيد

jozef_rezaei
پنج شنبه 16 آبان 1387, 19:04 عصر
سلام به همه
زود تر مشكل رو حل كنيد من هم اين مشكل رو دارم
اگه تونستم حلش كنم حتما" به همه مي گم
خيلي ممنوع از كد هاي خوبي كه در وبلاگ گذاشتيد

Alen
جمعه 17 آبان 1387, 10:54 صبح
مشکل کد mohammady2 برای restore این است که در connection string با DB ارتباط برقرار شده است که قرار است عمل restore بر روی آن انجام گیرد
برای حل این مشکل باید در connection string نام پایگاه داده مشخص نشود و یا با پایگاه داده master ارتباط برقرار شود (ضمن اینکه نباید کانکشن فعالی به آن DB داشته باشیم)

pars.engineer
جمعه 17 آبان 1387, 13:23 عصر
شما اگر مطالب همين تاپيك رو به دقت مطالعه مي كرديد، جوابتان را مي گرفتيد.
به هر حال به لينك زير مراجعه كنيد(اين لينك را در چند پست قبل نيز گذاشته ام)
اگر مشكلتان حل نشد متن خطا را بگذاريد.
خود من از اين روش استفاده مي كنم و مشكلي ندارم.
http://barnamenevis.org/forum/showthread.php?t=118712
به پست سوم و چهارم مراجعه نماييد.

موفق باشيد.

engineer.l.poolad77
پنج شنبه 12 دی 1387, 12:37 عصر
خوب اين كه معلومه كه از اين خط خطا مي گيرد. اينكه چه خطايي مي گيرد مهم است.
به هر حال براي backUp كد زير را استفاده كنيد.




objCommand =

newSqlCommand("BACKUP DATABASE YourDataBase TO DISK = N'" + txtDataFileName.Text + "'" +


" WITH NOFORMAT, NOINIT, NAME = N'mydb-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10", objConnection);


objConnection.Open();


intSuccessRecovery = objCommand.ExecuteNonQuery();

objConnection.Close();










روش Restore هم در لينك زير كاملا توضيح داده ام.


http://barnamenevis.org/forum/showthread.php?t=118712



موفق باشيد.



دستتون درد نکنه کدش درست و عالی هستش:تشویق:

Amir Oveisi
پنج شنبه 12 دی 1387, 16:06 عصر
اینو ببینید
خیلی ساده و خیلی کامل
http://www.geekpedia.com/tutorial180_Backup-and-restore-SQL-databases.html
موفق باشید
jooje

danial82
جمعه 13 دی 1387, 03:55 صبح
گرفتن Backup و Restore کردن دیتابیس
http://barnamenevis.org/forum/attach...2&d=1226600148

saied_genius
پنج شنبه 19 دی 1387, 15:43 عصر
با سلام،

در هنگام Backup و Restore شما به بانك مورد نظر متصل هستيد.

معمولاً پس از Backup در آينده مي خواهيد از آن استفاده كنيد و Restore نماييد...

شايد بشود روش شما را اصلاح كرد ولي اگر بخواهيد به همان صورتي كه Backup گرفته ايد Restore نماييد ، به هيچ عنوان موفق نخواهيد شد.

زيرا ديتابيسي كه در حال استفاده است و اتصال شما به SQLServer از طريق آن است اجازه نمي دهد آنرا Restore نماييد. (حداقل در همه حالات جواب نمي دهد؛ و يك برنامه نويس بايد تمام حالت ها را در نظر بگيرد.)

شما مي توانيد براي اين كار ديتابيس در حال استفاده را از ديتابيس خود به "master" تغيير دهيد و پس از اتمام Backup و يا Restore به حالت اول بازگردانيد.

ولي من براي اين كار (چون خودم يك دور سر همين پدرم درآمده) يك Script نوشته ام كه ميتوانيد در برنامه خود به صورت Script فراخواني كنيد و يا آنرا به صورت Stored Procedure درآوريد. (كه بهتر است و راحت تر است)

اسكريپت Backup كه يك Stored Procedure براي Backup مي سازد.




USE [نام ديتابيس]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[BackupDB]


@BackupPath varchar(max)


AS


backup database [نام ديتابيس] to disk =@BackupPath with INIT, SKIP, NOUNLOAD, STATS = 10


RETURN



و

اسكريپت Restore كه يك Stored Procedure براي Restore مي سازد.





use [master]
GO


SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[RestoreDB]


@BackupPath varchar(max)


AS


RESTORE DATABASE [نام ديتابيس]
FROM DISK = " + "'" + RestorePath + "'" + " WITH RECOVERY, REPLACE


RETURN



در صورت هرگونه سوال در خدمتم.

موفق باشيد.

DelphiFriend
جمعه 11 بهمن 1387, 13:03 عصر
سلام عالب بود ممنون.

alih210
شنبه 12 بهمن 1387, 11:09 صبح
سلام بر همه بر و بچ:قلب:
سیتم backtp گیری Linq چه جوریه؟

saied_genius
شنبه 12 بهمن 1387, 16:41 عصر
سلام عالب بود ممنون.

خواهش مي كنم عزيز ، قابل نداشت.

alisebt
یک شنبه 19 مهر 1388, 09:36 صبح
روی لوکال دستورات کار می کنه ولی من روی وب به این خطا بر میخورم. پرمیشن هم همه جوره ست کردم ولی هنوز خطا داره

Cannot open backup device 'c:\\b.bak'. Operating system error 5(Access is denied.).
BACKUP DATABASE is terminating abnormally.



آدرس رو روی هاست هم که میدم همین خطا رو میده.