上下文
为了在CI管道中进行本地开发和测试,我想要一个postgres docker镜像,其中包含一些从生产中采样的数据(几十MB)。我将定期重建此图像,以确保采样数据保持最新。
我完全不在乎数据完整性,但是在运行时我非常在乎图像大小和容器磁盘/内存使用情况。启动时间最多应为几分钟。
我构建了什么
我有一个构建在官方postgres(postgis)Docker镜像之一之上的docker文件,但它实际上是初始化数据库并使用pg_restore
插入我的示例数据。
尝试优化
我使用mutlistage构建,只是将postgres目录复制到最终镜像中(这有助于构建过程中使用的节点)。
我注意到pg_xlog
目录很大,在逻辑上似乎多余,因为在密封图像之前我会很乐意检查点并抛弃任何WAL。我不知道如何摆脱它。我尝试使用以下标志启动postgres:-min_wal_size=2 --max_wal_size=3 --archive_mode=off --wal_keep_segments
并运行Checkpoint
并等待几秒钟,但似乎没有任何改变。我还尝试删除目录的内容,但这似乎在下次启动时破坏了数据库。
除了将实际的数据库放置在镜像中之外,我还可以在镜像中保留一个pg_dump
文件,并让镜像入口点从中建立数据库。我认为这将改善图像大小(尽管我不清楚为什么数据库比转储占用更多的空间,除非索引特别大-我实际上认为转储格式没有数据库本身那么紧凑,所以这可能会抵消索引大小)。显然,这会影响启动时间(但不会如此)。
摘要/问题
我要这样做正确吗?如果是这样,我可以使用哪种磁盘/内存优化?我尤其可以删除/缩小pg_xlog
吗?
我正在使用Postgres 9.5
和Postgis 2.X
。
最佳答案
服务器运行过的max_wal_size是否大于3?如果是这样,它可以通过将旧的wal文件重命名以供将来使用来“回收”很多wal文件。一旦将它们重命名,即使以后减小max_wal_size,也不会删除它们,直到使用它们。
I also tried deleting the contents of the directory, but that seemed to break the database on its next startup.
您可以使用pg_resetxlog修复它。只是不要养成盲目的运行的习惯,在测试环境之外运行非常危险。
关于postgresql - 优化包含测试数据的dockerized postgres数据库的(磁盘/内存),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61227449/