简而言之:
- 开发笔记本电脑坏了
- 旧硬盘仍然可读
- 新笔记本电脑有 PostgreSQL 9.4 而不是 9.1
- 两台笔记本电脑都使用 Ubuntu Linux 的风格
问题 1:我的理解是否正确,为了恢复旧数据,我需要一台与写入旧数据目录的服务器具有相同主版本和次版本的服务器?由于我的发行版没有可用的 9.1 包,我必须从源代码编译一个 v9.1.x 服务器,复制旧数据,启动服务器并执行正常的 pg_dump,然后可以将其恢复到新集群?
问题2:旧笔记本上大概有10-15个数据库,但因为是开发机,理论上除了一些本地实验外,所有的数据都应该是可以替换的。我正在考虑只是废弃旧数据,但我不能 100% 确定那些数据库是什么。有没有办法在不运行 9.1 服务器的情况下从旧数据目录中提取一些基本信息(例如数据库名称,甚至大小或时间戳)?
看起来您已经自己解决了问题 1(简短回答:是的,使用最新的 9.1.x 版本,并确保编译时选项在旧机器和新机器上的版本之间相同,以确保数据目录,理想情况下机器应该尽可能相似以便二进制兼容,例如 x86-64,相似的 glibc 版本等)。
但是关于问题2:
你可以在数据目录的“base”子目录下查看,你应该会看到类似这样的内容:
每个以整数作为目录名称的目录都代表我的 PostgreSQL 集群中的一个数据库。目录名称中的整数 (OID) 与
oid
您从以下查询中看到的匹配:如果你有服务器运行。我不知道有什么简单的方法可以在服务器不运行的情况下从这些 OID 中确定数据库名称,但至少您知道有多少个数据库以及它们应该有多大。你也应该能够通过检查来计算出创建时间
stat
。在我的例子中,“1”代表“template1”,“12292”代表“template0”,其余的是其他各种数据库。我刚刚发现了一种方法来找出旧
PG_DATA
目录包含哪些数据库。这有点骇人听闻,对我来说为时已晚,但将来可能对其他人有用。有关数据库名称(等)的信息不存储在 中
PG_DATA/base
,而是存储在PG_DATA/global
. 该目录中的文件(至少就我而言)足够小,可以使用十六进制编辑器或命令行工具进行检查,例如grep
和strings
:默认内部数据库之一的名称“template1”仅在两个小文件中以纯文本字符串形式出现。在这些文件中查找其他字符串会显示其他数据库名称:
删除标准 PG 数据库和字符集名称,这留下了我最初寻找的数据库名称列表: