You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

通过脚本自动安装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

火山引擎 最新活动