PDA

View Full Version : سوال: بک آپ گیری پایگاه داده SQl در #C



behnam25214
جمعه 10 اردیبهشت 1389, 23:39 عصر
با سلام

من چندتا سوال راجع به بک آپ گیری داشتم.:متفکر:
1.به چند روش میتوان از یک پایگاه داده بک آپ گرفت؟البته باکد در #C
2.بهترین روش برای بک آپ گیری چه روشی میباشد؟
3.لزوما باید هر روز بک آپ گرفت یا نه؟
4.آیا میتوان در #C بک آپ ها را هم ریستور کرد؟

mrsalam
شنبه 11 اردیبهشت 1389, 08:08 صبح
علیکم السلام

.به چند روش میتوان از یک پایگاه داده بک آپ گرفت؟
با استفاده از دستورات SQL میشه بک اپ گرفت

.بهترین روش برای بک آپ گیری چه روشی میباشد؟
من از Store Procedure استفاده می کنم که هم سریع است و هم مطمئن و نهایتا بی دردسر

لزوما باید هر روز بک آپ گرفت یا نه؟
این با اهمیت و میزان ورود اطلاعات بانک ارتباط مستقیم دارد

آیا میتوان در C#‎‎‎‎ بک آپ ها را هم ریستور کرد؟
به این مثال توجه کنید:



internal void MakeRestore(string BAK_Path)
{
SqlParameter[] p = new SqlParameter[3];
p[1] = new SqlParameter("@DBname", "DataBaseName");
p[2] = new SqlParameter("@path", BAK_Path);
con.Open();
SqlCommand sql_cmd = new SqlCommand("ProcedureName", con);
sql_cmd.CommandType = CommandType.StoredProcedure;

sql_cmd.Parameters.AddWithValue(parameter[1].ParameterName, parameter[1].Value);
sql_cmd.Parameters.AddWithValue(parameter[2].ParameterName, parameter[2].Value);

sql_cmd.ExecuteNonQuery();
con.Close();
{



حال پروسیجر مربوطه را به صورت زیر معرفی می کنیم:


Create PROCEDURE [dbo].[ProcedureName].[]
-- Add the parameters for the stored procedure here
@Path char(50),
@DBname char(20)
AS
BEGIN

restore DATABASE @DBname
from DISK = @path
WITH REPLACE

END

behnam25214
شنبه 11 اردیبهشت 1389, 08:57 صبح
مرسی از دوستان

حالا این پروسیجر رو باید تو #C بنویسم یا تو SQl ?

mrsalam
شنبه 11 اردیبهشت 1389, 09:42 صبح
به 2 روش میشه نوشت:

1:
کوری که در مثال قبل نوشتم را تو محیط SQL بنویس و Excute کن.

2:(راحت تر)
به ترتیب تصاویر:

mrsalam
شنبه 11 اردیبهشت 1389, 09:47 صبح
البته یه روش دیگه هست که از همه راحتر و سریعتر هست که از(Typed DatSet) Wizard استفاده می شه که اگه لازم داری توضیح می دم ولی الان نمی تونم...

behnam25214
شنبه 11 اردیبهشت 1389, 22:02 عصر
من کدی که تو #C مینویسم به parameter ارور میده.:اشتباه:

behzadk
شنبه 11 اردیبهشت 1389, 22:15 عصر
از sqlsmo استفاده کتی راحت تر هستی
http://msdn.microsoft.com/en-us/library/ms131540.aspx

hojjatshariffam
شنبه 11 اردیبهشت 1389, 22:43 عصر
منم چیزی از لینک چیزی دستگیرم نشد

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

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

درسته دوستان؟

mrsalam
یک شنبه 12 اردیبهشت 1389, 08:49 صبح
باز هم سلام
اگه برای ساختن Procedure عجله داشته باشیم و یا Procedure های زیادی باید درست کنیم از روش زیر استفاده کنید. این روش نیازی به کد نویسی زیادی ندارد و تا حدودی کار آدم رو راه می ندازه

در این روش از Typed DataSet استفاده می کنیم.
البته من از Typed DataSet فقط برای تولید Procedure استفاده می کنم و پس از اتمام کار می توان آن را پاک کرد. و اما اصل ماجرا:

mrsalam
یک شنبه 12 اردیبهشت 1389, 08:51 صبح
ادامه آموزش:

hojjatshariffam
چهارشنبه 26 خرداد 1389, 22:33 عصر
سلام دوستان
لطفا یکی از دوستان حرفه ای این مشکل منو بررسی کنه که چطور میش حلش کرد
من از دیتا بیس بک آپ می گیرم ولی در هر دو حالت (از خود اس کیو ال سرور و از داخل سی شارپ (کد برنامه )) فقط به یک فایل خاص بک آپ می گیره
فایلی که در مسیر خود اس کیو ال سرور و در داخل دایرکتوری بک آپ هستش ، بک آپ می گیره ولی وقتی حتی این فایل رو به یه جای دیگه مانند F: کپی می کنم ارور زیر رو میده



TITLE: Microsoft SQL Server Management Studio
------------------------------

Backup failed for Server 'SERVER'. (Microsoft.SqlServer.SmoExtended)

------------------------------
ADDITIONAL INFORMATION:

System.Data.SqlClient.SqlError: Cannot open backup device 'F:\FullBackup.bak'. Operating system error 5(failed to retrieve text for this error. Reason: 1815). (Microsoft.SqlServer.Smo)

یعنی وقتی حتی از داخل برنامه مسیر

C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Backup\FullBackup .bak

رو انتخاب می کنم بک آپ با موفقیت گرفته میشه ولی وقتی همین فابل رو به مسیری مانند F:\FullBackup.bak کپی کردیم و این فایل رو انتخاب کردیم خطای بالا رو میده
آیا قابل حل شدن هست؟

ostovarit
چهارشنبه 26 خرداد 1389, 23:49 عصر
اگر فایل دیتابیس رو کپی کنیم و برای ریستور از کپی استفاده کنیم اشکالی داره؟! من خودم این کارو میکنم مشکلی نداره ... ولی یک از دوستان ایراد گرفت و منو دو دل کرد؟!

حجتی نیا
پنج شنبه 27 خرداد 1389, 00:05 صبح
روش من :
رستور..

private void restore_backup_Click(object sender, EventArgs e)
{

objconnection.Open();
if (openFileDialog_restore.ShowDialog() == DialogResult.OK)
if (openFileDialog_restore.FileName.EndsWith(".bak") == true)
{
MessageBox.Show("برای تکمیل بازیابی اطلاعات، برنامه دوباره اجرا خواهد شد، چند لحظه صبر کنید...", "",MessageBoxButtons.OK,MessageBoxIcon.Information,M essageBoxDefaultButton.Button2,MessageBoxOptions.R tlReading);
string s1 = "ALTER DATABASE [" + Application.StartupPath + "\\sodour.mdf] SET OFFLINE WITH ROLLBACK IMMEDIATE";
string s2 = "ALTER DATABASE [" + Application.StartupPath + "\\sodour.mdf] SET MULTI_USER";
string query = "RESTORE DATABASE [" + Application.StartupPath + "\\sodour.mdf] FROM DISK ='" + openFileDialog_restore.FileName + "' WITH RECOVERY,REPLACE";
SqlCommand cmd = new SqlCommand();
cmd.CommandText = s1;
cmd.Connection = objconnection;
cmd.ExecuteNonQuery();

cmd.CommandText = s2;
cmd.Connection = objconnection;
cmd.ExecuteNonQuery();

cmd.CommandText = query;
cmd.Connection = objconnection;
cmd.ExecuteNonQuery();

cmd.Dispose();
Application.Restart();
}
else
FarsiMessageBox.FMessageBox.Show("فایل با پسوند .bak انتخاب کنید", "خطا", FarsiMessageBox.FMessageBoxButtons.OK, FarsiMessageBox.FMessageBoxIcons.Error, FarsiMessageBox.FMessageBoxDefaultButtons.Button3) ;

}

بکآپ..

{
if (saveFileDialog_backup.ShowDialog() == DialogResult.OK)
{
string command = @"BACKUP DATABASE [" + Application.StartupPath + "\\sodour.mdf] TO DISK = N'"+saveFileDialog_backup.FileName+"' WITH FORMAT, INIT, NAME = N'accounting-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10";
this.Cursor = Cursors.WaitCursor;
SqlCommand oCommand = null;
if (objconnection.State != ConnectionState.Open)
objconnection.Open();
oCommand = new SqlCommand(command, objconnection);
oCommand.ExecuteNonQuery();
this.Cursor = Cursors.Default;
objconnection.Close();
FarsiMessageBox.FMessageBox.Show("فابل پشتیبان ذخیره شد", "", FarsiMessageBox.FMessageBoxButtons.OK, FarsiMessageBox.FMessageBoxIcons.Information, FarsiMessageBox.FMessageBoxDefaultButtons.Button3) ;
oCommand.Dispose();
}
}
خیلی خوب و سریع کار میکنه

hojjatshariffam
پنج شنبه 27 خرداد 1389, 12:10 عصر
روش من :
}[/code]بکآپ..

{
if (saveFileDialog_backup.ShowDialog() == DialogResult.OK)
{
string command = @"BACKUP DATABASE [" + Application.StartupPath + "\\sodour.mdf] TO DISK = N'"+saveFileDialog_backup.FileName+"' WITH FORMAT, INIT, NAME = N'accounting-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10";
this.Cursor = Cursors.WaitCursor;
SqlCommand oCommand = null;
if (objconnection.State != ConnectionState.Open)
objconnection.Open();
oCommand = new SqlCommand(command, objconnection);
oCommand.ExecuteNonQuery();
this.Cursor = Cursors.Default;
objconnection.Close();
FarsiMessageBox.FMessageBox.Show("فابل پشتیبان ذخیره شد", "", FarsiMessageBox.FMessageBoxButtons.OK, FarsiMessageBox.FMessageBoxIcons.Information, FarsiMessageBox.FMessageBoxDefaultButtons.Button3) ;
oCommand.Dispose();
}
}خیلی خوب و سریع کار میکنه

دوست من دیتا بیس شما روی فایل ولی من از خود اس کیو ال استفاده می کنم
شما آدرس فایل دیتا بیس رو میدی ولی من دستورات رو به خود اس کیو ال سرور ارسال می کنم ، این عمل باید تو شبکه هم جواب بده

csharpprogramer88
پنج شنبه 27 خرداد 1389, 18:42 عصر
من تا پيك شما را نخوندم ولي براي بك آپ و ريستور من كد زير را پيشنهاد مكنم من حتي در سيستم مقصد هم جواب گرفتم http://barnamenevis.org/forum/showthread.php?t=218782&page=3

hojjatshariffam
پنج شنبه 27 خرداد 1389, 20:00 عصر
من تا پيك شما را نخوندم ولي براي بك آپ و ريستور من كد زير را پيشنهاد مكنم من حتي در سيستم مقصد هم جواب گرفتم http://barnamenevis.org/forum/showthread.php?t=218782&page=3
دوست من ، من کل این تاپیک ها رو خوندم
مشکل من یه چیز دیگست اگه تاپیک شماره 15 رو بخونین می بینید که تو خود اس کیو ال سرور هم من این خطا رو دارم
من با استفاده از این دستورات در مسیر خاصی از هاد دیسک می تونم بک آپ بگیرم ولی در مسیر ها دیگه اجازه نمی ده
متن خطا رو هم نوشتم

hojjatshariffam
پنج شنبه 27 خرداد 1389, 20:12 عصر
سلام دوستان
لطفا یکی از دوستان حرفه ای این مشکل منو بررسی کنه که چطور میش حلش کرد
من از دیتا بیس بک آپ می گیرم ولی در هر دو حالت (از خود اس کیو ال سرور و از داخل سی شارپ (کد برنامه )) فقط به یک فایل خاص بک آپ می گیره
فایلی که در مسیر خود اس کیو ال سرور و در داخل دایرکتوری بک آپ هستش ، بک آپ می گیره ولی وقتی حتی این فایل رو به یه جای دیگه مانند F: کپی می کنم ارور زیر رو میده



TITLE: Microsoft SQL Server Management Studio
------------------------------

Backup failed for Server 'SERVER'. (Microsoft.SqlServer.SmoExtended)

------------------------------
ADDITIONAL INFORMATION:

System.Data.SqlClient.SqlError: Cannot open backup device 'F:\FullBackup.bak'. Operating system error 5(failed to retrieve text for this error. Reason: 1815). (Microsoft.SqlServer.Smo)

یعنی وقتی حتی از داخل برنامه مسیر

C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Backup\FullBackup .bak

رو انتخاب می کنم بک آپ با موفقیت گرفته میشه ولی وقتی همین فابل رو به مسیری مانند F:\FullBackup.bak کپی کردیم و این فایل رو انتخاب کردیم خطای بالا رو میده
آیا قابل حل شدن هست؟
یکی از دوستان حرفه ای مشکل منو حل کنه
ضمنا تنها روشی که خطا نمی دیه پست شماره 10 در تاپیک زیر هست که علتشم اینه
http://barnamenevis.org/forum/showthread.php?t=218782
علتش اینه که در این روش آدرس محل بک آپ گیری اسکیو ال سرور از داخل رجیستری ویندوز گرفته شده و بک آپ اونجا گرفته میشه بعد یه کپی از فایل بک آپ گرفته شده به محل مورد نظر ما کپی میشه .
که معمولا آدرسی شبه اینه:
C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Backup\FileName.b ak
من می خوام بدونم که چرا حتی خود اس کیو ال سرور نیز نمی تونه بجز این دایرکتوری به جاهای دیگه بک آپ بگیره، آیا تنظیمات خاصی لازمه؟
البته شده که من خودم در برخی مواقع تونستم که به مسیر های دیگری هم بک آپ بگیرم ولی نه همیشه ، فقط برخی مواقع

masoud.rhb
یک شنبه 03 خرداد 1394, 13:02 عصر
واسه بکاپ گرفتن از sql 2000 از کتابخونه sqldmo و واسه نسخه 2005 به بعد باید از sqlsmo استفاده کنید
حواستون باشه sqldmo روی 2005 به بعد وجود نداره و استفاده نمیشه

Javad_raouf
یک شنبه 03 خرداد 1394, 13:44 عصر
علت اینکه با SQLServer نمی تونید برخی جا ها بک آپ بگیرید اینه که ویندوز پرمیشن نمی ده
من این مشکل رو داشتم تنها راه حلش اینه که به پوشه مقصد به صورت دستی یا با برنامه نویسی به Everyone پرمیشن بدی
اینجا نوشته چطوری به صورت دستی می تونی به یک پوشه پرمیشن بدی:
https://msdn.microsoft.com/en-us/library/bb727008.aspx

ولی اگر می خوای به صورت برنامه نویسی پرمیشن بدی این کلاسیه که من ساختم و ازش استفاده می کنم:
public class fPer
{
public static bool AlowFolPer(string StrPath)
{ return AlowFolPer(StrPath, true); }
public static bool AlowFolPer(string StrPath, bool SubFooldersAndFiles)
{ return AlowFolPer(StrPath, SubFooldersAndFiles, "Everyone"); }
public static bool AlowFolPer(string StrPath, string strUser)
{ return AlowFolPer(StrPath, true, strUser); }
public static bool AlowFolPer(string StrPath, bool SubFooldersAndFiles, string strUser)
{
if (!System.IO.Directory.Exists(StrPath))
return false;
try
{
DirectorySecurity dSecurity = Directory.GetAccessControl(StrPath);


FileSystemAccessRule fsar;
//fsar = new FileSystemAccessRule(strUser, FileSystemRights.FullControl, AccessControlType.Allow);
fsar = new FileSystemAccessRule(strUser, FileSystemRights.FullControl, InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit, PropagationFlags.None, AccessControlType.Allow);
dSecurity.AddAccessRule(fsar);
try
{
Directory.SetAccessControl(StrPath, dSecurity);
}
catch (Exception) { return false; }
if (SubFooldersAndFiles)
{
bool blnOk = true;
foreach (string x in Directory.GetDirectories(StrPath))
blnOk = blnOk && AlowFolPer(x, true, strUser);
foreach (string x in Directory.GetFiles(StrPath))
blnOk = blnOk && AlowFilePer(x, strUser);
return blnOk;
}
else
return true;
}
catch (Exception) { return false; }
}
public static bool AlowFilePer(string StrPath)
{ return AlowFilePer(StrPath, "Everyone"); }
public static bool AlowFilePer(string StrPath, string strUser)
{
FileSecurity fSecurity = File.GetAccessControl(StrPath);
FileSystemAccessRule fsar = new FileSystemAccessRule(
strUser
, FileSystemRights.FullControl
//, InheritanceFlags.None , PropagationFlags.NoPropagateInherit
, AccessControlType.Allow);
fSecurity.AddAccessRule(fsar);
try
{
File.SetAccessControl(StrPath, fSecurity);
return true;
}
catch (Exception)
{ return false; }
}
}
Using های مورد نیاز این کلاس:
using System.Security.AccessControl;
using System.IO;

حالا هنگام بکاپ گیری هر پوشه ای رو که کاربر برای ذخیره فایل بکاپ ذخیره کرد اول این دستور رو اجرا کن:
fPer.AlowFolPer(backUpFoolder, true);

اگر جایی از حرفام گنگ بود بگین توضیح بدم