为什么我无法删除 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

无效操作错误显示目标对象上的目标依赖关系。

要识别依赖于目标表的对象,请创建以下三个视图:

创建这三个视图后,使用 v_object_dependency.sql 脚本获取目标对象的依赖对象:

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 中检测和解除锁定?


这篇文章对您有帮助吗?


您是否需要账单或技术支持?