diff --git a/agent/app/dto/database.go b/agent/app/dto/database.go
index 455695377..f08ae3e0e 100644
--- a/agent/app/dto/database.go
+++ b/agent/app/dto/database.go
@@ -281,14 +281,15 @@ type DatabaseItem struct {
}
type DatabaseCreate struct {
- Name string `json:"name" validate:"required,max=256"`
- Type string `json:"type" validate:"required"`
- From string `json:"from" validate:"required,oneof=local remote"`
- Version string `json:"version" validate:"required"`
- Address string `json:"address"`
- Port uint `json:"port"`
- Username string `json:"username" validate:"required"`
- Password string `json:"password"`
+ Name string `json:"name" validate:"required,max=256"`
+ Type string `json:"type" validate:"required"`
+ From string `json:"from" validate:"required,oneof=local remote"`
+ Version string `json:"version" validate:"required"`
+ Address string `json:"address"`
+ Port uint `json:"port"`
+ InitialDB string `json:"initialDB"`
+ Username string `json:"username" validate:"required"`
+ Password string `json:"password"`
SSL bool `json:"ssl"`
RootCert string `json:"rootCert"`
diff --git a/agent/app/model/database.go b/agent/app/model/database.go
index b6f0a0bb9..9770c7eaf 100644
--- a/agent/app/model/database.go
+++ b/agent/app/model/database.go
@@ -9,6 +9,7 @@ type Database struct {
From string `json:"from" gorm:"not null"`
Address string `json:"address" gorm:"not null"`
Port uint `json:"port" gorm:"not null"`
+ InitialDB string `json:"initialDB"`
Username string `json:"username"`
Password string `json:"password"`
diff --git a/agent/app/service/database.go b/agent/app/service/database.go
index 648ddeca4..24c0ecd9e 100644
--- a/agent/app/service/database.go
+++ b/agent/app/service/database.go
@@ -122,12 +122,13 @@ func (u *DatabaseService) CheckDatabase(req dto.DatabaseCreate) bool {
switch req.Type {
case constant.AppPostgresql:
_, err := postgresql.NewPostgresqlClient(pgclient.DBInfo{
- From: "remote",
- Address: req.Address,
- Port: req.Port,
- Username: req.Username,
- Password: req.Password,
- Timeout: req.Timeout,
+ From: "remote",
+ Address: req.Address,
+ Port: req.Port,
+ InitialDB: req.InitialDB,
+ Username: req.Username,
+ Password: req.Password,
+ Timeout: req.Timeout,
})
return err == nil
case constant.AppRedis:
diff --git a/agent/init/migration/migrate.go b/agent/init/migration/migrate.go
index 208dee796..9adf68fb7 100644
--- a/agent/init/migration/migrate.go
+++ b/agent/init/migration/migrate.go
@@ -52,6 +52,7 @@ func InitAgentDB() {
migrations.UpdateCronJob,
migrations.UpdateTensorrtLLM,
migrations.AddIptablesFilterRuleTable,
+ migrations.UpdateDatabase,
})
if err := m.Migrate(); err != nil {
global.LOG.Error(err)
diff --git a/agent/init/migration/migrations/init.go b/agent/init/migration/migrations/init.go
index 651cd1bf0..03eb0f763 100644
--- a/agent/init/migration/migrations/init.go
+++ b/agent/init/migration/migrations/init.go
@@ -705,3 +705,10 @@ var UpdateTensorrtLLM = &gormigrate.Migration{
return tx.AutoMigrate(&model.TensorRTLLM{})
},
}
+
+var UpdateDatabase = &gormigrate.Migration{
+ ID: "20251117-update-database",
+ Migrate: func(tx *gorm.DB) error {
+ return tx.AutoMigrate(&model.Database{})
+ },
+}
diff --git a/agent/utils/postgresql/client.go b/agent/utils/postgresql/client.go
index e9888ee6b..2a653455a 100644
--- a/agent/utils/postgresql/client.go
+++ b/agent/utils/postgresql/client.go
@@ -33,7 +33,10 @@ func NewPostgresqlClient(conn client.DBInfo) (PostgresqlClient, error) {
}
escapedUsername := url.QueryEscape(conn.Username)
escapedPassword := url.QueryEscape(conn.Password)
- connArgs := fmt.Sprintf("postgres://%s:%s@%s:%d/postgres?sslmode=disable", escapedUsername, escapedPassword, conn.Address, conn.Port)
+ if len(conn.InitialDB) == 0 {
+ conn.InitialDB = escapedUsername
+ }
+ connArgs := fmt.Sprintf("postgres://%s:%s@%s:%d/%s?sslmode=disable", escapedUsername, escapedPassword, conn.Address, conn.Port, conn.InitialDB)
db, err := sql.Open("pgx", connArgs)
if err != nil {
return nil, err
diff --git a/agent/utils/postgresql/client/info.go b/agent/utils/postgresql/client/info.go
index ee04e56b7..5db3a4344 100644
--- a/agent/utils/postgresql/client/info.go
+++ b/agent/utils/postgresql/client/info.go
@@ -5,13 +5,14 @@ import (
)
type DBInfo struct {
- From string `json:"from"`
- Database string `json:"database"`
- Address string `json:"address"`
- Port uint `json:"port"`
- Username string `json:"userName"`
- Password string `json:"password"`
- AppKey string `json:"appKey"`
+ From string `json:"from"`
+ Database string `json:"database"`
+ Address string `json:"address"`
+ Port uint `json:"port"`
+ InitialDB string `json:"initialDB"`
+ Username string `json:"userName"`
+ Password string `json:"password"`
+ AppKey string `json:"appKey"`
Timeout uint `json:"timeout"` // second
}
diff --git a/agent/utils/postgresql/client/local.go b/agent/utils/postgresql/client/local.go
index 9919c1da1..1b6f178b1 100644
--- a/agent/utils/postgresql/client/local.go
+++ b/agent/utils/postgresql/client/local.go
@@ -199,7 +199,7 @@ func (r *Local) SyncDB() ([]SyncDBInfo, error) {
}
for _, line := range lines {
itemLine := strings.TrimLeft(line, " ")
- if len(itemLine) == 0 || itemLine == "postgres" || itemLine == "template1" || itemLine == "template0" || itemLine == r.Username {
+ if len(itemLine) == 0 || itemLine == "template1" || itemLine == "template0" || itemLine == r.Username {
continue
}
datas = append(datas, SyncDBInfo{Name: itemLine, From: "local", PostgresqlName: r.Database})
diff --git a/agent/utils/postgresql/client/remote.go b/agent/utils/postgresql/client/remote.go
index e88de80e4..6e7c64fd7 100644
--- a/agent/utils/postgresql/client/remote.go
+++ b/agent/utils/postgresql/client/remote.go
@@ -215,7 +215,7 @@ func (r *Remote) SyncDB() ([]SyncDBInfo, error) {
if err := rows.Scan(&dbName); err != nil {
continue
}
- if len(dbName) == 0 || dbName == "postgres" || dbName == "template1" || dbName == "template0" || dbName == r.User {
+ if len(dbName) == 0 || dbName == "template1" || dbName == "template0" || dbName == r.User {
continue
}
datas = append(datas, SyncDBInfo{Name: dbName, From: r.From, PostgresqlName: r.Database})
diff --git a/frontend/src/api/interface/database.ts b/frontend/src/api/interface/database.ts
index bde7151d9..c04f86332 100644
--- a/frontend/src/api/interface/database.ts
+++ b/frontend/src/api/interface/database.ts
@@ -274,6 +274,7 @@ export namespace Database {
from: string;
address: string;
port: number;
+ initialDB: string;
username: string;
password: string;
diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts
index 72e503155..1b8a1609b 100644
--- a/frontend/src/lang/modules/en.ts
+++ b/frontend/src/lang/modules/en.ts
@@ -537,6 +537,7 @@ const message = {
caCert: 'CA certificate',
hasCA: 'Has CA certificate',
skipVerify: 'Ignore certificate validity check',
+ initialDB: 'Initial Database',
formatHelper:
'The current database character set is {0}, the character set inconsistency may cause recovery failure',
diff --git a/frontend/src/lang/modules/es-es.ts b/frontend/src/lang/modules/es-es.ts
index b0c66b248..222636846 100644
--- a/frontend/src/lang/modules/es-es.ts
+++ b/frontend/src/lang/modules/es-es.ts
@@ -541,6 +541,8 @@ const message = {
caCert: 'Certificado CA',
hasCA: 'Posee certificado CA',
skipVerify: 'Omitir la verificación de validez del certificado',
+ initialDB: 'Base de Datos Inicial',
+
formatHelper:
'El conjunto de caracteres actual de la base de datos es {0}, la inconsistencia de conjuntos puede causar errores al recuperar',
dropHelper: 'Puede arrastrar y soltar el archivo aquí o',
diff --git a/frontend/src/lang/modules/ja.ts b/frontend/src/lang/modules/ja.ts
index 21194661f..8eb1e4df2 100644
--- a/frontend/src/lang/modules/ja.ts
+++ b/frontend/src/lang/modules/ja.ts
@@ -525,6 +525,7 @@ const message = {
caCert: '証明書として',
hasCA: 'CA証明書があります',
skipVerify: '証明書の有効性チェックを無視します',
+ initialDB: '初期データベース',
formatHelper: '現在のデータベース文字セットは{0}です。文字セットの矛盾は回復の故障を引き起こす可能性があります',
dropHelper: 'ここでアップロードされたファイルをドラッグアンドドロップするか、',
diff --git a/frontend/src/lang/modules/ko.ts b/frontend/src/lang/modules/ko.ts
index c74ae60f5..044244ba8 100644
--- a/frontend/src/lang/modules/ko.ts
+++ b/frontend/src/lang/modules/ko.ts
@@ -523,6 +523,7 @@ const message = {
caCert: 'CA 인증서',
hasCA: 'CA 인증서 있음',
skipVerify: '인증서 유효성 검사 무시',
+ initialDB: '초기 데이터베이스',
formatHelper: '현재 데이터베이스 문자셋은 {0} 입니다. 문자셋 불일치로 인해 복구에 실패할 수 있습니다.',
dropHelper: '여기에 업로드한 파일을 드래그 앤 드롭하거나',
diff --git a/frontend/src/lang/modules/ms.ts b/frontend/src/lang/modules/ms.ts
index 9460339a3..53004fc47 100644
--- a/frontend/src/lang/modules/ms.ts
+++ b/frontend/src/lang/modules/ms.ts
@@ -536,6 +536,7 @@ const message = {
caCert: 'Sijil CA',
hasCA: 'Mempunyai sijil CA',
skipVerify: 'Abaikan pemeriksaan kesahihan sijil',
+ initialDB: 'Pangkalan Data Awal',
formatHelper:
'Set aksara pangkalan data semasa adalah {0}, ketidakkonsistenan set aksara mungkin menyebabkan kegagalan pemulihan.',
diff --git a/frontend/src/lang/modules/pt-br.ts b/frontend/src/lang/modules/pt-br.ts
index ad2733ce4..081bae442 100644
--- a/frontend/src/lang/modules/pt-br.ts
+++ b/frontend/src/lang/modules/pt-br.ts
@@ -534,6 +534,7 @@ const message = {
caCert: 'Certificado CA',
hasCA: 'Possui certificado CA',
skipVerify: 'Ignorar verificação de validade do certificado',
+ initialDB: 'Banco de Dados Inicial',
formatHelper:
'O conjunto de caracteres atual do banco de dados é {0}, a inconsistência no conjunto de caracteres pode causar falha na recuperação',
diff --git a/frontend/src/lang/modules/ru.ts b/frontend/src/lang/modules/ru.ts
index 995160fb0..08225deee 100644
--- a/frontend/src/lang/modules/ru.ts
+++ b/frontend/src/lang/modules/ru.ts
@@ -528,6 +528,7 @@ const message = {
caCert: 'Сертификат CA',
hasCA: 'Есть сертификат CA',
skipVerify: 'Игнорировать проверку действительности сертификата',
+ initialDB: 'Исходная База Данных',
formatHelper:
'Текущая кодировка базы данных - {0}, несоответствие кодировок может привести к ошибке восстановления',
diff --git a/frontend/src/lang/modules/tr.ts b/frontend/src/lang/modules/tr.ts
index 0fc41f2e1..b09c69896 100644
--- a/frontend/src/lang/modules/tr.ts
+++ b/frontend/src/lang/modules/tr.ts
@@ -543,6 +543,8 @@ const message = {
caCert: 'CA sertifikası',
hasCA: 'CA sertifikası var',
skipVerify: 'Sertifika geçerlilik kontrolünü yoksay',
+ initialDB: 'Başlangıç Veritabanı',
+
formatHelper:
'Mevcut veritabanı karakter seti {0}, karakter seti tutarsızlığı kurtarma işleminin başarısız olmasına neden olabilir',
dropHelper: 'Yüklenen dosyayı buraya sürükleyip bırakabilir veya',
diff --git a/frontend/src/lang/modules/zh-Hant.ts b/frontend/src/lang/modules/zh-Hant.ts
index a052e7d91..2d448a24c 100644
--- a/frontend/src/lang/modules/zh-Hant.ts
+++ b/frontend/src/lang/modules/zh-Hant.ts
@@ -516,6 +516,7 @@ const message = {
hasCA: '擁有 CA 證書',
caCert: 'CA 證書',
skipVerify: '忽略校驗證書可用性檢測',
+ initialDB: '初始資料庫',
formatHelper: '目前資料庫字元集為 {0},字元集不一致可能導致復原失敗',
dropHelper: '將上傳文件拖曳到此處,或者',
diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts
index 059fd5d77..55504ed39 100644
--- a/frontend/src/lang/modules/zh.ts
+++ b/frontend/src/lang/modules/zh.ts
@@ -517,6 +517,7 @@ const message = {
hasCA: '拥有 CA 证书',
caCert: 'CA 证书',
skipVerify: '忽略校验证书可用性检测',
+ initialDB: '初始数据库',
formatHelper: '当前数据库字符集为 {0},字符集不一致可能导致恢复失败',
dropHelper: '将上传文件拖拽到此处,或者',
diff --git a/frontend/src/views/database/postgresql/remote/operate/index.vue b/frontend/src/views/database/postgresql/remote/operate/index.vue
index 57b618bcb..5ff32d6ab 100644
--- a/frontend/src/views/database/postgresql/remote/operate/index.vue
+++ b/frontend/src/views/database/postgresql/remote/operate/index.vue
@@ -25,6 +25,9 @@
+
+
+
{{ $t('database.pgUserHelper') }}