【问题标题】:MySQL shell/client: Read-only access, or "safe history" option?MySQL shell/client:只读访问,还是“安全历史”选项?
【发布时间】:2009-10-07 18:25:40
【问题描述】:

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

是的,这是在实时生产数据库中。

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

然后我回到我的 live shell,从历史记录中拉出一行,更改 where 子句以查看生成的插入,然后点击 [Enter] ...

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

哎呀。

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

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

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

【问题讨论】:

    标签: mysql workflow mysql-management


    【解决方案1】:

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

    或者只是习惯于在事务中工作。 :) 当你打开 shell 时输入 BEGIN,如果/当你真的想要时才输入 COMMIT

    【讨论】:

    • 我会添加“关闭自动提交”,以便您自动获取可以退出的事务。这里有一些问题:1)应用程序可能没有在设计时考虑 autocommit = 0,所以你会有新的错误,2)你必须记住在关闭窗口之前提交,否则你会得到一个自动回滚,3)如果你有一个事务打开并且你正在玩一段时间,你冒着锁定其他用户需要的行并且他们的应用程序因此停止响应或超时的风险。
    【解决方案2】:

    --safe-updates 选项让您分道扬镳。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-10
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 2017-12-10
      • 1970-01-01
      • 2012-06-05
      • 2013-11-30
      相关资源
      最近更新 更多