5

昨天我正在编写一个 shell 脚本来执行一些中等复杂的表插入到 MySQL 数据库。自然地,我mysql打开了一个客户端 shell 窗口,用于运行describe命令、示例查询以及在测试周期之间删除我的测试行。

是的,这是在一个实时的生产数据库上。

在我完成编码的时候,我请一位同事在运行脚本处理批处理条目之前检查我的工作。我们审查了所有内容,他同意这对他来说是正确的,然后我取消了剧本。没问题。

然后我回到我的 live shell,从历史中拉出一行,更改where子句以查看结果插入,然后按 [Enter] ...

...不幸的是,我没有查看我正在编辑的整个命令!这是一个delete声明,而不是一个select.

哎呀。

好的,所以我知道我可以设置一个不同的 DBMS 服务器,将此 DB 的转储恢复到该服务器并在其上完成所有测试。我们都知道,这样会更安全、更有纪律。我们也都知道,有时在现场商店工作更方便。(在这种情况下,风险比您预期的要低一些......有问题的数据库用于批处理,我们能够在 10 分钟内从仅 20 分钟的备份中恢复delete)。

然而,这让我想到了一个问题:客户端 shell 是否有一些选项(或一些补丁)mysql可以使其只读?是否有一些选项可以修改它在交互历史中存储的内容?(将标记deletedrop table类似“危险”语句的东西标记为“在重新执行之前提示验证?”mysql客户端是否具有类似于该bash HISTIGNORE功能的东西?

做这种工作的更安全的方法是什么(没有开发完全独立的数据库副本)?

4

2 回答 2

5

如果您想要完全只读访问权限,请创建一个没有任何写入权限的用户帐户。

或者只是习惯于在事务中工作。:)BEGIN在您打开 shell 时输入,并且仅COMMIT当您真的想要时输入。

于 2009-10-07T18:29:55.607 回答
5

--safe-updates选项可让您在其中分道扬镳。

最好的方法是为只读访问创建一个新用户并且只允许 SELECT。例如:


    GRANT SELECT ON *.* TO readonly@'%' IDENTIFIED BY 'password';
    FLUSH PRIVILEGES;

于 2009-10-07T18:33:14.180 回答