Как настроить DTU для базы данных Azure Sql через Api?

Я могу создать базу данных Azure Sql, упомянув уровень цен.

Я пытаюсь установить память и DTU для базы данных.

Я не могу найти правильный API, вот что я пытался

PUT :    https://management.azure.com/subscriptions/<subscription-ID>/resourceGroups/<Resource-group-Name>/providers/Microsoft.Sql/servers/<Server-name>/databases/<Database-name>/?api-version=2014-04-01

Тело запроса:

 {
                "location": "East Asia",
                "properties": {
                    "edition": "Premium",
                    "collation":"SQL_Latin1_General_CP1_CI_AS",
                "sampleName": "blank database",
                "serviceTierAdvisors":[
                    {
                        "maxSizeInGB":"150",
                        "maxDtu":"500"
                    }   
                    ]
                }   
    }

Я также не получаю правильное сообщение об ошибке. Может ли кто-нибудь подсказать мне параметр для настройки DTU на уровне базы данных?

2 ответа

Решение

Может кто-нибудь направить меня с помощью параметра для настройки DTU на уровне базы данных??

Нужно указать правильный параметр DTUServiceObjectiveName. Его тип enum. Вы можете установить следующие значения для этого свойства.

Basic, 
S0, S1, S2, S3
P1, P2, P4, P6, P11, P15
System, System2
ElasticPool

Пожалуйста, проверьте соответствующие значения DTU следующим образом.

Basic(5DTU), 
S0(10DTU), S1(20DTU), S2(50DTU), S3(100DTU)
P1(125DTU), P2(250DTU), P4(500DTU), P6(1000DTU), P11(1750DTU), P15(4000DTU)
System, System2
ElasticPool

Вам необходимо использовать API для обновления базы данных, как описано в этой статье.

Например:

{
    "parameters": {
        "subscriptionId": "00000000-1111-2222-3333-444444444444",
        "resourceGroupName": "sqlcrudtest-4799",
        "serverName": "sqlcrudtest-5961",
        "databaseName": "testdb",
        "api-version": "2014-04-01",
        "parameters": {
            "properties": {
                "edition": "Standard",
                "status": "Online",
                "createMode": "Default",
                "serviceLevelObjective": "S0",
                "collation": "SQL_Latin1_General_CP1_CI_AS",
                "maxSizeBytes": "268435456000",
                "currentServiceObjectiveId": "f1173c43-91bd-4aaa-973c-54e79e15235b",
                        "requestedServiceObjectiveId": "dd6d99bb-f193-4ec1-86f2-43d3bccbc49c",
                                            "requestedServiceObjectiveName": "Basic",
                "defaultSecondaryLocation": "Japan West",
                "earliestRestoreDate": "2017-02-10T01:52:52.923Z",
                "containmentState": 2,
                "readScale": "Disabled"
            }
        }
    },
    "responses": {
        "200": {
            "body": {
                "id": "/subscriptions/00000000-1111-2222-3333-444444444444/resourceGroups/sqlcrudtest-4799/providers/Microsoft.Sql/servers/sqlcrudtest-5961/databases/testdb",
                "name": "testdb",
                "type": "Microsoft.Sql/servers/databases",
                "location": "Japan East",
                "kind": "v12.0,user",
                "properties": {
                    "edition": "Standard",
                    "status": "Online",
                    "serviceLevelObjective": "S0",
                    "collation": "SQL_Latin1_General_CP1_CI_AS",
                    "creationDate": "2017-02-24T22:39:46.547Z",
                    "maxSizeBytes": "268435456000",
                    "currentServiceObjectiveId": "f1173c43-91bd-4aaa-973c-54e79e15235b",
                    "requestedServiceObjectiveId": "dd6d99bb-f193-4ec1-86f2-43d3bccbc49c",
                    "requestedServiceObjectiveName": "Basic",                   "sampleName": null,
                    "defaultSecondaryLocation": "Japan West",
                    "earliestRestoreDate": "2017-02-10T01:52:52.923Z",
                    "elasticPoolName": null,
                    "containmentState": 2,
                    "readScale": "Disabled",
                    "failoverGroupId": null
                }
            }
        },
        "202": {}
    }
}

В приведенном выше примере я уменьшаю уровень Standard S0 до уровня Basic.

Надеюсь это поможет.

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

Я получаю свой токен на предъявителя, затем вызываю этот метод, чтобы увеличить или уменьшить значение dtus. Обратите внимание, что вызов GetUpdateSettingsJson() возвращает следующие две строки Json в зависимости от того, увеличиваю или уменьшаю размер DTU / размера экземпляра:Увеличить JSON: "{" sku ": {" name ":" Premium "," tier ":" Premium ", "acity": 250} }"Уменьшить JSON:" {"sku": {"name": "Standard", "tier": "Standard", "acity": 50} }"

private static async Task<string> UpdateDatabaseSettings()
    {
        using (HttpClient client = new HttpClient())
        {
            var updateDtuEndpoint = String.Format(@"https://management.azure.com/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Sql/servers/{2}/databases/{3}?api-version=2017-10-01-preview",
                subscriptionId,
                databaseResourceGroup,
                databaseServer,
                databaseName
                );
            var accept = "application/json; charset=utf-8";

            client.DefaultRequestHeaders.Add("Accept", accept) ;
            client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue ("Bearer", bearerToken);

            //string queryParameters = String.Format(@"resource=https%3A%2F%2Fgraph.microsoft.com%2F&client_id={0}&grant_type=client_credentials&client_secret={1}", clientId, clientSecret);

            string jsonUpdateSetting = GetUpdateSettingsJson();

            using (var response = await client.PatchAsync(updateDtuEndpoint, new StringContent(jsonUpdateSetting, Encoding.UTF8, "application/json")))
            {
                if (response.StatusCode == System.Net.HttpStatusCode.Accepted)
                {
                    WriteLine("Capacity Update is Processing");
                    return "Capacity Update is Processing";
                }
                else
                {
                    Environment.ExitCode = 1;
                    WriteLine("Capacity Update failed.");
                    return "Capacity Update failed. ";
                }
            }


        }
    }

ДОПОЛНИТЕЛЬНО: Этот метод выше только помещает запрос, метод ниже вызывается, пока он не может подтвердить, что изменение ЭФФЕКТИВНО. Метод выше только запрашивает изменение. Метод просто проверяет, что RequestServiceObject = CurrentServiceObject (он не подтверждает DTU).

private static async Task<bool> CheckDatabaseSettng()
    {
        using (HttpClient client = new HttpClient())
        {
            var checkDatabaseSettings = String.Format(@"https://management.azure.com/subscriptions/{0}/resourceGroups/{1}/providers/Microsoft.Sql/servers/{2}/databases/{3}?api-version=2017-10-01-preview",
                subscriptionId,
                databaseResourceGroup,
                databaseServer,
                databaseName
                );
            var accept = "application/json; charset=utf-8";

            client.DefaultRequestHeaders.Add("Accept", accept);
            client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", bearerToken);

            using (var response = await client.GetAsync(checkDatabaseSettings))
            {
                if (response.StatusCode == System.Net.HttpStatusCode.OK)
                {
                    var jsonresult = JObject.Parse(await response.Content.ReadAsStringAsync());
                    var jsonProperties = jsonresult["properties"];
                    if (jsonProperties == null)
                    {
                        throw new Exception("Could not find properties that are supposed to be returned in this call.");
                    }
                    var currentServiceObject = (string)jsonProperties["currentServiceObjectiveName"];
                    var requestedServiceObject = (string)jsonProperties["requestedServiceObjectiveName"];

                    string msg = string.Format("currentServiceObjectiveName = {0}; requestedServiceObjectiveName = {1}", currentServiceObject, requestedServiceObject);
                    WriteLine(msg);
                    if (currentServiceObject == requestedServiceObject)
                    {
                        return true;
                    }
                }
            }
        }

        return false;
    }

Надеюсь, это поможет кому-то сэкономить больше времени, чем я потратил на это.

Шаг 1. Вам необходимо создать clientId,Token и clientSecret на портале Azure. Используйте этот учебник (есть много, которые просто сбивают с толку), этот работает. как получить токен, clientID и секрет клиента

Шаг 2: Затем вам нужно будет сделать выбор, если вы хотите использовать остальные API или SDK. Я предпочитаю SDK, но это зависит от вас (вам не нужно выяснять, какие значения json используют SDK). Шаг 3 и далее предполагает, что вы выбрали SDK.

Для установки предварительных требований для SDK вам понадобятся следующие пакеты nuget:

Install-Package Microsoft.Azure.Management.Fluent
Install-Package Microsoft.Azure.Management.ResourceManager.Fluent

И вам нужно следующее для SQL:

Microsoft.Azure.Management.Sql.Fluent

Вам нужны токены на шаге 1 для аутентификации.

Шаг 3: Затем посмотрите на этот пример, как использовать SDK - хорошо, чтобы увидеть, как подать заявку. Azure SQL SDK

И наконец: вот фрагмент кода, когда у вас есть все вышеперечисленное - отлично справляется со своей работой.

  string tenantId = "9596ecae-xxxxxxx";
  string clientAppId= "51c28b54-xxxxxxxxx";
  string secret = "@w6.Quv--your secret";

  credentials = SdkContext.AzureCredentialsFactory
           .FromServicePrincipal(clientAppId,
           secret,
           tenantId,
           AzureEnvironment.AzureGlobalCloud);

 var azure = Microsoft.Azure.Management.Fluent.Azure
            .Configure()
            .Authenticate(credentials)
            .WithDefaultSubscription();

 var database = azure.SqlServers
        .GetById("/subscriptions/<your specific>/resourceGroups/<your specific>/providers/Microsoft.Sql/servers/<your specific>")
        .Databases.GetById("/subscriptions/xxx/resourceGroups/xxx/providers/Microsoft.Sql/servers/xxx/databases/xxx");

 var result = database.Update()
            .WithEdition(DatabaseEditions.Standard)
            .WithServiceObjective(ServiceObjectiveName.S0) <-- CHANGE LEVEL OF DB.
            .Apply();

СОВЕТ И ПОМОЩЬ ДЛЯ ИМЕНИ SQL И БД: Получить правильную строку для замены приведенного выше кода довольно сложно. Сочетание клавиш - сначала вызвать List, затем вы можете отладить и посмотреть, что поместить в функции GetById, вы можете сначала вызвать его и посмотреть результаты:

 azure.SqlServers.List() <-- Debug this and you will see the full names of the Database Servers string names
 Then do azure.SqlServer.Databases.List() <-- an array of objects where you can get the string for the database name.

Надеюсь, это поможет - документация ужасна.

Другие вопросы по тегам