如何将数据库从 Postgres 8.4 复制到 Postgres 9.1?

Jos*_*osh 3 postgresql recovery upgrade

我的 trac 服务器最近开始出现问题。它运行的是一个非常过时的 Ubuntu 版本,我无法正确使用apt-get来纠正我遇到的问题。因此,我备份了机器并全新安装了 Ubuntu 12.04。

现在我有一个正确安装并运行 Postgres 9.1 的新服务器。我想从备份中复制我的旧 Postgres 8.4 数据库并在新安装上进行设置。我该怎么做?


什么是迄今为止我所做的是旧的Postgres 8.4数据和bin目录从备份(复制/var/lib/postgresql/8.4/main/usr/lib/postgresql/8.4/bin)来/tmp/postgres.old/tmp/postgres-bin.old上新安装。我停止使用 Postgres 9.1service postgres stop并运行以下命令:

sudo -u postgres /usr/lib/postgresql/9.1/bin/pg_upgrade \
  --old-datadir=/tmp/postgres.old/main/ \
  --new-datadir=/var/lib/postgresql/9.1/main/ \
  --old-bindir=/tmp/postgres-bin.old/postgresql/8.4/bin \
  --new-bindir=/usr/lib/postgresql/9.1/bin
Run Code Online (Sandbox Code Playgroud)

Postgres 文档中所述。这似乎很好用,除了我收到错误:

Performing Consistency Checks
-----------------------------
Checking current, bin, and data directories                 ok
Checking cluster versions                                   ok

connection to database failed: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?


unable to connect to old postmaster started with the command: "/tmp/postgres-bin.old/postgresql/8.4/bin/pg_ctl" -w -l "/dev/null" -D "/tmp/postgres.old/main" -o "-p 5432 -c autovacuum=off -c autovacuum_freeze_max_age=2000000000" start >> "/dev/null" 2>&1
Failure, exiting
Run Code Online (Sandbox Code Playgroud)

问题似乎是它正在尝试启动旧服务器,但这不起作用,因为它太旧了并且没有正确安装。尝试手动启动它会发现问题:

root@mission:/tmp# sudo -u postgres /tmp/postgres-bin.old/postgresql/8.4/bin/postgres 
/tmp/postgres-bin.old/postgresql/8.4/bin/postgres: error while loading shared libraries: libssl.so.0.9.8: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

那么,如何将旧的 Postgres 8.4 数据库还原到新的 Postgres 9.1 安装中并更新它们?

swa*_*eck 6

尝试运行旧的 bin 文件时失败,因为它缺少依赖项。您将需要安装其依赖项,在新服务器上安装 8.4 以执行此任务,或者启动安装了 8.4 的 VM,将文件复制到 VM,执行在 VM 上启动 8.4 实例所需的操作(这意味着 postgres 需要知道默认数据目录在哪里)。从那里,我会在有pg_dump问题的数据库上做一个,然后将它们恢复到新服务器。那可能会给你最干净的环境。

所以,这里是我认为你的选择:

使用 pg_upgrade

在新服务器上 ( pg_upgrade)

  1. 安装 PostgreSQL 8.4依赖项,并希望您复制的二进制文件能够正常工作。如果没有,那么您可能只需要删除这些复制的二进制文件并从 apt 安装 8.4。
  2. 尝试启动服务 /tmp/postgres-bin.old/postgresql/8.4/bin/pg_ctl start -D /tmp/postgres.old/main/
  3. 如果可行,请停止服务 /tmp/postgres-bin.old/postgresql/8.4/bin/pg_ctl stop -D /tmp/postgres.old/main/
  4. 现在试试你的 pg_upgrade 脚本

不使用 pg_upgrade

  1. 创建一个 VM 或使用一个旧的、废弃的服务器并安装 postgresql 8.4
  2. 使用initdb(或pg_createcluster)初始化您的服务器
  3. 将备份的数据复制到刚刚创建的数据上
  4. 启动 postgresql
  5. 使用备份数据 pg_dump
  6. 将转储文件复制到“新服务器”
  7. 还原到新服务器上的新数据库