如何通过 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 使用?

Amazon S3 存储桶策略:如何锁定仅访问您的 EC2 实例

帮我通过 Amazon 的 EC2 复制数据并运行脚本

如何将数据从 Postgres 移动到在 Amazon 的 RDS 上运行的 MySQL?