You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL跨库迁移时源库数据莫名丢失问题求助

PostgreSQL跨库迁移时源库数据丢失问题排查与修复

排查方向

1. 数据库连接配置混淆

  • 检查connect.py中目标库zno_db_norm的连接参数是否写错成了源库zno_db,导致执行建表脚本时实际操作的是源库而非目标库。
  • 确认main.py中调用table.py执行目标库建表操作时,是否正确切换了连接对象,有没有出现连接复用、未重新初始化的情况。

2. SQL脚本的上下文错误

  • 检查2_NORMAL_TABLE.sql中的DROP TABLE语句是否未指定数据库前缀,且执行时的连接上下文是源库:比如脚本写DROP TABLE IF EXISTS educate_organisation;,若此时连接的是zno_db,就会误删源库的对应表。
  • 排查脚本中是否存在跨库操作的错误写法,比如误将目标库表写成zno_db.educate_organisation。

3. 事务与执行顺序异常

  • 确认main.py是否将源库数据迁移和目标库建表操作放在了同一个事务中,导致异常回滚时误删源库数据(此可能性较低,但需排查)。

修复方案

1. 严格隔离源/目标库连接

  • 在connect.py中创建独立的连接函数:get_source_conn()(连接zno_db)和get_target_conn()(连接zno_db_norm),明确区分两类连接,禁止复用混淆。
  • 执行SQL时强制绑定对应连接:比如执行目标库建表脚本,必须传入get_target_conn()返回的连接对象。

2. 给SQL表名添加数据库前缀

  • 修改2_NORMAL_TABLE.sql中的所有DDL语句,显式指定目标库,避免上下文错误导致误操作:
    DROP TABLE IF EXISTS zno_db_norm.educate_organisation;
    CREATE TABLE zno_db_norm.educate_organisation (
        -- 表结构定义
    );
    

3. 增加连接校验逻辑

  • 在table.py的SQL执行函数中,添加当前连接数据库的校验,执行目标库操作前先确认连接的是zno_db_norm:
    def execute_sql(conn, sql_file):
        with conn.cursor() as cur:
            cur.execute("SELECT current_database();")
            current_db = cur.fetchone()[0]
            # 针对目标库建表脚本做校验
            if "2_NORMAL_TABLE.sql" in sql_file and current_db != "zno_db_norm":
                raise ValueError(f"执行目标库建表脚本时,当前连接数据库为{current_db},预期为zno_db_norm")
            # 读取并执行SQL
            with open(sql_file, 'r') as f:
                cur.execute(f.read())
            conn.commit()
    

4. 强制备份前置操作

  • 在执行步骤4的目标库建表操作前,自动对源库zno_db做备份,用pg_dump在Python中调用实现:
    import subprocess
    def backup_source_db():
        subprocess.run([
            "pg_dump",
            "-d", "zno_db",
            "-f", "zno_db_backup.sql"
        ], check=True)
    

内容的提问来源于stack exchange,提问作者Alex_K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 04:35:06