暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL问答-第23期

原创 多米爸比 2023-05-20
1111

本期问答如下:

  • 数据库如何卸载及挂载
  • 数据分隔符不生效问题
  • pg_dumpall报错问题
  • dblink连接保持问题
  • pg_basebackup不包含所有对象

Q1. PG数据库如何卸载及挂载

问题描述

在SQL Server数据库有sp_detach_db操作可以卸载一个库,可以从当前实例中分离指定数据库,使其脱机,分离后的数据库数据库文件可以使用sp_attach_db将其挂在到SQL Server 实例中。

在PG中如何对db进行卸载及挂载呢?

问题解答

PG数据库里可以使用pg_dump/pg_restore对db做导出导入。

例如可以先对pg_hba.conf设置db的黑名单,不允许新的连接进来,然后处理pg_stat_activity对db的当前活跃连接,接着使用pg_dump/pg_restore对db做导出导入,最后可以drop db。

Q2. 数据分隔符不生效问题

问题描述

psql -c执行查询语句时,使用-F设置数据分隔符,但不生效,语句如下:

$ psql -F "@@" -c "select * from t1;" id | info -----+------ 100 | aaa 200 | bbb (2 rows)

-F选项为什么没有生效呢?

问题解答

查看psql的帮助文档,-F选项的解释如下:

Use separator as the field separator for unaligned output. This is equivalent to \pset fieldsep or \f.

当语句以非对齐模式输出时,可以使用该选项设置分隔符,而语句默认是对齐模式。

-F选项需要与-A选项结合使用,下面是正确的示例:

$ psql -AF "@@" -c "select * from t1;" id | info id@@info 100@@aaa 200@@bbb (2 rows)

-F选项需要与-A选项可以简写为-AF,还可以增加-t选项,只显示数据。

$ psql -tAF "@@" -c "select * from t1;" 100@@aaa 200@@bbb

Q3. pg_dumpall报错问题

使用pg_dumpall如果连接端口信息不对,会出现如下报错信息:

$ /opt/pg13/bin/pg_dumpall -f s1.sql -s -U postgres -p 5432 pg_dumpall: error: could not connect to database "template1": connection to server on socket "/tmp/.s.PGSQL.5432" failed: 没有那个文件或目录 Is the server running locally and accepting connections on that socket?

虽然报错提示信息可以看出一些问题,大概可以直接猜测出可能端口不对或者数据库服务不正常。

不过前半部分的提示信息是不能连接到"template1",还是有点懵。

在下一个版本PG 14里,可以看到对这个报错信息做了简化,去掉了不能连接到"template1"的信息,新版本里的信息更加合理。

$ /opt/pg14/bin/pg_dumpall -f s1.sql -s -U postgres -p 5432 pg_dumpall: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: 没有那个文件或目录 Is the server running locally and accepting connections on that socket?

Q4. dblink连接保持问题

在PG数据库可以使用dblink进行跨库访问,远程数据库访问需要使用dblink_connect函数先建立连接,dblink建立的连接是基于会话(session)的,会话结束则远程连接自动关闭,不能持久化存储远程连接。

单个会话中可以保持连接并执行多个操作,能重复使用dblink_exec、dblink_fetch来执行多个查询,避免每个操作之间重新建立连接。

在另一个会话中调用dblink_connect函数将创建一个新连接,也就意味着无法在不同会话之间共享 dblink_connect创建的连接。

Q5. pg_basebackup备份不包含所有对象

从PG邮件列表看到一个问题,使用pg_basebackup工具进行备份相比直接使用低阶的pg_start_backup/pg_stop_backup(PG15重命名为pg_backup_start/pg_backup_stop)
会缺失pg_replication_slots里复制槽信息,在最新的PG15.3进行测试也有同样的现象。

往期问答链接:PostgreSQL 问答合辑

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论