在一台双启动机器上共享 PostgreSQL 数据库而不会重复(跨平台)

Tim*_*imY 5 postgresql windows linux

我在双引导机器上安装了 PostgreSQL 9.4(在 Win 7 和 Ubuntu 14.10 上)。这两个系统共享一个驱动器(NTFS 格式),其中包含一个在 Windows 下创建的 PSQL 数据库目录。显然,PSQL 安装是特定于系统的,而且它们也恰好位于不同的分区上。该驱动器在 Linux 下自动挂载,并授予完全读/写/执行权限。

我想知道是否可以在两个系统之间共享结构和数据,而无需在每次加载新操作系统时复制和/或复制所有内容。实际上,我希望所有数据在 Windows 中创建时都可用于 Ubuntu,反之亦然。

这是可能的,如果是这样,假设所有数据最初是在 Windows 下生成的,如何从 Linux 设置它?

编辑:我尝试运行:

sudo pg_dropcluster --stop 9.4 main
Run Code Online (Sandbox Code Playgroud)

其次是

sudo pg_createcluster -d /db_from_windows_path 9.4 main
Run Code Online (Sandbox Code Playgroud)

这似乎有效,但是当再次启动服务器时,我得到:

sudo /etc/init.d/postgresql start 
 * Starting PostgreSQL 9.4 database server
 * Error: could not exec /usr/lib/postgresql/9.4/bin/pg_ctl /usr/lib/postgresql/9.4/bin/pg_ctl start -D /db_from_windows_path -s -o  -c config_file="/etc/postgresql/9.4/main/postgresql.conf" :
 [fail]
Run Code Online (Sandbox Code Playgroud)

它看起来非常神秘,特别是因为它/var/log/postgresql/postgresql-9.4-main.log是完全空的,/var/log/postgresql/目录的其余部分也是如此

编辑 2:经过一番观察,我注意到 chown 没有被占用,因为 NTFS 系统显然只能在安装时设置。在修复 /etc/fstab 以将所有权授予 postgres 后,我收到一个不同的错误The PostgreSQL server failed to start. Please check the log output.这又导致没有日志,所以我运行:

/usr/lib/postgresql/9.4//bin/postgres -d 5 -D /var/lib/postgresql/9.4/main -c config_file=/etc/postgresql/9.4/main/postgresql.conf
Run Code Online (Sandbox Code Playgroud)

这给了这个:

LOG:  invalid value for parameter "dynamic_shared_memory_type": "windows"
HINT:  Available values: posix, sysv, mmap, none.
2015-04-17 12:38:43 BST [3653-3] LOG:  invalid value for parameter "lc_messages": "English_United Kingdom.1252"
2015-04-17 12:38:43 BST [3653-4] LOG:  invalid value for parameter "lc_monetary": "English_United Kingdom.1252"
2015-04-17 12:38:43 BST [3653-5] LOG:  invalid value for parameter "lc_numeric": "English_United Kingdom.1252"
2015-04-17 12:38:43 BST [3653-6] LOG:  invalid value for parameter "lc_time": "English_United Kingdom.1252"
2015-04-17 12:38:43 BST [3653-7] FATAL:  configuration file "/etc/postgresql/9.4/main/postgresql.conf" contains errors
2015-04-17 12:38:43 BST [3653-8] DEBUG:  shmem_exit(1): 0 before_shmem_exit callbacks to make
2015-04-17 12:38:43 BST [3653-9] DEBUG:  shmem_exit(1): 0 on_shmem_exit callbacks to make
2015-04-17 12:38:43 BST [3653-10] DEBUG:  proc_exit(1): 0 callbacks to make
2015-04-17 12:38:43 BST [3653-11] DEBUG:  exit(1)
Run Code Online (Sandbox Code Playgroud)

这似乎是一个完全不同的问题,也许与 POSIX 相关?

Cra*_*ger 6

我想知道是否可以在两个系统之间共享结构和数据,而无需在每次加载新操作系统时复制和/或复制所有内容。实际上,我希望所有数据在 Windows 中创建时都可用于 Ubuntu,反之亦然。

你不能。只是不支持,不可能。没有办法。PostgreSQL 不会尝试使数据目录可跨架构、操作系统等移植。

唯一可以做到这一点的方法是,当您想要访问 Windows 数据目录时,在 Ubuntu 中运行 Windows 虚拟机,或者当您想要访问 Linux 数据目录时,在 Windows 中运行 Linux 虚拟机。

您可能想要运行一个在两个平台之间共享的 VM 映像,并让它包含数据库 - 但要小心,Linux 的 NTFS 驱动程序对性能来说并不是很好,并且在并发方面可能无法解决所有问题/O 所以我会有点怀疑在它上面运行像 VM 映像这样的东西。FAT32 和 exFAT 不是崩溃安全的。因此,对于两个系统可以共享以运行“实际工作”的文件系统,实际上没有任何好的选择。

所以就个人而言......我只有一台小型独立机器。或者我会保留数据库的转储并在​​重新启动时重新加载它。

(此外,如果在 Linux 下在 Linux 的 NTFS 文件系统驱动程序上运行 PostgreSQL 有效,那有点令人惊讶,我当然不会依赖它来做我关心的任何事情)。