背景
开发使用postgresql 数据库,当需要部署时,通过pg_dump导出,通过pg_restore导入,发现导入遇到错误,很多表没有导入。部分报错截图如下:
排查问题
开发中用到了postgresql插件postgis里的地理类型,所以用sql 导出会有很多问题。于是使用pg_dump导出。导出命令如下:
pg_dump -h localhost -p 15431 -U postgres -F c -b -v -d test1 -x -O -f D:\databases\test1.dump
1.本地试验(没有带postgis插件)
使用不带postgis插件的镜像测试,使用docker环境
docker run --name some-postgres -e POSTGRES_PASSWORD=dev@local -v E:\docker-postgis:/var/lib/postgresql/data -p 15432:5432 -d postgres:12.0-alpine
首先创建数据库,然后创建用户,之后给用户授予此新建数据库的权限,截图如下:
下图可知此镜像没有postgis插件
导入命令:
pg_restore -h localhost -p 5432 -U test -d test -c -v -x -O /var/lib/postgresql/data/theamtic_map.dump
报错:
之后给用户授予superuser权限
ALTER USER test WITH SUPERUSER;
再继续导入,发现报错减少。
2.带postgis插件的镜像试验
同样创建用户,创建数据库,给用户授予操作数据库所有的权限,报错如下:
之后修改用户为superuser,alter user test with superuser;
导入
pg_restore -h localhost -p 5432 -U test -d test -c -v -x -O /var/lib/postgresql/data/theamtic_map.dump
导入成功
报的95个错误是因为新的数据库,有些索引不存在
查询可知postgis插件存在
总结
pg_restore导入成功,第一需要安装的postgresql安装了postgis插件,第二创建的用户要具有superuser权限。
部分查看和创建语句
1.没有postgis插件的镜像
docker run --name some-postgres -e POSTGRES_PASSWORD=dev@local -v E:\docker-postgis:/var/lib/postgresql/data -p 15432:5432 -d postgres:12.0-alpine
通过
docker exec -it container_id /bin/bash
登录数据库
psql -U postgres -h localhost -p 5432
创建数据库
create database test;
创建用户
CREATE USER test WITH PASSWORD 'dev@local';
给用户授予数据库权限
GRANT ALL PRIVILEGES ON DATABASE dbname TO user;
给用户授予superuser
ALTER USER your_username WITH SUPERUSER;
查看用户
\du
一旦登录,如果您想切换到另一个用户,比如myuser,您可以使用以下命令:
\c mydatabase myuser
列出所有数据库
\l
查询postgis版本
select postgis_version();
查询postgresql 版本
select version();
查看postgresql data目录
SHOW data_directory;
导入数据库
pg_restore -h localhost -p 5432 -U test -d test -c -v -x -O /var/lib/postgresql/data/theamtic_map.dump
2.有postgis的镜像
docker run -d --name fct-postgis-12-3.0 -p 54321:5432 -e POSTGRES_PASSWORD=dev@local -v E:\docker-postgis2:/data geographica/postgis:latest