PostgreSQL 10调用copy_to_csv无NOTICE/错误消息,求原因排查
PostgreSQL中NOTICE/错误消息的输出位置排查
咱们一步步拆解你的问题——先搞清楚PostgreSQL的通知和错误消息到底会输出到哪,再结合你的情况排查原因。
1. 消息的常规输出渠道
PostgreSQL的NOTICE、WARNING这类消息,默认有两个主要去向:
- 客户端终端/工具面板:如果你用
psql命令行连接数据库,消息会直接打印在执行命令的终端窗口;如果用pgAdmin这类GUI工具,消息会显示在工具的“消息”或“日志”面板中。 - PostgreSQL系统日志文件:如果是后台运行的脚本、定时任务,或者客户端没捕获到消息,消息会被写入系统日志。
2. 针对你的情况逐一排查
你说执行select copy_to_csv(E'select * from t', '/tmp/t');没看到NOTICE,但函数运行正常,大概率是这几个原因:
- 自定义函数没加NOTICE输出逻辑:
copy_to_csv应该是你自定义的函数吧?如果函数代码里没有用RAISE NOTICE 'xxx';这类语句主动输出通知,自然不会有NOTICE消息。你可以翻一下函数定义,看看有没有相关的RAISE语句。 - 客户端消息级别被过滤了:PostgreSQL客户端可以设置只接收特定级别的消息。比如如果
client_min_messages参数设成了WARNING或ERROR,NOTICE级别的消息会被直接过滤。你可以在psql里执行SHOW client_min_messages;查看当前设置(默认是notice)。临时修改可以用SET client_min_messages = notice;,永久生效的话就去/etc/postgresql/10/main/postgresql.conf里修改参数,然后重启PostgreSQL服务。 - 去系统日志里找找:Ubuntu 16 LTS下PostgreSQL 10的默认日志位置是
/var/log/postgresql/postgresql-10-main.log。你可以开个终端执行tail -f /var/log/postgresql/postgresql-10-main.log,再运行copy_to_csv函数,看看日志里有没有相关消息。 - 关于quote_ident()重载:既然重载函数运行正常,说明自定义函数的基础逻辑没问题,不用在这方面纠结,重点还是放在消息输出配置或函数本身的通知代码上。
3. 快速验证方法
你可以先在psql里跑个简单测试,确认消息通道是否正常:
RAISE NOTICE '这是一条测试通知';
如果这条测试消息能正常显示在终端,说明客户端消息设置没问题,就是copy_to_csv函数没加NOTICE输出代码;如果测试消息也没出来,就去检查client_min_messages设置,或者直接去系统日志里找。
内容的提问来源于stack exchange,提问作者Peter Krauss
相关产品推荐
相关产品推荐

