web-dev-qa-db-ja.com

奇妙なMySQLの「読み取り専用」エラー

データベースのread-onlyフラグに関連していると思われる、奇妙なMySQLエラーが発生しています。 MySQLを使用するWebアプリケーションがDebian 7.9で実行されています。数週間以上は正常に動作していましたが、突然、アプリケーションを使用したWebサイトにアクセスしようとすると、空のWebページで次のエラーメッセージが生成されました。

エラー:500-SQLSTATE [HY000]:一般エラー:1290 MySQLサーバーは--read-onlyオプションで実行されているため、このステートメントを実行できません

以下は、調査の一環として実行した手順です。

  • インターネット上の関連情報を見つけて読んでください(一部はMySQLのread-onlyフラグを指しています);
  • 上記に基づいて、MySQL configでread-onlyフラグを見つけようとしました。ファイル(my.cnf)-見つかりませんでしたが、フラグのデフォルト値はとにかくOFFであると読みました。
  • ファイルシステムを検証して、十分なディスク容量があることを確認しました(df -h):Filesystem Size Used Avail Use% Mounted on udev 10M 0 10M 0% /dev tmpfs 3.2G 1.4M 3.2G 1% /run /dev/disk/by-uuid/xxxxxxxxxxxxxxxxx 113G 14G 94G 13% / tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 7.3G 72K 7.3G 1% /run/shm

  • mysqlcheck --all-databasesを実行しました:すべてのテーブルは問題ありません。

  • サーバーで使用可能なRAM)が十分にあることを確認しました(free):total used free shared buffers cached Mem: 32898332 2090268 30808064 0 425436 970348 -/+ buffers/cache: 694484 32203848 Swap: 5105660 0 5105660
  • 最後に、問題の存在中および一時的な修正(DBの再起動)の後、MySQL関連プロセス(ps ax | grep mysql)の「スナップショット」を取ることを決定しました。対応する結果は次のとおりです。

    問題:20307 ? S 0:00 /bin/sh /usr/bin/mysqld_safe 20635 ? Sl 0:37 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306 20636 ? S 0:00 logger -t mysqld -p daemon.error 36427 pts/0 S+ 0:00 grep mysql

    問題なし:36948 pts/0 S 0:00 /bin/sh /usr/bin/mysqld_safe 37275 pts/0 Sl 0:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306 37276 pts/0 S 0:00 logger -t mysqld -p daemon.error 38313 pts/0 S+ 0:00 grep mysql

更新:

私はこの問題をもう一度経験し、グローバル読み取り専用フラグがオフに設定されているかどうかを確認することにしました。私の仮定は確認しました:

mysql> SELECT @@global.read_only;
+--------------------+
| @@global.read_only |
+--------------------+
|                  1 |
+--------------------+
1 row in set (0.00 sec)

デフォルトのOFF値にもかかわらず、システムのプロセスによって上書きされるため、MySQL構成ファイルを介して読み取り専用フラグを明示的かつ永続的にOFFに設定する必要があります。回答の後半で結果を報告します。

14
Aleksandr Blekh

ご覧のとおり、データベースが読み取り専用に設定されている理由には、大きく分けて2つの理由があります。

1)MySQLは自身を読み取り専用に設定しています

MySQLが読み取り専用になる原因がわからない、おそらくディスクの問題やデータベースの破損?いずれにせよ、ログに何かが表示されるはずなので、MySQL(およびシステム)ログを確認してください。

2)クライアントがデータベースを読み取り専用に設定している

MySQLに接続するクライアントは、次のコマンドを使用してデータベースを読み取り専用に設定できます。

SET GLOBAL read_only = ON;

ただし、これを行うには、ユーザーにSUPER特権が必要です。この権限は、MySQLを使用しているWebサイト、アプリケーションなどには必要ありません。データベースの管理に使用する管理者アカウントに対してのみ保持してください。

該当するデータベース/テーブルに対して必要なことだけを行う権限を持つように、各ユーザーが持つ権限をロックダウンします。すぐに使用できるアプリケーションを使用している場合、必要なアクセス許可の詳細な説明が必要です(例:SELECT, INSERT, DELETE, UPDATE)。

10
Eborbob

AWS Auroraを使用している場合は、 読み取り専用のレプリカインスタンスにアクセスしている可能性があります ですので、代わりにDBクラスターエンドポイントを使用する必要があります。

5
sashoalm

同じエラーが発生したので、IPアドレスではなくmysqlサーバーのホスト名に接続して修正しました。なぜこれが修正されたのかわかりませんが、修正されました。ちなみに

1
Chris Hall

私の質問のコメント(@Eborbobに特に感謝)と私の更新に基づいて、システム内の一部のプロセスが_read-only_フラグをON (1)にリセットし、それが問題と結果を引き起こすように思われるウェブサイトにアクセスできなくなります。ソフトウェアとサーバーの再起動全体で問題を修正し、この修正persistentを行うために、MySQL構成ファイル_my.cnf_を更新することにしました。 DBサーバーを再起動します。

構成ファイルに関連する更新(私の場合は追加)を行った後

_read_only=0
_

フラグが実際にOFF (0)に設定されていることを確認しましょう:

_# mysql
mysql> SELECT @@global.read_only;
+--------------------+
| @@global.read_only |
+--------------------+
|                  0 |
+--------------------+
1 row in set (0.00 sec)
_

最後に、MySQLサーバーを再起動しましょう(何らかの理由で、MySQL設定(_/etc/init.d/mysql reload_)のdynamic reloadingが機能しなかったため、 to restartデータベースサーバーを明示的に:

_service mysql stop
service mysql start
_

出来上がり!これで、Webサイトへのアクセスが復元されました。変更が発生した場合、私の答えを更新します。

1
Aleksandr Blekh

以下のエラー:-MySQLサーバーは--read-onlyオプションで実行されているため、このステートメントを実行できません

これは、sql dbの書き込み権限を持っていないユーザーが、dbにデータを挿入/更新しようとしたときに発生します。

これは非常に有効なセキュリティエラーです。現在は読み取り専用の権利しか持っていないため、書き込みに関係するクエリを実行できないことを示しています。

このエラーを解決するには:-DBAから書き込みアクセス権を取得します。

例えば.

GRANT ALL PRIVILEGES ON database.table TO 'user'@'localhost';

上記のクエリは、ユーザー名「user」のユーザーにすべての特権を付与します。

0
Akash Verma

set global read_only = off;後で読み取り専用モードをオフにすると、確実に動作します。

0
Ajay Gadhavana

エボルボブはおそらくクライアントだと言っているように、

バックアップツールを確認しましたか?

ProxySQLやmaxscaleなどのSQLプロキシを使用しますか?たとえば、Mascaleは監視することで読み取り専用を強制できます: https://jira.mariadb.org/browse/MXS-1859

レプリケーションマネージャーは、読み取り専用フラグも変更できます。

0
NicoMinsk