撤销写入权限与将数据库设置为只读

Que*_*low 4 mysql innodb migration permissions read-only-database

我计划将数据库迁移到新服务器。在过渡阶段,我不希望 Apache 用户能够向数据库写入任何内容。我有两个选择。

  1. 撤销写入权限:

    REVOKE INSERT, UPDATE ON `mydb`.* FROM 'apache'@'localhost';
    FLUSH PRIVILEGES;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将数据库设置为只读模式:

    FLUSH TABLES WITH READ LOCK;
    SET GLOBAL read_only = 1;
    
    Run Code Online (Sandbox Code Playgroud)

选择其中之一是否有任何实际考虑?

Rol*_*DBA 6

我会选择选项 2

  • 如果您使用选项 1 并撤销权限,则必须将它们放回原处。mysql 授权表是 MyISAM。如果任何崩溃、人为错误或其他意外事件损坏了表,您就需要清理一团糟。
  • 启用read_only时,只有具有SUPER 权限的人才能执行写入。SUPER不是数据库级别的授权。
  • 使用选项 2,授权在磁盘和内存中保持不变。

选项2也可以写成

FLUSH TABLES;
SET GLOBAL read_only = 1;
Run Code Online (Sandbox Code Playgroud)

这样,您只需运行SET GLOBAL read_only = 0;即可再次进行写入。FLUSH TABLES WITH READ LOCK 不会停止 InnoDB 写入事务日志、重做日志和撤消日志。这就是为什么SET GLOBAL read_only = 1;是你的朋友。

警告

在我担任 DBA 的早期,我曾经这样做过:

CREATE TABLE mysql.usercopy LIKE mysql.user;
CREATE TABLE mysql.root     LIKE mysql.user;
INSERT INTO mysql.usercopy SELECT * FROM mysql.user;
INSERT INTO mysql.root SELECT * FROM mysql.user WHERE user='root';
TRUNCATE TABLE mysql.user;
INSERT INTO mysql.user SELECT * FROM mysql.root;
FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

当我完成后,我做了这个

TRUNCATE TABLE mysql.user;
INSERT INTO mysql.user SELECT * FROM mysql.usercopy;
FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

然后,我发现了SUPER

结语

按原样使用选项 2,或更改FLUSH TABLES WITH READ LOCK;FLUSH TABLES;