本期问答如下:
- 数据库如何卸载及挂载
- 数据分隔符不生效问题
- 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 问答合辑