1. 部署方式

按照微软的操作指南,分析服务数据库发布有四种方式:存档和恢复、复制粘贴、基于文件的备份和恢复以及无支持的(unsupported)DSO/XML Scripting Utility。本文采取第一种方式并结合DSO(Decision Support Objects)对分析服务数据库进行配置。

1.1 存档和恢复

通过Analysis Manager把要发布的分析服务数据库存档成CAB包,把这个包分发到目标应用环境,通过DSO把CAB包恢复到分析服务器,并且再做一些需要的配置。

1.2 复制粘贴

通过Analysis Manager复制源分析服务数据库到目标分析服务器。这种方式需要主要靠人工干预,不做讨论。

1.3 基于文件的备份和恢复

这是基于分析服务数据库文件的备份和恢复,不推荐用这种方式,具体的内容请查看微软相关资料。

1.4 DSO/XML Scripting Utility

这是四种方式中最好的一种。微软提供的一种基于.net的工具,把分析服务数据库导成经过定义的XML文件,发布的时候,可以对XML做一些修改,然后通过这个工具导入到目标分析服务器中,类似于数据库的发布过程。可惜的是目前这种方式还是未支持的(unsupported),将来的版本应该会完善。

2. 存档和恢复方式实践

在这一节,我们讨论在存档和恢复方式下的部署问题,文章假设,目标计算机上已经安装并配置好Microsoft SQL Server 2000 Analysis Services,发布的程序可以正确调用DSO,并且发布程序只针对本机的分析服务器进行相关配置。

2.1存档

存档的过程相当简单,通过Analysis Manager把开发环境下的分析服务器数据库存档成CAB文件即可。这个文件就是我们安装包中需要分发的文件。

2.2 恢复

通过msmdarch.exe外部程序把CAB文件导入到分析服务器中。msmdarch.exe在分析服务器安装目录的Bin子目录下Program Files\Microsoft Analysis Services\Bin。

msmdarch格式说明

存档数据库:

msmdarch /A Server OLAPDataPath DatabaseName BackupFileName [LogFileName [TempDirectory]]

还原数据库:

msmdarch /R Server OLAPDataPath BackupFileName [LogFileName [TempDirectory]]

仅当数据库不存在时还原该数据库:

?msmdarch /RS Server OLAPDataPath BackupFileName [LogFileName [TempDirectory]]

?

(获取更详细的信息请查看帮助)

注意:

1. 用命令行的方式执行msmdarch命令Windwos Shell会马上返回,而不是等到任务执行完成。用批处理可以解决这个问题。

2. 带空格的文件名或路径名作参数传递需要加双引号。

3. Server参数传入计算机名,传入IP地址或localhost都是不允许的。

4. 参数非法msmdarch命令会马上返回并且日志文件往往不能被成功创建。

?

下面是C#的示例:

//CAB包包含的分析服务器数据库名称
private const string REGIONOLAPDATABASENAME = "OLAP_BACKUP";

//取得分析服务器Bin路径
private static string GetAnalysisServiceBinPath()
{
    object obj = null;
    RegistryKey regKey = Registry.LocalMachine.OpenSubKey(        "SOFTWARE\\Microsoft\\OLAP Server\\Server Connection Info");
    if (regKey != null)
    {
        obj = regKey.GetValue("Locks Directory");
    }
    regKey.Close();
    Registry.LocalMachine.Close();
    return obj.ToString();
}

//取得Msmdarch文件名
private static string GetMsmdarchFileName()
{
    return GetAnalysisServiceBinPath() + "\\msmdarch";
}

//取得分析服务器数据路径
private static string GetAnalysisServiceDataPath()
{
    object obj = null;
    RegistryKey regKey = Registry.LocalMachine.OpenSubKey(        "SOFTWARE\\Microsoft\\OLAP Server\\CurrentVersion");
    if (regKey != null)
    {
        obj = regKey.GetValue("RootDir");
    }
    regKey.Close();
    Registry.LocalMachine.Close();
    return obj.ToString();
}

//把CAB包导入到当前计算机的分析服务器中
private static void LoadOLAPDatabase(  string TempDir, string OLAPBackupFileName,   string OLAPServer, out string OLAPCatalog)
{
    string sWordDir = GetAnalysisServiceBinPath();
    string sMsmdarchFileName = GetMsmdarchFileName();
    string sDataPath = GetAnalysisServiceDataPath();
    string sBackupFileName = OLAPBackupFileName;
    string sTempDir = TempDir;
    if (TempDir[TempDir.Length-1] != '\\') TempDir += "\\";
    string sTempBatch = sTempDir + @"\Msmdarch.bat";
    string sCommand = "\"" + sMsmdarchFileName + "\"" + 
        @" /R " + 
        OLAPServer + " " +
        "\"" + sDataPath + "\" " + 
        "\"" + sBackupFileName + "\"";

    if(sWordDir == null || sWordDir == "")
        throw new Exception("分析服务器尚未安装,请先安装分析服务器!");

    if (!Directory.Exists(sTempDir))         Directory.CreateDirectory(sTempDir);

    FileInfo fiBatch = new FileInfo(sTempBatch);
    if (fiBatch.Exists) fiBatch.Delete();
    using (StreamWriter sw = fiBatch.CreateText())
    {
        sw.WriteLine(sCommand);
    }

    ProcessStartInfo psi = new ProcessStartInfo(sTempBatch);
    psi.WindowStyle = ProcessWindowStyle.Normal;
    psi.WorkingDirectory = sWordDir;
    Process p = Process.Start(psi);
    p.WaitForExit();


    DSO.Server dsoServer = new DSO.ServerClass();
    dsoServer.Connect(OLAPServer);
    try
    { 
        if (!dsoServer.MDStores.Find(REGIONOLAPDATABASENAME))
        {
            throw new Exception("导入CAB包到分析服务器失败!");
        }
    }
    finally
    {
        dsoServer.CloseServer();
    }

    OLAPCatalog = REGIONOLAPDATABASENAME;
}

2.3 更改分析服务数据库名称

通过msmdarch命令导入的分析服务数据库的名称是固定的,在发布以后需要改名。目前,笔者还没有发现可以直接更改数据库名称的方法,一个替代的方法是将这个导入的数据库复制成一个指定名称的数据库然后把原来的这个数据库删除。所有这些操作通过DSO完成。

下面是C#的示例:

private static void MoveOLAPDatabase(
  string OLAPServer,
  string SourceCatalog,
  string DestCatalog
)
{
    if (string.Compare(SourceCatalog, DestCatalog, true) == 0) return;
    DSO.Server dsoServer = new DSO.ServerClass();
    dsoServer.Connect(OLAPServer);
    try
    {    
        if (!dsoServer.MDStores.Find(SourceCatalog))
        {
            throw new Exception(
                    string.Format("源OLAP数据库\"{0}\"不存在!", SourceCatalog)
                );
        }

        DSO.MDStore dbSource = 
            (DSO.MDStore)(dsoServer.MDStores.Item(SourceCatalog));

        if (dsoServer.MDStores.Find(DestCatalog))
        {
            dsoServer.MDStores.Remove(DestCatalog);
        }

        DSO.MDStore dbDest = (DSO.MDStore)dsoServer.MDStores.AddNew(
                DestCatalog,
                DSO.SubClassTypes.sbclsRegular
            );
    
        dbSource.Clone(dbDest, DSO.CloneOptions.cloneMajorChildren);

        dbDest.Update();

        dsoServer.MDStores.Remove(SourceCatalog);
    }
    finally
    {
        dsoServer.CloseServer();
    }
}

2.4 更改分析数据库中的数据源

分发到目标计算机上的分析服务数据库的数据源依然指向开发环境的数据库,在分发的时候需要加以定制。

下面是调用DSO的C#示例:

private static void UpdateOLAPDataSource(
  string OLAPServer,
  string OLAPCatalog,
  string DBServer,
  string DBSUserID,
  string DBSPassword,
  string DBName
)
{
    DSO.Server dsoServer = new DSO.ServerClass();
    dsoServer.Connect(OLAPServer);
    try
    {
        DSO.Database dsoDB = (DSO.Database)dsoServer.MDStores.Item(OLAPCatalog);
        dsoDB.LockObject(
            DSO.OlapLockTypes.olaplockWrite,
            "config datasource"
        );

        try
        {
            DSO.DataSource dsoDS = 
                (DSO.DataSource)dsoDB.DataSources.Item(
                    REGIONOLAPDATASOURCENAME
                );

            dsoDS.ConnectionString = 
                "Provider=SQLOLEDB.1;Password=" + 
                DBSPassword + 
                ";Persist Security Info=True;User ID=" + 
                DBSUserID + ";Initial Catalog=" + 
                DBName + ";Data Source=" + 
                DBServer + 
                ";Connect Timeout=15";

            dsoDS.Update();
        }
        finally
        {
            dsoDB.UnlockObject();
        }
    }
    finally
    {
        dsoServer.CloseServer();
    }
}

3. 小结

通过以上的介绍可以发现,用存档和恢复的方式发布分析服务数据库主要通过DSO完成的,关于DSO的用法可以参看微软的相关文档。通过比较可以发现存档和恢复的方式的不足指出是不能远程对分析服务进行部署,所以,我们期待微软分析服务的下一个版本全面支持DSO/XML Scripting Utility。

?

A. 参考资料

A.1. Microsoft SQL Server 2000 Analysis Services Operations Guide