はじめに
この記事では読み取り専用モードの変更手順と、更新可能モードに戻す手順をご紹介します。
読み取り専用モードとは?
通常、データベースは参照・更新の両方の処理が可能な状態で稼働しています。
読み取り専用モードとは、文字通り読み取りのみ許可された状態を表し、更新処理を行うことができない状態で稼働します。
読み取り専用モードで稼働させることで、誤ったデータの書き込み処理を抑えたり、更新処理によるロックの挙動を抑えてデータの参照処理を行うことができます。
読み取り専用(READ ONLY)モードへの変更手順
デフォルトのトランザクションモードを確認
まずはじめに、モードを変更する前に、デフォルトのトランザクションモードを確認します。
※画面の関係上、縦表示に切り替えています。
dbadmin=> \x
Expanded display is on.
dbadmin=> SELECT parameter_name, database_value, allowed_levels, description
dbadmin-> FROM configuration_parameters WHERE parameter_name = 'TransactionMode';
-[ RECORD 1 ]--+------------------------------------------------------------------------------------------
parameter_name | TransactionMode
database_value | READ WRITE ★デフォルトのモード
allowed_levels | NODE, DATABASE
description | Determines whether the transaction is read/write or read-only. Read/write is the defaultデフォルトはREAD WRITE(更新可能)モードであることがわかります。
トランザクションモードを変更する
以下の構文に従って、READ ONLY(読み取り専用)モードに変更します。
【構文】
ALTER DATABASE <データベース名> SET TransactionMode = ‘READ ONLY’;
dbadmin=> ALTER DATABASE ssbm SET TransactionMode = 'READ ONLY';
ALTER DATABASE
dbadmin=> SELECT parameter_name, database_value, allowed_levels, description
dbadmin-> FROM configuration_parameters WHERE parameter_name = 'TransactionMode';
-[ RECORD 1 ]--+------------------------------------------------------------------------------------------
parameter_name | TransactionMode
database_value | READ ONLY ★
allowed_levels | NODE, DATABASE
description | Determines whether the transaction is read/write or read-only. Read/write is the default読み取り専用(READ ONLY)モードに変更されたことがわかります。
動作確認
設定変更後は、新規セッションから読み取り専用(READ ONLY)モードの動作が反映されます。
別セッションから更新処理が制御されるかどうか挙動を確認してみます。
テスト用テーブルを確認
dbadmin=> \d tab1;
List of Fields by Tables
Schema | Table | Column | Type | Size | Default | Not Null | Primary Key | Foreign Key
--------+-------+--------+-------------+------+---------+----------+-------------+-------------
public | tab1 | col1 | varchar(10) | 10 | | f | f |
(1 row)
dbadmin=> select * from tab1;
col1
--------
あああ
(1 row)
dbadmin=> insert into tab1 values ('いいい');
ERROR 2448: Cannot issue this command in a read-only transaction ★
dbadmin=> select * from tab1;
col1
--------
あああ
(1 row)更新処理を実行したところエラーになりました。
パラメータが正常に反映され、書き込みが制御されていることがわかります。
更新可能(READ WRITE)モードへの変更手順
トランザクションモードを元に戻す
再度、READ WRITE(更新可能)モードに戻します。
この際、初めにセッションの特性を変更する必要があります。
何も実行せずに読み取り専用から変更しようとすると、以下のようなエラーが出力されますのでご注意ください。
dbadmin=> ALTER DATABASE mydatabase SET TransactionMode = 'READ WRITE';
ROLLBACK 2448: Cannot issue this command in a read-only transaction以下SQLでセッションの特性を変更し、変更後にトランザクションモードを元に戻します。
【構文】
SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ COMMITTED READ WRITE;
dbadmin=> SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ COMMITTED READ WRITE;
SET次に、以下の構文に従って、READ WRITE(更新可能)モードに変更します。
【構文】
ALTER DATABASE <データベース名> SET TransactionMode = ‘READ WRITE’;
dbadmin=> ALTER DATABASE ssbm SET TransactionMode = 'READ WRITE';
ALTER DATABASE動作確認
パラメータがもとに戻ったかどうかを確認します。
dbadmin=> \x
Expanded display is on.
dbadmin=> SELECT parameter_name, database_value, allowed_levels, description
dbadmin-> FROM configuration_parameters WHERE parameter_name = 'TransactionMode';
-[ RECORD 1 ]--+------------------------------------------------------------------------------------------
parameter_name | TransactionMode
database_value | READ WRITE ★
allowed_levels | NODE, DATABASE
description | Determines whether the transaction is read/write or read-only. Read/write is the default更新処理が可能かどうか確認をします。
dbadmin=> insert into tab1 values ('いいい');
OUTPUT
--------
1
(1 row)
dbadmin=> select * from tab1;
col1
--------
あああ
いいい
(2 rows)正しくデータを更新出来たことを確認できました。
参考情報
Verticaのトランザクション管理について
https://www.ashisuto.co.jp/cm/analytics-database/transaction.html
検証バージョンについて
この記事の内容はVertica 12.0で確認しています。
更新履歴
2023/06/21 Vertica12.0用に検証バージョンを修正
2017/08/14 本記事を公開