使用pg作为元数据引擎时,在已经格式化的情况下提示:database is not formatted,please run juicefs format #2636
-
使用redis时正常,但使用pg时,format正常,mount时会提示未format,该如何排查问题在哪 |
Beta Was this translation helpful? Give feedback.
Replies: 3 comments 1 reply
-
你好,经过测试是schema导致的,查看源码xorm默认的schema是 func (db *postgres) getSchema() string {
if db.uri.Schema != "" {
return db.uri.Schema
}
return DefaultPostgresSchema
} juicefs在format时使用了用户默认的schema,但随后load时,却使用xorm默认的 func (m *dbMeta) doLoad() (data []byte, err error) {
err = m.roTxn(func(ses *xorm.Session) error {
if ok, err := ses.IsTableExist(&setting{}); err != nil {
return err
} else if !ok {
return nil
}
s := setting{Name: "format"}
ok, err := ses.Get(&s)
if err == nil && ok {
data = []byte(s.Value)
}
return err
})
return
} xorm: func (db *postgres) IsTableExist(queryer core.Queryer, ctx context.Context, tableName string) (bool, error) {
if len(db.getSchema()) == 0 {
return db.HasRecords(queryer, ctx, `SELECT tablename FROM pg_tables WHERE tablename = $1`, tableName)
}
return db.HasRecords(queryer, ctx, `SELECT tablename FROM pg_tables WHERE schemaname = $1 AND tablename = $2`,
db.getSchema(), tableName)
} 希望可以修复这个问题,比如提供选项或者param设置schema,或者可以正确使用当前用户默认的schema,保证format与mount一致 |
Beta Was this translation helpful? Give feedback.
-
能否提供下复现的命令参数? |
Beta Was this translation helpful? Give feedback.
-
的确会有这个问题,因为 xorm 对 search_path 没有支持。为了支持在非 public 的 schema 中使用 juicefs ,我们会对 search_path 进行限制,只允许用户填一个 schema。?search_path=juicefs,public 将不会被允许。限制后,juicefs 使用的 schema 默认为 public,如果用户设置了 search_path 则 schema 改为 search_path 中设置的 schema。 这个问题将会在 #2663 中解决 |
Beta Was this translation helpful? Give feedback.
的确会有这个问题,因为 xorm 对 search_path 没有支持。为了支持在非 public 的 schema 中使用 juicefs ,我们会对 search_path 进行限制,只允许用户填一个 schema。?search_path=juicefs,public 将不会被允许。限制后,juicefs 使用的 schema 默认为 public,如果用户设置了 search_path 则 schema 改为 search_path 中设置的 schema。
比如设置 ?search_path=pguser1 juicefs 则使用 pguser1这个 schema 进行操作
这个问题将会在 #2663 中解决