PDA

View Full Version : سوال: بعد از ریستور دیتابیس دیگر امکان اتصال به دیتابیس را نمیدهد



ostovarit
دوشنبه 01 آذر 1389, 00:26 صبح
با سلام و خسته نباشید
برنامه ای نوشتم که در بخشی از ان امکان بک آپ گیری و ریستور وجود دارد ...
بعد از نصب برنامه عملیات بک آپ و ریستور بدون مشکل انجام می شود ...
اما اگر برنامه را پاک و از نو نصب کنم و یک بک آپ از قبل گرفته شده را بخواهم ریستور کنم ارور زیر را میدهد ...

Cannot open backup device 'C:\1389\9\1\\ComDatabase.bak'. Operating system error 2(error not found).
RESTORE DATABASE is terminating abnormally.
Nonqualified transactions are being rolled back. Estimated rollback completion: 100%.
Failed to restart the current database. The current database is switched to master.

و بعد از آن به طور کل در تمامی فرم ها اتصال به دیتابیس قطع می شود ... یعنی به فرض مثال صفحه لاگین را هم که باز میکنم موقع اتصال ارور زیر را میدهد :

Cannot open user default database. Login failed.
Login failed for user 'OZHAN\Ozhan Ostovar'.

مشکل از کجاست چرا بعد از ریستور نا موفق دیتابیس کلیه اتصالات قطع میشود ... حتی اگر برنامه را پاک و از نو نصب کنم باز هم در موقع لاگین ارور بالا را میدهد ...

لطفا مرا راهنمایی کنید ... با تشکر

devil00x
دوشنبه 01 آذر 1389, 10:28 صبح
دوست عزیز هنگام ریستور کردن معمولا دیتابیس رو آفلاین می کنن و پس از اتمام عملیات ریستور اون رو آپ می کنند در زمان انجام ناموفق احتمالا دیتابیس از حالت آفلاین خارج نمیشه.
یه چک بکنید بازم اگه مشکلتون بر طرف نشد بفرمایید.!!

ostovarit
دوشنبه 01 آذر 1389, 10:32 صبح
با سلام و تشکر
الان باید چی رو چک بکنم .... برنامه رو نوشتم و براش ستاپ ساختم در مواقعی که بک آپ و ریستور انجام میشه هیچ اروری نداریم ولی وقتی از بکآپ های پیشین میخوام ریستور کنم ارور میده که متنش رو نوشتم چطور این ارور رو حل کنم .... و این قضیه اف لاین و ان لاین رو چطور چک کنم ؟

ostovarit
دوشنبه 01 آذر 1389, 10:52 صبح
این کد بک آپ :



string root = (Directory.CreateDirectory(txtRoot.Text + DatePath()).FullName);
SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\ComDatabase.mdf;Integrated Security=True;User Instance=True");
SqlCommand com = new SqlCommand();
com.Connection = con;
con.Open();
string databaseroot = Application.StartupPath + @"\ComDatabase.mdf";
com.CommandText = "backup database [" + databaseroot + "] to disk='" + root + @"\ComDatabase.bak'";
com.ExecuteNonQuery();
con.Close();
این کد ریستور:



string root = (Directory.CreateDirectory(txtRoot.Text + DatePath()).FullName);
SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\ComDatabase.mdf;Integrated Security=True;User Instance=True");
SqlCommand com = new SqlCommand();
com.Connection = con;
con.Open();
string databaseroot = Application.StartupPath + @"\ComDatabase.mdf";
com.CommandText = "ALTER DATABASE [" + databaseroot + "] SET OFFLINE WITH ROLLBACK IMMEDIATE;RESTORE database [" + databaseroot + "] from disk='" + root + @"\ComDatabase.bak'";
com.ExecuteNonQuery();
con.Close();
فک میکنم حق با شماست SET OFFLINE WITH ROLLBACK IMMEDIATE ... لطفا کد رو چک کنید و من رو در اصلاحش راهنمایی کنید.
یک مطلب دیگه اینکه الان اگر دیتابیس اف لاین شده چطور ان لاینش کنم ....
چون تو خود ویژال مشکلی نیست و به دیتابیس کانکت میشه ...
من از sql خود ویژال استفاده میکنم و SQL Server نصب ندارم ...
با تشکر

ostovarit
دوشنبه 01 آذر 1389, 13:50 عصر
اگر برنامه رو در مسیر جدیدی نصب کنم مشکل حل میشه من ته کوئری که نوشتم این رو اضافه کردم به نظر شما باز هم ممکنه به مشکل بخورم:


"ALTER DATABASE [" + databaseroot + "] SET OFFLINE WITH ROLLBACK IMMEDIATE;RESTORE database [" + databaseroot + "] from disk='" + root + @"\ComDatabase.bak';ALTER DATABASE [" + databaseroot + "] SET ONLINE"


ابن دیتابیس که در مسیر اول بود و به مشکل خورد هیچ رقمه ان لاین نمیشه چه کارش کنم ...؟

devil00x
دوشنبه 01 آذر 1389, 15:58 عصر
دوست عزیز من کد های شما رو خوندم بهت یه پشنهاد دارم شما sql server رو نصب کن و از profilerش استفاده کن این tools کدهای sql شما رو یکی یکی که اجرا میشن رو نشون میده . البته من این کار رو تو sql server 2000 انجام دادم حتما تو نسخه های بالاتر هم هستش و بهتر عمل میکنه.

ostovarit
دوشنبه 01 آذر 1389, 16:03 عصر
من الان متوجه شدم اصلا کار از بیخ مشکل داره ....
برانامه بک آپ میگیره ریستور هم میکنه اروری هم در کار نیست ... اما فایل ریستور شده دیتابیس خامه و دیتایی که ثبت کردم داخلش نیست !

حمیدرضاصادقیان
دوشنبه 01 آذر 1389, 16:07 عصر
سلام.شما سعی کنید با استفاده از دستور With move در انتهای Restore مسیر فایلهای mdf,ldf که میخواد برای دیتابیس ایجاد کنه رو مشخص کنید. نیازی هم به offline کردن نیست. اگر در برنامه شبکه هست باید برنامه رو به Single user تغییر بدید و تمام Connection هایی که برنامه متصل هستند رو با استفاده از kill از بین ببرید بعد از اینکه Restore تمام شد دیتابیس رو به حالت Multi user تغییر بدید.
برای تست میتونید روی یک دیتابیس جدید با یک نام جدید Restore کنید ببینید جوابگو هست یاخیر.
همچنین انتهای دستور backup database وارد کنید with Init . با اینکار روی backup قبلی overwrite میشه.
برای توضیحات بیشتر این لینک (http://www.sqlteam.com/article/backup-and-restore-in-sql-server-full-backups) رو ملاحظه کنید
موفق باشید.

ostovarit
دوشنبه 01 آذر 1389, 17:59 عصر
مرسی از توضیحات...

به نظر شما مشکلم میتونه برای کانکشن استرینگ باشه ... من کانکشن رو به صورت زیر تعریف کردم :


SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\ComDatabase.mdf;Integrated Security=True;User Instance=True");


کد بک آپ رو به توصیه شما with Init و ... اضافه کردم و از کد بک آپ موجود در لینک استفاده کردم کد ریستور رو هم ویرایش کردم ولی مفهوم این خط رو متوجه نمیشم و نمیدونم چطور ازش استفاده کنم؟:



WITH FILE = 1,MOVE N'AdventureWorks_Data' TO N'C:\Data\MSSQL.1\MSSQL\Data\AdventureWorksNew_Dat a.mdf', MOVE N'AdventureWorks_Log' TO N'C:\Data\MSSQL.1\MSSQL\Data\AdventureWorksNew_Log .ldf',


در هر صورت کد بک آپ شد این :


string root = (Directory.CreateDirectory(txtRoot.Text + DatePath()).FullName);
SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\ComDatabase.mdf;Integrated Security=True;User Instance=True");
SqlCommand com = new SqlCommand();
com.Connection = con;
con.Open();
string databaseroot = Application.StartupPath + @"\ComDatabase.mdf";
com.CommandText = "BACKUP DATABASE [" + databaseroot + "] TO DISK = N'" + root + @"\ComDatabase.bak' WITH NOFORMAT, NOINIT, SKIP, NOREWIND, NOUNLOAD, STATS = 10";
com.ExecuteNonQuery();
con.Close();
FarsiMessage.Show(" فایل پشتیبانی با موفقیت ایجاد شد.", "اطلاعات", FarsiMessageBoxButtons.OK, FarsiMessageBoxIcons.Information);


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



string root = (Directory.CreateDirectory(txtRoot.Text + DatePath()).FullName);
SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\ComDatabase.mdf;Integrated Security=True;User Instance=True");
SqlCommand com = new SqlCommand();
com.Connection = con;
con.Open();
string databaseroot = Application.StartupPath + @"\ComDatabase.mdf";
com.CommandText = "ALTER DATABASE [" + databaseroot + "] SET OFFLINE WITH ROLLBACK IMMEDIATE;RESTORE DATABASE [" + databaseroot + "] FROM DISK = '" + root + @"\ComDatabase.bak' WITH NOUNLOAD, STATS = 10";
com.ExecuteNonQuery();
con.Close();
FarsiMessage.Show("بازگردانی اطلاعات با موفقیت انجام شد.", "اطلاعات", FarsiMessageBoxButtons.OK, FarsiMessageBoxIcons.Information);


اگر آف لاین رو حذف کنم ارور میده و ریستور نمیکنه .... و در این حالت هم بعد از ریستور اولین سلکتی که از دیتابیس بزنم ارور زیر رو میده اما از سلکت دوم مشکلی نیست و ظاهرا داده ها ریستور شده ...

A transport-level error has occurred when sending the request to the server. (provider: Named Pipes Provider, error: 0 - No process is on the other end of the pipe.)

devil00x
سه شنبه 02 آذر 1389, 11:03 صبح
سلام.شما سعی کنید با استفاده از دستور With move در انتهای Restore مسیر فایلهای mdf,ldf که میخواد برای دیتابیس ایجاد کنه رو مشخص کنید. نیازی هم به offline کردن نیست.
.
دوست عزیز دیتابیس جهت برگردوندن بک آپ بایستی ریستور بشه در غیر اینصورت خطا رخ خواهد داد.

ostovarit
سه شنبه 02 آذر 1389, 11:26 صبح
من الان مطلبی رو خوندم در باره اتچ کردن دیتابیس و کانکشن استرینگ بعد از اتچ که به شکل زیر میشه :
Data Source=.; initial catalog = dbName; Integrated Security = true

ولی جواب این سوال رو نگرفتم که برای ریستور دیتابیس ما باید حتما اون رو اتچ کرده باشیم یا نه با همین کانکشن استرینگ فعلی من هم جواب میده ... فک میکنم مشکل من دقیقا تو همین مطلب باشه ...

دوستان یکی که تو SQL server وارده یک توضیح به من درباره نحوه بک آپ و ریستور به زبان ساده بده ممنون میشم ... مطالبی که خوندم بیشتر منو گیج کرد ... مثلا الان من دیتابیس رو کنار فایل exe دارم و با کانکشن زیر بهش متصل میشم :
"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirector y|\GridView_DB.mdf;Integrated Security=True;User Instance=True"/

هیچ مشکلی با insert , update , delete با این کانکشن استرینگ ندارم فقط تو بک آپ از دیتابیس و ریستورش اروری نمایش داده نمیشه اما عملیات هم درست پیش نمیره ... طبق صحبت یکی از دوستان در تاپیک زیر :
http://barnamenevis.org/forum/showthread.php?t=224277
از این کانکشن واسه ریستور نمیشه استفاده کرد ... حالا من باید الان چکار کنم دیتابیس رو اتچ کنم و از کانکشن استرینگ دیگه ای استفاده کنم؟ ...

روش اصولی این کار چیه ؟

devil00x
شنبه 06 آذر 1389, 07:02 صبح
ببین دوست عزیز شما موقع بک آپ گرفتن از کانکشن استرینگ
Data Source=.; initial catalog = dbName; Integrated Security = true
که dbName اسم دیتابیس خودتون هست استفاده میکنید اما برای ریستور کردن بایستی کانکشن دیتابیستون رو عوض کنید و

Data Source=.; initial catalog = dbName; Integrated Security = true
یعنی در این قسمت عوض dbName مثلا master رو قرار بدین که از دیتابیس های buitin اس کیو ال هستش

ASKaffash
شنبه 06 آذر 1389, 08:06 صبح
سلام
کاملترین جواب را devil00x ارائه کرد برای Restore باید بانک Attach باشد در ضمن در تالار C#‎ و همین تالار فکر کنم بالای 5 بار بحث شده است

ostovarit
شنبه 06 آذر 1389, 10:59 صبح
ببین دوست عزیز شما موقع بک آپ گرفتن از کانکشن استرینگ
Data Source=.; initial catalog = dbName; Integrated Security = true
که dbName اسم دیتابیس خودتون هست استفاده میکنید اما برای ریستور کردن بایستی کانکشن دیتابیستون رو عوض کنید و

Data Source=.; initial catalog = dbName; Integrated Security = true
یعنی در این قسمت عوض dbName مثلا master رو قرار بدین که از دیتابیس های buitin اس کیو ال هستش

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

devil00x
شنبه 06 آذر 1389, 12:38 عصر
حتما ،
واقعیتش من تو برنامه هایی که خودم نوشتم این مشکل رو نداشتم ، اما فرصت نکردم که اصلا نگاهی بهشون بندازم.
سورس من با دلفی هستش اگه خاطرم موند سورس های خودم رو برات میفرستم.