PDA

View Full Version : Stored Procedure برای backup گرفتن از دیتابیس sql



larim2007
سه شنبه 29 خرداد 1386, 20:55 عصر
با سلام

من یک برنامه با سی شارپ نوشتم که دیتابیس آن با sql 2000 می باشد در این برنامه نیاز به گرفتن backup توسط کاربر دارم. برای اینکار نیاز به یک sp دارم .اگر برای دوستان امکان دارد کد sp را در اینجا قرار دهند.(کد به صورتی باشد که محل ذخیره فایل پشتیبان را کاربر به صورت پارامتر به sp ارسال کند).



با تشکر

hdv212
سه شنبه 29 خرداد 1386, 21:25 عصر
کد sp اینطوری باید باشه :
create proc sp_BackUp
(@path varchar(max))
as
BACKUP DATABASE Northwind TO DISK = @path WITH
NOFORMAT, NOINIT, NAME = N'mydb-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10

کد استفاده از sp هم اینطوری :
exec sp_BackUp 'C:\Assemblies\mydb.bak'

موفق باشید

kiani.mehdi
سه شنبه 29 خرداد 1386, 21:32 عصر
Examples
A. Back up the entire MyNwind database


Note The MyNwind database is shown for illustration only.


This example creates a logical backup device in which a full backup of the MyNwind database is placed.

-- Create a logical backup device for the full MyNwind backup.
USE master
EXEC sp_addumpdevice 'disk', 'MyNwind_1',
DISK ='c:\Program Files\Microsoft SQL Server\MSSQL\BACKUP\MyNwind_1.dat'

-- Back up the full MyNwind database.
BACKUP DATABASE MyNwind TO MyNwind_1

B. Back up the database and log
This example creates both a full database and log backup. The database is backed up to a logical backup device called MyNwind_2, and then the log is backed up to a logical backup device called MyNwindLog1.



Note Creating a logical backup device needs to be done only once.


-- Create the backup device for the full MyNwind backup.
USE master
EXEC sp_addumpdevice 'disk', 'MyNwind_2',
'c:\Program Files\Microsoft SQL Server\MSSQL\BACKUP\MyNwind_2.dat'

--Create the log backup device.
USE master
EXEC sp_addumpdevice 'disk', 'MyNwindLog1',
'c:\Program Files\Microsoft SQL Server\MSSQL\BACKUP\MyNwindLog1.dat'

-- Back up the full MyNwind database.
BACKUP DATABASE MyNwind TO MyNwind_2

-- Update activity has occurred since the full database backup.

-- Back up the log of the MyNwind database.
BACKUP LOG MyNwind
TO MyNwindLog1






تو books online هم میتونی کامل تر اونو بخونی
موفق باشید
مهدی کیانی

larim2007
سه شنبه 29 خرداد 1386, 22:22 عصر
آقای hdv212 وقتی کد شما را اجرا می کنم خطای زیر را می دهد

. 'CREATE PROCEDURE permission denied in database 'db_name

hdv212
چهارشنبه 30 خرداد 1386, 00:29 صبح
با sa به دیتابیست لوگین بشو.

kiani.mehdi
چهارشنبه 30 خرداد 1386, 05:14 صبح
کد sp اینطوری باید باشه :
create proc sp_BackUp
(@path varchar(max))
as
BACKUP DATABASE Northwind TO DISK = @path WITH
NOFORMAT, NOINIT, NAME = N'mydb-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10

کد استفاده از sp هم اینطوری :
exec sp_BackUp 'C:\Assemblies\mydb.bak'

موفق باشید

خوب چرا از backup خود books online استفاده نمی کنید که براش store procedure نوشتین؟

گرچه این هم همونه ولی واقعا چه نیازی هست که یه store procedure بنویسیم و داخل اون از دستور backup استفاده کنیم ؟
خوب مستقیما با خود دستور کار میکنیم

hdv212
چهارشنبه 30 خرداد 1386, 10:41 صبح
خب نظر شما هم درسته، مخصوصا برای restore کردن دیتابیس نمیشه sp تعریف کرد، بهتره از خود دستورات استفاده کرد.

larim2007
چهارشنبه 30 خرداد 1386, 12:37 عصر
با سلام

ببخشید این books online چیست و از کجا می توان آن را تهیه کرد.


با تشکر

sinpin
چهارشنبه 30 خرداد 1386, 12:42 عصر
با سلام

ببخشید این books online چیست و از کجا می توان آن را تهیه کرد.


با تشکر

همراه با خود SQL Server یک کتاب هست به این نام که شورتکات اون رو میتونید در منوی استارت و در مسیر اصلی Microsoft SQL Server پیدا کنید

larim2007
چهارشنبه 30 خرداد 1386, 16:28 عصر
ببخشید اگر برایتان امکان دارد کد sp ریستور (Restore) کردن دیتابیس sql را هم در اینجا قرار دهید.

hdv212
چهارشنبه 30 خرداد 1386, 22:00 عصر
برات گذاشتم که عزیز، فقط از sp درش بیار، اینطوری استفاده کن :
BACKUP DATABASE [mydb] TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\mydb.bak' WITH
NOFORMAT, NOINIT, NAME = N'mydb-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10

kiani.mehdi
چهارشنبه 30 خرداد 1386, 22:09 عصر
برات گذاشتم که عزیز، فقط از sp درش بیار، اینطوری استفاده کن :
BACKUP DATABASE [mydb] TO DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\mydb.bak' WITH
NOFORMAT, NOINIT, NAME = N'mydb-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10

ایشون منظورشون restore کردن بود نه back up

جواب
کلمه restore database را تو books online جستجو کن شصتاد مدل بر ات میاره :چشمک:

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

hdv212
پنج شنبه 31 خرداد 1386, 00:58 صبح
اوووه ببخشید، پیری هست و هزار جور دردسر و گیج بازی، اینم کد Restore کردن :

RESTORE DATABASE [mydb] FROM DISK = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\mydb.bak' WITH
FILE = 1, NOUNLOAD, STATS = 10

larim2007
پنج شنبه 31 خرداد 1386, 11:42 صبح
آقای hdv212 وقتی کد مربوط به ریستور (restore) را اجرا می کنم خطای زیر را می دهد. لطفا راهنمایی کنید که به چه صورت این کد را در برنامه به کار گیرم ؟


System.InvalidOperationException: The connection was not closed. The connection's current state is open.



با تشکر

hdv212
پنج شنبه 31 خرداد 1386, 14:57 عصر
شما یه بار اون connection ای که ساختی ببند و بعد دوباره کانکشنت رو باز کن.

larim2007
پنج شنبه 31 خرداد 1386, 15:39 عصر
ببخشید به چه صورت ؟ امکان داره کدش را بنویسید.

larim2007
جمعه 01 تیر 1386, 21:51 عصر
با سلام کسی نیست جواب ما را بده ؟با تشکر

hdv212
جمعه 01 تیر 1386, 23:13 عصر
کدت رو اینجا بذار ببینم مشکلت کجاست.

larim2007
شنبه 02 تیر 1386, 07:49 صبح
اینم کد مربوط به ریستور کردن :

private void menuItem45_Click(object sender, EventArgs e)
{
if (openFileDialog2.ShowDialog() == DialogResult.OK)
{
string filename = openFileDialog2.FileName;
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "sp_restore";
cmd.Parameters.Add("@path", SqlDbType.NVarChar).Value = filename;

con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
}



با تشکر

hdv212
شنبه 02 تیر 1386, 18:30 عصر
larim2007 عزیز اگه دقت کنی، شما توی کدت دوبار con.Open رو فراخوانی کردی، دومیش رو حذف کن(منظورم قبل از cmd.ExecuteNonQuery(); هستش)
موفق باشید

kiani.mehdi
شنبه 02 تیر 1386, 22:14 عصر
larim2007 عزیز اگه دقت کنی، شما توی کدت دوبار con.Open رو فراخوانی کردی، دومیش رو حذف کن(منظورم قبل از cmd.ExecuteNonQuery(); هستش)
موفق باشید

خداییش من یدونه con.Open(); که بیشتر نمی بینم
نکنه من کوررنگی گرفتم؟:افسرده:

hdv212
شنبه 02 تیر 1386, 22:21 عصر
اصلا به جای con.Open() از این کد استفاده کن :

if (con.State == ConnectionState.Closed)
con.Open();

kiani.mehdi عزیز شما درست گفتی، من اشتباه کردم، من تو خطی که کانکشن رو تعریف کرده، فکر کردم بازش کرده، به هر حال با این کد، هم کدش بهینه میشه، هم در صورت باز بودن کانکشن، دیگه این کانکشن رو باز نمیکنه که برنامه دچار خطا بشه، ولی در کل یه کانکشنی توی برنامه ت بازه (احتمالا توی کدهای قبلی که نوشتی)

larim2007
شنبه 02 تیر 1386, 23:10 عصر
با سلام

آقای hdv212 من کد زیر را جایگزین کردم :

private void menuItem45_Click(object sender, EventArgs e)
{
if (openFileDialog2.ShowDialog() == DialogResult.OK)
{
string filename = openFileDialog2.FileName;
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "sp_restore";
cmd.Parameters.Add("@path", SqlDbType.NVarChar).Value = filename;
if (con.State == ConnectionState.Closed)
{
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
else
{
cmd.ExecuteNonQuery();
con.Close();
}
}
}

ولی باز هم خطای زیر را میدهد :

System.Data.SqlClient.SqlException: Exclusive access could not be obtained because the database is in use.

با تشکر از دوستان

iman_s52
یک شنبه 03 تیر 1386, 08:02 صبح
خوب عزیز باید قبل از Restore کردن همه Processهای متصل به دیتا بیس رو Kill کنی .

iman_s52
یک شنبه 03 تیر 1386, 08:11 صبح
واسه اینکار باید اول لیست کاربرانی که به دیتابیس وصل هستند رو دربیاری و یکی یکی دسترسی شون رو از دیتا بیس قطع کنی اگه اینکار رو نکنی همون خطای DataBase In USe رو بهت میده


SELECT spid AS ID FROM Master..sysprocesses WHERE dbid = db_id('**dbName**')


بعد میتونی با یه dataReader تویه لیست UserId حرکت کنی و یکی یکی براشون دستور
Kill(آی دی که دیتا ریدر پیدا کرده)

در ضمن اگه خواستی می تونی تویه Enterprise Manager-> Managment->Current Activity -> Process Info لیست پروسس های متصل به دیتا بیس های مختلف رو ببینی.

larim2007
یک شنبه 03 تیر 1386, 10:02 صبح
با سلام

آقای iman_s52 اگر برایتان امکان دارد همین چیزی را که در پست قبلی خود گفتید (به صورت کد ) به کدی که من در پست قبلی خودم قرار دادم اضافه نمایید.

با تشکر

iman_s52
یک شنبه 03 تیر 1386, 10:20 صبح
البته ابن روشی که من استفاده کردم و جواب هم گرفتم شاید روش بهتری هم باشه :
شما قبل از کد خودتون این تابع رو صدا بزن


private void prepare_Restore()
{
try
{
string strSql = "SELECT spid AS ID FROM Master..sysprocesses WHERE dbid = db_id('SHOP')";
string stId = string.Empty;
SqlCommand cmd = new SqlCommand(strSql,sqlCon);
if(sqlCon.State.ToString() == "Closed")sqlCon.Open();
SqlDataReader dr = cmd.ExecuteReader();
if(dr.HasRows)
while(dr.Read())
{
stId += dr["ID"].ToString()+"|";
}
dr.Close();
string [] stTemp = stId.Split((char) 124);
for(int i = 0 ; i < stTemp.Length-1 ;i++)
kill_User(Convert.ToInt32(stTemp[i]));
sqlCon.Close();
}
catch{}
}
private void kill_User(int id)
{

SqlCommand cmdKill = new SqlCommand("Kill "+id.ToString(),sqlCon);
cmdKill.ExecuteNonQuery();
}



در ضمن اسم دیتا بیس من Shop بوده وشما باید اسم دیتا بیس خودتو بذاری

larim2007
یک شنبه 03 تیر 1386, 16:06 عصر
با سلام

آقلی iman_s52 اینکار راهم کردم ولی جواب نداد و همان error را می دهد.

کد:
private void menuItem45_Click(object sender, EventArgs e)
{
prepare_Restore();
if (openFileDialog2.ShowDialog() == DialogResult.OK)
{
string filename = openFileDialog2.FileName;
SqlCommand cmd = new SqlCommand();
cmd.Connection = con;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "sp_restore";
cmd.Parameters.Add("@path", SqlDbType.NVarChar).Value = filename;

prepare_Restore();

con.Open();

cmd.ExecuteNonQuery();
con.Close();



}

}

error:

System.Data.SqlClient.SqlException: Exclusive access could not be obtained because the database is in use.


با تشکر

hdv212
سه شنبه 05 تیر 1386, 00:41 صبح
larim2007 عزیز خب طبیعیه که همچین خطایی میده، شما در حال استفاده از دیتابیس هستید، چطوری میتونید اونو جایگزین کنید ؟
به خاطر همین در تعریف sp ای که نوشتید، قبلش از دستور use dbName استفاده کنید، مثلا :
use master

اگر دوباره همون پیغام رو دریافت کردید یا مشکلتون حل نشد، به این تاپیک مراجعه کنید :
http://www.barnamenevis.org/forum/showthread.php?t=71410
موفق باشید