※ この記事は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作成
この時点ではREAD ONLYではありません。
READ ONLY = 1
空っぽのDBだけどまあまあ(4.3秒)かかりました。
DBのREAD ONLY化確認
CREATE DATABASE 文の最後に / READ ONLY = 1 / がついてますね!
ちなみに、これはINFORMATION_SCHEMA 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)
さて、本当に書き込みできないのか? テーブル作成できない!(成功) ちなみにDMLもダメでした。 じゃあ、そのREAD ONLYのデータベースは削除できるのか? できませんね!(ちゃんとドキュメントに書いてますw)
READ ONLY = 0
書き込みや削除できるようにするために、戻しておきましょう。 test_roデータベースを削除できました。
終わりに
割とドキュメントが簡潔ながら充実してたと思うので興味があれば読んでみてください。
明日のMySQLアドベントカレンダーは @yuito_it_さんです。(SQL Alchemy、前職のエンジニアにとても詳しい人が多いと思う)