قد لا تعمل أوامر DBCC SHRINKFILE و SHRINKDATABASE بسبب الكثافة نص أو ntext أو أعمدة صور

الأعراض

أوامر DBCC SHRINKFILE و DBCC SHRINKDATABASE لن نقل البيانات وتقليل حجم الملف إذا كانت القيمة استيماتيدباجيس تساوي قيمة MinimumSize الذي تم الإعلام عنه عند اكتمال الأمر. بسبب تعديل بيانات الاستعلامات على الجداول التي تحتوي على أنواع بيانات كائن ثنائي كبير (BLOB) (النص، ntext الصورة)، من الممكن أن يكون العديد من النطاقات موحدة المخصصة التي يتم الكثافة بالبيانات (على سبيل المثال، فقط 1 من 8 صفحات يتم تخصيص عناصر تحكم النطاق)، مما يتسبب في DBCC SHRINKFILE و DBCC SHRINKDATABASE الأوامر الإفراط في تقدير عدد استيماتيدباجيس ، وعدم تنفيذ الأوامر عمليات التقليص. بشكل عام، في الحالات التي تعاني من هذه المشكلة، حجم النسخ الاحتياطي الكامل لقاعدة البيانات 8 مرات أصغر من أحجام ملفات قاعدة البيانات بعد تشغيل SHRINKFILE DBCC على ملفات قاعدة البيانات.

الحل

إذا لم يكن لديك الجداول المتأثرة أن تكون على اتصال باستمرار بينما تقوم بتصحيح هذه الحالة، يمكنك استخدام أحد الحلول التالية لحل هذه المشكلة:
  • استخدام عبارة SELECT INTO لنقل الجدول بأكمله إلى جدول جديد في قاعدة البيانات نفسها. إسقاط الجدول الأصلي، ثم قم بتشغيل عبارة DBCC SHRINKFILE. إعادة تسمية الجدول الجديد إلى اسم الجدول الأصلي.
  • استخدام عبارة SELECT INTO لنقل الجدول بأكمله إلى جدول جديد في قاعدة بيانات مختلفة. اقتطاع الجدول الأصلي، ثم قم بتشغيل عبارة DBCC SHRINKFILE. نقل البيانات إلى الجدول الأصلي.
  • استخدم برنامج نسخ كبيرة لنسخ الجدول في الوضع الأصلي. برنامج نصي خارج الجدول ومن ثم إسقاط الجدول الموجود. تشغيل عبارة DBCC SHRINKFILE. إنشاء جدول جديد، ومن ثم استخدم برنامج نسخ كبيرة لنسخ البيانات إلى الجدول.
  • استخدام خدمات تحويل البيانات (DTS) لنقل قاعدة البيانات بأكملها إلى قاعدة بيانات جديدة. خدمات تحويل البيانات SQL Server 7.0 ربما لا يتم نقل نص وصورة البيانات أطول من 64 كيلو بايت بشكل صحيح. لا تنطبق هذه المشكلة لإصدار SQL Server 2000 خدمات تحويل البيانات.
    للحصول على معلومات إضافية، انقر فوق رقم المقال التالي لعرضه في "قاعدة معارف Microsoft":
    إصلاح 257425 : كائن DTS النقل لا يتم نقل البيانات BLOB أكبر من 64
    يمكنك البحث عن أعمدة النص والصورة أكبر من 64 كيلو بايت باستخدام الاستعلام التالي:
    SELECT MAX (DATALENGTH (TextImageColumn)) FROM TableName
    إذا كانت البيانات النص والصورة أكبر من 64 كيلو بايت، النقل اقتطاع البيانات ولا تثير أي خطأ فيما عدا في DTS ملفات السجل. إذا كان لديك بيانات النص أو الصورة أكبر من 64 كيلو بايت، استخدام المعلومات في العنصر النقطي الثالث للجداول التي تحتوي على بيانات صورة أو نص. ثانيا، استخدم DTS بقية العناصر الموجودة في قاعدة البيانات.
إذا كان يجب أن تكون قاعدة البيانات عبر إنترنت أو حجم قاعدة البيانات كبيرة جداً لنقل البيانات إلى ملف خارجي أو قاعدة بيانات أخرى، يمكنك استخدام الأمر DBCC SHRINKFILE مع الخيار EMPTYFILE. لاستخدام هذا العمل حول، اتبع الخطوات التالية:
  1. إذا كنت تستخدم Microsoft SQL Server 7.0 Service Pack 3، قم بتشغيل تتبع إشارات 1180 و 1197.
  2. إذا قمت بتشغيل Microsoft SQL Server 7.0 Service Pack 3 بناء 7.00.987، أو في وقت لاحق، بما في ذلك الخدمة service Pack 4، قم بتشغيل إشارة تتبع 1180.
  3. إذا كان قد نشر قاعدة البيانات عبر العديد من الملفات لأسباب تتعلق بالأداء أو قضايا مساحة محرك الأقراص، إنشاء واحد أو أكثر من ملفات إضافية في قاعدة البيانات باستخدام الأمر "تغيير قاعدة البيانات" مع إجمالي حجم مماثل لنتائج الاستعلام التالي.
    select 'size in MB'=ceiling(sum(ei.pg_alloc)/128.000), sfg.groupnamefrom extentinfo ei inner join sysfiles sf on ei.[file_id] = sf.fileid and ei.[file_id] != 1
    inner join sysfilegroups sfg on sf.groupid = sfg.groupid
    group by sfg.groupname
    ملاحظة: يستخدم الاستعلام السابق الجدول الذي يتم إنشاؤه بواسطة الاستعلام في قسم "مزيد من المعلومات" من هذه المقالة. بالإضافة إلى ذلك، يتم تقسيم إجمالي حجم الملف بمجموعة ملفات.

  4. تشغيل استعلام DBCC SHRINKFILE مع الخيار امبتيفيلي كمعلمة ثانية، على كل ملف الكثافة السكانية نطاقات محدد النقطة.
  5. يمكنك تعقب تقدم الأمر DBCC SRHINKFILE عن طريق إنشاء جدول واحد أو أكثر بنفس المخطط كجدول extentinfo من قسم "مزيد من المعلومات" من هذه المقالة. قم بتشغيل "إدراج... EXEC import_extentinfo"استعلام لملء البيانات إلى جداول جديدة. استخدم الاستعلام التالي لتحليل النتائج:
    select [file_id], 'page count'=sum(pg_alloc), 'min page'=min(page_id), 'max page'=max(page_id) from extentinfo group by [file_id]
    بالإضافة إلى ذلك، يمكنك استخدام الاستعلام التالي لتعقب عندما تم تشغيل الأمر DBCC EXTENTINFO إذا الجداول ابدأ بنفس نمط الأحرف وإنشاء جانب وقت الأمر DBCC EXTENTINFO:
    select crdate, [name] from sysobjects where type = 'U' and [name] like 'extent%' order by crdate
  6. عند اكتمال الاستعلام DBCC SHRINKFILE أو تشغيل استعلام "تغيير قاعدة البيانات" لإزالة الملفات القديمة من قاعدة البيانات.
  7. ربما يمكنك إزالة مساحة إضافية عن طريق تشغيل استعلام DBCC SHRINKFILE مع الخيار TRUNCATEONLY على الملفات الجديدة التي تم إنشاؤها في الخطوة 3.
  8. إذا كنت تستخدم Microsoft SQL Server 7.0، إيقاف تشغيل علامات التتبع الذي قمت بتشغيله في الخطوة 1 أو 2.

مزيد من المعلومات

يمكنك تشغيل استعلام SQL للعمليات التالية من أية أداة الاستعلام، مثل "محلل استعلام"، إذا تم تسجيل الدخول كمستخدم له حقوق مسؤول النظام . تشغيل استعلام SQL للعمليات في SQL Server لتحديد الأمر DBCC SHRINKDATABASE و SHRINKFILE DBCC الأمر لا تقليص الملفات نظراً لقلة عدد ملء النطاقات كائن محدد.

ملاحظة: يجب تحديث السلسلة '< اسم قاعدة البيانات >' إلى اسم قاعدة بيانات المشكلة وضع الاسم ضمن علامات اقتباس مفردة.

use pubsgo
if convert(int,substring(convert(binary(4), @@microsoftversion),1,1)) = 8
begin
create table extentinfo
(
[file_id] smallint,
page_id int,
pg_alloc int,
ext_size tinyint,
obj_id int,
index_id tinyint,
pfs_bytes varbinary(10)
)
end
go
if convert(int,substring(convert(binary(4), @@microsoftversion),1,1)) = 7
begin
create table extentinfo
(
[file_id] smallint,
page_id int,
pg_alloc int,
ext_size tinyint,
obj_id int,
index_id tinyint,
pfs_bytes varbinary(10),
avg_used tinyint
)
end
go
create procedure import_extentinfo as
dbcc extentinfo('<database name>')
go
insert extentinfo exec import_extentinfo
go

select [file_id],obj_id, index_id, ext_size, 'actual extent count'=count(*), 'actual page count'=sum(pg_alloc),
'possible extent count'=ceiling(sum(pg_alloc)*1.0/ext_size),
'possible extents / actual extents' = (ceiling(sum(pg_alloc)*1.00/ext_size)*100.00) / count(*)
from extentinfo where ext_size != 1 and index_id = 255
group by [file_id],obj_id, index_id, ext_size
having count(*)-ceiling(sum(pg_alloc)*1.0/ext_size) > 0
order by obj_id, index_id, [file_id]
إذا كنت ترى صفوف النتائج من الاستعلام الأخير التي تحتوي على قيم index_id 255، و حد ممكن/الفعلي مدى العمود هو أقل من 75، وقاعدة البيانات هذه قد الكثافة السكانية النطاقات النقطة ويمكن تقليل حجم بالطرق الموضحة في القسم "حل المشكلة" من هذه المقالة.

ملاحظة: يستند هذا الاستعلام وظيفة الأمر DBCC EXTENTINFO. لا تستخدم الأمر DBCC EXTENTINFO خارج هذا الموقف لأن الوظيفة قد تتغير أو حتى يتم إزالتها من إصدارات مستقبلية من Microsoft SQL Server.

المراجع

لمزيد من المعلومات، انقر فوق أرقام المقالات التالية لعرضها في "قاعدة معارف Microsoft":
إصلاح 272220 : مساحة تخزين بيانات النص/الصورة لا استعادة بشكل صحيح
إصلاح 308627 : DBCC SHRINKDATABASE أو DBCC SHRINKFILE قد يؤدي إلى توسيع قاعدة البيانات مع نص أو بيانات الصورة
خصائص

رقم الموضوع: 324432 - آخر مراجعة: 15‏/01‏/2017 - المراجعة: 2

تعليقات