Предположим, Вы собрали свой первый OLAP-куб (можно поздравить!) или первый релиз очередного куба на платформе SQL Server Analysis Services (SSAS). Теперь перед Вами стоит задача - разработать процесс автоматического обновления куба на регулярной основе. В то же время активная фаза развития куба (добавление новых измерений, реорганизация иерархий по просьбам пользователей, и т.п.) не завершена, а посему требуется полное обновление (Full Processing) куба. Предлагаю рассмотреть простой и проверенный способ, суть которого заключается в том, что MOLAP-куб процессится на отдельном сервере (или инстансе SSAS), а далее готовые файлы перемещаются на боевую площадку.
Открываем SQL Server Integration Services (SSIS) и создаем новый (или впрягаем уже существующий у Вас) интеграционный проект. Используя компоненту "Analysis Services Processing Task", сначала настраиваем задачу процессинга измерений, затем - процессинга размерных групп, причем в случае большого куба можно разнести на отдельные шаги процессинг не только разных размерных групп, но и процессинг данных и процессинг индексов, агрегатов.
Для больших кубов также рекомендуется использовать 64-х разрядную версию SQL Server Enterprise Edition, чтобы задействовать всю мощь параллельного режима процессинга:
На следующем шаге после обновления кубов возможно потребуется добавить учетные записи для доступа пользователей к кубу. Для этого воспользуемся компонентой "Script Task", в которой разместим нижеприведенный программный код (код приведен схематично, только для понимания подхода). Смысл кода заключается в том, что из реляционной таблицы, известной по одной из предыдущих статей, извлекаются данные об активных пользователях и их доменные учетные записи добавляются в единственную роль многомерной базы. Обратите внимание, строки параметров подключения к OLAP и реляционной базе данных прописаны в глобальных пользовательских переменных уровня SSIS-проекта и передаются посредством входных параметров в программную процедуру.
---------------------------------------------------------------------------------------------------------- Imports System Imports System.Data Imports System.Math Imports Microsoft.SqlServer.Dts.Runtime Imports Microsoft.AnalysisServices Imports System.Data.SqlClient ....... Partial Public Class ScriptMain Inherits Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase Enum ScriptResults Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure End Enum Public Sub Main() Dim queryString As String, RDBMS_connString As String Dim strLogin As String, myOLAPServer_ConnectionString As String RDBMS_connString = Dts.Variables("RDBMS_ConnectionString").Value.ToString queryString = "SELECT * FROM dbo.User_List ORDER BY User_SysName" Dim myOLAPServer As New Server myOLAPServer_ConnectionString = Dts.Variables("OLAP_DEVELOP_ConnectionString").Value.ToString myOLAPServer.Connect(myOLAPServer_ConnectionString) ' соединяемся с OLAP-сервером Dim MyDatabase As Database = myOLAPServer.Databases.GetByName("OLAP_PROJECT") ' получаем ссылку на БД Dim MyRole As Role If Not MyDatabase.Roles.ContainsName("Staff") Then ' MyRole = MyDatabase.Roles.Add("Staff") ' MyRole.Update() Dts.TaskResult = ScriptResults.Failure Exit Sub Else MyRole = MyDatabase.Roles.GetByName("Staff") MyRole.Members.Clear() MyRole.Update() End If Dim conn As New SqlConnection conn.ConnectionString = RDBMS_connString Dim cmd As New SqlCommand(queryString, conn) ' Try conn.Open() Dim rdr As SqlDataReader = cmd.ExecuteReader() While rdr.Read() If rdr("User_Activity") = "активный" And rdr("User_Role") <> "администратор" Then strLogin = rdr.Item("User_SysName").ToString If userValid(strLogin) Then Dim MyRoleMember As New RoleMember(strLogin) MyRole.Members.Add(MyRoleMember) MyRole.Update() End If End If End While rdr.Close() ' Catch ex As Exception ' End Try If conn.State = ConnectionState.Open Then conn.Close() conn.Dispose() End If ' MyDatabase.Update() 'в данном случае эта команда не требуется myOLAPServer.Disconnect() Dts.TaskResult = ScriptResults.Success End Sub Function userValid(ByVal MyUser As String) As Boolean Dim retVal As Boolean = False On Error Resume Next Dim objUser As Object objUser = GetObject("WinNT://YoursDomen/" & MyUser) If Err.Number = 0 Then retVal = True ' MsgBox("В домене есть учетная запись " & retVal.ToString & " " & MyUser) ElseIf Err.Number = -2147022676 Then retVal = False ' MsgBox("В домене нет учетной записи " & retVal.ToString & " " & MyUser) Else retVal = False ' MsgBox("Не определен статус учетной записи " & retVal.ToString & " " & MyUser) End If Return retVal End Function End Class ----------------------------------------------------------------------------------------------------------
Теперь файлы полностью готового куба (кубов) можно копировать на боевой сервер SSAS. Воспользуемся утилитой robocopy.exe, которая включена в состав Windows Server 2003 Resource Kit Tools, ее можно скачать http://www.microsoft.com/downloads/details.aspx. Утилита robocopy.exe включена в состав Windows Server 2008, Windows 7 по-умолчанию. (Описание robocopy на русском, примеры использования robocopy).
Эта утилита работает быстро! Использование утилиты многопоточного копирования оформим в виде командного файла olap_robocopy.bat (все bat-файлы приведены в конце статьи), вызов которого пропишем в компоненте "Execute Process Task":
Данный bat-файл гарантирует копирование папки с файлами многомерной базы данных с сервера процессинга в некоторую отдельную папку на эксплуатационном сервере. Надо сказать, что после вызова на исполнение robocopy.exe в силу особенности этой утилиты основной процесс ETL-пакета ничего не знает о статусе окончания ее исполнения, поэтому перед переходом к следующей задаче "Останов боевой OLAP-службы" можно вставить шаг циклической проверки наличия определенного файла в папке назначения.
После того, как успешно скопированы основные файлы, нужно остановить OLAP-службу (см. stop_OLAP_service.bat) на боевом сервере и подменить папку многомерной базы данных (см. olap_exchange.bat), а также скопировать оставшиеся файлы из корневого каталога OLAP.
Следует отметить, что для останова / запуска служб Windows учетная запись, от имени которой исполняется ETL-процесс, должна обладать соответствующими полномочиями. OLAP службы процессинга и эксплуатации могут размещаться на одной физической машине (OLAP-служба по-умолчанию и именованный экземпляр OLAP-службы), если подобное позволяет мощность серверного компьютера. Для такого случая пример именований OLAP-служб приведен ниже:
После всех манипуляций не забываем стартовать боевую OLAP-службу (см. start_OLAP_service.bat) и извещать пользователей по e-mail об успешном обновлении кубов. Таким образом, время недоступности OLAP-кубов для пользователей составляет < 4 минут.
Ну и наконец, не стоит забывать об обработчике ошибок:
Надеюсь, данный материал поможет Вам в построении светлого будущего.