如何修改Azure SQL联机时间?如何按指定周期设置数据库联机/离线状态?
嘿,我来帮你搞定这个需求!Azure SQL数据库本身没有内置的“定时切换联机/离线”功能,但我们可以通过Azure自动化账户或者Azure逻辑应用来实现这个定时启停的规则,完美匹配你周一到周六06:00-21:00联机、周日全天离线的要求。下面分两种常用方法详细说明:
方法一:使用Azure自动化账户(推荐,适合长期稳定调度)
这是最常用的方案,适合需要长期运行的定时任务,成本也很低:
步骤1:创建Azure自动化账户
登录Azure门户,搜索“自动化账户”,新建一个。记得选和你的SQL数据库同区域的位置,并且要启用“系统分配的托管标识”——这个标识后面用来给自动化账户授权操作SQL数据库的权限。步骤2:给自动化账户分配权限
找到你的SQL数据库所在的资源组,或者直接进入SQL服务器的“IAM(访问控制)”页面,添加角色分配:把SQL Server参与者角色分配给刚才创建的自动化账户的托管标识。这样它才有资格启停你的数据库。步骤3:编写启停数据库的Runbook
在自动化账户里,进入“Runbooks”页面,新建两个PowerShell类型的Runbook:一个用来启动数据库,一个用来停止。
启动脚本示例(记得替换成你自己的资源信息):# 替换为你的资源组、SQL服务器和数据库名称 $resourceGroupName = "YourResourceGroup" $serverName = "YourSqlServerName" $databaseName = "YourDatabaseName" # 启动数据库 Start-AzSqlDatabase -ResourceGroupName $resourceGroupName -ServerName $serverName -DatabaseName $databaseName停止脚本示例:
# 替换为你的资源组、SQL服务器和数据库名称 $resourceGroupName = "YourResourceGroup" $serverName = "YourSqlServerName" $databaseName = "YourDatabaseName" # 停止数据库 Stop-AzSqlDatabase -ResourceGroupName $resourceGroupName -ServerName $serverName -DatabaseName $databaseName写完后记得保存并发布这两个Runbook,不然没法调度。
步骤4:设置定时调度规则
针对启动Runbook,创建调度:- 频率选“每周”,重复周期1周
- 勾选周一到周六,设置触发时间为06:00
- 持续时间选“无结束日期”(或者按需设置)
针对停止Runbook,需要创建两个调度:
- 周一到周六的21:00:同样每周重复,勾选周一到周六,触发时间设为21:00
- 周日的00:00(或者凌晨1点,选个低峰时间就行):每周重复,只勾选周日,触发时间设为你希望数据库停止的时间,确保周日全天处于离线状态。
方法二:使用Azure逻辑应用(可视化配置,适合快速搭建)
如果你更喜欢拖拖拽拽的可视化操作,逻辑应用是个不错的选择,适合快速搭建定时任务:
步骤1:创建消费型逻辑应用
登录Azure门户,搜索“逻辑应用”,新建一个消费型逻辑应用(比标准型成本更低,适合这种定时任务),选择和SQL数据库同区域的位置。步骤2:添加定时触发器
进入逻辑应用设计器,搜索“recurrence”(循环触发器),设置启动数据库的定时规则:- 频率:每周
- 间隔:1
- 时区:选你所在的时区(比如中国标准时间)
- 星期:勾选周一到周六
- 时间:06:00
步骤3:添加启动数据库的操作
搜索“Azure SQL数据库”,选择“启动Azure SQL数据库”操作,连接你的Azure账户,然后选择对应的资源组、SQL服务器和目标数据库名称。步骤4:复制逻辑应用创建停止规则
直接复制刚才的逻辑应用,修改两个地方:- 第一个停止逻辑应用:把触发器时间改成21:00,操作换成“停止Azure SQL数据库”
- 第二个停止逻辑应用:把触发器的星期改成只选周日,时间设为00:00(或者你想要的时间),操作同样换成“停止Azure SQL数据库”
重要注意事项
- 如果你用的是Azure SQL托管实例,启停命令略有不同,需要用
Start-AzSqlInstance和Stop-AzSqlInstance,操作步骤和上面一致,只是脚本里的命令替换一下就行。 - 数据库停止后,计算费用会停止,但存储费用还是会正常收取,这是Azure的计费规则哦。
- 配置完后,建议先手动运行一次Runbook或者逻辑应用,验证权限和脚本是否正常,没问题再正式启用调度。
内容的提问来源于stack exchange,提问作者Mustafa Demirhan

