为了防止误操作,DRDS 默认禁止全表删除和全表更新的操作。
下列语句默认会被禁止:
DELETE 语句不带 WHERE 条件或者 LIMIT 条件;
UPDATE 语句不带 WHERE 条件或者 LIMIT 条件。
如果确实需要执行这类操作,可以通过 HINT 来临时跳过这个限制:HINT:/!TDDL:FORBID_EXECUTE_DML_ALL=false*/
示例
执行全表删除默认会被拦截:
mysql> delete from tt;
ERR-CODE: [TDDL-4620][ERR_FORBID_EXECUTE_DML_ALL] Forbid execute DELETE ALL or UPDATE ALL sql. More: [http://middleware.alibaba-inc.com/faq/faqByFaqCode.html?faqCode=TDDL-4620]
加 HINT 则可执行成功:
mysql> /!TDDL:FORBID_EXECUTE_DML_ALL=false*/delete from tt;
Query OK, 10 row affected (0.21 sec)
执行全表更新默认会被拦截:
mysql> update tt set id = 1;
ERR-CODE: [TDDL-4620][ERR_FORBID_EXECUTE_DML_ALL] Forbid execute DELETE ALL or UPDATE ALL sql. More: [http://middleware.alibaba-inc.com/faq/faqByFaqCode.html?faqCode=TDDL-4620]
加 HINT 则可执行成功:
mysql> /*TDDL:FORBID_EXECUTE_DML_ALL=false*/update tt set id = 1;
Query OK, 10 row affected (0.21 sec)
DELETE 或者 UPDATE 语句中带有 WHERE 或者 LIMIT 条件,不会出现这个限制。
mysql> delete from tt where id = 1;
Query OK, 1 row affected (0.21 sec)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
您描述的情况是正确的。阿里云分布式关系型数据库服务(DRDS)为了保护用户数据安全,避免因误操作导致的数据大量丢失或更改,确实默认禁止了全表删除(DELETE without WHERE or LIMIT)和全表更新(UPDATE without WHERE or LIMIT)的操作。
当您确实需要执行这类全表操作时,可以通过在SQL语句中添加特定的HINT来临时绕过这个安全限制。HINT是一种向DRDS解析器提供额外指令的方式,用于改变查询的执行策略。在您的例子中,使用了/!TDDL:FORBID_EXECUTE_DML_ALL=false*/
或者/*TDDL:FORBID_EXECUTE_DML_ALL=false*/
这样的HINT来允许执行全表的DELETE或UPDATE操作。
需要注意的是,尽管提供了这种方式来临时解除限制,强烈建议在执行这类操作前进行充分的数据备份,并确认该操作不会对业务造成不可逆的影响。此外,合理利用WHERE或LIMIT条件来精确控制影响的行数,是更安全、推荐的做法。
总之,DRDS的这一设计体现了“安全第一”的原则,旨在帮助用户在享受分布式数据库带来的扩展性与性能提升的同时,也能有效防止数据误操作风险。