PDA

View Full Version : dbcc



nashkani
پنج شنبه 22 مرداد 1383, 13:50 عصر
برای پشتیبانی پایگاهها از چه دستوراتی استفاده کنم ؟ آیا dbccکمکی میکند ؟ اگر بله چگونه و مهمترین مشکلاتی که در پشتیبانی پایگاه با آنها مواجه میشویم چه هستند ؟

Microsoft.net
پنج شنبه 22 مرداد 1383, 14:01 عصر
از دستود CREATE BACKUP ON استفاده کن خیلی امکاتات خوبی داره حتی می تونی زمان بندی خود کار براش تعریف کنی برای SYNTAX دستور هم توی SQL ONLINE BOOK برو و سرچ کن

nashkani
پنج شنبه 22 مرداد 1383, 14:14 عصر
از جوابتان ممنون البته منظور من تهیه پشتیبان نیست اگر در مورد dbcc اطلاعاتی دارید ممنون میشوم که در اختیار من بگذارید .

AminSobati
پنج شنبه 22 مرداد 1383, 14:51 عصر
دوست عزیز سلام،
خانواده دستورات DBCC بسیار بزرگ و پر جمعیت هستش! DBCC مخفف دو عبارته:
- DataBase Console Command
- DataBase Consistency Checker

تعریفی که مایکروسافت برای این خانواده از دستورات اراپه میده این هست که کلا دستوراتی برای کنترل و اطمینان از یکپارچگی و پیوستگی منطقی و فیزیکی دیتابیس هستند.
چیزی که مد نظر شماست(پشتیبانی)، تعریف بسیار گسترده ای داره و نیازه که بفرمایید چه نوع پشتیبانی منظورتون هست. به عنوان مثال، اگر شما Admin یک دیتابیس هستین، هر چند وقت یکبار نیاز خواهید داشت که برای Performance بهتر، روی دیتابیس دستور DBCC DBREINDEX رو اجرا کنید. همچنین بعد از مدتی کار با دیتابیس، فضاهای خالی به جا گذاشته میشه(بر اثر Delete) که ازشون استفاده ای نمیشه و به قول معروف فضای دیتابیس هدر میره. اینجا DBCC SHRINKFILE به کمک شما میاد.
متاسفانه بحث مراقبت از دیتا بیس و کلا Administration چیزی نیست که بشه در چند سطر توضیح داد. ولی اگر شما دقیقتر هدفتون رو بفرمایید، امکان راهنمایی هم بیشتر فراهم میشه.
موفق باشین،
امین ثباتی MCSD

nashkani
شنبه 24 مرداد 1383, 09:01 صبح
آقای ثباتی
باسلام
راهنمایی تان بسیار مفید و ارزشمند بود و دقیقا در مسیری که من میخواستم پاسخ داده بودید اگر وقت کنید و توضیحات بیشتری بدید ممنون میشم . ما یک تیم هستیم در حال نوشتن یک سیستم برنامه ریزی تعمیرات . وظیفه من تهیه قسمتهای sql پروژه هست . برای اولین بار است که از دیدگاه یک admin کد مینویسم و وسعت سیستم هم نسبتا زیاد هست . بهمین خاطر برامون مهمه که اشکالاتی رو که ممکنه پیش بیاد و admin باید برطرفش کنه بدونیم اگر اشکالات مهم مثل همین دو موردی که شما اشاره کردین بدونیم در صد زیادی از راه رو رفتیم اگر دستورات مربوطه اش رو هم بدونیم که دیگه چی بهتر از این . البته من از اینکه اینهمه سوالم کلی و مفصله معذرت میخوام ولی کمک زیادی میتونین بما بکنین .ممنون . اشکانی

AminSobati
شنبه 24 مرداد 1383, 09:56 صبح
آقای اشکانی عزیز،
خوشحالم که این توضیحات مختصر، به کارتون مربوط بوده.
در مورد اینکه اشاره کردین شما Admin این سیستم هستین، در درجه اول از کسانی که کار طراحی و برنامه نویسی پروژه رو به عهده دارن باید بخواهید که یک سیستم با Performance ایده آل رو طراحی کنن. ساختار نادرست جداول، غلط انتخاب کردن ایندکسها، Queryهای ناصحیح و غیره نقش زیادی در عدم کارآیی سیستم دارن. چون هر چقدر Admin کارش رو بلد باشه و خوب انجام بده، نمیتونه یک سیستم به اصطلاح مریض رو سر پا نگه داره. این مطلب رو گفتم که بعدا به قول معروف کاسه کوزه سر شما خراب نشه!! :wink:
و اما نکاتی که برای Performance، عملکرد مناسب سرور و امنیت اطلاعات شما به صورت تیتر وار میشه بهشون اشاره کرد:
- قرار دادن فایلهای مختلف دیتابیس روی هارد دیسکهای جدا (RAID در صورت امکان)
- استفاده از Full Recovery Model برای دیتابیس
- انتخاب نوع Backupهای مناسب در طول روز و همچنین ساعاتی که دیتابیس حداقل تعداد یوزر رو سرویس میده
- استفاده از sp_recompile در ساعات کم ترافیک دیتابیس (معمولا هفته ای یا ماهی یکبار کافیه)
- DBCC DBREINDEX برای Defrag کردن جداول و ایندکسها
- DBCC SHRINKFILE برای احیاء فضاهای از دست رفته
- DBCC SHOWCONTIG برای اینکه خودتون از وضعیت پیوستگی و ساختار داخلی دیتابیس آگاهی پیدا کنین
- DBCC CHECKDB برای رفع اشکالات احتمالی در ساختار داخلی دیتابیس

اگر انجام بعضی از کارها رو به SQL Server بسپارید، اون خودش انجام میده. مثلا شاخه Management رو باز کنید، روی Database Maintenance Plan یکبار Right Click کنین و New انجام بدین. در این Wizard بعضی از کارها رو براتون به صورت زمان بندی شده تنظیم میکنه.
ولی بازهم فراموش نکنین، طراحان و برنامه نویسان پروژه در مورد Performance خیلی میتونن موثر باشن.

موفق باشید

nashkani
شنبه 24 مرداد 1383, 10:34 صبح
آقای ثباتی
از پاسخ های مفیدتان ممنون من روی چیزهایی که گفته اید مطالعه میکنم و در صورت بروز مشکل باز روی همین تاپیک از شما سوال میکنم .ممنون از اینکه اینقدر سریع پاسخ دادید .

AminSobati
شنبه 24 مرداد 1383, 11:30 صبح
خواهش میکنم و موفق باشید! :)

Mohammad S
شنبه 24 مرداد 1383, 11:57 صبح
با سلام خدمت آقای ثباتی و دیگر دوستان عزیز
اول اینکه میبخشید اگه این سوال رو اینجا مطرح می کنم چون دیدم میشه همینجا ربطش داد
در زبان برنامه نویسی دلفی، برای اتصال به بانک SQL Server از رابط ADO استفاده میشه
در بخش خصوصیات ADO بخشی داره برای تعریف ایندکس که شما به راحتی می تونی روی فیلد دلخواهت ایندکس تعریف کنی. من به این طریق یک ایندکس را تعریف کردم ولی در محیط Enterprise Manager برای بانکم هیچ ایندکسی تعریف نکردم. ولی پس از اجرا متوجه شدم که گویا عمل ایندکس به خودی خود انجام می شود (البته رکوردها را Sort‌ می کرد که همانطور که می دانید یکی از اهداف ایندکس می باشد)
حال می خواستم ببینم آیا واقعا لازم است که یک ایندکس در SQL Server‌ تعریف شود یا همین ایندکس مجازی کافی است؟

با تشکر

AminSobati
شنبه 24 مرداد 1383, 18:55 عصر
سلام محمد جان،
خیلی ممنون که این مطلب رو عنوان کردین، چون فکر میکنم برای اکثر دوستان مفید باشه.
برای بیان بهتر، اجازه بدین اول به تعریف ایندکس در SQL Server نگاهی بندازیم. در SQL Server دو نوع ایندکس داریم: Clustered (که C قرار داد میکنیم) و NonClustered (که NC قرار داد میکنیم)
ایندکس C واقعا ساختار فیزیکیه جدول رو تغییر میده و مرتب میکنه. زمانی که در Enterprise Manager جدول رو باز میکنید، اطلاعات رو سورت شده میبینیم.
ایندکس C چون رکوردها در تیبل رو واقعا مرتب میکنه، منطقا بیشتر از یک ایندکس C نمیتونیم روی تیبل داشته باشیم. چون امکان نداره که یک تیبل رو که باز میکنید، بیبینید که هم بر اساس فیلد ID سورت شده هم براساس مثلا City.
اما زمانیکه یک ایندکس NC روی فیلد Country میسازیم، خود تیبل تغییری نمیکنه بلکه تمام اطلاعات موجود در فیلد Country به یک فضای خالی موجود در دیتابیس کپی میشن و اونجا سورت میشن. کنار هر مقدار، یک علامت(Bookmark) ذخیره میشه که بعدا SQL Server مطلع باشه که هر Value از Country در ایندکس، مرتبط با کدام رکورد در تیبل اصلی هستش. پس اگر تیبل ما 10 تا ایندکس NC داشته باشه، خود تیبل دست نخورده هستش. یعنی داشتن ایندکس، الزاما تیبل رو سورت نمیکنه (به شرط اینکه NC باشه ایندکس.)
عکس این موضوع هم صادقه. یعنی مرتب بودن گزارش شما در ADO دلیل بر ایندکس داشتن تیبل شما نیست. چون به کمک پراپرتی Sort در Recordset میتونین نتیجه یک SELECT رو سورت کنین، بدون اینکه تیبل اصلی ایندکسی داشته باشه.
پس ایندکس برای چه منظوری ساخته میشه؟
ایندکس به مقدار قابل توجهی در افزایش سرعت جستجوی شما در Queryها موثره. هرچی حجم دیتا بیشتر باشه، اهمیت ایندکس بالاتر میره. اینطور تصور نکنید که ما ایندکس رو برای سورت کردن میسازیم! اگر چه در بعضی حالتها ایندکس به سرعت سورت شدن کمک میکنه اما اولین و مهمترین وظیفش افزایش سرعت Queryهاست.
تنظیماتی که شما در دلفی انجام میدین من اطلاع ندارم که آیا به طور فیزیکی روی تیبل ایندکس ایجاد میکنه یا نه. اگر نه، پس حتما روی تیبل در SQL Server ایندکس بسازین و این کار رو به نرم افزار دیگه ای محول نکنین.
اگر به پاسخ من به Search بسیار سریع در SQL(فوری) در همین بخش رجوع کنین، خالی از لطف نخواهد بود!

اگر مطلب مبهمی هست لطفا ارسال کنید.
موفق باشید
امین ثباتی MCSD

nashkani
سه شنبه 27 مرداد 1383, 09:50 صبح
با سلام خدمت آقای ثباتی و دیگر دوستان
چگونه از داخل یک سیستم میتوان از table های همان سیستم backup گرفت که پیام خطای باز بودن دیتا بیس را ندهد ؟ممنون و متشکر . اشکانی

AminSobati
سه شنبه 27 مرداد 1383, 10:20 صبح
سلام آقای اشکانی عزیز،
backup گرفتن از دیتابیس حتی زمانی که در حال استفاده باشه مشکلی نداره، فقط Restore کردنش مشکل داره. شما به چه اشکالی برخورد کردین؟

موفق باشین،
امین ثباتی

nashkani
سه شنبه 27 مرداد 1383, 11:16 صبح
پیغام میگیرم که دیتابیس در حال استفاده است . البته در restore هم همین پیغام رو میگیرم .

AminSobati
سه شنبه 27 مرداد 1383, 22:34 عصر
ممکنه لطفا دستور TSQL برای عمل backup رو بنویسین(یا شاید با EM این کارو انجام میدین؟)

nashkani
چهارشنبه 28 مرداد 1383, 08:13 صبح
ممکنه لطفا دستور TSQL برای عمل backup رو بنویسین(یا شاید با EM این کارو انجام میدین؟)




use [master]
exec sp_addumpdevice 'disk','cmms20040818',disk='\\trsq\cmms back\cmms20040818'
backup database cmms to cmms20040818

AminSobati
چهارشنبه 28 مرداد 1383, 08:46 صبح
آقای اشکانی عزیز،
برای ساختن Device، از پارامتر Disk دو بار استفاده نکنین. البته نمیدونم اصلا اشکال شما این باشنه یا نه. ضمنا برای اطمینان بیشتر، ترجیحا اول روی هارد دیسک خودتون Device رو ایجاد کنین. اگر همه چیز مرتب بود، بعدا مسیر روی شبکه رو تست کنین.
همچنین اول از دیتابیس دیگری مثل Northwind سعی کنین Backup بگیرین. پس دستور TSQL رو به این شکل اجرا میکنیم:


use [master]
exec sp_addumpdevice 'disk','cmms20040818','c:\cmms20040818'
backup database northwind to cmms20040818

حالا اگر این کار بدون خطا انجام شد، به جای Northwind، از cmms استفاده کنین. اگر هنوز خطا دریافت میکنین، لطفا پیغام خطا رو دقیقا بنویسین.

پیروز باشید..