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
相关产品推荐
相关产品推荐

