web-dev-qa-db-ja.com

書き込み用のデータベーステーブルを無効にするが、書き込みが成功したと報告する

私は、数千GBの無駄なログデータが毎日作成されるデータベースを管理しています。

この(不要な)ロギングをすべて実行しているソフトウェアを修正できません。このログテーブルをロック(または書き込みを無効にする)して、書き込まれないようにする方法はありますが、同時に書き込みが成功したと報告し、ソフトウェアに問題を引き起こしませんか?

テーブルをcronjobで切り捨てることができることはわかっていますが、もっと良いアプローチがあるかどうか知りたいのですが?

2
Freedo

MySQL と友人、つまり MariaDBPercona には、 Black Holeエンジン と呼ばれるかなり変わったストレージメカニズムがあります。特定のリクエストに役立つ場合があります(フィドル こちら を参照)。

たとえば、次のようにした場合:

CREATE TABLE foo
(
  bar INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  baz VARCHAR (30) NOT NULL
) ENGINE = InnoDB;
Query OK, 0 rows affected (0.07 sec)

とにかくデフォルトのEngineはInnoDBですが、ここでは明確にするために明示的にしています。

次に、いくつかのレコードを入力します。

mysql> INSERT INTO foo (baz) VALUES ('afadfa'), ('sfasdfa'), ('asdfadf');
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

そこに問題はありません!次に、確認するには:

mysql> SELECT * FROM foo;
+-----+---------+
| bar | baz     |
+-----+---------+
|   1 | afadfa  |
|   2 | sfasdfa |
|   3 | asdfadf |
+-----+---------+
3 rows in set (0.00 sec)

庭のバラ色!

さて、面白い部分です!

mysql> ALTER TABLE foo ENGINE = BLACKHOLE;
Query OK, 3 rows affected (0.10 sec)
Records: 3  Duplicates: 0  Warnings: 0

OK。次のように、データのINSERTingを楽しく続けます。

mysql> INSERT INTO foo (baz) VALUES ('xxxxx'), ('yyyyy'), ('zzzzzzz');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

繰り返しになりますが、すべてうまくいきます。データベースは幸せです。私たちも幸せです。そして最も重要なのは、サードパーティのソフトウェアが幸福にも幸せであり、環境の変化を知らないことです。

だが!!!今、これを行うと:

mysql> SELECT * FROM foo;
Empty set (0.00 sec)

なだ!ジルチ!リエン!ない...

私たちのデータはブラックホールの イベントの地平線 を満たしています。あなたは好きなだけ多くのデータを入れることができます-それはにファイルを送るようなものです /dev/null * nix!

あなたは尋ねました:

このログテーブルをロックして書き込まれないようにする方法はありますが、同時に書き込みが成功したと報告され、ソフトウェアに問題を引き起こしませんか?

そして今、あなたは(上記を参照)INSERTの外側に通常の動作を持っています:

Query OK, 3 rows affected (0.00 sec)
    Records: 3  Duplicates: 0  Warnings: 0

だから、私たちは黄金です!すべての意図と目的のために、サーバーに送信されるデータはを除いて忠実に保存されています!

これらのログを書き込むソフトウェアには、すべてがおかしな話であるように見えますが、何も書き込まれません-それは本当にかなり気の利いたものです。

これは、要件に合わせて作成されたかのように見えます。 MariaDBでは、説明されているようにプラグインをロードする必要があります here が、それはかなり簡単に思えます。から ここ

アプリケーションはエラーなしで機能し続けます。しかし、データが実際に書き込まれることはないため、余分なI/Oはすべてなくなります。

警告の言葉!このすべてのログデータをサーバーに書き込んでいるソフトウェアが何であるかはわかりませんが、誰かが、どこかで、保存する価値があると考えていました。赤ちゃんがお風呂で捨てられていないことを確認してください!

また、この厄介なソフトウェアのサポート契約を結んでいる場合は、これを行うことによってその連絡先を無効にしていないかどうかを確認する必要があるかもしれません。

最後に、ブラックホールテーブルで次のようなことを試した場合、

INSERT INTO foo (baz) VALUES (23, 'asdfds'), (33), (43, 'adsfd');

結果:

Column count doesn't match value count at row 1

したがって、エラーでさえ本物であり、エラーが発生した場合、ソフトウェアは期待どおりに動作し、このようなことが発生しても(すべての外観が)正常に機能し続けます。

フィドルはMySQL 8用であり、MariaDB用ではないことに気付くでしょう。 MariaDB(これについて fiddle )を使用すると、実行しようとすると権限拒否エラーが表示されます

ALTER TABLE foo ENGINE = BLACKHOLE;  

私はメッセージを受け取ります:

Unknown storage engine 'BLACKHOLE'

これは予想されることです-MariaDBリンクから:

BLACKHOLEストレージエンジンは、MariaDB 10.0までデフォルトでインストールされていました。 MariaDB 10.1以降では、ストレージエンジンのプラグインをインストールする必要があります。

エンジンタイプの変更とプラグインのインストールの両方が失敗しました(公開サーバーではほとんど驚かされません)。

INSTALL SONAME 'ha_blackhole';

与える:

INSERT command denied to user
'fiddle_PIIYJABQHVJRTTYOTJLC'@'localhost' for table 'plugin'
4
Vérace