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


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/