[功能] 添加遗留观察性索引和表的删除逻辑,优化数据库迁移过程

This commit is contained in:
ryan
2026-03-19 20:26:18 +08:00
parent 8737e146d1
commit a1b3204204
2 changed files with 139 additions and 4 deletions
+72 -2
View File
@@ -320,19 +320,88 @@ func renameLegacyObservabilityShardTables(db *gorm.DB) error {
if err := db.Migrator().RenameTable(table, legacyTable); err != nil {
return fmt.Errorf("rename sharded table %s to %s failed: %w", table, legacyTable, err)
}
if err := dropLegacyObservabilitySecondaryIndexes(db, legacyTable); err != nil {
return err
}
}
}
return nil
}
func dropLegacyObservabilitySecondaryIndexes(db *gorm.DB, table string) error {
db = sessionIgnoringSharding(db)
if db == nil {
return fmt.Errorf("database handle is nil")
}
backend := baseDialector(db).Name()
indexes := make([]string, 0)
switch backend {
case "sqlite":
if err := db.Raw(
`SELECT name FROM sqlite_master WHERE type = 'index' AND tbl_name = ? AND name LIKE 'idx_%'`,
table,
).Scan(&indexes).Error; err != nil {
return fmt.Errorf("list indexes for %s failed: %w", table, err)
}
case "postgres":
if err := db.Raw(
`SELECT indexname FROM pg_indexes WHERE schemaname = current_schema() AND tablename = ? AND indexname LIKE 'idx_%'`,
table,
).Scan(&indexes).Error; err != nil {
return fmt.Errorf("list indexes for %s failed: %w", table, err)
}
default:
return fmt.Errorf("unsupported database backend %s", backend)
}
for _, indexName := range indexes {
if err := db.Exec(fmt.Sprintf(`DROP INDEX IF EXISTS "%s"`, indexName)).Error; err != nil {
return fmt.Errorf("drop legacy index %s failed: %w", indexName, err)
}
}
return nil
}
func autoMigrateObservabilityShardTables(db *gorm.DB) error {
db = sessionIgnoringSharding(db)
if db == nil {
return fmt.Errorf("database handle is nil")
}
dialector := baseDialector(db)
if dialector == nil {
return fmt.Errorf("database dialector is nil")
}
type shardedTable struct {
model any
base string
}
tables := []shardedTable{
{model: &NodeMetricSnapshot{}, base: "node_metric_snapshots"},
{model: &NodeRequestReport{}, base: "node_request_reports"},
{model: &NodeAccessLog{}, base: "node_access_logs"},
}
for _, item := range tables {
for _, table := range observabilityShardTables(item.base) {
tx := db.Table(table)
if err := dialector.Migrator(tx).AutoMigrate(item.model); err != nil {
return fmt.Errorf("auto migrate sharded table %s failed: %w", table, err)
}
}
}
return nil
}
func dropLegacyObservabilityShardTables(db *gorm.DB) error {
db = sessionIgnoringSharding(db)
if db == nil {
return fmt.Errorf("database handle is nil")
}
for _, baseTable := range shardedObservabilityBaseTables() {
for _, table := range observabilityShardTables(baseTable) {
legacyTable := legacyObservabilityShardTableName(table)
if !db.Migrator().HasTable(legacyTable) {
continue
}
if err := db.Migrator().DropTable(legacyTable); err != nil {
if err := db.Exec(fmt.Sprintf(`DROP TABLE IF EXISTS "%s"`, legacyTable)).Error; err != nil {
return fmt.Errorf("drop legacy sharded table %s failed: %w", legacyTable, err)
}
}
@@ -461,10 +530,11 @@ func migrateObservabilityShardsToID(db *gorm.DB, backend string) error {
if db == nil {
return fmt.Errorf("database handle is nil")
}
_ = backend
if err := renameLegacyObservabilityShardTables(db); err != nil {
return err
}
if err := applyCurrentSchema(db, backend); err != nil {
if err := autoMigrateObservabilityShardTables(db); err != nil {
return err
}
if err := migrateLegacyNodeMetricSnapshots(db); err != nil {