PostgreSQL的目录结构及修改数据目录

本文主要介绍了PostgreSQL数据库的数据目录和安装目录。详细说明了initdb时指定的PGDATA目录存储内容,包括文件和目录的用途,还介绍了显示数据目录的方法。同时阐述了PG安装目录的子目录功能,以及修改数据目录的具体步骤。

initdb 的时候会指定一个 PGDATA 目录,这就是 PostgresQL 存储数据的地方,比如:/var/lib/pgsql/10/data。
======显示数据目录
1. 进入psql
sudo -u postgres psql
2. 找到数据目录
postgres=# SHOW data_directory;
data_directory
------------------------
/var/lib/pgsql/10/data
(1 row)

======PGDATA 下面各项存储的内容大概是:
文件 存储内容
PG_VERSION     实例的 版本号
postgresql.conf   主配置文件
postgresql.auto.conf (新功能,优先级更高)
pg_hba.conf        认证配置文件
pg_ident.conf       映射配置文件
postmaster.opts    /usr/pgsql-10/bin/postgres "-D" "/var/lib/pgsql/10/data/"
postmaster.pid
...

目录名: 存储内容
base: 默认表空间目录,建立的表格储存在此目录中.每个 database 会在 base 目录下有一个子目录
global: 一些共享系统表的目录.Postgres 自己的 meta 数据库存放的地方(全局 DB)
pg_stat_tmp: 统计信息的存储目录
pg_tblsp: 存储了指向各个用户自建表空间实际目录的链接方式
pg_twophase: 使用两阶段提交功能时分布式事务的存储目录
==以下目录功能待补充...
log
pg_commit_ts
pg_dynshmem
pg_logical
pg_multixact
pg_notify
pg_replslot
pg_serial
pg_snapshots
pg_stat
pg_subtrans
pg_wal
pg_xact

以下目录应该是10.0以前版本的
pg_clog: commit log的目录
pg_log:系统日志目录,在查询一些系统错误时就可查看此目录下的日志文件
pg_xlog:wal(Write Ahead Log 预写式日志)日志的目录

base 目录是最重要的一个目录,放的是每一个 database 的数据。
base 目录里的每一个数字目录对于一个 database 的 oid,可以通过 查看 pg_database 这张表查看每一个 数据库的 oid 。
[root@srv]# ls /var/lib/pgsql/10/data/base
1 13805 13806
postgres=# select oid, datname from pg_database ;
oid | datname
-------+-----------
13806 | postgres
1 | template1
13805 | template0
(3 rows)

每一张表的数据(大部分)又是放在 base/(dboid)/(relfilenode) 这个文件里面:
postgres=# select relname, relowner, relfilenode from pg_class where relowner = 13805;
relname | relowner | relfilenode
---------+----------+-------------
(0 rows)

查询'item'表的数据文件.这里的'item'是table名称.
lai=# select pg_relation_filepath('item');
pg_relation_filepath
----------------------
base/16385/24595
(1 row)

======PG安装目录,postgresql默认在/usr/pgsql-10
子目录有:
(1)/usr/pgsql-10/bin: 二进制可执行文件目录,此目录下有postgres,psql等可执行程序.
(2)/usr/pgsql-10/lib: 动态库目录,PG程序运行需要的动态库都在此目录下,如libpg.so.
(3)/usr/pgsql-10/share: 此目录下存放有文档和配置模板文件,一些扩展包的sql文件,在此目录的子目录extension下.

-----------
修改data_directory的所有者,目录权限
chown -R postgres:postgres /home/pgdata
chmod 700 /home/pgdata
--------
======修改数据目录
1. 进入psql
sudo -u postgres psql
2. 找到数据目录
SHOW data_directory;
3. 关闭数据库
sudo systemctl stop postgresql
sudo systemctl status postgresql
4. 我们将现有的数据库目录复制到新的位置用rsync。
>> 使用-a标志保留的权限和其他目录属性, 能避免未来的升级权限问题.
>> 而-v提供详细输出,以便能够按照进度。
注意:确保没有对目录没有尾随斜线,如果你使用制表符完成可以加入。
当有一个结尾的斜线, rsync将转储目录复制到安装点,而不是转移成一个包含内容PostgreSQL目录:
sudo rsync -av /var/lib/postgresql /mnt/newdir
5. 复制完成后,我们将使用.bak扩展名重命名当前文件夹,并保留该文件,直到我们确认移动已成功。 通过重命名它,我们将避免可能由于新的和旧的位置中的文件引起的混乱:
sudo mv /var/lib/postgresql/10/data /var/lib/postgresql/10/data.bak
6. 修改配置文件:postgresql.conf
data_directory = '/mnt/newdir/postgresql/10/data'
7. 启动数据库
sudo systemctl start postgresql
sudo systemctl status postgresql
8. 显示数据目录
sudo -u postgres psql
SHOW data_directory;
9. 删除备份
sudo rm -Rf /var/lib/postgresql/9.5/main.bak
10.重启
sudo systemctl restart postgresql
sudo systemctl status postgresql

==================
移动PostgreSQL的数据目录移到新位置
https://www.howtoing.com/how-to-move-a-postgresql-data-directory-to-a-new-location-on-ubuntu-16-04

PG安装目录
https://blog.youkuaiyun.com/liguangxianbin/article/details/79563881
Postgres 数据表文件存储位置
https://blog.youkuaiyun.com/jameshadoop/article/details/60962451
http://veryr.com/posts/postgres-storage-location/

 

转载于:https://www.cnblogs.com/sztom/p/9541272.html

<think>首先,用户的问题是:“我想修改PostgreSQL数据库数据存储目录 请问how to change data directory in PostgreSQL”。这是一个关于如何更改PostgreSQL数据目录的查询。 在系统级指令中,我需要: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如:[^1]。 用户可见层指令: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 参考的站内引用: - 引用[1]: 展示了如何更改数据目录并确认新位置。 - 引用[2]: 关于配置SSL后重启PostgreSQL。 - 引用[3]: 重启PostgreSQL服务并检查状态。 - 引用[4]: 使用pg_ctl命令启动PostgreSQL。 - 引用[5]: 删除节点文件和使用Postgres-XL集群。 这些引用提供了关于PostgreSQL操作的具体步骤,特别是重启服务、更改目录和命令使用。 我的回答需要基于这些引用,但用户的问题是关于更改数据目录的,所以我应该聚焦在引用[1]和[3],因为它们涉及数据目录更改和重启服务。 步骤结构: 1. **停止PostgreSQL服务**:在更改数据目录前,需要停止服务。 2. **移动数据目录**:将现有数据移动到新位置。 3. **更新配置文件**:修改postgresql.conf中的data_directory设置。 4. **更新启动脚本或服务文件**(如果需要):确保服务指向新目录。 5. **重启服务**:启动PostgreSQL以应用更改。 6. **验证更改**:确认新数据目录被使用。 从引用[1]: - 它展示了通过psql命令SHOW data_directory来确认新位置。 - 步骤包括重启服务。 从引用[3]: - 展示了重启服务:sudo systemctl restart postgresql - 然后检查状态:sudo systemctl status postgresql 从引用[4]: - 使用pg_ctl启动PostgreSQL:pg_ctl -D /path/to/data -l logfile start 所以,在回答中,我应该包括这些步骤。 使用中文回答。 生成相关问题:在回答结束后,添加相关问题部分,如示例所示。 回答结构: - 以清晰的方式逐步解释过程。 - 自然地添加引用标识在相关段落末尾。 - 使用代码块展示命令,如示例中的Python代码。 最终回答应包括: 1. 停止服务。 2. 移动数据。 3. 更新配置。 4. 重启服务。 5. 验证。 引用添加: - 当提到重启服务时,引用引用[3]。 - 当提到确认数据目录时,引用引用[1]。 - 当提到使用pg_ctl时,引用引用[4]。 相关问题: - 基于主题,生成2-3个相关问题,如备份数据、处理错误等。 确保LaTeX:用户的问题中没有数学表达式,所以可能不需要,但如果涉及计算,可以添加。但在这个上下文中,可能不必要。 现在,草拟回答。</think>### 如何更改 PostgreSQL 数据存储目录 更改 PostgreSQL数据目录(data directory)是一个系统级操作,需要谨慎执行以避免数据丢失或服务中断。以下步骤基于 PostgreSQL 官方文档和最佳实践,以 Linux 系统为例(其他系统类似)。操作前,请确保: - 以 `postgres` 用户或具有管理员权限的用户执行命令。 - 备份原始数据目录(如 `/var/lib/postgresql/版本号/data`),以防意外发生。 #### 步骤 1: 停止 PostgreSQL 服务 在修改数据目录前,必须先停止正在运行的 PostgreSQL 服务。使用以下命令: ```bash sudo systemctl stop postgresql # 停止服务 ``` 然后检查服务状态,确保已停止: ```bash sudo systemctl status postgresql # 验证服务状态,应显示 "inactive" ``` 如果服务未停止,可能导致数据损坏[^3]。 #### 步骤 2: 移动数据目录到新位置 将现有数据复制(或移动)到新目录(如 `/home/pgdata/data`)。使用 `rsync` 确保权限和所有权正确: ```bash sudo rsync -av /var/lib/postgresql/ /home/pgdata/data # 复制数据,保留属性 sudo chown -R postgres:postgres /home/pgdata/data # 设置所有权为 postgres 用户 ``` **注意**:如果新目录位于不同分区,确保磁盘空间充足(使用 `df -h` 检查)。 #### 步骤 3: 更新配置文件 修改 PostgreSQL 的主配置文件 `postgresql.conf`,更新 `data_directory` 参数: 1. 打开配置文件(路径通常为 `/etc/postgresql/版本号/main/postgresql.conf` 或新目录下的文件)。 2. 找到并修改 `data_directory` 行: ```ini data_directory = '/home/pgdata/data' # 指向新目录 ``` 3. 保存文件。 如果 PostgreSQL 使用 systemd 管理(如 Ubuntu/Debian),还需更新服务文件: ```bash sudo systemctl edit postgresql # 覆盖服务配置 ``` 添加以下内容,指定新目录: ```ini [Service] Environment=PGDATA=/home/pgdata/data ``` 保存后重载 systemd:`sudo systemctl daemon-reload`[^1]。 #### 步骤 4: 重启服务并验证 重启 PostgreSQL 使更改生效: ```bash sudo systemctl start postgresql # 启动服务 sudo systemctl status postgresql # 检查状态,应显示 "active" ``` 如果启动失败(如权限错误),查看日志:`journalctl -u postgresql`[^3]。 使用 `psql` 连接数据库,确认新目录: ```bash sudo su - postgres psql -c "SHOW data_directory;" # 应输出新路径,如 /home/pgdata/data ``` 示例输出: ``` data_directory ------------------- /home/pgdata/data (1 row) ``` 这验证了数据目录已成功更改[^1]。 #### 常见问题处理 - **启动失败**:检查新目录的权限(`chmod 700 /home/pgdata/data`)和 SELinux/AppArmor 设置。 - **旧目录残留**:移动后,可删除旧数据(但先备份)。 - **使用 `pg_ctl` 管理**:如果未使用 systemd,可用 `pg_ctl` 启动: ```bash pg_ctl -D /home/pgdata/data -l logfile start # 直接指定数据目录[^4] ``` 通过以上步骤,您已安全迁移 PostgreSQL 数据目录。整个过程依赖于系统服务管理器和配置文件更新,确保数据一致性[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值