Automating Database Maintenance on Azure SQL

Database maintenance is crucial for the health and performance of any database system, including those in Azure. Without regular maintenance, databases can become slow, unstable, and prone to crashes and other errors. Maintenance tasks such as index optimization and statistics updates ensure query processing happens quickly and accurately. By automating these maintenance tasks, database administrators can reduce downtime risk and improve database system reliability and performance. In short, database maintenance is essential for ensuring databases operate efficiently and effectively.

When planning your index maintenance strategy, keep in mind these tips from Microsoft.

I plan to schedule stats updates nightly and reorganize/rebuild indexes once a week on the weekend. Be careful with index reorgs/rebuilds especially if your tables are highly fragmented. I plan to reorg/rebuild manually before I put all the tables into that weekly reorg/rebuild schedule. If they are all highly fragmented and you run the reorg/rebuild on a schedule, you may overload your Azure SQL DB resources.

Ways to Automate Maintenance

Each of these techniques can be used to automate index maintenance:

  1. Azure Runbooks: Azure Runbooks are pre-built automation scripts that can be scheduled to run at specific times or in response to events.
  2. Azure Functions: You can use Azure Functions to run maintenance scripts in response to a timer trigger or other event. For example, you can use an Azure Function to run a PowerShell script.
  3. Logic Apps: Azure Logic Apps automate maintenance tasks with pre-built connectors and actions. For example, you can use the SQL Server connector to execute T-SQL scripts.
  4. Elastic Jobs: Elastic Jobs is a feature in Azure SQL Database that allows you to manage and execute jobs across multiple databases and servers. With Elastic Jobs, you can define and manage job schedules, monitor job execution, and troubleshoot issues across your entire database estate. It is a powerful tool for simplifying database maintenance and management in Azure SQL Database.
  5. SQL Server Agent: SQL Server Agent is a built-in tool in SQL Server. However, SQL Server Agent is not available in Azure SQL Database, so you need linked servers to facilitate this.

Automating with Azure Runbooks

Azure Runbooks are a powerful tool for automating repetitive tasks, including Azure SQL Database maintenance. With Azure Runbooks, you can easily create, schedule, and manage maintenance tasks. Additionally, Azure Runbooks allow you to automate tasks across multiple Azure services, providing a unified experience for managing your Azure environment. By automating Azure SQL Database maintenance tasks with Azure Runbooks, you can improve maintenance efficiency and reliability.

High-level Steps

  1. Create an Automation Account in the Azure portal: This is a container for all Azure Automation resources, including runbooks, schedules, and variables.
  2. Import Modules: These modules may include SqlServer, Az.Accounts, and Az.Storage.
  3. Create Runbooks: You will have one for index optimization and one for statistics updates.
  4. Schedule Runbooks: Create a schedule within Azure Automation, specifying the frequency and timing of the runbook.
  5. Configure Variables: To avoid hard-coding credentials and other sensitive data in runbooks, configure variables within Azure Automation to store this information securely. Runbooks use variables to authenticate to Azure SQL Database.
  6. Monitor and Alert: Lastly, you need monitoring and alerting to ensure you know if maintenance tasks fail. Azure Automation includes built-in monitoring and alerting capabilities. You can configure alerts using Azure Monitor.

https://learn.microsoft.com/en-us/azure/automation/quickstarts/create-azure-automation-account-portal

https://sqlsolutionsgroup.com/azure-automation-and-runbooks/

Automating with Azure Functions

Like Runbooks, Azure Functions are a powerful tool for automating repetitive tasks. You can automate maintenance tasks and free up your time for more critical tasks. You can create, schedule, and manage maintenance tasks.

High-level Steps

  1. Create an Azure Function App: This app will act as a container for your Azure Function resources, including function code and triggers.
  2. Import Modules: This may include modules such as SqlServer and Azure.Storage.
  3. Create Functions: One for index optimization and one for statistics updates.
  4. Configure Triggers: You can create a timer trigger within Azure Functions, specifying the frequency and timing of the function.
  5. Configure Connection Strings: To avoid hard-coding credentials and other sensitive data in functions, configure connection strings within Azure Functions to store this information securely. Use connection strings to authenticate to Azure SQL Database and other services required for maintenance tasks.
  6. Monitor and Alert: Lastly, you need monitoring and alerting to ensure you are notified when maintenance tasks fail. Azure Functions includes built-in monitoring and alerting capabilities. You can configure alerts using Azure Monitor.

Helpful Links

https://learn.microsoft.com/en-us/azure/azure-functions/create-first-function-vs-code-powershell

https://learn.microsoft.com/en-us/azure/azure-functions/functions-scenario-database-table-cleanup

Automating with Logic Apps

Like Runbooks and Functions, Logic Apps are powerful tools for automating repetitive tasks. You can automate maintenance tasks and free up your time for more critical tasks. You can create, schedule, and manage maintenance tasks.

High-level Steps

  1. Create an Azure Logic App: This app will act as a container for all Logic App resources, including workflow definitions and triggers.
  2. Import Modules: Once the Azure Logic App is created, import the necessary PowerShell modules required for maintenance tasks. These modules may include SqlServer and Azure.Storage.
  3. Create Workflows: One for index optimization and one for statistics updates.
  4. Configure Triggers: Triggers execute workflows automatically. You can create a timer trigger to specify the frequency and timing of the workflow.
  5. Configure Connection Strings: To avoid hard-coding credentials and other sensitive data in workflows, configure connection strings within Azure Logic Apps to store this information securely. Use connection strings to authenticate to Azure SQL Database and other services required for maintenance tasks.
  6. Monitor and Alert: Lastly, configure monitoring and alerting to get alerts if a Logic App fails. Azure Logic Apps include built-in monitoring and alerting capabilities. You can configure alerts using Azure Monitor.

Helpful Links

https://learn.microsoft.com/en-us/azure/connectors/connectors-create-api-sqlazure?tabs=consumption

https://www.mssqltips.com/sqlservertip/6420/create-azure-sql-database-scheduled-jobs/

Automating with Elastic Jobs

Like the others in this post, common tasks can be automated like index maintenance and statistics updates. Automating these tasks can improve database performance.

High-level Steps

  1. Create an Azure SQL Database: First, create an Azure SQL Database in the Azure portal. You will use this database to host your Elastic Job database schema.
  2. Create an Azure Elastic Job Agent: Next, create an Azure Elastic Job Agent in the Azure portal. This agent will run and manage your Elastic Jobs.
  3. Create an Elastic Job Group: Once the Elastic Job Agent is set up, you can create an Elastic Job Group to manage your Elastic Jobs. The Elastic Job Group is a container for your Elastic Jobs and provides a central location to manage and monitor their execution.
  4. Create Elastic Jobs: Create your Elastic Jobs within the Elastic Job Group. You can set up jobs to execute T-SQL scripts, PowerShell scripts, or other scripts.
  5. Define Schedules: Define schedules for your Elastic Jobs so that they run at the appropriate times. You can set up recurring schedules, one-time schedules, or schedules that run on a specific date and time.
  6. Monitor and Alert: Finally, monitor and troubleshoot your Elastic Jobs. You can view job execution history, check for job failures, and view job metrics to ensure your Elastic Jobs are running smoothly.

Helpful Links

https://learn.microsoft.com/en-us/azure/azure-sql/database/elastic-jobs-overview?view=azuresql

https://www.sqlshack.com/elastic-jobs-in-azure-sql-database/

Automating with SQL Server Agent

If you still manage SQL Servers, you can automate Azure SQL database maintenance with SQL Agent. However, to use SQL Server Agent with Azure SQL Database, you need to create a linked server that connects your SQL Server instance to your Azure SQL Database.

Once you have set up the linked server, you can create SQL Server Agent jobs that run T-SQL scripts against your Azure SQL Database. You can schedule these jobs to run at specific times or intervals. You can configure them to send email notifications when they complete or encounter errors.

What Will I Use?

I’m not using SQL Agent because I don’t have SQL Servers at work. I’m not using Elastic Jobs because 1) it’s still in preview and 2) it can’t be set up with Terraform. I won’t use Logic Apps because they are more complicated to set up with Terraform.

I’m investigating runbooks and functions. I will probably use a function because we already have some functions in Terraform but may use runbooks. I will provide more details on this setup once I’ve figured it out.

One Reply to “Automating Database Maintenance on Azure SQL”

  1. I use Ola Hallengren’s scripts, and my Infra Team created Azure Runbooks to execute them on a schedule in our Azure SQL Databases. These are scattered across many resource groups and Azure Regions, and many are in Elastic Pools. It was tricky to get the executions spaced out so that we’re not rebuilding indexes in all of the databases in a pool at the same time, which would bring the pool itself to its knees.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.