View Full Version : KILL USER یا ALTER DATABSE ؟
fereshte22
دوشنبه 04 تیر 1386, 09:44 صبح
سلام
من تاپیک های زیادی را در مورد بک آپ گیری و restore کردن دیتابیس مطالعه کردم .در این تاپیک ها گفته شده بود که برای حل مشکل database in use از kill user استفاده کنیم.همچنین دوستان توصیه کرده بودن که دستور alter database مشکل را حل میکند.من موندم که اخرش از کدوم دستور استفاده کنم .همچنین در نحوه استفاده از اونها هم مشکل دارم.کد restore من به صورت زیر است.
ایا alter databse را درست استفاده کرده ام؟
اگر قرار باشد از kill user استفاه کنم به چه شکل باید اون را به کار برد؟
Dim con As New SqlConnection("Data Source=FERESHTE-BDE62C\SQLEXPRESS;Initial Catalog=master;Integrated Security=True")
Dim cmdselect1 As SqlCommand
cmdselect1 = New System.Data.SqlClient.SqlCommand("ALTER DATABASE fff SET SINGLE_USER with ROLLBACK IMMEDIATE", con)
con.Open()
cmdselect1.ExecuteNonQuery()
con.Close()
Dim cmdselect As SqlCommand
cmdselect = New System.Data.SqlClient.SqlCommand("RESTORE DATABASE [fff] FROM DISK = '" & TextBox1.Text & "' with replace ", con)
Dim da As New SqlDataAdapter(cmdselect)
con.Open()
cmdselect.ExecuteNonQuery()
con.Close()
ایا درسته که در conection string از دیتابیس master استفاده کنیم؟
reza_rad
دوشنبه 04 تیر 1386, 10:31 صبح
این sp رو یکبار من توی سرچ هام پیدا کردم که user های دیگه رو که به دیتابیس شما وصل هستند kill می کنه.
http://www.aspdeveloper.net/tiki-print_article.php?articleId=6
USE MASTER
IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'USP_GETEXCLUSIVE ' AND type = 'P')
DROP PROCEDURE USP_ GETEXCLUSIVE
GO
--create stored procedure
CREATE PROCEDURE USP_GETEXCLUSIVE @dbname varchar(100) AS
SET NOCOUNT ON
SET QUOTED_IDENTIFIER OFF
--declares our variables
DECLARE @KILL_ID int
DECLARE @QUERY VARCHAR(320)
DECLARE GETEXCLUSIVE_CURSOR CURSOR FOR
--get all SPIDs from SYSOBJECTS table which match our database
SELECT A.SPID FROM SYSPROCESSES A JOIN
SYSDATABASES B ON A.DBID=B.DBID WHERE B.NAME=@DBNAME
OPEN GETEXCLUSIVE_CURSOR
FETCH NEXT FROM GETEXCLUSIVE_CURSOR INTO @KILL_ID
WHILE(@@FETCH_STATUS =0)
BEGIN
--form drop trigger query
SET @QUERY = "KILL "+ CONVERT(VARCHAR,@KILL_ID)
EXEC (@QUERY)
FETCH NEXT FROM GETEXCLUSIVE_CURSOR INTO @KILL_ID
END
CLOSE GETEXCLUSIVE_CURSOR
DEALLOCATE GETEXCLUSIVE_CURSOR
fereshte22
دوشنبه 04 تیر 1386, 10:58 صبح
سلام استاد این ALTER DATABASE چی میشود؟از این SP ای که شما فرمودید بهتر است استفاده کرد یا از دستور ALTER DATABASE؟
reza_rad
دوشنبه 04 تیر 1386, 11:15 صبح
در این حالتی که توی کد شما دیدم و می خواهید از Alter database استفاده کنید عملا کاری که می کنید اینه که دیتابیس رو single user می کنید و بعد باهاش کار می کنید . این در واقع فرقی با حالتی که شما یوزر ها رو kill کنید نداره چون در هر دو حالت عملا ارتباط بقیه یوزر ها با بانک قطع میشه. پس فرقی نمی کنه از چه روشی استفاده کنید. البته من خودم به شخصه روش kill user رو استفاده می کنم. چون وقتی که شما قرار هست دیتابیس رو restore کنید اصولا وصل بودن کاربر توی اون لحظه به دیتابیس معنا نداره.
AminSobati
دوشنبه 04 تیر 1386, 13:44 عصر
از همه سریعتر و کم هزینه تر این هست ک دیتابیس رو Offline کنین قبل از Restore:
ALTER DATABASE Northwind
SET OFFLINE WITH ROLLBACK IMMEDIATE
fereshte22
دوشنبه 04 تیر 1386, 15:43 عصر
سلامبا تشکر از راهنمایهای دوستان چند تا سوال داشتم.ایا لازم نیست که بعد از restore کردن دیتابیس را از حالت offline خارج کنیم؟وقتی این برنامه روی سرور اجرا میشود و دیتابیس داره restore میشود. و یه کاربر میخواهد از همین دیتابیس استفاده کند حالت offline بودن دیتابیس چهطوری بهش تذکر داده میشود ؟ایا پیغام خطایی نمایش داده میشود؟در ضمن این کد restore کردن بر روی سرور به مجوز خاصی احتیاج دارد و یا همان مجوزهای پیش فرض کافیه.ممنون
AminSobati
دوشنبه 04 تیر 1386, 20:59 عصر
- بعد از Restore دیتابیس Online خواهد بود.
- برای مجوزها، به راهنمای دستور RESTORE DATABASE در Books Online (اواسط صفحه مربوطه) مراجعه کنید
JaVaD_1900
چهارشنبه 05 فروردین 1388, 03:38 صبح
من با روش ALTER DATABASE پايگاه دادم رو Restore مي كنم ولي اين Error رو مي ده ؟
ممنون مي شوم اگه راهنمايي كنيد ؟
http://i39.tinypic.com/29uzztx.jpg
AminSobati
چهارشنبه 05 فروردین 1388, 13:22 عصر
دوست عزیزم قبل از اون عملیات، دیتابیس خودتون رو عوض کنین، مثلا USE MASTER انجام بدین
JaVaD_1900
چهارشنبه 05 فروردین 1388, 15:48 عصر
دوست عزیزم قبل از اون عملیات، دیتابیس خودتون رو عوض کنین، مثلا USE MASTER انجام بدین
ببخشيد،منظورتون اين است كه يك Connection ديگر براي يك DB ديگر را Open و Close كنم ؟
مي شه يكم بيشتر توضيح بدين ؟!!؟:متفکر:
AminSobati
چهارشنبه 05 فروردین 1388, 19:21 عصر
نه دوست عزیزم،
از همون Connection ابتدا دستور USER MASTER رو اجرا کنین بعد Restore انجام بدین
JaVaD_1900
چهارشنبه 05 فروردین 1388, 20:29 عصر
ممنون ميشم اگه نحوه استفاده از USER MASTER رو در SqlCommand برام بنويسيد :چشمک: سايت رو جستجو كردم ولي پيدا نكردم ...
mom alone
چهارشنبه 05 فروردین 1388, 23:01 عصر
نازت شم بعد یه سیمی کالن تو کانکشن اینو بنویس دیگه
USER MASTER ;RESTORE DATABASE Test FROM DISK='c:\\dbBackup.bak'
ok?
البته اگه دیتا بیس خودت در حال استفاده است یا پیغام in use رو داد
از کلک offline استفاده کن
JaVaD_1900
پنج شنبه 06 فروردین 1388, 00:04 صبح
واي خداي من،:افسرده:، چي شد !!!
اين رو ببينيد،واسه خاطر يك Restore ساده ...
http://i43.tinypic.com/24e5avd.jpg
اين هم نتيجه كار ... ديگه نمي دونم چيكار كنم ؟؟ :افسرده:
من از ALTER DATABASE استفاده كردمكه مشكل Database in use رو نداشته باشم !!!
در بالا هم اول CMD ALTER رو اجرا مي كنم بعد Restore رو ...
حالا اين كلك Offline چي هست ؟؟
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.