Εντολές DBCC SHRINKFILE και SHRINKDATABASE ενδέχεται να μην λειτουργούν λόγω sparsely συμπλήρωση κειμένου, ntext ή στήλες εικόνων

Συμπτώματα

Οι εντολές DBCC SHRINKFILE και DBCC SHRINKDATABASE θα μετακινήσετε δεδομένα και δεν μειώνει το μέγεθος του αρχείου, εάν η τιμή EstimatedPages είναι ίση με την τιμή MinimumSize που καταγράφεται όταν ολοκληρωθεί η εντολή. Λόγω τροποποίησης δεδομένων ερωτήματα σε πίνακες με τύπους δεδομένων δυαδικό μεγάλο αντικείμενο (BLOB) (κειμένου, ntext, εικόνας), είναι πιθανό να έχετε πολλά ενιαία εκτάσεις που κατανέμονται sparsely έχουν συμπληρωθεί με δεδομένα (για παράδειγμα, μόνο το 1 από τις 8 σελίδες που εκχωρείται το βαθμό ελέγχου), που θα προκαλέσει την DBCC SHRINKFILE και την DBCC SHRINKDATABASE εντολές υπερ-υπολογισμού του αριθμού των EstimatedPages , και οι εντολές δεν εκτελεί τις λειτουργίες συρρίκνωσης. Συνήθως, σε περιπτώσεις όπου είναι αντιμετωπίζουν αυτήν τη συμπεριφορά, το μέγεθος του ένα πλήρες αντίγραφο ασφαλείας βάσης δεδομένων είναι 8 φορές μικρότερο από τα μεγέθη των αρχείων της βάσης δεδομένων μετά την εκτέλεση μιας DBCC SHRINKFILE σχετικά με τα αρχεία βάσης δεδομένων.

Προτεινόμενη αντιμετώπιση

Εάν οι πίνακες που επηρεάζονται δεν χρειάζεται να είναι συνεχώς online, ενώ μπορείτε να διορθώσετε αυτήν την κατάσταση, μπορείτε να χρησιμοποιήσετε μία από τις παρακάτω λύσεις για να επιλύσετε αυτό το ζήτημα:
  • Χρησιμοποιήστε μια δήλωση SELECT INTO για να μεταφέρετε όλο τον πίνακα σε ένα νέο πίνακα στην ίδια βάση δεδομένων. Απόθεση του αρχικού πίνακα και, στη συνέχεια, εκτελέστε μια εντολή DBCC SHRINKFILE. Μετονομάστε το νέο πίνακα με το αρχικό όνομα του πίνακα.
  • Χρησιμοποιήστε μια δήλωση SELECT INTO για να μεταφέρετε όλο τον πίνακα σε ένα νέο πίνακα σε μια διαφορετική βάση δεδομένων. Περικοπή του αρχικού πίνακα και, στη συνέχεια, εκτελέστε μια εντολή DBCC SHRINKFILE. Μεταφέρετε τα δεδομένα στον αρχικό πίνακα.
  • Χρησιμοποιήστε το πρόγραμμα αντίγραφο μαζικής για να αντιγράψετε τον πίνακα σε λειτουργία με τοπικές ρυθμίσεις. Δέσμη ενεργειών του πίνακα και, στη συνέχεια, αποθέστε τον υπάρχοντα πίνακα. Εκτελέστε μια εντολή DBCC SHRINKFILE. Δημιουργήστε ένα νέο πίνακα και, στη συνέχεια, χρησιμοποιήστε το πρόγραμμα αντίγραφο μαζικής για να αντιγράψετε τα δεδομένα στον πίνακα.
  • Χρήση υπηρεσιών μετασχηματισμού δεδομένων (DTS), για να μεταφέρετε ολόκληρη τη βάση δεδομένων σε μια νέα βάση δεδομένων. Υπηρεσίες μετασχηματισμού δεδομένων του SQL Server 7.0 μπορεί να μην μεταφερθούν κειμένου και εικόνας που περισσεύουν που είναι σωστά από 64 KB. Αυτό το ζήτημα δεν ισχύει για την έκδοση του SQL Server 2000 υπηρεσιών μετασχηματισμού δεδομένων.
    Για πρόσθετες πληροφορίες, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft:
    257425 ΕΠΙΔΙΌΡΘΩΣΗ: DTS αντικείμενο μεταφοράς δεν μεταφέρει δεδομένα BLOB που είναι μεγαλύτερο από 64
    Μπορείτε να αναζητήσετε στήλες κειμένου και εικόνας που είναι μεγαλύτερο από 64 KB με το ακόλουθο ερώτημα:
    SELECT MAX (DATALENGTH (TextImageColumn)) FROM TableName
    Εάν τα δεδομένα κειμένου και εικόνας είναι μεγαλύτερο από 64 KB, η μεταφορά περικόπτει τα δεδομένα και δεν ενεργοποιεί κάποιο σφάλμα, με τη διαφορά με το DTS αρχεία καταγραφής. Εάν έχετε δεδομένα κειμένου ή εικόνας, μεγαλύτερο από 64 KB, χρησιμοποιήστε τις πληροφορίες στο τρίτο στοιχείο κουκκίδας για τους πίνακες που έχουν δεδομένα κειμένου ή εικόνας. Στη συνέχεια, μπορείτε να χρησιμοποιήσετε 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. Αν έχετε άνοιγμα της βάσης δεδομένων σε διάφορα αρχεία για λόγους επιδόσεων ή ζητήματα χώρου στο δίσκο, δημιουργία 1 ή περισσότερα πρόσθετα αρχεία της βάσης δεδομένων, χρησιμοποιώντας την εντολή ΤΡΟΠΟΠΟΊΗΣΗ βάσης ΔΕΔΟΜΈΝΩΝ με ένα συνολικό μέγεθος που είναι συγκρίσιμα με τα αποτελέσματα του ακόλουθου ερωτήματος.
    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, με την επιλογή EMPTYFILE ως τη δεύτερη παράμετρο, σε κάθε αρχείο που sparsely έχει συμπληρωθεί εκτάσεις ενιαίο αντικείμενο blob.
  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.

Περισσότερες πληροφορίες

Μπορείτε να εκτελέσετε το παρακάτω ερώτημα Transact-SQL από οποιοδήποτε ερώτημα εργαλείο, όπως το Query Analyzer, εάν έχετε συνδεθεί ως χρήστης που έχει δικαιώματα sysadmin . Μπορείτε να εκτελέσετε το ερώτημα Transact-SQL στον SQL Server για να προσδιορίσετε εάν η εντολή DBCC SHRINKDATABASE και την DBCC SHRINKFILE, εντολή δεν μπορεί να συρρικνωθεί αρχεία λόγω sparsely συμπληρωθεί εκτάσεις ενιαίο αντικείμενο BLOB.

ΣΗΜΕΊΩΣΗ: πρέπει να ενημερώσετε τη συμβολοσειρά '< όνομα βάσης δεδομένων >' το όνομα της βάσης δεδομένων πρόβλημα και πρέπει να περικλείσετε το όνομα σε μονά εισαγωγικά.

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, αυτή η βάση δεδομένων έχει συμπληρωθεί sparsely χώρων BLOB και μπορεί να μειωθεί σε μέγεθος με τις μεθόδους που περιγράφονται στην ενότητα "Προτεινόμενη αντιμετώπιση" αυτού του άρθρου.

ΣΗΜΕΊΩΣΗ: αυτό το ερώτημα εξαρτάται από τη λειτουργικότητα της εντολής DBCC EXTENTINFO. Μην χρησιμοποιείτε την εντολή DBCC EXTENTINFO έξω από αυτήν την κατάσταση, επειδή η λειτουργικότητα μπορεί να αλλάξει ή να καταργήσει από μελλοντικές εκδόσεις του Microsoft SQL Server.

Αναφορές

Για πρόσθετες πληροφορίες, κάντε κλικ στους αριθμούς των άρθρων παρακάτω, για να προβάλετε τα άρθρα της Γνωσιακής Βάσης της Microsoft:
272220 ΕΠΙΔΙΌΡΘΩΣΗ: δεν ανακτάται σωστά το ΚΕΊΜΕΝΟ/την ΕΙΚΌΝΑ δεδομένων αποθηκευτικού χώρου
308627 ΕΠΙΔΙΌΡΘΩΣΗ: DBCC SHRINKDATABASE ή DBCC SHRINKFILE να επεκταθεί και βάση δεδομένων με κείμενο ή δεδομένα εικόνας
Ιδιότητες

Αναγνωριστικό άρθρου: 324432 - Τελευταία αναθεώρηση: 17 Ιαν 2017 - Αναθεώρηση: 2

Σχόλια