Освободить файл от данных можно с помощью команды DBCC SHRINKFILE (file_name, EMPTYFILE). Аргумент EMPTYFILE предписывает распределить все данные из файла между другими файлами группы. Добавление новых данных в файл не разрешается.
О ADD FILEGROUP f i legroup_name. Используется для создания в базе данных группы файлов с указанным именем. Как видно из синтаксиса, при создании группы не указывается, какие файлы должны в нее войти. Перенос существующих файлов в новую группу выполняется отдельно. В базе данных может быть создано до 256 групп файлов. Напомним, что группы файлов создаются только для файлов данных. Файлы журнала транзакций не могут быть организованы в группы.
О REMOVE FILEGROUP filegroup_name. Используется для удаления из базы данных указанной группы файлов. При этом также будут удалены все файлы, включенные в эту группу. Однако перед выполнением этой операции необходимо предварительно удалить из файлов все данные.
О MODIFY FILE <fi lespec>. Используется для изменения параметров файла базы данных, таких как логическое имя (NAME), первоначальный размер (SIZE), максимальный размер (MAXSIZE) и шаг приращения (FILEGROWTH). За один вызов команды ALTER DATABASE может быть изменен только один параметр одного из файлов. Хотя для описания файла и используется конструкция <fi!espec>, ее синтаксис несколько иной, чем при создании базы данных. Отличительной особенностью является наличие аргумента NEWNAME, с помощью которого можно изменить логической имя файла. В остальном же синтаксис и использование конструкции аналогичны рассмотренным ранее.
<filespec> ::=
( NAME = logical_file_narne
[ . NEWNAME = new_log1cal_name ]
[ , FILENAME = "os_file_name" ]
[ . SIZE = size ]
[ . MAXSIZE = { max_s1ze | UNLIMITED } ]
[ . FILEGROWTH = growthjncrement ] )
О MODIFY NAME = new_dbname. Как нетрудно догадаться, этот аргумент позволяет изменять имя базы данных. Для этого достаточно всего-навсего указать новое имя с помощью параметра new_dbname.
О MODIFY FILEGROUP fi1egroup_name NAME = new_fi1egroup_name. Помимо изменения имени базы данных также можно переименовать и отдельную группу файлов. Это и делается с помощью рассматриваемого аргумента. Все, что нужно для изменения имени группы, — указать текущее имя с помощью параметра f i I egroup_name и новое имя— с помощью параметра new_fiIegroup_name.
О MODIFY FILEGROUP fi1egroup_name filegroup_property. Этот аргумент позволяет управлять свойствами группы файлов. Имя группы файлов, свой- • ства которой предполагается изменить, задается параметром f i I egroup_name, тогда как параметр f i I egroup_property предназначен для указания свойства, которое должно быть назначено для группы файлов. Поддерживаются следующие значения параметра f ilegroup_property.
* READONLY. При указании этого значения группа файлов переводится в режим «только для чтения». В этом режиме запрещается выполнение любых модификаций данных в файлах, принадлежащих соответствующей группе. Переключение группы файлов в режим «только для чтения» могут выполнять только пользователи, имеющие монопольный доступ к базе данных. Нельзя устанавливать в режим «только для чтения» первичную группу файлов, так как в этом случае системные таблицы будут заблокированы и выполнение любых изменений в базе данных (в том числе и отмена для группы файлов режима «только для чтения») станет невозможным.
* READWRITE. Действие этого значения обратно предыдущему. Используется для разрешения изменений в группе файлов, установленной в режим «только для чтения». Работа с этим значением, как и с предыдущим, разрешена только пользователям, имеющим монопольный доступ к базе данных.
* DEFAULT. Используется для маркировки указанной группы файлов как группы файлов по умолчанию (default filegroup). В эту группу файлов будут включаться все файлы данных, которые явно не включены ни в какую другую группу файлов. Более того, все объекты (индексы, таблицы и их столбцы), для которых явно не указано, в какой группе файлов они должны располагаться, будут размещены в группе файлов по умолчанию. Группа файлов, которая до этого была группой файлов по умолчанию, становится обычной группой.
О WITH <termination>. Вполне возможна ситуация, когда попытка изменения базы данных происходит при выполнении какой-либо транзакции. Как уже говорилось, эти две операции несовместимы и одна из них должна быть отложена до окончания другой. То есть администратор должен либо подождать завершения всех активных транзакций, либо принудительно прервать их выполнение. В первом случае администратор может довольно долго ждать завершения всех транзакций. Более того, ничто не помешает пользователям начинать новые транзакции. В предыдущих версиях, в том числе и в SQL Server 7.0, это было единственным решением. К счастью, в SQL Server 2000 появилась возможность принудительного прерывания всех пользовательских транзакций. Именно для этого и используется аргумент WITH <ternnnation>, который определяет метод прерывания транзакций. Синтаксис конструкции <termination> следующий:
< termination > ::= ROLLBACK AFTER integer [ SECONDS ] | ROLLBACK IMMEDIATE | NO WAIT
» ROLLBACK AFTER num_second [SECONDS] — в этом случае сервер будет ожидать указанное количество секунд, прежде чем прервет все активные и обслуживание баз данных транзакции. Предварительно можно отправить пользователям сообщение по сети, что через столько-то секунд все транзакции будут принудительно откачены. За это время пользователи должны либо зафиксировать, либо откатить свои транзакции. * ROLLBACK IMMEDIATE — в этом случае откат пользовательских транзакций
выполняется немедленно без каких-либо пауз.
» NO WAIT— как и в предыдущем случае, откат происходит сразу же. О COLLATE < conation_name >. С помощью этого аргумента указывается сопоставление по умолчанию для всех объектов, создаваемых в базе данных. Изменение сопоставления по умолчанию не влияет на сопоставления, используемыми уже созданными объектами базы данных. Разрешается указываться как сопоставления Windows, так и сопоставления SQL Server. Определяет сопоставление для базы данных. По умолчанию задается сопоставление SQL Server.
О SET <optionspec> [ , . . . n ]. С помощью аргумента SET пользователь может управлять различными свойствами базы данных. Свойства указываются с помощью конструкции <optionspec>, которая имеет довольно объемную структуру. Более подробно управление свойствами базы данных будет рассмотрено далее в этой главе в разделе «Управление свойствами базы данных».
В предыдущих версиях SQL Server, включая и SQL Server 7.0, не поддерживалась
возможность изменения свойств базы данных с помощью команды ALTER DATABASE.
В одном из предыдущих разделов этой главы было рассказано о возможности SQL Server 2000 автоматически увеличивать размер баз данных. Однако нередко требуется выполнить и обратный процесс — уменьшение размера базы данных. Действительно, если из базы данных удаляется значительная часть данных или после нескольких дней напряженной работы пользователи существенно снижают нагрузку на сервер и в журнале транзакций образуется много свободного пространства, часто возникает необходимость вернуть неиспользуемое дисковое пространство в операционную систему. Как и увеличение базы данных, процесс уменьшения размера базы данных, называемый также сжатием базы данных (shrinking database), представляет собой уменьшение размера отдельных файлов, из которых состоит база данных.
Операции сжатия базы данных по возможности должны выполняться в период наименьшей активности пользователей, чтобы доставлять им как можно меньше неудобств.
Как и увеличение, сжатие базы данных может выполняться автоматически. Однако при автоматическом сжатии нет возможности контролировать размер, на который необходимо уменьшить размер файлов базы данных. Сервер пытается освободить как можно большую, но не всю свободную часть базы данных. То есть в некоторых случаях сервер может оставить в файле лишнее свободное пространство, тогда как в других свести его к минимуму. Такое неконтролируемое сведение к минимуму свободного пространства очень скоро приводит к необходимости нового увеличения размера файла. Конечно, разумнее было бы оставить в файле какой-то процент свободного пространства, но, к сожалению, сервер этого не делает.
Автоматическое уменьшение размера базы данных происходит в том случае, когда сервер обнаруживает в базе данных слишком много неиспользуемого пространства.
Несмотря на некоторые недостатки автоматического уменьшения размера базы данных, нельзя не отметить и неоспоримое преимущество — администратор освобождается от необходимости следить за размером базы данных, а также за объемом используемого и свободного пространства, переложив эту обязанность на сервер.
Для разрешения или запрещения автоматического уменьшения базы данных используется хранимая процедура sp_dboption:
sp_dboption "database_name", "autoshrink". ("true" | "false")
С помощью первого аргумента указывается имя базы данных, свойства которой предполагается изменять. Второй аргумент должен оставаться таким, как он приведен выше. Указывая значение "true" или " f al se", можно соответственно разрешать и запрещать автоматическое уменьшение файлов базы данных.
Автоматическое уменьшение размера базы данных можно разрешить и с помощью команды ALTER DATABASE, воспользовавшись аргументом SET. Более подробно управление свойствами базы данных будет рассмотрено в следующем разделе.
Помимо автоматического можно также выполнять ручное уменьшение размера базы данных. Это делается с помощью команды контроля согласованности (или целостности) базы данных (database consistency check, DBCC):
DBCC SHRINKDATABASE
( databasejname [ , target_percent ]
[ , { NOTRUNCATE | TRUNCATEONLY } ]
)
Рассмотрим назначение аргументов.
О database_name. Имя базы данных, которую необходимо сжать.
О target_percent. Количество процентов свободного пространства, которое желательно оставить в базе данных после выполнения ее сжатия. Говоря точнее, с помощью рассматриваемого аргумента указывается процент от общего объема файлов базы данных, который должен быть незаполненным. Например, если в файле размером 10 Мбайт имеется 4 Мбайта свободного пространства, то для уменьшения количества неиспользуемого пространства до 2 Мбайт необходимо указать значение аргумента target_percent равным 25. Сначала сервер вычисляет объем свободного и занятого пространства (соответственно 4 и 6 Мбайт). Чтобы получить искомые 25 процентов, соотношение свободного и занятого пространства должно быть 3 к 1. Путем нехитрых вычислений сервер приходит к выводу, что нужный результат будет получен при размере файла, равном 8 Мбайт. После этого сервер переносит все данные из последних 2 Мбайт файла в первые 8 Мбайт, помещая их в любое незанятое место на странице. После того как все данные будут перенесены, выполняется уменьшение размера файла. Заметим, что в аргументе target_percent нельзя указывать размер, превышающий текущий процент свободного пространства. В противном случае уменьшение размера файла выполнено не будет. Таким образом, выполняя команду DBCC SHRINKDATABASE