Yukiです。
今日は基本的な運用管理について学びました。
Photo by Harshil Gudka on Unsplash
データベースユーザの追加・変更・削除
緑の本を読んでいたら、10日目によくわからないと言っていたスーパーユーザーの説明がありました。
[PR]<『OSS教科書 OSS-DB Silver Ver.3.0対応』をAmazonで探す>
- 一般ユーザー: データベースへ通常のアクセスを行うユーザー
- スーパーユーザー: データベースの管理を行うユーザー
いや、語感からそんな気はしてましたが・・・
けっこうマニュアルを探しても見つけられなかったのに・・・
まあ、いいでしょう。
OSコマンドのcreateuser/dropuserコマンドでユーザーの作成/削除ができるそうです。
面白いと感じたのは、SQLコマンドのALTER USER文でユーザー名も変えれるんですね。
ALTER USER yuki RENAME TO snow;
名前を間違えた時に使えるかもしれません。
実運用だとあまりない気はしますが・・・
テスト環境でとりあえずユーザーを作ったけど、名前が気に入らなかったときに使えるかもしれません。
また、スーパーユーザー権限のはく奪なんかもできるんですね。
ALTER USER yuki WITH NOSUPERUSER;
これも、間違って権限をつけてしまったときの修正に使えるかもしれません。(本当に?)
あれ、全員スーパーユーザでなくなったらどうなるんでしょう?
自分のスーパーユーザー権限ははく奪できないのかな?
ところで、Oracleのプロファイルみたいにややこしいのは、PostgreSQLにはなさそうですね。
権限
標準SQLということでOracleと同じですね。
ただ、細かい違いはあるのかもしれません。
(すみません。普段あまり打たないコマンドなので、リファレンスを見ないとわかりません。)
ちなみに、GRANTで権限を付与するときに、テーブル単位だけでなく、列単位でも設定できるようです。驚きました。
GRANT SELECT (col1, col2, col3) ON table1 TO yuki;
権限を確認するときは、メタコマンドの「\dp」または「\z」を使います。
\dp table1
なんで2個同じコマンドがあるんでしょうね?
バキューム (VACUUM)
ついにPostgreSQL独特の概念が出てきました。
Oracleにはないやつですね。
簡単に説明すると、PostgreSQLは追記型アーキテクチャなので、テーブルの行で1項目でも更新があると、新しい行を丸ごと追加します。ただ、しばらくは別のトランザクションから参照される可能性があるので、古い行も残しておく必要があります。そうは言ってもずっと残しておくとディスク領域をどんどん消費してしまうので、古い行がどのトランザクションからも参照されなくなると回収して再利用できるようにします。この回収する処理がバキューム処理です。
手動バキューム
VACUUMコマンドを明示的に実行して行うバキュームのことです。
オプションがいろいろあるので、覚えておく必要がありそうです。
DBの全テーブルを対象にバキューム実行
VACUUM
テーブルを指定してバキューム実行
VACUUM <テーブル名>
統計情報の更新
ANALYZE
バキューム実行後に統計情報を更新
VACUUM ANALYZE
バキュームを実行すると、テーブルだけでなく、インデックスも対象に処理されます。
バキューム・フルを実行
VACUUM FULL
バキューム・フルは通常のバキュームと内部動作が全く異なります。
テーブルを再作成する感じです。
そのため、通常のバキュームでは実行中もSELECT, INSERT, UPDATE, DELETEができるのに対して、バキューム・フルではテーブルに排他ロックがかかってしまいます。こちらは気軽に実行できないコマンドです。
自動バキューム
手動でバキュームを実行しなくても、PostgreSQLはデフォルトで自動でバキュームを実行してくれます。便利ですね。
なお、自動バキュームの制御については、適切に設計して、設定ファイルに設定しておく必要があります。
注意点として、ロングトランザクション(長い間、コミットもロールバックもされずに続いているトランザクション)があると、古い行が回収できないので、自動バキュームを有効にしていても、該当テーブルが肥大化してしまうことがあります。
ロングトランザクションが発生しないか、適切にログを監視等する必要がありそうです。
まとめ
ついにバキュームが出てきました。PostgreSQLと言えばバキュームですね。(私のイメージです)基本的にPostgreSQLに任せておけば大丈夫ですが、仕組みを理解して、きちんと設計しておく必要がありそうです。
また、今日はユーザーの管理についても勉強しました。
コメント