вторник, 13 апреля 2010 г.

Бережём место на сервере

Тестовые базы будет использоваться всегда и везде,  для того чтобы получить условия приближенные к "боевым" обычно тестовые базы разворачиваются на тех же серверах что и рабочие.
Если базы большие, а местa на сервере мало, то приходится очищать большие таблицы (в контексте баз 1С:Предприятия это могут быть):



  • Регистр сведений Версии объектов;
  • Регистр сведений Адресный классификатор;
  • Регистр сведений События календаря пользователя; 
  • Справочник Хранилище дополнительной информации;

Нижеизложенный скрипт  автоматизирует этот процесс

  1. Определяет таблицы регистров сведений или справочников больше 2 Гб, в базах данных в имени,  которых содержится %test% или %temp%.
  2. Очищает строки в найденных таблицах
  3. Переводит базы данных  (в имени,  которых содержится %test% или %temp%) в режим восстановления  Simple.
  4. Сжимает базу данных.
set nocount on
if exists(select name from tempdb..sysobjects where name='##tmp')
drop table ##tmp
create table ##tmp(Name varchar(50), reserved int)
GO
-- получаем большие таблицы и записываем их полные имена во временную
EXEC sp_msforeachdb '
Use ?;
IF  DB_Name() LIKE ''%test%'' OR DB_Name() LIKE ''%_temp%'' 
BEGIN
 INSERT INTO ##tmp
 SELECT 
  DB_Name()+''..''+sysobjects.Name Name,
  Sum(sys.dm_db_partition_stats.reserved_page_count) reserved
 From sysobjects 
 Left join 
  sys.dm_db_partition_stats 
   ON sysobjects.id = sys.dm_db_partition_stats.object_id
 Where 
  sysobjects.xtype=''U''
   AND (
    sysobjects.name LIKE ''_InfoReg%'' 
     OR sysobjects.Name LIKE ''_Reference%''
     )
 GROUP BY
  sysobjects.Name
 HAVING 
  Sum(sys.dm_db_partition_stats.reserved_page_count) > 200000 
 ORDER BY 
  reserved DESC
END'
-- Очищаем строки из у больших таблиц 
declare @tblname varchar(50)
declare tblname CURSOR for Select Name From ##tmp   
open tblname
Fetch next from tblname into @tblname
WHILE @@FETCH_STATUS = 0
BEGIN
 
 PRINT 'TRUNCATE TABLE '+@tblname
 EXECUTE('TRUNCATE TABLE '+@tblname)
 FETCH NEXT FROM tblname INTO @tblname
END
CLOSE tblname
deallocate tblname

-- Устанавливаем режим востановления Simple и сжимаем БД

EXEC sp_msforeachdb '
Use ?;
IF  DB_Name() LIKE ''%test%'' OR DB_Name() LIKE ''%_temp%'' 
BEGIN
PRINT ''SHRINK DB ?''
ALTER DATABASE ? SET RECOVERY SIMPLE
DBCC SHRINKDATABASE (?)
END'

drop table ##tmp
P.S Настраиваем под свои фантазии