41から始めました

文字通り41歳から始めたブログです。DB(MySQL)を使ってお仕事してるので、DB周りの話を中心に最近始めたこととかをTwitterのノリで書いています。なお、本サイトにおいて示されている見解は私個人の見解であり、所属団体や組織を代表するものではありません。

君は「ALTER DATABASE ... READ ONLY」を知ってるか?

※ この記事はMySQL Advent Calendar 2024 14日目の記事です。 軽めのネタです。

8.0.22からそいつは存在した

ALTER DATABASE 文にREAD ONLY オプションというものがあるのをご存じですか?

MySQL :: MySQL 8.0 Release Notes :: Changes in MySQL 8.0.22 (2020-10-19, General Availability)

MySQL :: MySQL 8.0 Reference Manual :: 15.1.2 ALTER DATABASE Statement

データベースおよびデータベース内のオブジェクトの変更を許可するかどうかを制御することがMySQL8.0.22からできるようになりました。

許可される値は、DEFAULT または 0 (読取り専用ではない) および 1 (読取り専用) です。

使い道としては移行やデータベース単位で書き込みを一旦凍結したい場合でしょう。

使い方

読み取り専用にするにはREAD ONLY = 1を、読み取り専用を解除(デフォルト状態に戻す)ならREAD ONLY =0をALTER DATABASE文に付けるだけです。

読み取り専用

ALTER DATABASE <schema_name> READ ONLY = 1;

読み取り専用解除(書き込み可能に戻す)

ALTER DATABASE <schema_name> READ ONLY = 0;

作業例

実際に試してみます。データベース名はtest_roとします。 作業環境はMySQL Shell for VS Codeです。

DB作成

DB作成
この時点ではREAD ONLYではありません。

READ ONLY = 1

READ ONLY 有効化
空っぽのDBだけどまあまあ(4.3秒)かかりました。

DBのREAD ONLY化確認

定義でREAD ONLY確認
CREATE DATABASE 文の最後に / READ ONLY = 1 / がついてますね!

ちなみに、これはINFORMATION_SCHEMA SCHEMATA_EXTENSIONS テーブルでも確認できます。

SCHEMATA_EXTENSIONSでの確認

リリースノート見ると、8.0.22のタイミングで入ってるので、とりあえずはこれのためのテーブルと言っても過言では無いでしょうw

A new INFORMATION_SCHEMA table named SCHEMATA_EXTENSIONS displays database options. Currently, it displays READ ONLY=1 for read-only databases. See The INFORMATION_SCHEMA SCHEMATA_EXTENSIONS Table. (WL #13369)

さて、本当に書き込みできないのか?

CREATE TABLE 失敗
テーブル作成できない!(成功) ちなみにDMLもダメでした。 じゃあ、そのREAD ONLYのデータベースは削除できるのか?
DROP DATABASE 失敗
できませんね!(ちゃんとドキュメントに書いてますw)

READ ONLY = 0

書き込みや削除できるようにするために、戻しておきましょう。

READ ONLY = 0
test_roデータベースを削除できました。
DROP DATABASE 成功

終わりに

割とドキュメントが簡潔ながら充実してたと思うので興味があれば読んでみてください。

明日のMySQLアドベントカレンダーは @yuito_it_さんです。(SQL Alchemy、前職のエンジニアにとても詳しい人が多いと思う)