Файл базы данных SQL Server не усекается - PullRequest
5 голосов
/ 02 марта 2011

У меня есть база данных размером ~ 4 ГБ.Я скопировал эту базу данных и удалил 99% данных, потому что мне нужна база данных, содержащая только схему и базовые данные (в основном хранятся статические данные).

Проблема в том, что файл MDF все еще сохраняетсяразмер ~ 4 ГБ.Если я читаю размер таблиц (например, используя this ), они вместе составляют менее 20 МБ.Файл журнала уже сжат, но ни один из запущенных мною сценариев не работал для сжатия файла БД.

Примечание: Обычно я этого не делаю, но на этот раз мне нужно чтобы уменьшить базу данных (я знаю, что это не рекомендуется)

Редактировать: + Полезная информация

Команда:

exec sp_spaceused

Вывод:

database_name       database_size   unallocated_space
AccudemiaEmptyDb    3648.38 MB      4.21 MB

Команда:

select object_name(id) as objname, SUM(dpages*8) as dpages, COUNT(*) as cnt
from sysindexes
group by id
order by dpages desc

Выход:

object_name(id)            sum(dpages*8)    count(*)
sysdercv                   675328           1
sysxmitqueue               359776           1
sysdesend                  72216            1
sysconvgroup               47704            1
sysobjvalues               4760             5
sec_OperationAccessRule    3472             5
sec_PageAccessRule         2232             5
syscolpars                 656              11
AuditObjects               624              2
sysmultiobjrefs            408              5
HelpPage                   376              8
sysschobjs                 352              9
syssoftobjrefs             328              7
sysidxstats                272              10
sysrscols                  200              1
Translation                160              3
sysallocunits              128              3
sysiscols                  128              8
syssingleobjrefs           96               5
sysrowsets                 80               4

Ответы [ 5 ]

3 голосов
/ 02 марта 2011

Первый запуск

exec sp_spaceused

в базе данных, чтобы проверить, сколько вы можете восстановить.Если вы обнаружите, что на нем не отображается неиспользуемое пространство, значит, вы неправильно поняли распределение пространства.

Именно так я обычно сжимаю свой test1 дБ, где я воспроизводю все мои запросы StackOverflow.Я просто сократил его с 3 ГБ до 8 МБ.

use test1;
exec sp_spaceused;
checkpoint;
alter database test1 set recovery simple;
alter database test1 set recovery full;
dbcc shrinkfile(1,1);
dbcc shrinkfile(2,1);

Для чего это стоит, это то, что я использую, чтобы проверить размер распределения по таблице.Может быть, вы проверяли неправильно?Сюда входят индексы.

select object_name(id), SUM(dpages*8), COUNT(*)
from sysindexes
group by id

РЕДАКТИРОВАТЬ - на основе таблиц, занимающих место, отредактированное в вопросе

Комментарий Мартина перенесен в ответ: соответствующие таблицы являются диалогами компонента Service Broker.http://social.msdn.microsoft.com/Forums/en/sqlservicebroker/thread/03180f45-cd83-4913-8f0e-3d8306f01f06 Ссылка имеет обходной путь.

Есть альтернатива;используя уже урезанную базу данных

  1. Создать сценарий - все объекты - включить все параметры (ключи, полный текст, значения по умолчанию и т. д.)
  2. включить параметр для данных сценария
  3. Создайте новую базу данных и заполните ее из сценариев

(Исходя из воспоминаний, очереди SSSB не включаются в сценарии создания данных)

2 голосов
/ 03 марта 2011

Спасибо вам, ребята, и в основном Ричарду за всю информацию!

Чтобы решить проблему, мне пришлось отказаться и заново создать мои УСЛУГИ:

DROP SERVICE [//Audit/DataWriter] 
GO

CREATE SERVICE [//Audit/DataWriter] 
    AUTHORIZATION dbo 
ON QUEUE dbo.TargetAuditQueue ([//Audit/Contract])

Как только я это сделал,база данных была 5гб!Но на этот раз второй запрос, который я поставил в своем вопросе, показал sysxmitqueue в качестве первого результата.Покопавшись в Интернете, я смог очистить большой стол, выполнив следующее:

ALTER DATABASE [your_database] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
ALTER DATABASE [your_database] SET NEW_BROKER WITH ROLLBACK IMMEDIATE
GO
ALTER DATABASE [your_database] SET MULTI_USER
GO

Затем запустите DBCC SHRINKFILE, и все!=) Теперь только 40MB

Спасибо, ребята!

2 голосов
/ 02 марта 2011

Редактировать: так что кажется, что место еще где-то выделено. Можете ли вы попробовать этот запрос (на основе sp_spaceused)?

select OBJECT_NAME(p.object_id),
 reservedpages = sum(a.total_pages),
    usedpages = sum(a.used_pages),
    pages = sum(
            CASE
                -- XML-Index and FT-Index internal tables are not considered "data", but is part of "index_size"
                When it.internal_type IN (202,204,211,212,213,214,215,216) Then 0
                When a.type <> 1 Then a.used_pages
                When p.index_id < 2 Then a.data_pages
                Else 0
            END
        )
from sys.partitions p join sys.allocation_units a on p.partition_id = a.container_id
    left join sys.internal_tables it on p.object_id = it.object_id
GROUP BY p.object_id
with rollup
0 голосов
/ 03 марта 2011

Что если вы скопируете базу данных?Щелкните правой кнопкой мыши по базе данных и выполните задачи, скопируйте базу данныхПросто мысль, которую легко попробовать.

0 голосов
/ 02 марта 2011

Вы можете использовать команды DBCC для сжатия базы данных.

Вот ссылка на DBCC SHRINKDATABASE и DBCC SHRINKFILE

...