PostgreSQL 将数据库存储在哪里?
Posted
技术标签:
【中文标题】PostgreSQL 将数据库存储在哪里?【英文标题】:Where does PostgreSQL store the database? 【发布时间】:2009-07-16 11:55:29 【问题描述】:PostgreSQL 数据库的文件存储在哪里?
【问题讨论】:
postgresql.org/docs/9.5/static/storage-file-layout.htmlsudo -u postgres psql -c "show data_directory;"
将显示标准 PostgreSQL 安装上的当前存储位置。
【参考方案1】:
要查看数据目录的位置,请使用此查询。
show data_directory;
要查看所有运行时参数,请使用
show all;
您可以创建表空间来将数据库对象存储在文件系统的其他部分。要查看可能不在该数据目录中的表空间,请使用此查询。
SELECT *, pg_tablespace_location(oid) FROM pg_tablespace;
【讨论】:
显示数据目录;命令指向数据的确切位置。搜索特定文件夹很痛苦,因为其他人可能已经为您安装了它,现在您不知道配置,因此遵循 sql 有助于节省时间。 :) 谢谢迈克。 它说“必须是超级用户才能检查数据目录”:( 如果您不是 DBA,那么您实际上不需要知道。 顺便说一句 - 如果有人像我一样在 Mac 上寻找 Postgres.app 的数据库位置,默认情况下它在 ~/Library/Application Support/Postgres[ver]/var 中。 要运行查询,请使用 PGAdmin III 并使用菜单栏中的“运行查询”图标。【参考方案2】:在 Windows7 上,所有数据库都由 C:\Program Files (x86)\PostgreSQL\8.2\data\global
下名为 pg_database
的文件中的数字引用。然后您应该在C:\Program Files (x86)\PostgreSQL\8.2\data\base
下按该编号搜索文件夹名称。那就是数据库的内容。
【讨论】:
除非问题明确说明了操作系统,否则不要以操作系统特定的方式回答。 为什么不呢?如果您不提及操作系统而只是说“这有效”,那么任何在不同操作系统上尝试的人都会感到困惑。这是相关的。编辑:哦,您可能的意思是“根本不给出操作系统特定的答案”。我想这是有道理的,我不知道。 @SamGoody 如果这个答案实际上是正确的,那么你所说的会有点意思。 (这并非完全不正确,因为文件夹可能在 Windows 中,但它肯定不是给定的)。按照已经给出的答案,可以很容易地找出是否是这种情况。 @senthilkumari 我有 postgresql 11 和 windows 10。正如你提到的,我试图查看全局文件夹中的 pg_database,但我看不到任何内容。我可以看到一堆 _vms、_fsm、config_exec_params、pg_control、pg_filenode.map、pg_internal.init。对于 Windows 10,我应该搜索哪个文件名。不一样吗?【参考方案3】:如“PostgreSQL database default location on Linux”中所建议的,在Linux下你可以使用以下命令找到:
ps aux | grep postgres | grep -- -D
【讨论】:
简单,无需对数据库进行身份验证!【参考方案4】:打开 pgAdmin 并转到特定数据库的属性。找到OID然后打开目录
<POSTGRESQL_DIRECTORY>/data/base/<OID>
应该有你的数据库文件。
【讨论】:
SELECT oid from pg_database where datname = '<dbname>'
【参考方案5】:
在我的 Linux 安装下,它在这里:/var/lib/postgresql/8.x/
你可以用initdb -D "c:/mydb/"
改变它
【讨论】:
取决于发行版 — 对于 Fedora 20,它位于/var/lib/pgsql/data
下。最好使用ps auxw|grep postgres|grep -- -D
查找。【参考方案6】:
每个人都已经回答了,但只是为了最新的更新。如果您想知道所有配置文件的位置,请在 shell 中运行此命令
SELECT name, setting FROM pg_settings WHERE category = 'File Locations';
【讨论】:
【参考方案7】:我敢打赌,您之所以问这个问题,是因为您尝试过 pg_ctl start
并收到以下错误:
pg_ctl: 未指定数据库目录且环境变量 PGDATA 未设置
换句话说,您正在寻找在您的pg_ctl start
命令中放在-D
之后的目录。
在这种情况下,您要查找的目录包含这些文件。
PG_VERSION pg_dynshmem pg_multixact
pg_snapshots pg_tblspc postgresql.conf
base pg_hba.conf pg_notify
pg_stat pg_twophase postmaster.opts
global pg_ident.conf pg_replslot
pg_stat_tmp pg_xlog postmaster.pid
pg_clog pg_logical pg_serial
pg_subtrans postgresql.auto.conf server.log
您可以通过使用操作系统提供的搜索找到上述任何文件和目录来找到它。
以我为例(HomeBrew 安装在 Mac OS X 上),这些文件位于 /usr/local/var/postgres
。要启动服务器,我输入:
pg_ctl -D /usr/local/var/postgres -w start
...它的工作原理。
【讨论】:
如果您使用自制软件,查找此数据的更简单方法是brew info postgres
您对我寻找数据库文件夹的原因是正确的。但问题是我找不到上面的任何文件locate <filename>
找到它们...必须使用sudo locate <filename>
【参考方案8】:
特定表/索引的位置可以通过 TABLESPACEs 调整:
CREATE TABLESPACE dbspace LOCATION '/data/dbs';
CREATE TABLE something (......) TABLESPACE dbspace;
CREATE TABLE otherthing (......) TABLESPACE dbspace;
【讨论】:
【参考方案9】:Postgres 将数据存储在其数据目录中的文件中。按照以下步骤转到数据库及其文件:
一个postgresql表文件对应的数据库是一个目录。运行SHOW data_directory
可以得到整个数据目录的位置。
在类似 UNIX 的操作系统中(例如:Mac)/Library/PostgreSQL/9.4/data
进入包含所有数据库文件夹的数据目录中的基本文件夹:/Library/PostgreSQL/9.4/data/base
通过运行查找数据库文件夹名称(给出一个整数。这是数据库文件夹名称):
SELECT oid from pg_database WHERE datname = <database_name>;
通过运行查找表文件名(给出一个整数。这是文件名):
SELECT relname, relfilenode FROM pg_class WHERE relname = <table_name>;
这是一个二进制文件。可以照常获取文件详细信息,例如大小和创建日期时间。欲了解更多信息read this SO thread
【讨论】:
【参考方案10】:在 Mac 上:/Library/PostgreSQL/9.0/data/base
目录无法进入,但可以通过sudo du -hc data
查看内容
【讨论】:
如果您通过自制软件安装(为什么不安装?),它将位于/usr/local/var/postgres
中,您可以使用 @MikeSherrill 的 show data_directory;
提示找到它
/Library/PostgreSQL/9.0/data/base
似乎比/usr/local/var/postgres
更像Mac。如果不启用隐藏的 Finder 功能,您将无法在 Finder 中浏览到后者。
@Charlie 您可以使用“前往”菜单中的 Finder 进行浏览。前往 > 前往文件夹...,或 ⇧⌘G
@JasonS 是的,您可以使用该技巧在 Finder 中打开类似于 mac 的文件夹。
就我而言,它位于:/Users/bob/Library/Application Support/Postgres/var-9.5【参考方案11】:
在 Windows 上,PostgresSQL docs describe 所在的 PGDATA 目录位于 C:\Program Files\PostgreSQL\8.1\data
之类的某个位置。特定数据库的数据位于(例如)C:\Program Files\PostgreSQL\8.1\data\base\100929
下,我猜 100929 是数据库编号。
【讨论】:
当心:如果你想做文件系统级备份,不要只备份这些目录,因为正如docs 描述的那样:“......你可能会尝试备份或仅从它们各自的文件或目录中恢复某些单独的表或数据库。这将不起作用,因为如果没有包含所有事务的提交状态的提交日志文件 pg_clog/*,这些文件中包含的信息将无法使用。"跨度> 这取决于。您可以在安装时将其配置到不同的文件夹。 我的,C:\Program Files\PostgreSQL\9.4\ 中没有数据文件夹,这是 9.4 特有的还是做错了什么?【参考方案12】:picmate 的回答是对的。在 Windows 上,主 DB 文件夹位置是(至少在我的安装中)
C:\PostgreSQL\9.2\data\base\
而不是在程序文件中。
他的 2 个脚本将为您提供所需的确切目录/文件:
SELECT oid from pg_database WHERE datname = <database_name>;
SELECT relname, relfilenode FROM pg_class WHERE relname = <table_name>;
我在 datname 16393 和 relfilenode 41603 中
【讨论】:
【参考方案13】:我在 docker 容器中运行 postgres (9.5)(碰巧在 CentOS 上),正如 Skippy le Grand Gourou 在上面的评论中提到的那样,这些文件位于 /var/lib/postgresql/data/
。
$ docker exec -it my-postgres-db-container bash
root@c7d61efe2a5d:/# cd /var/lib/postgresql/data/
root@c7d61efe2a5d:/var/lib/postgresql/data# ls -lh
total 56K
drwx------. 7 postgres postgres 71 Apr 5 2018 base
drwx------. 2 postgres postgres 4.0K Nov 2 02:42 global
drwx------. 2 postgres postgres 18 Dec 27 2017 pg_clog
drwx------. 2 postgres postgres 6 Dec 27 2017 pg_commit_ts
drwx------. 2 postgres postgres 6 Dec 27 2017 pg_dynshmem
-rw-------. 1 postgres postgres 4.4K Dec 27 2017 pg_hba.conf
-rw-------. 1 postgres postgres 1.6K Dec 27 2017 pg_ident.conf
drwx------. 4 postgres postgres 39 Dec 27 2017 pg_logical
drwx------. 4 postgres postgres 36 Dec 27 2017 pg_multixact
drwx------. 2 postgres postgres 18 Nov 2 02:42 pg_notify
drwx------. 2 postgres postgres 6 Dec 27 2017 pg_replslot
drwx------. 2 postgres postgres 6 Dec 27 2017 pg_serial
drwx------. 2 postgres postgres 6 Dec 27 2017 pg_snapshots
drwx------. 2 postgres postgres 6 Sep 16 21:15 pg_stat
drwx------. 2 postgres postgres 63 Nov 8 02:41 pg_stat_tmp
drwx------. 2 postgres postgres 18 Oct 24 2018 pg_subtrans
drwx------. 2 postgres postgres 6 Dec 27 2017 pg_tblspc
drwx------. 2 postgres postgres 6 Dec 27 2017 pg_twophase
-rw-------. 1 postgres postgres 4 Dec 27 2017 PG_VERSION
drwx------. 3 postgres postgres 92 Dec 20 2018 pg_xlog
-rw-------. 1 postgres postgres 88 Dec 27 2017 postgresql.auto.conf
-rw-------. 1 postgres postgres 21K Dec 27 2017 postgresql.conf
-rw-------. 1 postgres postgres 37 Nov 2 02:42 postmaster.opts
-rw-------. 1 postgres postgres 85 Nov 2 02:42 postmaster.pid
【讨论】:
【参考方案14】:单个终端命令:pg_lsclusters
,(使用 Ubuntu)
你需要的是Data目录下:
Ver Cluster Port Status Owner Data directory Log file
10 main 5432 online postgres /var/lib/postgresql/10/main /var/log/postgresql/postgresql-10-main.log
11 main 5433 online postgres /var/lib/postgresql/11/main /var/log/postgresql/postgresql-11-main.log
【讨论】:
以上是关于PostgreSQL 将数据库存储在哪里?的主要内容,如果未能解决你的问题,请参考以下文章
我应该使用哪种数据类型将图像存储在数据库(PostgreSQL)中?
将 json 对象存储到 postgresql 中的数据类型是啥?