为什么我无法删除 Amazon Redshift 集群中的对象?
上次更新时间:2020 年 9 月 10 日
我无法删除 Amazon Redshift 集群中的表或视图。为什么会发生这种情况?
简短描述
可能是以下原因,导致您无法删除 Amazon Redshift 集群中的对象(如表或视图):
- 权限不足:用户没有删除对象的适当权限。(用户必须是对象的拥有者或具有管理权限。)
- 对象依赖关系:表列被另一个视图或表引用
- 锁争用:某个事务锁定了对象,导致删除操作挂起。
解决方法
权限不足
在 Amazon Redshift 中,只有表的拥有者、架构所有者或超级用户才能删除表。
要确认用户权限和所有权,请使用 v_get_obj_priv_by_user.sql 脚本创建视图:
CREATE OR REPLACE VIEW admin.v_get_obj_priv_by_user
AS
SELECT
对象依赖关系
您的删除操作可能会失败,并显示以下错误消息:
Invalid operation: cannot drop table/view <object_name> because other objects depend on it
select * from admin.v_object_dependency where src_objectname=<target object>
检查所有依赖对象后,使用 CASCADE 参数删除所有相关对象以及目标对象:
drop table <target object> cascade;
锁争用
如果在执行删除时,drop 命令挂起或没有输出任何内容,则可能是有事务锁定了对象。因此,您无法获取表上的 AccessExclusiveLock。需要 AccessExclusiveLock 来删除对象。
要识别锁定,请使用以下语法:
select a.txn_owner, a.txn_db, a.xid, a.pid, a.txn_start, a.lock_mode, a.relation as table_id,nvl(trim(c."name"),d.relname) as tablename, a.granted,b.pid as blocking_pid ,datediff(s,a.txn_start,getdate())/86400||' days '||datediff(s,a.txn_start,getdate())%86400/3600||' hrs '||datediff(s,a.txn_start,getdate())%3600/60||' mins '||datediff(s,a.txn_start,getdate())%60||' secs' as txn_duration
from svv_transactions a
left join (select pid,relation,granted from pg_locks group by 1,2,3) b
on a.relation=b.relation and a.granted='f' and b.granted='t'
left join (select * from stv_tbl_perm where slice=0) c
on a.relation=c.id
left join pg_class d on a.relation=d.oid
where a.relation is not null;
And once you identify the locking transaction either COMMIT the blocking transaction or terminate the session of the blocking transaction if it is no longer necessary by :
select pg_terminate_backend(PID);
识别锁定后,使用 PG_TERMINATE_BACKEND 解除锁定。有关检测和解除锁定的更多信息,请参阅如何在 Amazon Redshift 中检测和解除锁定?