结论:提前创建数据库再执行docker exec -u postgres -i [postgres_container] pg_restore -d postgres < ~/db.backup
起因是想把使用pg_dump
导出的本地数据导入到云端,就用了下面这个命令
docker exec -u postgres [postgres_container] pg_restore -C -d postgres < ~/db.backup
命令敲进去之后发现终端就没声了,Ctrl + C
可以正常 kill 掉,但是不 kill 它就不会有任何输出,开一晚上也不会有任何反应。
经过研究,发现应该加个 -i
:
docker exec -u postgres -i [postgres_container] pg_restore -C -d postgres < ~/db.backup
-h
文档里是这样写的:
-i, --interactive Keep STDIN open even if not attached
所以我命令中加上-i
才能够让在我没有 attach 到容器的情况下正常导入文件。(我的理解)
加上这个-i
之后可算有反应了,虽然是报错
pg_restore: [archiver (db)] connection to database "postgres" failed: FATAL: database "postgres" does not exist
文档里对-C
的描述是
-C, --create create the target database
我就以为它会自己创建数据库,然而不是的,参考 why pg_restore ignores –create?
当-C
和-d
一起用的时候会,-d
后的数据库会被当作 launchpad 而不是目标。
所以要达到我的目的,最好就是先删除数据库,再重新创建数据库,然后再导入: 1
2
3docker exec -u postgres [postgres_container] dropdb postgres
docker exec -u postgres [postgres_container] createdb postgres
docker exec -u postgres -i [postgres_container] pg_restore -d postgres < ~/db.backup
感觉我对 Docker 和 PostgreSQL 的理解都很浅……