ورود

View Full Version : اساتید کمک - یه ایراد در بازیابی بک آپ sql در دلفی



farzadkamali
جمعه 11 مرداد 1392, 22:19 عصر
با سلام

من برای بازگردانی بک آپ sql در دلفی از این کد استفاده می کنم.




try
module.ADOConnection1.Execute('use master RESTORE DATABASE db1 FROM DISK='''+OpenDialog1.FileName+''' WITH REPLACE');
showmessage('عملیات بازیابی نسخه پشتیبان با موفقیت انجام شد ');

except
MessageDlg('عملیات بازیابی نسخه پشتیبان با شکست مواجه شد',mtError,[mbOK],0);



کار میکنه. فقط یه مشکل وجود داره. وقتی که sql server management studio باز باشه، اون وقت دیگه بک آپ رو بر نمی گردونه. جالب اینجاست که پیغام موفقیت آمیز بودن هم میده. در صورتی که اگر بازگردانی نکنه حداقل باید پیغام شکست بده. همینطور وقتی پروژه رو با دلفی بازکردم هم همینطوره. و حتماً باید پروژه و sql بسته باشه تا عملیات انجام بشه.
ایراد از کجاست؟

benyaminrahimi
شنبه 12 مرداد 1392, 11:51 صبح
شما مسیر فایلها رو مشخص نکردید

این کد رو امتحان کن


CREATE PROCEDURE [dbo].[sp_sys_restore](@dbname NVARCHAR(100),@masir NVARCHAR(500) )
AS

BEGIN

DECLARE @r_name NVARCHAR(500)
DECLARE @r_path NVARCHAR(500)


SELECT @r_name=sys.master_files.name ,
@r_path=sys.master_files.physical_name
FROM sys.databases
INNER JOIN sys.master_files
ON sys.databases.database_id = sys.master_files.database_id
WHERE sys.databases.name=@dbname AND sys.master_files.type_desc='ROWS'



DECLARE @l_name NVARCHAR(500)
DECLARE @l_path NVARCHAR(500)

SELECT @l_name=sys.master_files.name ,
@l_path=sys.master_files.physical_name
FROM sys.databases
INNER JOIN sys.master_files
ON sys.databases.database_id = sys.master_files.database_id
WHERE sys.databases.name=@dbname AND sys.master_files.type_desc='LOG'



DECLARE @f_name NVARCHAR(500)
DECLARE @f_path NVARCHAR(500)


SELECT @f_name=sys.master_files.name ,
@f_path=sys.master_files.physical_name
FROM sys.databases
INNER JOIN sys.master_files
ON sys.databases.database_id = sys.master_files.database_id
WHERE sys.databases.name=@dbname AND sys.master_files.type_desc='FILESTREAM'




DECLARE @runer NVARCHAR(max)
SET @runer='RESTORE DATABASE ['+@dbname+'] FROM DISK = '+''''+@masir+''''+' WITH FILE = 1'
+' ,MOVE '+''''+@r_name+''''+' to '+''''+@r_path+''''
+' ,MOVE '+''''+@l_name+''''+' to '+''''+@l_path+''''
+' ,MOVE '+''''+@f_name+''''+' to '+''''+@f_path+''''
+', NOUNLOAD, REPLACE, STATS = 10 '



exec ('ALTER DATABASE '+ @dbname +'SET SINGLE_USER WITH ROLLBACK IMMEDIATE ')
EXEC (' go ')
EXEC (@runer)
EXEC(' go ')
exec ('ALTER DATABASE '+@dbname +' SET MULTI_USER ')








END

farzadkamali
شنبه 12 مرداد 1392, 14:50 عصر
شما مسیر فایلها رو مشخص نکردید

این کد رو امتحان کن


CREATE PROCEDURE [dbo].[sp_sys_restore](@dbname NVARCHAR(100),@masir NVARCHAR(500) )
AS

BEGIN

DECLARE @r_name NVARCHAR(500)
DECLARE @r_path NVARCHAR(500)


SELECT @r_name=sys.master_files.name ,
@r_path=sys.master_files.physical_name
FROM sys.databases
INNER JOIN sys.master_files
ON sys.databases.database_id = sys.master_files.database_id
WHERE sys.databases.name=@dbname AND sys.master_files.type_desc='ROWS'



DECLARE @l_name NVARCHAR(500)
DECLARE @l_path NVARCHAR(500)

SELECT @l_name=sys.master_files.name ,
@l_path=sys.master_files.physical_name
FROM sys.databases
INNER JOIN sys.master_files
ON sys.databases.database_id = sys.master_files.database_id
WHERE sys.databases.name=@dbname AND sys.master_files.type_desc='LOG'



DECLARE @f_name NVARCHAR(500)
DECLARE @f_path NVARCHAR(500)


SELECT @f_name=sys.master_files.name ,
@f_path=sys.master_files.physical_name
FROM sys.databases
INNER JOIN sys.master_files
ON sys.databases.database_id = sys.master_files.database_id
WHERE sys.databases.name=@dbname AND sys.master_files.type_desc='FILESTREAM'




DECLARE @runer NVARCHAR(max)
SET @runer='RESTORE DATABASE ['+@dbname+'] FROM DISK = '+''''+@masir+''''+' WITH FILE = 1'
+' ,MOVE '+''''+@r_name+''''+' to '+''''+@r_path+''''
+' ,MOVE '+''''+@l_name+''''+' to '+''''+@l_path+''''
+' ,MOVE '+''''+@f_name+''''+' to '+''''+@f_path+''''
+', NOUNLOAD, REPLACE, STATS = 10 '



exec ('ALTER DATABASE '+ @dbname +'SET SINGLE_USER WITH ROLLBACK IMMEDIATE ')
EXEC (' go ')
EXEC (@runer)
EXEC(' go ')
exec ('ALTER DATABASE '+@dbname +' SET MULTI_USER ')
END



مسیر فایل رو که از یه OpenDialog میگیره. و پیشفرض در پوشه DATA ی sql server کپی میکنه. یعنی پایگاه هر جا هست، جایگزین همون پایگاه قبلی میکنه. (WITH REPLACE). که من هم می خوام همین کار رو بکنه.
در ضمن برای بازگردانی پایگاه جست و جوی زیادی کردم و کدهای زیادی یافتم. اما تنها کدی که تونستم جواب بگیرم همی کدی بود که نوشتم. بقیه رو یا نتونستم یا نشد یا اشتباه رفتم. لطف میکنین یه نمونه بدین؟

benyaminrahimi
یک شنبه 13 مرداد 1392, 13:08 عصر
منظورم از مسیر Ldf , mdf بود که تو این پروسیجر از خونده میشه .. شما باید این پروسیجر رو مثلا تو master ایجاد کنید و بعد تو دلفی کالش کنید منطور از مثال رو نفهمیدم ولی این پروسیجرو خودم نوشتم و داره تو پیکج کار میکنه و بیش از 100 مشتری تستش کردند .. موفق باشید

farzadkamali
پنج شنبه 24 مرداد 1392, 19:18 عصر
منظورم از مسیر Ldf , mdf بود که تو این پروسیجر از خونده میشه .. شما باید این پروسیجر رو مثلا تو master ایجاد کنید و بعد تو دلفی کالش کنید منطور از مثال رو نفهمیدم ولی این پروسیجرو خودم نوشتم و داره تو پیکج کار میکنه و بیش از 100 مشتری تستش کردند .. موفق باشید

چند تا سوال.

1- چه طوری stored procedures رو توی دلفی کال کنم.
2- دو پارامتر dbname و masir رو باید توی همون sql و توی همین قطعه کد مقدار دهی کرد؟
3- مسیر بک آب (.bak) ممکنه متغیر باشه. باز هم باید از open dialog استفاده کرد؟

شرمنده طولانی شد.

ممنون

farzadkamali
یک شنبه 17 شهریور 1392, 14:16 عصر
کسی از دوستان می تونه راهنمایی کنه؟

benyaminrahimi
چهارشنبه 20 شهریور 1392, 20:05 عصر
این کد رو رو دیتابیس غیر از دیتابی منطور اجرا میکنی sp در اسکیو ال ساخته میشه

سمت دلفی یه Opn dialog میزاری نام فایلو میگیری بعد بایه کنترل tsoredproc به این پروسیجر در اون دیتا بیس وصل میشیو پارامتر ها رو با parambyname (نام دیتابیس و و مسیری که تو open dialog گرفتی ) رو پاس میکنی و اجراش میکنی بقیه کارا رو خود پروسیجر میکنه ... امید وارم واضح گفته باشم

farzadkamali
جمعه 10 آبان 1392, 17:13 عصر
این کد رو رو دیتابیس غیر از دیتابی منطور اجرا میکنی sp در اسکیو ال ساخته میشه

سمت دلفی یه Opn dialog میزاری نام فایلو میگیری بعد بایه کنترل tsoredproc به این پروسیجر در اون دیتا بیس وصل میشیو پارامتر ها رو با parambyname (نام دیتابیس و و مسیری که تو open dialog گرفتی ) رو پاس میکنی و اجراش میکنی بقیه کارا رو خود پروسیجر میکنه ... امید وارم واضح گفته باشم

ممنون از راهنمایی های خوبتون. با procedure ها و نحوه کار و استفادشون آشنا شدم. اما به همین روشی که گفتید رفتم اما هنگام اجرا ارور زیر رو میده. چرا؟
Incorrect syntax near the keyword 'WITH'

مراحل کار من به این صورته:
1-ایجاد یک پروسیجر در مستر
2-گزاشتن ADOStoredProc در فرم و اوکی کردن connection string و procedure name آن
3-opendialog و button
4- کدهای button رو هم این جوری نوشتم :


if opendialog1.Execute then
begin
ADOStoredProc1.Parameters.ParamByName('@dbname').V alue:='db1';
ADOStoredProc1.Parameters.ParamByName('@masir').Va lue:=opendialog1.FileName;
ADOStoredProc1.ExecProc;
end;


پروسیجری که توی تایپیک زیر نوشتید استفاده کردم و با کدهای بالا پارامتر دادم و در آخر execproc کردم. هیچ اروری نمیده. اما هیچ کاری هم انجام نمیده.
http://barnamenevis.org/showthread.php?396813-restore-%D8%A8%D8%B1%D8%A7%DB%8C-sql-%D8%B3%D8%B1%D9%88%D8%B1&highlight=restore
بعد از پارامتر دادن باید حتماً ADOStoredProc1 رو active یا open کرد؟ یا همون دستور ADOStoredProc1.ExecProc کفایت می کنه. چون وقتی دستور زیر رو میدم ارور :

ADOStoredProc1: CommandText does not return a result set.

میگیره


ADOStoredProc1.Parameters.ParamByName('@dbname').V alue:='db1';
ADOStoredProc1.Parameters.ParamByName('@masir').Va lue:=opendialog1.FileName;

ADOStoredProc1.Open;


یه سوال دیگه : اگه پایگاه با موفقیت بازگردانی بشه return_value مقدار true یعنی 1 رو برمیگردونه دیگه. درسته؟ (برای اطمینان از انجام کار)

ممنون میشم اگه پاسخ بدید. خیلی جست و جو و کار کردم اما به نتیجه نرسیدم.:گریه:

alirezass
سه شنبه 28 آبان 1392, 15:37 عصر
با سلام خدمت شما دوست عزیز من بد از چند وقت گشتن دنبال این موضوع و بر خورد با مشکلات فراوان تونستم در بکاپ و بازیابی موفق شم البته در بازیابی مشکلی وجود داره اینم اونه که باید در هنگام بکاپ فایل بکاب را فشره کرد سپس انرا بازیابی نمود وگرنه مدت زمان بازیابی ان بطول می انجامد
بکاب:if (SaveDialog1.Execute)and (Length(SaveDialog1.FileName)>0) then
begin
ADOQuery1.Close ;
ADOQuery1.SQL.Text :='backup database tolid to disk = '+''''+SaveDialog1.FileName+'''';
ADOQuery1.ExecSQL ;
end;
رستور:var t:String ;
begin
if (OpenDialog1.Execute)and (Length(OpenDialog1.FileName)>0) then
begin
ADOQuery1.Close ;

ADOQuery1.SQL.Text :='ALTER DATABASE tolid SET OFFLINE WITH ROLLBACK IMMEDIATE '+' restore database tolid from disk='+''''+OpenDialog1.FileName +''' with replace';


ADOQuery1.ExecSQL ;


end;
امیدوارم تونسته باشم کمکی بکنم با خلوص
اگه باز کمکی خواستید به ایمیلم میل بزنید
bkhdml@gmail.com