通过脚本自动安装PostGIS扩展至AWS RDS PostgreSQL遇交互阻塞问题
解决PostgreSQL脚本中SELECT exec导致psql交互卡顿的问题
我太懂这个坑了!你遇到的问题本质是psql默认启用了分页功能,当你的SELECT exec语句返回大量ALTER TABLE的执行结果时,psql会自动调用分页器(比如less),导致脚本卡住等待你按q退出分页。下面给你几个靠谱的解决办法:
方法1:临时关闭psql分页器
最简单的方式就是在执行脚本时直接关闭分页,有两种途径:
- 在命令行添加参数:修改你的psql执行命令,加上
--pset pager=off:psql -h myrdsinstance.rds.amazonaws.com -U myusername -d mydbname -a -f script.sql --pset pager=off - 在脚本开头添加命令:在
script.sql的最顶部加入一行psql元命令,强制关闭分页:\pset pager off
方法2:改用DO块执行,避免返回结果
你的SELECT exec会把每一条ALTER TABLE的执行结果都返回,改用PL/pgSQL的DO块来循环执行,就不会产生任何返回结果,从根源上避免分页触发:
DO $$ BEGIN -- 循环遍历需要修改权限的表/序列/视图 FOR rec IN SELECT nspname, relname FROM pg_class c JOIN pg_namespace n ON (c.relnamespace = n.oid) WHERE nspname IN ('tiger','topology') AND relkind IN ('r','S','v') ORDER BY relkind = 'S' LOOP -- 动态执行ALTER TABLE语句,用format函数更简洁安全 EXECUTE format('ALTER TABLE %I.%I OWNER TO rds_superuser;', rec.nspname, rec.relname); END LOOP; END $$;
方法3:用安静模式抑制输出(可选)
如果不需要看详细的执行日志,可以给psql加上-q参数(安静模式),它会抑制大部分非必要输出,不过注意这个参数会和-a(显示所有执行语句)有点冲突,需要根据你的需求权衡:
psql -h myrdsinstance.rds.amazonaws.com -U myusername -d mydbname -q -f script.sql
推荐优先用方法1或方法2,方法1简单快速,方法2更优雅且避免不必要的输出,完全适配自动化脚本的需求。
内容的提问来源于stack exchange,提问作者James




