37

我们运行 postgresql 8.4 已经有一段时间了。与任何数据库一样,我们正在慢慢达到我们的空间门槛。我添加了另一个 8 GB EBS 驱动器并将其安装到我们的实例上,并将其配置为在名为 /files 的目录上正常工作

在 /files 中,我手动创建了

如果我错了,请纠正我,但我相信所有 postgresql 数据都存储在 /var/lib/postgresql/8.4/main

我备份了数据库并运行了 sudo /etc/init.d/postgresql stop。这将停止 postgresql 服务器。我试图将 /var/lib/postgresql/8.4/main 的内容复制并粘贴到 /files 目录中,但结果却是一团糟!由于文件权限。我不得不进入并chmod该文件夹的内容,以便我可以复制和粘贴它们。由于 root 权限,一些文件没有完全复制。我修改了 postgresql.conf 中的 data_directory 参数以指向文件目录

 data_directory = '/files/postgresql/main'

我跑了 sudo /etc/init.d/postgresql restart 并且服务器无法启动。再次可能是由于权限问题。默认情况下,Amazon EC2 仅允许您以 ubuntu 身份访问该服务。您只能从终端内访问 root,这使一切变得更加复杂。

有没有更清洁、更有效的逐步方法?

4

3 回答 3

78

停止服务器。

在保留权限的同时复制 datadir - 使用cp -aRv

然后(最简单,因为它避免了修改 initscripts 的需要)只需将旧的 datadir 移到一边并将旧路径符号链接到新位置。

于 2013-05-21T23:22:55.347 回答
16

感谢您接受的答案。除了符号链接,您还可以使用绑定挂载。这样它就独立于文件系统。如果您想为数据库使用专用硬盘,您也可以正常挂载它。到数据目录。

我做了后者。如果有人需要参考,这是我的步骤。我在许多 AWS 实例上将其作为脚本运行。

# stop postgres server
sudo service postgresql stop

# create new filesystem in empty hard drive
sudo mkfs.ext4 /dev/xvdb

# mount it
mkdir /tmp/pg
sudo mount /dev/xvdb /tmp/pg/

# copy the entire postgres home dir content
sudo cp -a /var/lib/postgresql/. /tmp/pg

# mount it to the correct directory
sudo umount /tmp/pg
sudo mount /dev/xvdb /var/lib/postgresql/

# see if it is mounted 
mount | grep postgres

# add the mount point to fstab
echo "/dev/xvdb /var/lib/postgresql ext4 rw 0 0" | sudo tee -a /etc/fstab

# when database is in use, observe that the correct disk is being used
watch -d grep xvd /proc/diskstats
于 2015-09-22T00:16:50.970 回答
1

一个澄清。您使用的特定 AMI 将 ubuntu 设置为默认用户,这可能不适用于其他 AMI。

本质上,如果您尝试手动移动数据,您可能需要以 root 用户身份执行此操作,然后确保它可用于运行 postgres 的任何用户。

您还可以选择对卷进行快照并增加从快照创建的卷的大小。然后您可以用新卷替换实例上的卷(您可能必须调整分区大小以利用所有空间)。

于 2013-05-21T21:12:34.300 回答