基本上,数据只是作为一组文件存储在磁盘上。如果需要备份,只需停止数据库,复制磁盘上的所有数据库文件,然后创建备份。还有很多其他方法来备份PostgreSQL数据,在此不多述。现在,回到数据所在的位置。
让我们假设PostgreSQL数据目录是一个名为/database的目录。如果不太确定数据库目录在哪里,可以使用psql登录到数据库,通过键入以下命令很容易地找到数据库目录所在:
show data_directory;返回:data_directory------------------/database
如果查看/database目录,将看到许多文件,包括:• postgresql.conf• pg_hba.conf• 以及其他各种文件
还可以看到一个名为base的路径。这是保存整个数据库的所有数据的地方。在该目录中能看到许多仅为数字的目录。这些编号目录中的每一个都对应单个数据库。如果想知道哪个目录号与哪个数据库相关,可以使用psql登录到数据库,并键入以下内容:
SELECT oid as object_id, datname as database_name FROM pg_database;返回:object_id | database_name-------------+---------------- 1 | template114799 | template014804 | postgres 20886 | test
也可以在 UNIX shell下使用 oid2name 工具,如下所示:
oid2name返回:所有数据库:Oid Database Name Tablespace---------------------------------------------14804 postgres pg_default14799 template0 pg_default1 template1 pg_default20886 test pg_default
现在,有了一个数据库列表和它们的oid,oid用作/database/base目录中目录的名称。如果想查看test数据库(OID为20886)中的数据,可以使用 ls -l 列出目录内容,如下所示:
-rw-------. 1 postgres postgres 16384 Jun 2 13:10 112-rw-------. 1 postgres postgres 16384 Jun 2 13:11 113-rw-------. 1 postgres postgres 8192 Jun 19 16:39 12168-rw-------. 1 postgres postgres 24576 Jun 19 17:01 12168_fsm-rw-------. 1 postgres postgres 8192 Jun 19 17:01 12168_vm-rw-------. 1 postgres postgres 8192 Jun 1 23:58 12172-rw-------. 1 postgres postgres 73728 Aug 1 17:47 1247-rw-------. 1 postgres postgres 24576 Jun 19 17:01 1247_fsm
这是该目录中文件的一小部分。注意到文件大小了吗?它们都可以被8192(8k)整除。这是因为 PostgreSQL 默认使用 8k数据块(PostgreSQL称为页)写入磁盘。如果有一个大表,其中包含超过1GB的数据,那么将看到多个文件,这些文件的编号结尾都是1、2、3,诸如此类:
-rw-------. 1 postgres postgres1073741824 Jun 12 10:12 20211-rw-------. 1 postgres postgres1073741824 Jun 12 10:12 20211.1-rw-------. 1 postgres postgres1073741824 Jun 12 10:12 20211.2-rw-------. 1 postgres postgres1073741824 Jun 12 10:12 20211.3
在这个测试数据库中,有一个名为test_data的表。如果要查看哪个文件实际包含表test_data的数据,可以执行以下操作:
启动psql后:\c testSELECT pg_relation_filepath('test_data');pg_relation_filepath----------------------base/20886/186770
可以再次使用 oid2name 工具,如下所示:
oid2name -d test -t test_data返回:From database "test":Filenode Table Name----------------------186770 test_data
文件 database/base/20866/186770 包含表 test_data 的实际数据如果运行下边的程序(假设已经安装hexdump):
hexdump -C database/master/base/20866/186770
将看到 test_data 的表数据,因为它存储在磁盘上的文件中。
是时候测试一下上边提到的所有:psqlCREATE DATABASE test;\c testCREATE TABLE test_table my_id serial , mytext varchar;INSERT INTO test_table (mytext) VALUES ('hello there');
不要忘记发起一个检查点,以确保所有东西都从WAL写到数据库表中。
CHECKPOINT;SELECT oid as object_id, datname as database_name FROM pg_database where datname ='test';object_id | database_name-----------+---------------20886 | testSELECT pg_relation_filepath('test_table');pg_relation_filepath----------------------base/20886/186770(1 row)\qhexdump -C database/master/base/20886/18677000000000 a8 00 00 00 d0 2a d7 55 00 00 00 00 1c 00 d8 1f |.....*.U........|00000010 00 20 04 20 00 00 00 00 d8 9f 50 00 00 00 00 00 |. . ......P.....|00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|*00001fd0 00 00 00 00 00 00 00 00 99 30 5b 02 00 00 00 00 |.........0[.....|00001fe0 00 00 00 00 00 00 00 00 01 00 02 00 02 09 18 00 |................|00001ff0 01 00 00 00 19 68 65 6c 6c 6f 20 74 68 65 72 65 |.....hello there|00002000
最后。插入的varchar字符串 'hello there' 现在存储在磁盘上并可见,可能有人认为磁盘上的可见性是个问题。如果要加密磁盘上文件中的数据,可以使用透明数据加密功能进行加密。 名称是数字并以 _fsm 或 _vm后缀的文件,是每个页的空闲空间映射和可见映射。原文链接:http://www.postgresql.fastware.com/blog/where-and-how-is-your-data-actually-stored-on-disk
如果您在PostgreSQL数据库方面需要任何帮助,请随时联系飞象数据。
敬请关注飞象数据