postgresql 13 修改默认数据库路径

您好,您问的是PostgreSQL数据目录切换操作。
我以前给上海的一个客户做过。
让我告诉你我的经历中最关键的一点:
上周一位客户问我为什么他的服务在更改数据目录后崩溃了。
后来发现是权限不对。
所以我们一定要一步一步来,不能操之过急。

先说最核心的步骤。
记住它们:
1 先停止服务吧! 这一步是最容易被忽视的。
可以直接 sudo systemctl stop postgresql@1 3 -main 确保服务稳定停止。
如果不停下来,只要触动下面的,分分钟你的数据库数据就会乱七八糟。

2 初始化新目录。
这必须使用 postgres 用户身份来完成。
首先使用 sudo -u 切换到 postgres,然后使用 initdb -D /opt/pgsql/data 对其进行初始化。
请记住,目录 /opt/pgsql/data 必须提前创建,并使用 chmod 7 00 给予适当的权限。
将会有一个成功。
成功后会有提示,不要错过。

3 更改配置文件。
sudo -u postgres vim /etc/postgresql/1 3 /main/postgresql.conf,找到data_directory行并将其更改为data_directory='/opt/pgsql/data'。
注意这里有英文单引号。
之前遇到的坑是引号不对,一直报配置错误。

4 更改权限。
这一步超级重要! 使用 sudo chown -R postgres:postgres /opt/pgsql/data 将目录所有权更改为 postgres 用户,然后使用 sudo chmod 7 00 /opt/pgsql/data 授予执行权限。
不要从我之前犯的错误中吸取教训,将目录更改为root。
结果postgres用户连进去都进不去,服务直接启动失败。

5 启动服务。
sudo systemctl start postgresql@1 3 -main 启动,然后使用 sudo systemctl status postgresql@1 3 -main 检查状态。
如果正常,使用journalctl -u postgresql@1 3 -main -n 5 0 --no-pager查看日志,确认没有报错。

现在我们来说一下原来流程中最有可能出现的问题,我给大家指出来:
关于postmaster.pid:不要手动弄乱这个文件! 它是在服务启动时自动生成的,位于数据目录中。
如果手动复制或重命名,服务启动时会找不到,直接挂掉。
请记住,不要碰这个文件并让它自行管理。

不要使用符号链接:最初的过程建议使用符号链接来指向配置文件,但这是不可靠的。
我尝试过一次,但是服务启动时路径解析就乱了。
直接更改配置文件中的路径是最安全的,或者使用软链接,但我也觉得软链接麻烦且不必要。

权限是关键:以前将 /opt/pgsql 更改为 root 权限的方法是一场灾难。
PostgreSQL 服务必须以 postgres 用户身份运行,才能读取和写入自己的数据目录。
您更改了权限,但 postgres 用户甚至无法打开该目录。
服务如何运行? 因此,我们必须密切关注权限。
postgres 用户必须具有完全访问权限。

更多提示:
pgAdmin4 报告错误? 如果启动pgAdmin4 时提示缺少flask模块,可以使用pip installflask进行安装。
有时系统自带的Python版本与pgAdmin4 不兼容。
最好使用系统自带的python3 来安装,避免版本冲突。

多实例管理? 如果要运行多个实例,每个实例必须有自己独立的data_directory和端口,并且必须更改服务单元文件名,例如postgresql@1 3 -instance1 .service以区分它们。

最后给大家一个完整的参考脚本:
bash 1 .停止原有服务 sudo systemctl stop postgresql@1 3 -main
2 .初始化新的数据目录(使用postgres用户) sudo -u postgres /usr/lib/postgresql/1 3 /bin/initdb -D /opt/pgsql/data
3 、修改配置文件 sudo -u postgres sed -i "s|^data_directory=.|data_directory='/opt/pgsql/data'|g" /etc/postgresql/1 3 /main/postgresql.conf
4 . 正确的权限 sudo chown -R postgres:postgres /opt/pgsql/data sudo chmod 7 00 /opt/pgsql/data
5 .启动服务 sudo systemctl 启动 postgresql@1 3 -main sudo systemctl status postgresql@1 3 -main
如果按照这些步骤来的话,基本上不会有什么问题。
如果中间报错,可以阅读错误信息并进行调整。
不管怎样,操作前还是有必要备份一下数据,以防万一。

PostgreSQL关闭数据库服务的三种模式

说实话,PostgreSQL有三种数据库服务模式,使用起来完全不同。
让我来帮你解决一下。

1 .智能关机 这种模式是完全私密的。
你发送一个 SIGTERM 信号,它会执行以下操作:它不允许新用户连接,但老用户仍然可以在那里工作。
必须等到所有老用户自行退出后才能关闭。
如果数据库正忙于恢复或复制数据,则必须等待这些完成才能离开。
如何使用? pg_ctlstop -m 智能是命令。
优点是数据肯定安全,但是关闭速度慢,要等用户自行离开。
这类似于正常的 Oracle 关闭。

2 快速关机 这是默认设置。
你发送一个SIGINT信号(这是默认信号),它将执行以下操作:新用户应该停止进来,老用户将立即被踢出。
所有未提交的事务都将回滚,子进程完成工作后将停止。
该命令是 pg_ctlstop -m fast。
这个比较平均,速度快,数据可以保存。
我通常用这个很好。
这类似于Oracle的立即关闭。

3 立即关闭 这是最残酷的。
你发送一个 SIGQUIT 信号而你不在乎。
如果5 秒后他还没有离开,就使用SIGKILL杀死他。
不要担心任何事,停下来。
该命令是 pg_ctlstop -m 立即。
这是一个高风险,数据可能存在问题,所以一般不使用。
如果要使用的话,下次打开数据库时需要很长时间才能恢复数据。
这类似于中止 Oracle 关闭。

其他事情 对于非Windows系统,可以使用kill命令发送信号。
例如: 重击 kill -INT head -1 /usr/local/pgsql/data/postmaster.pid
注意不要直接使用kill -9 ,否则资源无法完全释放,需要手动处理子进程。

Oracle有一种关闭事务模式,它会等到事务完成后再关闭。
PostgreSQL 没有直接的对应物。
如果您想要这种安全性,您应该使用智能关机。

如何选择? 通常采用快速闭合,安全、快捷。
特殊情况下使用智能关机。
作为最后的手段立即关闭。

sql数据库关闭命令是什么

需要明确的是,SQL 数据库关闭命令很复杂,因为每个数据库系统都有自己的关闭机制。
我们先来说说最重要的事情。
MySQL可以通过执行mysqladmin -uroot shutdown命令关闭所有连接。
还有一点是MySQL没有直接关闭指定数据库连接的命令,但是可以通过指定主机和端口来间接影响。
还有另一个重要的细节。
PostgreSQL可以通过执行pg_ctl -D /path/to/postgres/data stop命令关闭所有连接,并且可以通过SQL命令终止与指定数据库的连接。
我一开始也以为SQLite有专门的关闭命令,后来发现其实不需要。
当您退出命令行工具或应用程序时,数据库将自动关闭。
很多人不注意这一点。
关闭数据库前,请确保所有操作均已保存,以免数据丢失。
等等,还有一件事,在生产环境中关闭数据库时必须小心,并且最好在维护窗口期间执行此操作。
我认为值得尝试找出您正在使用的特定数据库系统的关闭命令,以避免不必要的问题。