当前位置: 首页 > news >正文

PostgreSQL表备份并重命名出现索引、外键仍指向旧表,恢复后仍失败的问题

文章目录

  • 问题描述
  • 原因分析
  • 解决方法
  • 总结

问题描述

遇到一个问题,在使用pgsql的时候,将其中几张表复制备份,原表导入增量数据,后面将复制的表和原表调换名称使用,结果引用过原表的其他表,外键仍然指向原表(但名称已发生变化),而且复制的表索引名称也与原表不同,导致使用这个数据库的系统报错,找不到外键、索引等,引发接口响应异常。随后将复制表和原表的索引、外键也还原,但依旧无法正常调用接口。
在这里插入图片描述

原因分析

  • 外键约束名称未改变:虽然重命名了表,但外键约束的名称仍然保持原样
  • 系统目录表未更新:PostgreSQL的pg_constraint、pg_index等系统表仍然记录着旧的依赖关系
  • 索引名称冲突:PostgreSQL会自动为重命名表上的索引添加后缀,导致名称不一致
  • 系统缓存未更新:PostgreSQL可能缓存了旧的依赖关系
  • 序列号不同步:如果表有自增字段,序列可能没有正确切换
  • 触发器状态:可能有些触发器仍然处于禁用状态

解决方法

  • 方案1:使用完整的表交换流程

    -- 1. 禁用外键约束
    ALTER TABLE 子表1 DISABLE TRIGGER ALL;
    ALTER TABLE 子表2 DISABLE TRIGGER ALL;-- 2. 重命名表(使用事务保证原子性)
    BEGIN;
    ALTER TABLE 原表 RENAME TO 原表_backup;
    ALTER TABLE 备份表 RENAME TO 原表;
    COMMIT;-- 3. 重新创建外键约束
    ALTER TABLE 子表1 
    DROP CONSTRAINT 原外键约束名,
    ADD CONSTRAINT 新外键约束名 FOREIGN KEY (字段) REFERENCES 原表(字段);-- 4. 启用外键约束
    ALTER TABLE 子表1 ENABLE TRIGGER ALL;
    
  • 方案2:使用模式切换(推荐)

    -- 1. 将备份表放在不同模式中
    CREATE SCHEMA IF NOT EXISTS backup_schema;
    ALTER TABLE 备份表 SET SCHEMA backup_schema;-- 2. 切换搜索路径或使用完整限定名
    SET search_path TO backup_schema, public;-- 3. 应用程序中使用模式限定表名
    SELECT * FROM backup_schema.表名;
    
  • 方案3:使用视图进行抽象

    -- 创建视图指向当前活跃的表
    CREATE OR REPLACE VIEW 当前表 AS SELECT * FROM 原表;-- 需要切换时
    CREATE OR REPLACE VIEW 当前表 AS SELECT * FROM 备份表;
    
  • 彻底检查脚本

    -- 检查外键约束
    SELECT tc.table_name, tc.constraint_name, ccu.table_name AS referenced_table_name
    FROM information_schema.table_constraints AS tc 
    JOIN information_schema.constraint_column_usage AS ccu
    ON tc.constraint_name = ccu.constraint_name
    WHERE tc.constraint_type = 'FOREIGN KEY';
    -- 检查索引
    SELECT indexname, tablename 
    FROM pg_indexes 
    WHERE tablename IN ('原表', '备份表');
    -- 检查依赖关系
    SELECT classid::regclass,objid::regclass,refclassid::regclass,refobjid::regclass
    FROM pg_depend 
    WHERE objid IN (SELECT oid FROM pg_class WHERE relname IN ('原表', '备份表')
    );
    

总结

  • 虽然最终通过dump恢复了数据,但在执行类似复制表一定要注意外键约束,还有pgsql特有的同一数据库下索引不重名的问题。
  • 彻底检查所有依赖关系,确保外键、索引、序列、触发器等都正确同步
  • 禁用外键

以上为个人学习分享,如有问题,欢迎指出:)

http://www.dtcms.com/a/410282.html

相关文章:

  • 【生态再升级】IvorySQL 4.5 与银河麒麟高级服务器操作系统V11完成适配认证!
  • 智慧团建系统官方网站登录网站制作 呼和浩特
  • 个体商户建自己的网站做销售小广告怎么能弄干净
  • 设计模式(C++)详解——迭代器模式(2)
  • perl踩坑系列=====正则表达式捕获
  • MQ-2烟雾传感器详解——从工作原理到实际应用
  • Ubuntu启动终端时默认窗口最大化
  • 整站seo排名郑州经济技术开发区政务服务中心
  • 求一些做里番的网站php网站建设实训引言
  • 嵌入用户idea到大模型并针对Verilog语言生成任务的微调实验报告
  • 【AI算力系统设计分析】1000PetaOps 算力云计算系统设计方案(大模型训练推理专项版)
  • JAVA露营基地预约户外露营预约下单系统小程序
  • ✨WPF编程基础【1.2】:XAML中的属性
  • 【MySQL】性能优化与核心机制深度解析
  • 珠海 网站建设和推广网站建设服务方案ppt模板下载
  • JUC:AQS源码分析(三)
  • 极简文件列表
  • CSS Grid 网格布局完整指南:从容器到项目,实战详解
  • 百度手机模板网站阿里云WordPress主题
  • 批量获取oracle的AWR报告方法
  • docker jenkins gitlab 流水线构建
  • MySQL 配置调优参数:从基础到生产级优化指南
  • 旅游网站设计模板cdr里做网站超级链接
  • TypeScript + React + Ant Design 前端架构入门:搭建一个 Flask 个人博客前端
  • 小九源码-springboot051-智能推荐旅游平台
  • 网站建设面试问题网站建设 学习 长沙
  • 【云原生】openebs-device+cstor存储方案部署
  • 破译古籍密码,HisDoc-DETR论文解读
  • Kafka 面试题及详细答案100道(66-80)-- 运维与部署
  • 衡阳网站优化公司个人网站可以做音乐吗