Redshift创建的表无法持久化,断开重连后消失,求解决方法
解决Redshift创建表无法持久化的问题
这个问题我之前排查过好几次,大概率是事务未提交或者连接配置的问题,给你几个具体的解决步骤:
1. 先检查SqlWorkbenchJ的自动提交设置(最常见原因)
SqlWorkbenchJ默认可能没开自动提交,这时候你执行的CREATE TABLE操作其实在一个未提交的事务里——只有当前连接能看到这个临时的表状态,一旦断开连接,事务直接回滚,表就没了。
解决起来很简单:
- 执行完建表语句后,手动点击工具栏的Commit按钮(或者按
Ctrl+Enter快捷键)提交事务; - 一劳永逸的方法是开启自动提交:点击顶部菜单栏的
SQL->Auto-commit,确保这个选项被勾选,这样每次执行SQL后都会自动提交,不用手动操作。
2. 确认建表语句没隐含临时表属性
Redshift里的临时表(TEMP/TEMPORARY关键字)或者会话级表是会随连接断开自动删除的。你的原语句看起来没问题,但可以显式加上PERMANENT关键字强制创建持久化表,避免意外:
CREATE TABLE mydb_dev.Widget ( fizz BIGINT, buzz BIGINT, lastRanOn timestamp with time zone NOT NULL DEFAULT (current_timestamp AT TIME ZONE 'UTC') ) PERMANENT;
3. 验证重连后的数据库和Schema是否匹配
有时候重连后,SqlWorkbenchJ可能默认连接到了其他数据库,或者默认Schema不对,导致你找不到表。可以先执行这行SQL确认当前上下文:
SELECT current_database(), current_schema();
如果发现数据库或Schema不对,要么查询时写全路径数据库名.mydb_dev.Widget,要么切换到正确的Schema:
SET search_path TO mydb_dev;
4. 用系统视图确认表是否真的存在
如果上面的步骤都试过还是不行,换个有高权限的账号(比如超级用户)登录Redshift,查系统视图看看表到底有没有被创建:
SELECT * FROM pg_tables WHERE schemaname = 'mydb_dev' AND tablename = 'widget';
注意Redshift默认会把表名转成小写,所以这里要用widget而不是Widget(除非你创建表时用双引号把Widget包起来了)。如果查不到结果,那肯定是建表操作没被持久化,回到第一步再检查事务提交的问题。
内容的提问来源于stack exchange,提问作者hotmeatballsoup
相关产品推荐
相关产品推荐

