我一直在将数据插入 PostgreSQL DB,并收到错误消息:
psycopg2.OperationalError: could not extend file "base/16384/61892": No space left on device
HINT: Check free disk space
我正在使用 CentOS 7,并且检查了我的 Linux 机器上的一些状态:
df -h
我对 Linux 还很陌生,根据我的df -h
命令结果,我发现 Linux 存储系统的工作方式与 Windows 不同。
看起来 PostgreSQL 正在推送到/dev/mapper/centos-root
,但是只有 50 GB 可用。
问题 1:我该如何改变它?我该如何将可用的额外空间分配/dev/mapper/centos-home
给我的~/centos-root
目录?
问题2:我的机器有两个硬盘,每个 200 GB。但根据我的df-h
命令,似乎只有 200GB 可用。为什么会这样?我如何才能充分利用 400GB 空间?
看起来问题在于我的表/dev/mapper/centos-root
已全部填满。我在 PostgreSQL 中插入了近 10,000,000 行、12 列的数据。
问题 3:这个足够大到占用 50GB 的空间吗?
谢谢!
编辑: 的输出pvs
,,vgs
lvs
答案1
您的服务器分区不当。这不能完全怪您,而是我认为默认的 RHEL/CentOS 设置非常具有误导性。
让我们从上面输入的命令的描述开始pvs; vgs; lvs
。它们都与LVM2
,一个逻辑卷管理器,简而言之,它使您能够创建“灵活的”、可调整大小的分区:
pvs
显示物理磁盘如何连接到 LVM 系统。您有 2 个 200 GB 磁盘,但pvs
仅显示 1 个 200 GB 物理设备。这意味着您的磁盘处于 RAID1(镜像)中,并且它们已完全分配给 LVM(即:没有未分配的物理空间);vgs
显示分配给您的物理设备的卷组和任何可用的可用空间。 您的可用空间小于 4 MB,因此基本上没有可用空间。 下一个命令解释了哪些内容在使用您的空间...lvs
显示您有两个逻辑卷(将它们视为分区):一个 50 GB 的根卷和一个 ~145 GB 的主卷。简而言之,您的root
卷(PostgreSQL 所在的位置)比您的需求小得多;相反,home
考虑到它包含的数据很少(< 5GB),您的卷非常大。
为了解决这个问题,你有两个选择:
将 PostgreSQL 重新定位到
home
卷下,例如 下/home/pgsl
。我会避免这样做,因为/home
不是数据库的正确位置,而且它将要造成未来的管理负担。此外,您需要将 SELinux 置于宽容模式(setenforce 0
+/etc/selinux/config
编辑)以使重定位工作;缩小
home
卷并放大root
。这说起来容易做起来难,特别是如果您使用的是 XFS(默认的 RHEL/CentOS 文件系统),它不支持缩小。
当且仅当您的数据home
可能会被删除/重新加载,您可以按照以下步骤操作删除音量home
和放大root
。请注意,一个小错误(我的和你的)将要销毁你的数据(杀死 100 公里范围内的任何猫),所以我采取不承担任何责任最终结果。如果你不确定,停止这里并打电话给专业的系统管理员以获得支持。好的,让我们继续;我将发布一个带有相关描述的命令序列:
umount /home
:这将卸载(即“禁用”)主卷;lvremove centos/home
: 这永久摧毁/home
和全部其内容;lvextend centos/root -L +100G
:这root
将使卷扩大 100 GB;xfs_growfs /
:假设您使用的是 XFS,这将扩展根文件系统以匹配底层扩展卷。如果您使用的是ext4
(这不太可能),则需要发出resize2fs /dev/centos/root
。