我有一个在 Unix 上运行 Postgres 的 Azure VM,由 Bitnami 提供:PostgreSQL 9.6.2-0(Ubuntu 14.04)
数据库运行良好并且我正在填充它,但是过了一段时间,数据库大小达到约 25GB 然后我的代码(填充数据库)崩溃了......
psycopg2.OperationalError: could not extend file "base/16450/79079": No space left on device
HINT: Check free disk space.
我以为这只是对我的虚拟机的简单调整。不。虚拟机现在的硬盘大小为 400GB。空间充足。
然后我又尝试了我的代码,到了 25GB,砰的一声,没有空间了。
我接下来要做的是通过 SSH 登录虚拟机并使用以下命令检查磁盘df -h
:
如上所示,/dev/sda1
大小为 30GB,其中已使用 29GB。我怀疑我的 Postgres 正在使用这个 HDD... 当我使用 Bitnami Azure 模板时自动设置。
您可以通过 Azure 门户看到我设置的 400GB HDD:/dev/sdb1
。
我能做什么?我需要将更多数据存入我的 Postgres DB...并且没有明显的方式可以/dev/sda1
通过门户更改大小。
更新
我改成/mnt
(/opt/bitnami/postgresql/data
按照路径:https://stackoverflow.com/a/8237512/596841)。当我更新、保存、退出并重新启动服务器时,它又恢复为默认设置(如上所示)。
答案1
最简单的做法是挂载 /dev/sdb1,数据就在那里。如何找到数据所在的位置:(https://stackoverflow.com/questions/1137060/where-does-postgresql-store-the-database)
因此,一旦您知道停止数据库并将数据移动到 /mnt 目录。
然后,您将把更大的驱动器放置在需要的位置,以便 postgres 能够看到它。
umount /dev/sdb1
mount /dev/sdb1 /original/path/to/data
现在您可能需要将 /etc/fstab 从 /mnt 更新为 /original/path/to/data,以便它在重启后仍然有效。
您还可以使用 LVM 并执行以下操作:https://kb.vmware.com/selfservice/search.do?cmd=displayKC&docType=kc&docTypeID=DT_KB_1_1&externalId=1006371
我个人认为mount方法是最简单的。
答案2
VM 现在的 HDD 大小为 400GB
/dev/sdb1
是个临时存储,这个临时存储必须不是用于存储您不愿意丢失的数据。(重启将丢失临时数据)
我需要更多数据进入我的 Postgres DB
我们可以使用 Azure 门户向该 VM 添加新磁盘,然后将该磁盘挂载到该 VM。
装载/dev/sdc
到 Azure VM:
root@jasonvm:/home/jason# fdisk -l #list all disks
Disk /dev/sdc: 429.5 GB, 429496729600 bytes #we can find this new disk
255 heads, 63 sectors/track, 52216 cylinders, total 838860800 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
然后使用此命令将此磁盘挂载到 Azure VM:
root@jasonvm:/home/jason# mkfs.ext4 /dev/sdc
root@jasonvm:/home/jason# mkdir -p /mnt/point1
root@jasonvm:/home/jason# mount /dev/sdc /mnt/point1
root@jasonvm:/home/jason# df -Th
Filesystem Type Size Used Avail Use% Mounted on
udev devtmpfs 1.7G 12K 1.7G 1% /dev
tmpfs tmpfs 344M 348K 344M 1% /run
/dev/sda1 ext4 30G 873M 28G 4% /
none tmpfs 4.0K 0 4.0K 0% /sys/fs/cgroup
none tmpfs 5.0M 0 5.0M 0% /run/lock
none tmpfs 1.7G 0 1.7G 0% /run/shm
none tmpfs 100M 0 100M 0% /run/user
/dev/sdb1 ext4 50G 52M 47G 1% /mnt
/dev/sdc ext4 394G 71M 374G 1% /mnt/point1
root@jasonvm:/home/jason# blkid # list UUID
/dev/sr0: LABEL="rd_rdfe_stable.161107-1031" TYPE="udf"
/dev/sda1: LABEL="cloudimg-rootfs" UUID="ce8fdc9c-fa56-49db-b69d-8c11634cbb7a" TYPE="ext4"
/dev/sdb1: UUID="b0531bb0-dadf-4e20-a968-bd177989f7b8" TYPE="ext4"
/dev/sdc: UUID="46c75dcc-51c8-4d53-8535-d4fc7bf3a5cb" TYPE="ext4"
root@jasonvm:/home/jason# vi /etc/fstab # add UUID to fstab,
# CLOUD_IMG: This file was created/modified by the Cloud Image build process
UUID=ce8fdc9c-fa56-49db-b69d-8c11634cbb7a / ext4 defaults,discard 0 0
/dev/disk/cloud/azure_resource-part1 /mnt auto defaults,nobootwait,comment=cloudconfig 0 2
UUID=46c75dcc-51c8-4d53-8535-d4fc7bf3a5cb /mnt/point1 ext4 defaults,nofail 0 0
笔记:
我们应该将这个磁盘添加到/etc/fstab
,这样,重新启动该虚拟机后我们就不会失去与该磁盘的连接。
将新磁盘挂载到Azure VM后,然后进行修改data_directory
,我们可以按照以下步骤操作:
编辑 data_directory 以postgresql.conf
指向新位置(例如/mnt/point1/postgresql/9.3/main
)
将 PG 数据目录的内容传输至/mnt/point1
viasudo rsync -av /opt/bitnami/postgresql/data /mnt/point1
重新启动 posgtesql。