如何通过 Amazon EC2 将 postgresql 数据移动到 Ubuntu 上的另一个目录?
Posted
技术标签:
【中文标题】如何通过 Amazon EC2 将 postgresql 数据移动到 Ubuntu 上的另一个目录?【英文标题】:How can I move postgresql data to another directory on Ubuntu over Amazon EC2? 【发布时间】:2013-05-16 17:50:55 【问题描述】:我们运行 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,这使一切变得更加复杂。
有没有更清洁、更高效的分步方法?
【问题讨论】:
【参考方案1】:感谢您接受的答案。除了符号链接,您还可以使用bind mount。这样它就独立于文件系统。如果您想为数据库使用专用硬盘驱动器,您也可以mount it normally。到数据目录。
我做了后者。如果有人需要参考,这是我的步骤。我在许多 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
【讨论】:
【参考方案2】:停止服务器。
在保留权限的同时复制数据目录 - 使用 cp -aRv
。
然后(最简单,因为它避免了修改 initscripts 的需要)只需将旧数据目录移到一边并将旧路径符号链接到新位置。
【讨论】:
您好,您能解释一下“将旧数据目录移到一边”是什么意思吗?您的意思是,只需将其删除或将其复制到某个备份文件夹?和:你的意思是哪个数据目录?show data_directory;
返回的整个文件夹?
重命名它,这样即使事实证明它很重要,您也不会丢失任何东西。
symlinlk 的想法不错,但也不完美,因为它要求您保留旧的 datadir 位置。
不错的提示!顺便提一下,在创建符号链接后,我们需要更改它的所有权(将 postgres 设置为所有者和组)。
我尝试了很多不同的方法,我发现“停止服务器”的最简单和最干净的方法是:如果您使用的是 ubuntu AMI,则将“sudo service postgresql stop”设置为“ubuntu”。否则,在 ec2 上关闭服务器可能会很困难,因为需要通过 postgres 进程的 postgres 用户/所有者提供 sudo 密码。【参考方案3】:
澄清。您使用的特定 AMI 将 ubuntu 设置为默认用户,这可能不适用于其他 AMI。
本质上,如果您尝试手动移动数据,您可能需要以 root 用户身份执行此操作,然后确保它可用于运行 postgres 的任何用户。
您还可以选择为卷创建快照并增加从快照创建的卷的大小。然后您可以用新卷替换实例上的卷(您可能必须调整分区大小以利用所有空间)。
【讨论】:
以上是关于如何通过 Amazon EC2 将 postgresql 数据移动到 Ubuntu 上的另一个目录?的主要内容,如果未能解决你的问题,请参考以下文章
启动 Amazon EC2 实例时如何自动启动 Web 服务?
如何在 Amazon Auto-scaling 组中的多个 ec2 实例上部署和更新应用程序?
如何将映像传输到 Amazon EBS 卷以供 EC2 使用?