web-dev-qa-db-ja.com

書き込み権限を取り消すvsデータベースを読み取り専用に設定する

新しいサーバーにデータベースを移行する予定です。移行段階では、Apacheユーザーがデータベースに何かを書き込めるようにしたくありません。 2つのオプションがあります。

  1. 書き込み権限を取り消す:

    REVOKE INSERT, UPDATE ON `mydb`.* FROM 'Apache'@'localhost';
    FLUSH PRIVILEGES;
    
  2. データベースを読み取り専用モードに設定します。

    FLUSH TABLES WITH READ LOCK;
    SET GLOBAL read_only = 1;
    

どちらを選択するかについて、実際的な考慮事項はありますか?

4

オプション2を選択します

  • オプション1を使用して特権を取り消す場合は、それらを元に戻す必要があります。 mysql付与テーブルはMyISAMです。クラッシュ、人為的エラー、またはその他の予期しないイベントによってテーブルが破損した場合、クリーンアップする必要があります。
  • read_only が有効になっている場合、 SUPER特権 を持つユーザーのみが書き込みを実行できます。 [〜#〜] super [〜#〜] はデータベースレベルの付与ではありません。
  • オプション2では、付与はディスク上とメモリ内で変更されません。

オプション2は次のように書くこともできます

FLUSH TABLES;
SET GLOBAL read_only = 1;

そうすれば、SET GLOBAL read_only = 0;を実行するだけで、書き込みを再開できます。 読み取りロック付きのフラッシュテーブルは、トランザクションログ、やり直しログ、元に戻すログへの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;

私が終わったとき、私はこれをしました

TRUNCATE TABLE mysql.user;
INSERT INTO mysql.user SELECT * FROM mysql.usercopy;
FLUSH PRIVILEGES;

それから、私は [〜#〜] super [〜#〜] を発見しました。

エピローグ

オプション2をそのまま使用するか、FLUSH TABLES WITH READ LOCK;FLUSH TABLES;に変更します

6
RolandoMySQLDBA