数据库导入导出是最常用的功能之一. PostgreSQL 的备份工具可以使用 pg_dump 及 pg_dumpall. 可以通过 pg_dump --help 获取其使用方法. 这里不对其做过多介绍. 主要介绍在使用 pg_dump 及恢复过程中遇到的一个问题.
1, 问题
使用 pg_dump -c 导出后, 通过 psql 导入时报下面的错误:
- ERROR: relation "t1" already exists
- ERROR: duplicate key value violates unique constraint "t1_pkey"
- ERROR: multiple primary keys for table "t1" are not allowed
2, 导入导出的操作
- pg_dump -U postgres -d yzs -Fa -c -C -f all.sql
- psql < all.sql
3, 问题分析
1) 通过 - c 导出时在重建 database 前先 drop
2) 通过 - C 导出时导出时导出 create database 语句
3) 每次导入时, 虽然库中已有导入的表结构和部分数据, 及先执行 drop database 语句清空, 应该不会出现表已存在等错误, 但是这种错误确实出现了. 原来, 在导入时, 只要已有连接连着这个 database,drop 语句就不会执行成功, 导致清理数据库失败, 后续执行对应语句时会报已存在, 重复键, 多个主键等错误.
4, 解决方法
1)pg_dump 导出时, 没有选项使导出的语句中带 if not exists, 不能使之不存在时再创建或插入.
2) 保证没有业务连接数据库时才导入, 或向一个干净的数据库进行导入
来源: http://www.linuxidc.com/Linux/2019-04/158143.htm