пятница, 28 декабря 2012 г.

С Новым Годом !!!


Пусть Новый Год стучится к Вам,
И счастьем дом наполнится.
И всё, о чём мечтали Вы,
Пусть в этот год исполнится!

понедельник, 17 декабря 2012 г.

Бесплатные утилиты для Vmware, 2012 год. vOPS Server Explorer


Этот год был очень урожайным на бесплатные утилиты от вендоров для виртуальной инфраструктуры Vmware, в основном это были инструменты позволяющие отслеживать проблемы с машинами и инфраструктурой. Рассмотрим один из таких инструментов - vOPS Server Explorer, который состоит из 3-х компонентов:

Environment Explorer-  обзор статистики по всем аппаратным и виртуальным объектам в окружающей среде, считает виртуальные машины, которые страдают от неправильной конфигурации и плохой производительности. Вы подробную информацию о проблемах в виртуальной среде.
vScope Explorer - оценивает состояние здоровья виртуальной среды, и  выявляет виртуальные машины, узлы и хранилища данных, которые страдают от низкой производительности, и имеют проблемы с объемом.
SearchMyVM Explorer - обеспечивает быструю возможность поиска в виртуальной среде.


Как оценить уровень дедупликации до её применения? DDPEval.exe вам поможет !


      Если вы не хотите применять дедупликацию на диск, но необходимо оценить уровень экономии,  вам поможет утилита DDPEval.exe. Она автоматически устанавливается в \Windows \System32 \ как только вы инсталлируете компонент дедупликации. Работает она и на Windows 7, Windows Server 2008 R2 или Windows Server 2012. Результаты её работы можно посмотреть на картинке. 

image

среда, 5 декабря 2012 г.

Исключения антивируса для Active Directory

   Для сервера практически всегда необходим антивирус, и сервер контроллер домена Active Directory не является исключением, тут так же необходима защита. Дабы не было  проблем с функционированием службы нам необходимо добавить исключения на проверку. Из проверки процессов необходимо исключить:

%systemroot%\system32\ntfrs.exe
%systemroot%\system32\dfsr.exe
%systemroot%\system32\dfsrs.exe

На файловой системе исключить такие файлы и папки:

%windir%\SoftwareDistribution\Datastore\Logs\Res1.log
%windir%\SoftwareDistribution\Datastore\Logs\Res2.log
%windir%\SoftwareDistribution\Datastore\Logs\tmp.edb
%systemroot%\ntds\ntds.dit
%systemroot%\ntds\EDB*.log
%systemroot%\ntds\Edbres*.jrs
%systemroot%\ntds\EDB.chk
%systemroot%\ntds\TEMP.edb
%systemroot%\ntds\*.pat
%systemroot%\SYSVOL\domain\DO_NOT_REMOVE_NtFrs_PreInstall_Directory
%systemroot%\SYSVOL\staging
%systemroot%\SYSVOL\staging areas
%systemroot%\SYSVOL\sysvol

понедельник, 26 ноября 2012 г.

Новая возможность Windows Server 2012 DHCP Failover

       Windows Server 2012 предоставил нам новый механизм обеспечения высокой доступности для роли DHCP. Два DHCP-сервера могут быть настроены для обеспечение высокой доступности сервиса DHCP через отказоустойчивость (failover relationship) (по аналогии с отказоустойчивым кластером). Отказоустойчивость имеет несколько параметров, влияющих на поведение серверов DHCP в случае сбоя: режим отказоустойчивой работы, области (scopes), защищенные отказоустойчивой связью. Последние полностью совпадают друг с другом в случае настройки отказоустойчивости. Если отказоустойчивость настроена, то DHCP серверы реплицируют информацию об арендованных ip-адресах и дополнительную информацию о клиентах между собой, и, таким образом, всегда содержат актуальную информацию обо всех клиентах в сети. Если один из DHCP серверов становится по какой-то причине недоступен, то другие DHCP серверы будут содержать актуальную информацию о клиентах и смогут обслуживать их запросы.
Небольшое видео о процессе создания DHCP Failover Cluster:



понедельник, 5 ноября 2012 г.

Переключаемся между GUI и Core в windows server 2012

Для того чтоб быстро установить или удалить GUI в Windows server 2012 есть небольшой скрипт-меню, но Вам никто не запрещает использовать просто команды:

switch ($id) 
        { 
            "1" {Uninstall-WindowsFeature Server-Gui-Mgmt-Infra,Server-Gui-Shell} 
            "2" {Install-WindowsFeature Server-Gui-Mgmt-Infra,Server-Gui-Shell} 
            "3" { 
                    Import-Module Dism 
                    Enable-WindowsOptionalFeature -online -Featurename ServerCore-FullServer,Server-Gui-Shell,Server-Gui-Mgmt 
                } 
        }

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

Microsoft Lync update address book. Обновляем адресную книгу

Вызываем powershell Lync:

 Update-CsAddressBook

вторник, 23 октября 2012 г.

Nginx, ошибка accept() failed (24: Too many open files) в error.log


Nginx, ошибка accept() failed (24: Too many open files) в error.log

В конец файла /etc/security/limits.conf нужно добавить такие строки:

* soft nofile 16384
* hard nofile 16384

Выполняем под рутом:

ulimit -n 16384

В /etc/nginx/nginx.conf прописать новое значение worker_connections, равное 16384 поделить на значение worker_processes.

понедельник, 22 октября 2012 г.

четверг, 18 октября 2012 г.

Зачем нужен Hide from Exchange Address Lists ?

Всё очень просто, если у вас есть заблокированный пользователь или служебная учётная запись, с помощью этой галки можно скрыть его из адресных листов.

среда, 10 октября 2012 г.

У части пользователей не видно адресной книги в OWA

У части пользователей не видно адресной книги в Exchange OWA, был слегка смущен данной проблемой, и гугл сразу не помог.. Догадался - решение очень простое:

iisreset

И будет вам счастье...

понедельник, 1 октября 2012 г.

Microsoft Exchange 2013 Что нового ???


Microsoft Exchange 2013 Что нового ???

Начну со сроков - дата выхода примерно конец 2013

- Всё еще поддерживаеться AD - windows 2003
- GC - 2008 r2
- только Windows Server 2008 R2 И 2012
- Клиенты - только 2007 SP3
- Снова улучшения в хранении, теперь наверно хватит и IDE :)

Архитектура...Снова возвращаемся в 2003...

- back-end - Обслуживает Базы
- front-end - Это СAS + transport - есть антиспам
- edge - не понятно :(((

Почему ? - У нас супер железо, всё класс, нам не надо разносить...

Средства управления:

- powershell
- EMC - нам уже не нужен..
- Только EMS/EAC - только web

Общие папки - они есть !
Смерть MAPI протоколу... Только Https
Расширение транспортных правил !
offline OWA

вторник, 11 сентября 2012 г.

четверг, 6 сентября 2012 г.

Очень быстрая установка Zenoss 4.2 на Centos

Гениально... Вот бы всё так устанавливалось :)


# wget --no-check-certificate https://raw.github.com/zenoss/core-autodeploy/master/core-autodeploy-4.2.sh
# chmod +x core-autodeploy-4.2.sh
# ./core-autodeploy-4.2.sh

среда, 5 сентября 2012 г.

Болезни Forefront Protection for Exchange

   Очень часто после пропадания электричества на сервере Exchange служба транспорта Microsoft Exchange Transport не хочет запускаться с разными ошибками косвенно или прямо намекающие на Forefront Protection for Exchange.

Есть несколько способов вылечить:

1. Удалить файл configuration.xml и переименовать файл configuration.bak в configuration.xml
2. Пере установить Forefront Protection for Exchange.

Если у вас не получается быстро починить проблему стоит попробовать отключить Forefront protection с помощью утилиты - Fscutility.exe. Так же её можно использовать и для Sharepoint.


/status Use this option to display the status of Forefront Security and of the Exchange server or the SharePoint server.
/enable Use this option to enable Forefront Security if the Exchange server or the SharePoint server services have been stopped.
/disable Use this option to disable Forefront Security if the Exchange server or the SharePoint server services have been stopped.
/remove Use this option to remove Microsoft Forefront Security’s registry keys.
/regmon Use this option to register FSCMonitor.
/unregmon Use this option to unregister FSCMonitor.


Подробнее о ней можно почитать по ссылке. 

среда, 29 августа 2012 г.

Канал Vmware World 2012


Очень много новых видео:

www.youtube.com/vmworldtv

Проверить живность sccm 2007 с помощью скрипта

Так же в копилку опыта, есть скрипт который проверяет живность SCCM и оправляет результаты на почту:



To run the script and Email Warning AND Critical Messages:

(What we use every 7am in the morning)

powershell.exe directory\sccm_health.ps1 –reporttype “MorningReport”

To run the script and Email Critical Messages:

(What we use every hour at the top of every hour)

powershell.exe directory\sccm_health.ps1

To send all results regardless of report type:

Modify SCCM_Health.ps1 line 18 to be if (-not $debug) { $debug = 1 }

Alternatively you can run:

powershell.exe directory\sccm_health.ps1 –debug 1


Скачать и прочитать подробнее можно по ссылке.

понедельник, 20 августа 2012 г.

Быстро восстанавливаем контроллер домена через IFM

   Если вам необходимо быстро восстановить или установить новый контроллер домена вы можете воспользоваться такой фичей как Install From Media (IFM). Она позволяет во время установки брать данные из бэкапа. В сети очень мало информации по этому поводу, цитирую www.osp.ru:

FM — дополнительный режим мастера создания контроллера домена DCPROMO (хотя термины IFM и Install From Media не встречаются в мастере нигде). С помощью IFM администраторы могут ввести новый DC в домен, используя резервную копию состояния системы для загрузки необходимых разделов каталогов в базу данных DC вместо того, чтобы делать это по сети. Если база данных большая, таким образом можно сэкономить много времени по сравнению с традиционным созданием контроллера по сети. Дополнительные сведения об использовании IFM для создания контроллеров доменов можно найти в статье Microsoft «How to use the Install from Media feature to promote Windows 2003-based domain controllers» по адресуsupport.microsoft.com/kb/311078.

Так же есть видео на youtube:


понедельник, 13 августа 2012 г.

Если "ВНЕЗАПНО" нет места у Exchange - Circular logging

Если "ВНЕЗАПНО" закончилось место у Exchnage баз, спасти может или бэкап или включение Circular logging, как это делается через powershell:

get-StorageGroup -server ** | Set-StorageGroup -CircularLoggingEnabled $true

После этой операции необходимо перемонтировать базу или базы.

понедельник, 6 августа 2012 г.

Новые возможности в powershell 3.0


 Итак, что же нового:

1. Обновлённый ISE. Уже не тот! Очень много всяких фишек для удобства работы, в основном позаимствованы из Visual Studio
2. ISE понимает так же HTML
3. Более 2-х тысяч командлетов.
4. Быстродействие. Существенное увеличение скорости выполнения.
5. Использование Workflow
6. Делегированная работа под сервисной учётной записью.



Так же вы можете посмотреть видео и презентацию на сайте.

Active Directory Replication Status Tool

Подсмотрел на Хабре отличную утилиту по просмотру репликации АД - Active Directory Replication Status Tool. Очень приятный GUI интерфейс, рекомендую:

Больше об этой утилите можно почитать тут.

PS. На Windows 2003 так же работает. Проверенно !

вторник, 31 июля 2012 г.

Клонирование диска с помощью DD

Если нам необходимо быстро сделать бэкап диска используем команду dd:


Полное копирование диска:

dd if=/dev/hdx of=/dev/hdy
dd if=/dev/hdx of=/path/to/image

Восстановление: 

dd if=/path/to/image of=/dev/hdx

Так же для экономии места можно использовать сжатие:

dd if=/dev/hdx | gzip > /path/to/image.gz

среда, 11 июля 2012 г.

windows server 2012 реальный опыт дедупликации

Дошли руки попробовать дедупликацию на windows server 2012 RC, очень даже ничего:

Имеем - файлы пользователей  - 57 гигабайт, после дедупликации - 40 гиг. Вот статистика:





Так же напоминаю что дедупликация не работает на системном томе. Как я это всё запускал:

Enable-DedupVolume -Volume E:

Start-DedupJob E: -Type Optimization

Get-DedupJob

Get-DedupStatus

New-DedupSchedule –Name OffHoursScrub –Type Scrubbing –Start 20:00 –DurationHours 6 –Days Mon,Tues,Wed,Thurs,Fri –Priority Normal

Set-DedupVolume -Volume e: -MinimumFileAgeDays 5  - эта команда регулирует каково возраста файлы будут дедуплицироваться. 

понедельник, 9 июля 2012 г.

Подготовка к экзаменам 70-246 и 70-247

Продолжаю делиться презентациями с TechEd 2012 с сессий examcram. На этот раз у нас два экзамена:


Monitoring and Operating a Private Cloud with System Center 2012

Configuring and Deploying a Private Cloud with System Center 2012


Напоминаю что это всё даёт:







По ссылке можно скачать презентации:

http://depositfiles.com/files/ioetu2918

вторник, 3 июля 2012 г.

пятница, 22 июня 2012 г.

Ускоряем Exchange owa 2007/2010

Есть небольшой трикс по увеличению скорости Exchange Owa, для этого необходимо включить сжатие. Для начала проверим какой уровень стоит:

Get-OwaVirtualDirectory -Identity "owa (default web site)" | fl

Смотрим GzipLevel 

Выставляем GzipLevel  High:

Set-OwaVirtualDirectory -identity "owa (Default Web Site)" -GzipLevel High

воскресенье, 17 июня 2012 г.

Борьба со спамом средствами Exchange..

Для борьбы со спамом написал небольшой скрипт по добавлению ip block list провайдеров:


Add-IPBlockListProvider -Name "zen.spamhaus.org" -LookupDomain "zen.spamhaus.org" -RejectionResponse "SPAM"
Add-IPBlockListProvider -Name "bl.spamcop.net" -LookupDomain "bl.spamcop.net" -RejectionResponse "SPAM"
Add-IPBlockListProvider -Name "psbl.surriel.com" -LookupDomain "psbl.surriel.com" -RejectionResponse "SPAM"
Add-IPBlockListProvider -Name "combined.njabl.org" -LookupDomain "dnsbl.sorbs.net" -RejectionResponse "SPAM"

По заверениям некоторых уважаемых людей - фильтруется 90% спама.

понедельник, 11 июня 2012 г.

Необходимо быстро понять проблему с Exchange ?

Необходимо быстро понять проблему с Exchange ? Есть вот такой вот хороший скрипт:

http://exchangeserverpro.com/wp-content/plugins/download-monitor/download.php?id=Test-MailboxServer.zip


Собственно его вывод:

[0PS] C:\SCRIPTS>.\Test-MailboxServer.ps1
------ Checking MAIL
Ping test: Pass
Uptime (hrs): 40
Роль сервера почтовых ящиков services: Pass
Роль сервера клиентского доступа services: Pass
Роль транспортного сервера-концентратора services: Pass
Mailbox databases mounted: Pass
MAPI connectivity: Pass
Mail flow test: Удачное завершение
Database copy status: Pass
Database copy/replay queue (total): 0
Database content index state: Pass


вторник, 5 июня 2012 г.

Veeam Backup & Replication 6.1 : Free vs. Full

Вот и вышли бесплатные инструменты для бэкапа Hyper-V и ESX. Теперь можно забыть про Ghetto VCB и прочие инструменты..

Про отличия Veeam Backup & Replication 6.1 : Free vs. Full :


http://www.veeam.com/veeam_backup_and_replication-free_vs_full_ds.pdf

http://www.veeam.com/veeam_one_free_6_0_en_ds.pdf


понедельник, 21 мая 2012 г.

Интересные презентации с мероприятия

Добрый день,

пара интересных презентаций:


CleanAir: концепция защищенных беспроводных сетей


Инновационные технологии: Оптимизация спектра с помощью CleanAir

http://depositfiles.com/files/jkvjvvz9l


понедельник, 7 мая 2012 г.

lsscsi

Сегодня подкинули интересную команду, о которой я не знал:

lsscsi

Позволяет посмотреть все SCSI устройства в системе. Больше информации:

понедельник, 9 апреля 2012 г.

Lync 2010 Monitoring server reports

Долго я искал где же мои репорты после установки сервера мониторинга Lync 2010, так и не нашел. Даже в google залез.. А всё оказалось банально:

 Если не появляются репорты - проверьте всё ли вы установили!

среда, 4 апреля 2012 г.

system center 2012

Свершилось !

Уже доступны продукты system center 2012:

Обратите внимание на группировку по группам ! 

понедельник, 12 марта 2012 г.

Vmware Workstation + android-x86

Решил попробывать поставить андройда 4.0 на Vmware Workstation. Как не странно всё завелось с пол пинка.. Только вот одна надпись насторожила:

И тут FreeBSD ? :))

Использовал android отсюда: http://www.android-x86.org/download

Vmware Workstation - 8.0.0 build-471780



понедельник, 5 марта 2012 г.

Company_Phone_Number_Normalization_Rules.txt

Очень часто я наблюдаю проблемы с генерацией книги на серверах OCS или Lync, причина этому - не правильно забитые телефоны в АД. Отследить чтоб все телефоны были в правильном формате в большой организации - практически нереально. По этому используем чудо файл Company_Phone_Number_Normalization_Rules.txt, в который можно прописать универсальные правила:


#Universal any digits strip
#------------------------------
[\s()\-\./\+\[\]]*(\d+)?([\s()\-\./\[\]]+(\d+))?([\s()\-\./\[\]]+(\d+))?([\s()\-\./\[\]]+(\d+))?([\s()\-\./\[\]]+(\d+))?([\s()\-\./\[\]]+(\d+))?([\s()\-\./\[\]]+(\d+))?([\s()\-\./\[\]]+(\d+))?([\s()\-\./\[\]]+(\d+))?([\s()\-\./\[\]]+(\d+))?([\s()\-\./\[\]]+(\d+))?[\s]*
$1$3$5$7$9$11$13$15$17$19$21


После этого запустите процесс генерации книги.

среда, 29 февраля 2012 г.

Обновить быстро все сервера ? Спроси меня как ! :)

Долго я искал как быстро обновить 100 серверов, делать это вручную - день в пустую...

И вот наконец найдено средство моей мечты..

http://learn-powershell.net/2011/05/20/patch-installation-using-powershell-vbscript-and-psexec/

После обновления получаем вот такую вот картинку:

image

воскресенье, 5 февраля 2012 г.

Backup конфигурации ESX


BACKUP:


Connect-VIServer vcenter -User administrator -Password password
Get-VMHost  | get-VMHostFirmware -BackupConfiguration -DestinationPath d:\esxibackup




RESTORE:


$esxi = get-vmhost esxi01
Set-VMHost $ESXi.Name -State 'maintenance'
Set-VMHostFirmware -vmhost $ESXi -Restore -SourcePath “D:\temp\esxibackup\” -HostUser root –HostPassword password

Так же можно использовать GUI:

http://www.shogan.co.uk/?p=1095

воскресенье, 29 января 2012 г.

Проверка бэкапа SQL Server с помощью скрипта.


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

Для этого умельцами был написан замечательный скрипт:

SELECT DB.name AS DatabaseName
      ,MAX(DB.recovery_model_desc) AS RecModel
      ,MAX(BS.backup_start_date) AS LastBackup
      ,MAX(CASE WHEN BS.type = 'D'
                THEN BS.backup_start_date END)
       AS LastFull
      ,SUM(CASE WHEN BS.type = 'D'
                THEN 1 END)
       AS CountFull
      ,MAX(CASE WHEN BS.type = 'L'
                THEN BS.backup_start_date END)
       AS LastLog
      ,SUM(CASE WHEN BS.type = 'L'
                THEN 1 END)
       AS CountLog
      ,MAX(CASE WHEN BS.type = 'I'
                THEN BS.backup_start_date END)
       AS LastDiff
      ,SUM(CASE WHEN BS.type = 'I'
                THEN 1 END)
       AS CountDiff
      ,MAX(CASE WHEN BS.type = 'F'
                THEN BS.backup_start_date END)
       AS LastFile
      ,SUM(CASE WHEN BS.type = 'F'
                THEN 1 END)
       AS CountFile
      ,MAX(CASE WHEN BS.type = 'G'
                THEN BS.backup_start_date END)
       AS LastFileDiff
      ,SUM(CASE WHEN BS.type = 'G'
                THEN 1 END)
       AS CountFileDiff
      ,MAX(CASE WHEN BS.type = 'P'
                THEN BS.backup_start_date END)
       AS LastPart
      ,SUM(CASE WHEN BS.type = 'P'
                THEN 1 END)
       AS CountPart
      ,MAX(CASE WHEN BS.type = 'Q'
                THEN BS.backup_start_date END)
       AS LastPartDiff
      ,SUM(CASE WHEN BS.type = 'Q'
                THEN 1 END)
       AS CountPartDiff
FROM sys.databases AS DB
     LEFT JOIN
     msdb.dbo.backupset AS BS
         ON BS.database_name = DB.name
WHERE ISNULL(BS.is_damaged, 0) = 0 -- exclude damaged backups          
GROUP BY DB.name
ORDER BY DB.name;



Его вывод:


понедельник, 23 января 2012 г.

Утилита для добавления драйверов в Vmware ESX

Доброго всем дня, решил поделиться утилиткой для интеграции драйверов в Vmware ESX.


Текущая версия поддерживает и Vmware vSphere 5.0.


для всех кто хочет пожертвовать на благо - ссылка.

понедельник, 16 января 2012 г.

И снова про скрипты.

Доброго времени суток, коллеги!

На сей раз я решил с вами поделиться скриптами для оптимизации баз SCOM:

http://filecaster.ru/files/FaEZsftmIqcY/LocalizedTextCleanup_zip

Подробнее можно прочитать по ссылке:
http://scug.be/blogs/scom/archive/2009/09/14/cleaning-the-localizedtext-table-after-scom-upgrade-to-scom-2007-r2.aspx

Так же после очистки необходимо запустить Reindex:

USE OperationsManager
go
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
SET ARITHABORT ON
SET CONCAT_NULL_YIELDS_NULL ON
SET QUOTED_IDENTIFIER ON
SET NUMERIC_ROUNDABORT OFF
EXEC SP_MSForEachTable "Print 'Reindexing '+'?' DBCC DBREINDEX ('?')"

четверг, 5 января 2012 г.

Оптимизация базы VC

Часто сталкиваешься с проблемой что база данных VC постоянно растёт.. Как с этим бороться ?
Первое что необходимо сделать если вы не делаете бэкап transaction log - переставить базу в режим SIMPLE.


Так же для очистки базы существует очень хороший скрипт:


/*
VCDB_table_cleanup_MSSQL_V4.X.sql,v 4.0 2010/08/12

This script will delete data from designated tables in the VirtualCenter DB
for vc4.x versions.

You are strongly advised to shut down the VirtualCenter server and make
a complete backup of your database before running this script.

VirtualCenter Server must be stopped while this script is running.

Please see USER CONFIGURABLE PARAMETERS section below for options.

In particular, you must set @DELETE_DATA = 1 in order to actually delete rows;
this is a safety precaution.

Directions: open this file with one of the following and execute:
SQL Query Analyzer (SQL Server 2000) or
SQL Server Management Studio (SQL Server 2005)
SQL Server Management Studio (SQL Server 2008)

Connect using the same DB login that VirtualCenter uses.

The transaction log may fill up during this procedure if sufficient space
is not available.  Monitor the transaction log size and usage with this command:

dbcc sqlperf (logspace)

*/


IF OBJECT_ID('tempdb..#CLEANUP_VCDB') IS NOT NULL
DROP TABLE #CLEANUP_VCDB
GO

SET NOCOUNT ON

DECLARE @VCUSER NVARCHAR(60)
DECLARE @VCUSERID INT
DECLARE @BATCH_SIZE INT
DECLARE @CUTOFF_DATE SMALLDATETIME
DECLARE @CUTOFF_DATE_S NVARCHAR(60)
DECLARE @DELETE_DATA BIT
DECLARE @CNT INT
DECLARE @TOT INT
DECLARE @SQL NVARCHAR(900)
DECLARE @FROM_VAL NVARCHAR(60)
DECLARE @WHERE_VAL NVARCHAR(900)


-- ######### USER CONFIGURABLE PARAMETERS ########################
-- 0 = COUNT ONLY; 1 = DELETE ROWS
SET @DELETE_DATA = 1

-- Use one of these methods to specifiy the data cutoff date
SET @CUTOFF_DATE = GETUTCDATE()-180
--SET @CUTOFF_DATE = '2007/01/01'

-- Number of rows to delete per transaction
SET @BATCH_SIZE = 10000

-- ######### END USER CONFIGURABLE PARAMETERS ####################

-- PERFORM SOME ERROR CHECKING TO ENSURE DB ACCESS
SELECT @VCUSERID = UID FROM SYSOBJECTS
WHERE NAME = 'VPX_VERSION'

IF @@ROWCOUNT < 1
BEGIN
PRINT 'The ' + DB_NAME() + ' database does not appear to contain VirtualCenter tables.'
PRINT 'Please ensure you are connected to the correct database.'
RETURN -- stop execution of this script
END

SELECT @VCUSER = NAME FROM SYSUSERS
WHERE UID = @VCUSERID

PRINT 'VirtualCenter database user: ' + @VCUSER
PRINT 'Logged in user: ' + CURRENT_USER

IF (@VCUSER <> CURRENT_USER) AND (@VCUSER <> 'dbo')
BEGIN
PRINT '***************************************************************'
PRINT 'You do not appear to be logged in as the VirtualCenter DB user.'
PRINT 'Please log in as ''' + @VCUSER + ''' to execute this SQL script.'
PRINT '***************************************************************'
RETURN
END

-- DONE WITH ERROR CHECKING

-- CONVERT THIS DATE TO A STRING WITH QUOTES FOR EFFICIENCY LATER
SET @CUTOFF_DATE_S = '''' + CONVERT(NVARCHAR, @CUTOFF_DATE, 111) + ''''
PRINT 'Cutoff date: ' + @CUTOFF_DATE_S

PRINT 'Batch size: ' + CONVERT(NVARCHAR, @BATCH_SIZE)

PRINT CONVERT(NVARCHAR, getdate(), 120) + ' starting...'

CREATE TABLE #CLEANUP_VCDB (VPXTABLE NVARCHAR(40), CRITERIA NVARCHAR(250), INITIAL_CNT INT, DELETE_CNT INT)

IF ((SELECT VER_ID FROM VPX_VERSION)< 4)
BEGIN
INSERT #CLEANUP_VCDB VALUES ('VPX_HIST_STAT', 'SAMPLE_ID IN (SELECT ID FROM VPX_SAMPLE WHERE SAMPLE_TIME < ' + @CUTOFF_DATE_S + ')', 0, 0 )
INSERT #CLEANUP_VCDB VALUES ('VPX_SAMPLE', 'SAMPLE_TIME < ' + @CUTOFF_DATE_S, 0, 0 )
END
ELSE
BEGIN
INSERT #CLEANUP_VCDB VALUES ('VPX_HIST_STAT1', 'TIME_ID IN (SELECT TIME_ID FROM VPX_SAMPLE_TIME1 WHERE SAMPLE_TIME < ' + @CUTOFF_DATE_S + ')', 0, 0 )
INSERT #CLEANUP_VCDB VALUES ('VPX_SAMPLE_TIME1', 'SAMPLE_TIME < ' + @CUTOFF_DATE_S, 0, 0 )
INSERT #CLEANUP_VCDB VALUES ('VPX_HIST_STAT2', 'TIME_ID IN (SELECT TIME_ID FROM VPX_SAMPLE_TIME2 WHERE SAMPLE_TIME < ' + @CUTOFF_DATE_S + ')', 0, 0 )
INSERT #CLEANUP_VCDB VALUES ('VPX_SAMPLE_TIME2', 'SAMPLE_TIME < ' + @CUTOFF_DATE_S, 0, 0 )
INSERT #CLEANUP_VCDB VALUES ('VPX_HIST_STAT3', 'TIME_ID IN (SELECT TIME_ID FROM VPX_SAMPLE_TIME3 WHERE SAMPLE_TIME < ' + @CUTOFF_DATE_S + ')', 0, 0 )
INSERT #CLEANUP_VCDB VALUES ('VPX_SAMPLE_TIME3', 'SAMPLE_TIME < ' + @CUTOFF_DATE_S, 0, 0 )
INSERT #CLEANUP_VCDB VALUES ('VPX_HIST_STAT4', 'TIME_ID IN (SELECT TIME_ID FROM VPX_SAMPLE_TIME4 WHERE SAMPLE_TIME < ' + @CUTOFF_DATE_S + ')', 0, 0 )
INSERT #CLEANUP_VCDB VALUES ('VPX_SAMPLE_TIME4', 'SAMPLE_TIME < ' + @CUTOFF_DATE_S, 0, 0 )
END

DECLARE curse CURSOR FOR
SELECT VPXTABLE, CRITERIA FROM #CLEANUP_VCDB

OPEN curse
FETCH NEXT FROM curse INTO @FROM_VAL, @WHERE_VAL

WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @SQL = 'SELECT @CNT= COUNT(1) FROM ' + @FROM_VAL + ' WHERE ' + @WHERE_VAL
-- this is required to get result into a variable
EXEC sp_executesql @SQL, N'@CNT INT OUTPUT', @CNT = @CNT OUTPUT

SET @SQL = 'UPDATE #CLEANUP_VCDB SET INITIAL_CNT = ' + CONVERT(NVARCHAR, @CNT) + ' WHERE CURRENT OF curse '
EXEC(@SQL)

IF (@CNT = 0)
BEGIN
PRINT CONVERT(NVARCHAR, getdate(), 120) + ' ' + @FROM_VAL + ': no matching rows to delete.'
FETCH NEXT FROM curse INTO @FROM_VAL, @WHERE_VAL
CONTINUE
END

PRINT CONVERT(NVARCHAR, getdate(), 120) + ' ' + @FROM_VAL + ': will attempt to delete ' + CONVERT(NVARCHAR, @CNT) + ' rows.'

IF @DELETE_DATA = 1
BEGIN
SET @CNT = 0
SET @TOT = 0

SET ROWCOUNT @BATCH_SIZE

WHILE 1=1
BEGIN
BEGIN TRAN
SET @SQL = 'DELETE FROM ' + @FROM_VAL + ' WHERE ' + @WHERE_VAL
EXEC(@SQL)

SET @CNT = @@ROWCOUNT
SET @TOT = @TOT + @CNT

COMMIT TRAN

IF @CNT < @BATCH_SIZE BREAK
PRINT CONVERT(NVARCHAR, getdate(), 120) + ' completed ' + CONVERT(nvarchar, @TOT) + ' rows...'
END --ROW BATCH LOOP

SET ROWCOUNT 0
PRINT CONVERT(NVARCHAR, getdate(), 120) + ' ' + @FROM_VAL + ': deleted ' + CONVERT(nvarchar, @TOT) + ' total rows.'

SET @SQL = 'UPDATE #CLEANUP_VCDB SET DELETE_CNT = ' + CONVERT(NVARCHAR, @TOT) + ' WHERE CURRENT OF curse '
EXEC(@SQL)

END -- DELETE DATA SECTION
ELSE
BEGIN
PRINT CONVERT(NVARCHAR, getdate(), 120) + ' This is a test run, no data was deleted.'
END

FETCH NEXT FROM curse INTO @FROM_VAL, @WHERE_VAL
END -- END CURSOR LOOP

CLOSE curse
DEALLOCATE curse

IF @DELETE_DATA = 1
BEGIN
PRINT ' '
PRINT '****************** SUMMARY *******************'

DECLARE curse CURSOR FOR
SELECT VPXTABLE, INITIAL_CNT, DELETE_CNT FROM #CLEANUP_VCDB

DECLARE @INITIAL_VAL INT, @DELETE_VAL INT

OPEN curse
FETCH NEXT FROM curse INTO @FROM_VAL, @INITIAL_VAL, @DELETE_VAL

WHILE (@@FETCH_STATUS = 0)
BEGIN
IF (@INITIAL_VAL <> @DELETE_VAL)
BEGIN
PRINT 'Potential problem: attempted to delete ' + CONVERT(NVARCHAR, @INITIAL_VAL)
+ ' rows, but only ' + CONVERT(NVARCHAR, @DELETE_VAL) + ' deleted.'
END
ELSE
BEGIN
PRINT 'Deleted ' + CONVERT(NVARCHAR, @DELETE_VAL)
+ ' rows from ' + CONVERT(NVARCHAR, @FROM_VAL) + ' table.'
END

FETCH NEXT FROM curse INTO @FROM_VAL, @INITIAL_VAL, @DELETE_VAL
END

CLOSE curse
DEALLOCATE curse

END --DELETE DATA CHECK

DROP TABLE #CLEANUP_VCDB