У меня есть база данных размером почти 1,9 ГБ, а MSDE2000 не позволяет использовать базы данных, превышающие 2,0 ГБ
Мне нужно сжать эту БД (и многие другие подобные в разных местах клиента).
Я нашел и удалил много сотен из 1000 записей, которые считаются ненужными: эти записи составляют большой процент некоторых основных (самых больших) таблиц в базе данных. Поэтому разумно предположить, что теперь можно извлечь много места.
Итак, теперь мне нужно сжать БД, чтобы учесть недостающие записи.
DBCC ShrinkDatabase('MyDB') ...... Никакого эффекта.Тем не менее 1,9 ГБ
Почему?
Какую бы процедуру я ни обнаружил, ее необходимо воспроизвести на клиентской машине, не имеющей доступа ни к чему, кроме OSql или подобного.





Вы также должны изменить минимальный размер файлов данных и журналов. DBCC SHRINKDATABASE сожмет данные внутри файлов, которые вы уже разместили. Чтобы уменьшить файл до размера, меньшего, чем его минимальный размер, используйте DBCC SHRINKFILE и укажите новый размер.
DBCC SHRINKDATABASE у меня работает, но вот его полный синтаксис:
DBCC SHRINKDATABASE ( database_name, [target_percent], [truncate] )
где target_percent - желаемый процент свободного места, оставшегося в файле базы данных после сжатия базы данных.
А параметр truncate может быть:
NOTRUNCATE
Заставляет освободившееся файловое пространство оставаться в файлах базы данных. Если не указано иное, освободившееся файловое пространство передается операционной системе.
TRUNCATEONLY
Вызывает освобождение всего неиспользуемого пространства в файлах данных операционной системе и сжимает файл до последнего выделенного экстента, уменьшая размер файла без перемещения каких-либо данных. Попытки переместить строки на нераспределенные страницы не предпринимаются. target_percent игнорируется при использовании TRUNCATEONLY.
... и да, no_one правильно, сокращение базы данных - не очень хорошая практика, например:
сжатие файлов данных - отличный способ ввести значительную логическую фрагментацию, поскольку он перемещает страницы из конца выделенного диапазона файла базы данных в место в начале файла ...
сжатие базы данных может иметь серьезные последствия для базы данных, сервера .... хорошенько подумайте об этом, прежде чем делать это!
в сети много блогов и статей об этом.
Это не будет обычным делом ... Я делаю это, потому что другие связанные БД приближаются к 2 Гб, и это предел для MSDE2000. Теоретически я удаляю 50% записей "Project" и все относящиеся к ним элементы во многих других таблицах ... Проекты составляют примерно 50% системы.
Вот еще одно решение: используйте Мастер публикации базы данных для экспорта вашей схемы, безопасности и данных в сценарии sql. Затем вы можете отключить свою текущую БД и воссоздать ее с помощью сценариев.
Звучит глупо, но есть пара преимуществ. Во-первых, нет шансов потерять данные. Ваша исходная БД (если вы не удаляете свою БД при ее удалении!) Безопасна, новая БД будет примерно настолько маленькой, насколько это возможно, и у вас будет два разных снимка текущей базы данных - один готов свернуть, один минифицированный - вы можете выбрать для резервного копирования.
Очень интересно. Я попробую это сделать на месте, чтобы понять, каким должен быть минимальный размер. Однако мне нужно иметь возможность запускать этот процесс на нескольких клиентских машинах. Предпочтительно запускать один скрипт, а не экспорт / импорт базы данных.
Любая идея типичного соотношения размера БД и размера скрипта?
Я создал сценарий для примера базы данных 1,3 ГБ, и он получил 9,8 ГБ. Я даже не знаю, как запустить такой большой скрипт.
Это чертовски дико. Я думаю, что вы находитесь в совершенно другой вселенной, большой по этому поводу.
Это может показаться странным, но у меня это сработало, и я написал программу на C# для автоматизации этого.
Шаг 1. Обрежьте журнал транзакций (сделайте резервную копию только журнала транзакций, включив опцию удаления неактивных транзакций)
Шаг 2. Запустите сжатие базы данных, переместив все страницы в начало файлов.
Шаг 3. Еще раз обрежьте журнал транзакций, так как на шаге 2 добавляются записи журнала.
Шаг 4. Снова запустите сжатие базы данных.
Мой урезанный код, использующий библиотеку SQL DMO, выглядит следующим образом:
SQLDatabase.TransactionLog.Truncate();
SQLDatabase.Shrink(5, SQLDMO.SQLDMO_SHRINK_TYPE.SQLDMOShrink_NoTruncate);
SQLDatabase.TransactionLog.Truncate();
SQLDatabase.Shrink(5, SQLDMO.SQLDMO_SHRINK_TYPE.SQLDMOShrink_Default);
Это может быть полезно, если кому-то нужно делать это программно.
ALTER DATABASE MyDatabase SET RECOVERY SIMPLE
GO
DBCC SHRINKFILE (MyDatabase_Log, 5)
GO
ALTER DATABASE MyDatabase SET RECOVERY FULL
GO
Работал у меня. Спасибо.
ВНИМАНИЕ: это означает, что вам не нужно то, что находится в файле LDF. Установка простого режима восстановления и сжатие файла журнала удаляет все журналы в нем безвозвратно.
как я могу использовать это как запланированное задание в планировщике Windows? также я хочу использовать это из приглашения sqlcmd? Я попытался поместить эту команду dbbccshrink в расширение файла .sql: REM Запустить файл SQL, чтобы сжать файл журнала mydb11 SQLCMD -S. \ SQLEXPRESS -i "mydb11", но что означает. \ sqlexpress?
Удалите данные, убедитесь, что модель восстановления проста, затем выполните сжатие (работает либо сжатие базы данных, либо сжатие файлов). Если файл данных по-прежнему слишком велик, И вы используете кучи для хранения данных, то есть без кластеризованного индекса для больших таблиц, тогда у вас может возникнуть проблема с удалением данных из кучи: http://support.microsoft.com/kb/913399
Вам следует использовать:
dbcc shrinkdatabase (MyDB)
Он сократит файл журнала (держите проводник Windows открытым и наблюдайте, как это происходит).
Естественно, это не коснется ваших данных, а только файла журнала.
«Поэтому разумно предположить, что теперь можно извлечь много места».
Приносим извинения, если я неправильно понял вопрос, но вы уверены, что это база данных, а не файлы журнала, которые занимают место? Проверьте, в какой модели восстановления находится база данных. Скорее всего, она полная, что означает, что файл журнала никогда не усекается. Если вам не нужна полная запись каждой транзакции, вы сможете перейти на Simple, что приведет к усечению журналов. Вы можете уменьшить базу данных во время процесса. Если все идет хорошо, процесс выглядит так:
Если это не сработает (или вы получите сообщение о том, что "файл журнала заполнен" при попытке переключить режимы восстановления), попробуйте следующее:
и т.п.
Я недавно это сделал. Я пытался сделать компактную версию своей базы данных для тестирования в дороге, но никак не мог заставить ее сжаться, сколько бы строк я ни удалил. В конце концов, после многих других команд в этом потоке я обнаружил, что мои кластерные индексы не восстанавливаются после удаления строк. Перестройка индексов позволила мне правильно сжаться.
Это старый вопрос, но я только что наткнулся на него.
Действительно короткий и правильный ответ уже дан и набрал наибольшее количество голосов. То есть как вы сокращаете журнал транзакций, и это, вероятно, проблема OP. А когда журнал транзакций вышел из-под контроля, его часто необходимо сжать обратно, но следует позаботиться о предотвращении в будущем ситуаций, когда журнал выходит из-под контроля. Этот вопрос о dba.se объясняет это. По сути - не позволяйте ему стать таким большим, прежде всего, из-за правильной модели восстановления, ведения журнала транзакций, управления транзакциями и т. д.
Но при чтении этого вопроса об уменьшении файла данных (или даже файла журнала) у меня возникает более серьезный вопрос: Зачем? и что плохого случается, когда вы пытаетесь?. Похоже, что операции сжатия были выполнены. В этом случае это имеет смысл в некотором смысле, потому что выпуски MSDE / Express ограничены максимальным размером БД. Но правильный ответ может заключаться в том, чтобы выбрать версию, подходящую для ваших нужд. И если вы наткнетесь на этот вопрос, пытаясь уменьшить свою производственную базу данных, и это не причина, почему, вы должны задать себе вопрос Зачем?.
Я не хочу, чтобы кто-то искал в Интернете «как уменьшить базу данных», натолкнувшись на это и подумав, что это круто или приемлемо.
Сжатие файлов данных - это особая задача, которую следует выполнять в особых случаях. Учтите, что при сжатии базы данных вы эффективно фрагментируете индексы. Учтите, что при сжатии базы данных вы забираете свободное пространство, в которое база данных может когда-нибудь вырасти, - эффективно тратя время и снижая производительность операции сжатия только для того, чтобы снова увидеть, как база данных снова вырастет.
Я писал об этой концепции в нескольких сообщениях блога об уменьшении размера баз данных. Сначала на ум приходит тот, который называется "Не трогай эту кнопку сжатия". Я говорю об этих концепциях, изложенных здесь, а также о концепции «правильного определения размера» вашей базы данных. Гораздо лучше решить, каким должен быть размер вашей базы данных, спланировать будущий рост и выделить его на эту сумму. Благодаря мгновенной инициализации файлов, доступной в SQL Server 2005 и последующих версиях для файлов данных, стоимость роста ниже, но я по-прежнему предпочитаю иметь правильное начальное приложение - и я гораздо меньше боюсь пробелов в базе данных, чем я сокращение в целом, не думая в первую очередь. :)
Я нашел эту ссылку (на французском плохо), которая может помочь людям понять, почему плохо сжимать файл данных, не делая этого должным образом или исключительно. mcherif.wordpress.com/2012/12/01/…
@ Майк Уолш - Спасибо. Я не знал о возможном снижении производительности. Если сокращение действительно неизбежно (из-за неправильного плана данных), есть ли способ дефрагментировать индексы - после завершения сжатия. Насколько я понимаю, MSSQL не имеет такой функциональности, но все же хочу подтвердить.
Я наткнулся на этот пост, хотя мне нужно было SHRINKFILE в версии MSSQL 2012, что немного сложнее с версий 2000 или 2005 года. Прочитав обо всех рисках и проблемах, связанных с этой проблемой, я закончил тестирование. Короче говоря, лучшие результаты я получил от использования Студия управления MS SQL Server.
Right-Click the DB -> TASKS -> SHRINK -> FILES -> select the LOG file
И снова он пытается уменьшить файл данных без файла журнала.
Не уверен, насколько это будет практично и зависит от размера базы данных, количества таблиц и других сложностей, но я:
Поздний ответ, но может быть полезен кому-то другому
Если ни DBCC ShrinkDatabase / ShrinkFile, ни SSMS (Tasks / Shrink / Database) не помогают, есть инструменты от Quest и ApexSQL, которые могут выполнить эту работу и даже запланировать периодическое сжатие, если оно вам нужно.
Некоторое время назад я использовал последний в бесплатной пробной версии, чтобы сделать это, следуя краткому описанию в конце этой статьи:
Все, что вам нужно сделать, это установить ApexSQL Backup, нажать кнопку «Сжать базу данных» на главной ленте, выбрать базу данных в появившемся окне и нажать «Готово».
Если для модели восстановления установлено значение «Простая» (и включено автоматическое сжатие), возможно, что SQL Server не сможет сжать журнал. Это связано с контрольными точками в журнале (или их отсутствием).
Так что сначала беги
DBCC CHECKDB
в вашей базе данных. После этого операция усадки должна работать как шарм.
Обычно я использую меню Задачи> Сжать> Файлы и выбираю файл журнала с возможностью реорганизации страниц.
Что ж, минимальный размер действительно сообщается, чтобы быть таким же, как текущий размер. Однако я не могу найти способа уменьшить это значение. DBCC Shrinkfile, похоже, не действует.