589 字
3 分钟
QuestDB自动备份方案

AI 智能摘要

AI 正在生成文章简介,请稍候...

网上的教程很少,好不容易找到一个还是需要安装pgsql的,太折腾了,既然9000端口的web可以执行命令,那应该就可以直接调用questdb的web api去执行备份命令,比安装pgsql的方案方便。

修改配置文件#

路径:questdb程序目录\bin\qdbroot\conf\server.conf 修改后记得重启questdb服务

修改配置文件

测试备份命令#

BACKUP TABLE 表名1, 表名2;

执行备份命令

执行后可以看到有对应的备份文件夹,如果执行多次就是年月日.1、年月日.2

执行备份命令

自动备份配置#

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Date>2025-07-22T16:40:31.4762726</Date>
<Author>DESKTOP-EGTT6MR\admin</Author>
<URI>\MES\定时备份Questdb</URI>
</RegistrationInfo>
<Triggers>
<CalendarTrigger>
<StartBoundary>2025-07-22T17:15:00</StartBoundary>
<Enabled>true</Enabled>
<ScheduleByDay>
<DaysInterval>1</DaysInterval>
</ScheduleByDay>
</CalendarTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<UserId>S-1-5-21-3828290859-3366777425-2908561605-1001</UserId>
<LogonType>Password</LogonType>
<RunLevel>LeastPrivilege</RunLevel>
</Principal>
</Principals>
<Settings>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>false</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<IdleSettings>
<StopOnIdleEnd>true</StopOnIdleEnd>
<RestartOnIdle>false</RestartOnIdle>
</IdleSettings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<Enabled>true</Enabled>
<Hidden>false</Hidden>
<RunOnlyIfIdle>false</RunOnlyIfIdle>
<WakeToRun>false</WakeToRun>
<ExecutionTimeLimit>PT72H</ExecutionTimeLimit>
<Priority>7</Priority>
</Settings>
<Actions Context="Author">
<Exec>
<Command>powershell</Command>
<Arguments>-noprofile -executionpolicy bypass -file "E:\Program Files (x86)\questdb\questdb-backup.ps1"</Arguments>
<WorkingDirectory>E:\Program Files (x86)\questdb</WorkingDirectory>
</Exec>
</Actions>
</Task>

保存这个xml文件:定时备份Questdb.xml

导入任务计划程序

修改执行用户身份

Terminal window
chcp 936 *>$null
# ====================== 参数区 ======================
$BACKUP_ROOT = "D:\BackUPQuestdb" # 备份路径与server.conf相同
$RETENTION_DAYS = 7 # 只保留近7天的备份文件
$DbHost = "localhost"
$HTTP_PORT = 9000
$LOG_FILE = Join-Path $BACKUP_ROOT ("backup_{0:yyyyMMdd}.log" -f (Get-Date))
# ====================================================
function Write-Log([string]$msg){
$msg = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') $msg"
Write-Host $msg
Add-Content -Path $LOG_FILE -Value $msg
}
# 1. 建立/确认目录
if (-not (Test-Path $BACKUP_ROOT)) {
New-Item -Path $BACKUP_ROOT -ItemType Directory -Force | Out-Null
}
Write-Log "===== 备份脚本开始 ====="
# 2. 删除过期目录
Get-ChildItem -Path $BACKUP_ROOT -Directory |
Where-Object {
$_.Name -match '^\d{4}-\d{1,2}-\d{1,2}(?:\..+)?$' -and
[DateTime]($_.Name -replace '^(\d{4}-\d{1,2}-\d{1,2}).*$', '$1') -lt (Get-Date).AddDays(-$RETENTION_DAYS)
} | ForEach-Object {
Write-Log "删除目录 - $($_.FullName)"
Remove-Item $_.FullName -Recurse -Force
}
# 3. 触发 QuestDB 备份
Write-Log "开始 HTTP 备份请求"
$uri = "http://${DbHost}:${HTTP_PORT}/exec"
$query = "BACKUP TABLE 表名1, 表名2;" # 改成你的表名
# 使用 WebUtility 做 URL 编码
$encodedQuery = [System.Net.WebUtility]::UrlEncode($query)
$fullUrl = "$uri`?query=$encodedQuery"
try {
$resp = Invoke-WebRequest -Uri $fullUrl -UseBasicParsing -ErrorAction Stop
Write-Log "备份请求成功:HTTP $($resp.StatusCode)"
}
catch {
Write-Log "备份请求失败:$($_.Exception.Message)"
}
# 4. 删除过期日志(*.log)
Get-ChildItem -Path $BACKUP_ROOT -Filter *.log -Recurse -File |
Where-Object {
$_.Name -match '^backup_(?<dt>\d{8})\.log$' -and
($dt = [DateTime]::ParseExact($Matches['dt'],'yyyyMMdd',$null)) -lt (Get-Date).AddDays(-$RETENTION_DAYS)
} | ForEach-Object {
Write-Log "删除旧日志 - $($_.FullName)"
Remove-Item $_.FullName -Force
}
Write-Log "===== 备份脚本完成 ====="

保存这个ps1文件:questdb-backup.ps1

设置脚本路径

隐藏执行窗口

手动执行备份测试#

执行完成

恢复备份#

停止questdb后,直接复制备份的文件夹到questdb程序目录\bin\qdbroot\db

QuestDB自动备份方案
https://16c.top/2025/07/31/questdb-auto-backup/
作者
Young
发布于
2025-07-31
许可协议
CC BY-NC-SA 4.0