0

创建数据库并添加到故障转移组

我有一个 Azure 弹性池,并且在不同的 Azure 区域上创建了一个带有另一个弹性池(同名)的故障转移组,在创建故障转移组期间,我选择了弹性池,它通过并添加了所有数据库将弹性池中的弹性池复制到辅助服务器上的弹性池。

我有一个脚本设置来使用以下 TSQL 自动创建新数据库:

CREATE DATABASE databaseName ( SERVICE_OBJECTIVE = ELASTIC_POOL ( name = "Elastic pool name" ) );

但是,上述脚本不会将数据库添加到故障转移组,因此它不会添加到我的其他 Azure 区域中的其他 SQL 服务器。我不想每次都通过 Azure 门户手动将任何新数据库添加到故障转移组,那么是否有一个 TSQL 脚本可以在创建时将数据库添加到故障转移组?

删除数据库,从故障转移组和辅助服务器中删除

继上述之后,我还有以下删除数据库的 TQL:

DROP DATABASE databaseName;

运行上述命令会从主服务器中删除数据库,并将其从故障转移组中删除,但数据库仍存在于辅助服务器上。有没有办法使用 TSQL 从辅助服务器中删除它,是否像再次运行上述脚本但指向辅助服务器一样简单,或者有更好的方法吗?

编辑

似乎没有办法用 TSQL 做到这一点,那么在 C# 中使用 Azure API 是否可以做到这一点,如下所示?

var dbResponse = client.FailoverGroups.Update("resourceGroupName", 
            "serverName", 
            "failoverGroupName", 
            new Microsoft.Azure.Management.Sql.Models.FailoverGroupUpdate() { 
                    Databases = new List<string>() { "databaseName" } 
                }
            );
4

2 回答 2

1

恐怕不,没有可以在创建时使用的 TSQL 脚本将数据库添加到故障转移组。

只有 Azure 为我们提供的两种方式可以管理故障转移组:PortalPowershell

如果要删除辅助数据库,请先将其从故障转移组中删除,然后再将其删除。参考这里在此处输入图像描述

我们仍然需要使用 Portal 或 PowerShell 来添加或删除这些数据库选项。

于 2021-05-17T07:23:01.263 回答
0

运行一些测试,您似乎可以使用 Azure Rest API 来执行此操作,我编写了以下方法来测试它,尽管看起来您必须始终传递所有数据库名称,因为这不会附加已经存在的内容,但是实际上替换了故障转移组中的数据库列表。

我没有在生产中对此进行测试,看看这是否会导致任何问题,例如每次都有效地删除和重新添加数据库。

希望其他人能够提供更好的解决方案,我理想的解决方案仍然是尽可能使用 TSQL,因为这意味着不必设置用户帐户来访问 REST API。

 public async Task AddDatabasesToFailoverGroupAsync(List<string> databaseNames)
    {
        // Variables
        string domainName = "XXXX"; /* Tenant ID or AAD domain */
        string username = "XXXX";
        string password = "XXXX";
        string resourceGroupName = "XXXXX";
        string serverName = "XXXX";
        string failoverGroupName = "XXXXX";
        string clientId = "XXXXX"; /* Active Directory APP Client ID */
        string subscriptionId = "XXXXXX";
        string databasePrefix = $"/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Sql/servers/{serverName}/databases/";
        List<string> databases = new List<string>();

        // Add prefix to database names
        foreach (var dbName in databaseNames)
            databases.Add($"{databasePrefix}{dbName}");

        // Login to Azure
        var credentials = await UserTokenProvider.LoginSilentAsync(clientId, domainName, username, password);

        // Create client
        SqlManagementClient client = new SqlManagementClient(credentials)
        {
            SubscriptionId = subscriptionId
        };

        // Set parameters
        var parameters = new FailoverGroupUpdate()
        {
            Databases = databases
        };

        // Update failover group
        client.FailoverGroups.Update(resourceGroupName, serverName, failoverGroupName, parameters);
    }
于 2021-05-18T11:53:44.370 回答