fix: Fixed issue with recover postgres-cluster database failed (#9732)

This commit is contained in:
CityFun 2025-07-29 16:19:39 +08:00 committed by GitHub
parent 4565c5b300
commit 04b9cbd87a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 68 additions and 61 deletions

View file

@ -136,7 +136,11 @@ func (r *Local) Backup(info BackupInfo) error {
} }
defer outfile.Close() defer outfile.Close()
global.LOG.Infof("start to pg_dump | gzip > %s.gzip", info.TargetDir+"/"+info.FileName) global.LOG.Infof("start to pg_dump | gzip > %s.gzip", info.TargetDir+"/"+info.FileName)
cmd := exec.Command("docker", "exec", "-e", fmt.Sprintf("PGPASSWORD=%s", r.Password), r.ContainerName, "pg_dump", "-F", "c", "-U", r.Username, "-d", info.Name) cmd := exec.Command(
"docker", "exec", "-i", r.ContainerName,
"sh", "-c",
fmt.Sprintf("PGPASSWORD=%s pg_dump -F c -U %s -d %s", r.Password, r.Username, info.Name),
)
var stderr bytes.Buffer var stderr bytes.Buffer
cmd.Stderr = &stderr cmd.Stderr = &stderr
@ -155,7 +159,9 @@ func (r *Local) Backup(info BackupInfo) error {
func (r *Local) Recover(info RecoverInfo) error { func (r *Local) Recover(info RecoverInfo) error {
fi, _ := os.Open(info.SourceFile) fi, _ := os.Open(info.SourceFile)
defer fi.Close() defer fi.Close()
cmd := exec.Command("docker", "exec", "-i", r.ContainerName, "pg_restore", "-F", "c", "-c", "-U", r.Username, "-d", info.Name) cmd := exec.Command("docker", "exec", r.ContainerName, "sh", "-c",
fmt.Sprintf("PGPASSWORD=%s pg_dump -F c -U %s -d %s", r.Password, r.Username, info.Name),
)
if strings.HasSuffix(info.SourceFile, ".gz") { if strings.HasSuffix(info.SourceFile, ".gz") {
gzipFile, err := os.Open(info.SourceFile) gzipFile, err := os.Open(info.SourceFile)
if err != nil { if err != nil {

View file

@ -48,7 +48,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { computed, useSlots } from 'vue'; import { computed, useSlots, ref } from 'vue';
defineOptions({ name: 'DrawerPro' }); defineOptions({ name: 'DrawerPro' });
import i18n from '@/lang'; import i18n from '@/lang';
import { GlobalStore } from '@/store'; import { GlobalStore } from '@/store';

View file

@ -4,67 +4,68 @@
:header="$t('commons.button.' + operateReq.operate)" :header="$t('commons.button.' + operateReq.operate)"
:resource="resourceName" :resource="resourceName"
@close="handleClose" @close="handleClose"
v-loading="loading"
> >
<el-descriptions direction="vertical"> <div v-loading="loading">
<el-descriptions-item> <el-descriptions direction="vertical">
<el-link @click="toLink(app.website)"> <el-descriptions-item>
<el-icon><OfficeBuilding /></el-icon> <el-link @click="toLink(app.website)">
<span>{{ $t('app.appOfficeWebsite') }}</span> <el-icon><OfficeBuilding /></el-icon>
</el-link> <span>{{ $t('app.appOfficeWebsite') }}</span>
</el-descriptions-item> </el-link>
<el-descriptions-item> </el-descriptions-item>
<el-link @click="toLink(app.document)"> <el-descriptions-item>
<el-icon><Document /></el-icon> <el-link @click="toLink(app.document)">
<span>{{ $t('app.document') }}</span> <el-icon><Document /></el-icon>
</el-link> <span>{{ $t('app.document') }}</span>
</el-descriptions-item> </el-link>
<el-descriptions-item> </el-descriptions-item>
<el-link @click="toLink(app.github)"> <el-descriptions-item>
<el-icon><Link /></el-icon> <el-link @click="toLink(app.github)">
<span>{{ $t('app.github') }}</span> <el-icon><Link /></el-icon>
</el-link> <span>{{ $t('app.github') }}</span>
</el-descriptions-item> </el-link>
</el-descriptions> </el-descriptions-item>
<el-form @submit.prevent ref="updateRef" :rules="rules" label-position="top" :model="operateReq"> </el-descriptions>
<el-form-item :label="$t('app.versionSelect')" prop="detailId"> <el-form @submit.prevent ref="updateRef" :rules="rules" label-position="top" :model="operateReq">
<el-select v-model="operateReq.version" @change="getVersions(operateReq.version)"> <el-form-item :label="$t('app.versionSelect')" prop="detailId">
<el-option <el-select v-model="operateReq.version" @change="getVersions(operateReq.version)">
v-if="operateReq.operate == 'ignore'" <el-option
:value="'all'" v-if="operateReq.operate == 'ignore'"
:label="$t('commons.table.all') + $t('app.version')" :value="'all'"
></el-option> :label="$t('commons.table.all') + $t('app.version')"
<el-option ></el-option>
v-for="(version, index) in versions" <el-option
:key="index" v-for="(version, index) in versions"
:value="version.version" :key="index"
:label="version.version" :value="version.version"
></el-option> :label="version.version"
</el-select> ></el-option>
</el-form-item> </el-select>
<el-form-item prop="backup" v-if="operateReq.operate === 'upgrade'"> </el-form-item>
<el-checkbox v-model="operateReq.backup" :label="$t('app.backupApp')" /> <el-form-item prop="backup" v-if="operateReq.operate === 'upgrade'">
<span class="input-help"> <el-checkbox v-model="operateReq.backup" :label="$t('app.backupApp')" />
<el-text type="warning">{{ $t('app.backupAppHelper') }}</el-text> <span class="input-help">
</span> <el-text type="warning">{{ $t('app.backupAppHelper') }}</el-text>
</el-form-item> </span>
<el-form-item prop="pullImage" v-if="operateReq.operate === 'upgrade'"> </el-form-item>
<el-checkbox v-model="operateReq.pullImage" :label="$t('app.pullImage')" size="large" /> <el-form-item prop="pullImage" v-if="operateReq.operate === 'upgrade'">
<span class="input-help">{{ $t('app.pullImageHelper') }}</span> <el-checkbox v-model="operateReq.pullImage" :label="$t('app.pullImage')" size="large" />
</el-form-item> <span class="input-help">{{ $t('app.pullImageHelper') }}</span>
</el-form> </el-form-item>
</el-form>
<div v-if="operateReq.operate === 'upgrade'"> <div v-if="operateReq.operate === 'upgrade'">
<el-text type="warning">{{ $t('app.upgradeWarn') }}</el-text> <el-text type="warning">{{ $t('app.upgradeWarn') }}</el-text>
<br /> <br />
<el-button @click="openDiff()" type="primary">{{ $t('app.showDiff') }}</el-button> <el-button @click="openDiff()" type="primary">{{ $t('app.showDiff') }}</el-button>
<div> <div>
<el-checkbox v-model="useNewCompose" :label="$t('app.useCustom')" size="large" /> <el-checkbox v-model="useNewCompose" :label="$t('app.useCustom')" size="large" />
</div>
<div v-if="useNewCompose">
<el-text type="danger">{{ $t('app.useCustomHelper') }}</el-text>
</div>
<CodemirrorPro v-if="useNewCompose" v-model="newCompose" mode="yaml"></CodemirrorPro>
</div> </div>
<div v-if="useNewCompose">
<el-text type="danger">{{ $t('app.useCustomHelper') }}</el-text>
</div>
<CodemirrorPro v-if="useNewCompose" v-model="newCompose" mode="yaml"></CodemirrorPro>
</div> </div>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">