Tihiroのストレスフリーな生活

少しだけ頭使って後は根性

PostgreSQLで現在のトランザクションIDを確認する。

概要

いつも通りタイトルの通りなのですが、PostgreSQLで現在のトランザクションID、つまりはxidを確認する方法についてす。

確認方法

SELECT txid_current();

で確認することができます。

ただし、psqlで実行する場合は暗黙的にトランザクションが開始されますので、上記コマンドを実行するとトランザクションIDが進んでしまいます。

postgres=# SELECT txid_current();
 txid_current
--------------
          818
(1 行)

postgres=# SELECT txid_current();
 txid_current
--------------
          819
(1 行)

↑こんな風に実行するたびに、現在のトランザクションIDが進んでしまいます。 じゃあ、どうするの、って話なのですが、BEGINしておけば進むxidを最小限に抑えられます。

postgres=# BEGIN;
BEGIN
postgres=# SELECT txid_current();
 txid_current
--------------
          820
(1 行)

postgres=# SELECT txid_current();
 txid_current
--------------
          820
(1 行)

postgres=# SELECT txid_current();
 txid_current
--------------
          820
(1 行)

postgres=# ROLLBACK;
ROLLBACK
postgres=# SELECT txid_current();
 txid_current
--------------
          821
(1 行)

とすることで、xidの進みを819→820だけに抑えることができます(残念ながらROLLBACKしても819→820→819にはなりません)。

確認して何が楽しい?

現在のトランザクションIDを確認してどうするの、っていうことですが、これはレコードのxmin、xmaxと比較するのに使います(個人的には)。

SELECT xmin, xmax, * FROM test_table

とすると、test_tableテーブルの行がもつxminとxmaxの値が表示されます。

xminはそのレコードに対して最後に更新を行なったトランザクションIDを表します(UPDATEでもxminは更新されます)。

xmaxはそのレコードに対して最後に削除処理を行なったトランザクションIDを表します(削除されていないレコードはxmaxが0です)。

また、

SELECT age(xmin), xmin FROM test_table;

とすることで、xminが現在のトランザクションIDとの差分を確認することができます。 他の行と比較することで、どっちが古い、どっちが新しい、とかいうのが分かります(ただしxidは周回するので、完璧に判断できるわけではありません)。

その他には

動作検証するときなどに、xminとかxmaxとかを確認しつつ、っていうパターンもありますよね。

まとめ

txid_current関数なのですが、名前が他のPostgreSQLシステム関数と違って覚えにくいのが難点です。が、非常に便利な関数ですのでメモしておきます。

Vagrantでディスクを追加してLVMで論理ボリュームを作成したお話。

概要

いつまで経ってもディスクの追加とか、ディスクサイズの拡張とか、パーティションの作成とか、マウントとかが理解できないので実際にやってみたメモ。

環境

CentOS7

やってみた

Vagrantでディスクを追加する

Vagrant、と言ったものの実際には、VirtualBoxの管理GUIで該当のVMにストレージを追加しました。Vagrantでストレージの追加ってどうするんでしょう?

バイスを追加

追加したデバイスの確認

lsblk

それっぽいのが現れていることを確認。この場合はsdbでした。

パーティションの作成

fdisk /dev/sdb

好きな数だけパーティションを作成します。

物理ボリュームの作成

pvcreate /dev/sdb1

作成したパーティションを物理ボリュームとして作成します。

pvcreate がインストールされていない場合

# yum install lvm2

もしpvcreateを実行して「見つからないよエラー」が発生した場合には焦らずインストールします。

物理ボリュームの確認

pvdisplay

作成した物理ボリュームを確認します。

ボリュームグループの作成

vgcreate vg_vol1 /dev/sdb1

物理ボリュームを元にボリュームグループを作成します。

ボリュームグループの拡張

vgextend vg_vol1 /dev/sdb2

上記は、すでに作成しているボリュームグループに物理ボリュームを追加する方法です。

論理ボリュームの作成

# lvcreate -n lv1 -L 2G vg_vol1

ボリュームグループから(?)論理ボリュームを作成します。-n オプションが名前の指定で、-L オプションがサイズ指定。最後の「vg_vol1」が元となるボリュームグループです。

論理ボリュームの確認

# lvdisplay

無事に作成されたか確認します。

f:id:r_tihiro:20200817060003j:plain
ヨシ!

確認って大事ですよね。

論理ボリュームにファイルシステムを作成

mkfs.xfs /dev/vg_vol1/lv1

ファイルシステムを作成しないことには、ディスクは使えません。上記ではxfsというファイルシステムを論理ボリュームに作成しています。

論理ボリュームのマウント

mount /dev/vg_vol1/lv1 /mnt/mount1

ファイルシステムを作成したので、実際に利用したいディレクトリにマウントします。上記では/mnt/mount1にしていますが、/dbでも、/home/postgresでも。要は使いたいところに差し込むイメージですね。

注意点としては、OSを再起動させるとマウントが解除されることです。永続化、というかOS再起動時に自動的にマウントさせたいのであれば/etc/fstabに記入しておく必要があります。

マウントの確認

df -h

無事に作成したファイルシステムが指定したディレクトリにマウントされていると、無事に利用できる状態になっています。

まとめ

マウントの概念って慣れないと難しいです。それとタイトルにVagrantで、とつけてみたもののVagrantはあんまり関係ありませんでした。

PostgreSQLでレコードのブロック番号を調べる方法

やりたいこと

テーブル内に格納されているレコードのブロック番号を調べたいってときありますよね?

環境は

です。が、多分どのバージョンでも大丈夫です。

調べる

pg_visibilityという拡張モジュールを使うと確認することができます。

postgres=# CREATE EXTENSION pg_visibility;

で、モジュールを追加して

postgres=# SELECT * FROM pg_visibility('test');
 blkno | all_visible | all_frozen | pd_all_visible
-------+-------------+------------+----------------
(0 行)

という感じで使います。

変化させてみる。

pg_visibilityの結果は0件でしたが、これはテーブルの中にレコードが入っていなかったためです。ので、レコードを追加してみましょう。

postgres=# insert into test values (1);
INSERT 0 1

追加したので、もう一度確認してみます。

postgres=# SELECT * FROM pg_visibility('test');
 blkno | all_visible | all_frozen | pd_all_visible
-------+-------------+------------+----------------
     0 | f           | f          | f
(1 行)

増えてますね。

postgres=# VACUUM test;
VACUUM

postgres=# SELECT * FROM pg_visibility('test');
 blkno | all_visible | all_frozen | pd_all_visible
-------+-------------+------------+----------------
     0 | t           | f          | t
(1 行)

VACUUMすると、全可視状態(all_visible = true)になりました。

全可視状態かどうかを調べる。

全可視状態かどうかはIndex Only Scanが使われる条件でもありますので重要です。そのテーブルが全可視状態かどうかを調べるには単純にWHERE句に追加するだけで確認することができます。

postgres=# SELECT * FROM pg_visibility('test') WHERE all_visible = false;

で、結果が0件であれば、そのテーブルは全可視状態となります。

QNAPのNASのメモ

概要

タイトルの通り、QNAPのNASをアレコレすることがありましたので、そのときのメモです。初めてNASの管理画面とかを触ったのですが、色々難しいもんですね。

メモ

homeフォルダとhomesフォルダの違い

homeの配下には見えないけど各ユーザーのフォルダが存在する。

そのhome配下のフォルダは、homesフォルダの配下にあるフォルダと内容は同一。つまり、ユーザがhome配下のユーザにファイルを作成したりするとhomes配下にも同じファイルが作成されている(同じファイルというか同一のファイルを参照している、という表現の方が正確?)。

homeフォルダとhomesフォルダの使い分け

homeの下のユーザーフォルダは、そのユーザーであれば読み書き可能。つまりはいちいち権限設定をしなくてよいので便利。

homesの下は権限設定することで、「他のユーザーからは読み取りだけ可能」とかも可能。

homesは他のユーザーからも見ることができる、homeは自分だけのフォルダ、という考え方が個人的にしっくりきます。

匿名(ゲスト)ユーザの有効化

https://www.forcemedia.co.jp/support/qa/qnap/007974.html

を参照してくださいませ。

はまりかけましたが、手順を一つ一つ確認しながらだと上手くいきました。

共有フォルダの扱い

よく分かりません。とりあえずゲストアカウントに公開する/しないを設定できるので、「共有フォルダはゲストからも参照できる」「homesフォルダはゲストからは参照できない」と、そういう様に使っています。

フレンドホームについて感想的というか宣伝というか

概要

たまには里親らしい記事でも、と思いましたのでフレンドホームについての紹介記事。

東京都の話です。

フレンドホームについて

東京都福祉保健局のHPのリンクを貼っておきます。

www.fukushihoken.metro.tokyo.lg.jp

ようするに週末に遊びに行く親戚のお家、的な役割となります。

フレンドホームの役割

施設で暮らす児童さんは、家庭というものを知らない場合があります。例えば

  • 家の中に触っちゃダメなものがあることを知らない
  • お父さん、お母さんが家の中でくつろいでいることを知らない
  • 料理、おかし作りをしたことがない
  • 電車に乗ったことがない
  • お買い物に行ったことがない
  • 外食をしたことがない

などなど(あくまで一例です。施設に入ったときの年齢や施設の方針などによって色々と変わります)。

そんな普通の家庭を知らない児童に、普通の家庭がどんなものかを教えるのがフレンドホームの役目だと思っています。

具体的な活動

東京都福祉保健局のHPのリンク先にある通りなんですが、

  1. 児童を施設まで迎えに行く
  2. 児童を自宅まで連れて帰って交流する or 施設の近く(商業施設とか遊園地、動物園など)で交流する
  3. 児童を施設までお送りする

な感じです。簡単ですよね。

もちろん、慣れるまでは施設内で交流したりします。

交流の内容は

  • 遊ぶ
  • おしゃべりをする
  • お料理、おかしを作ったりする
  • 外食をする
  • TVゲームをする
  • 勉強する
  • お買い物をする

などなど、基本的に児童が望む形で交流することが多いのではないのでしょうか。児童養護施設などでは一人になれる時間が少なかったりしますので、お部屋で静かに過ごすだけでも喜ぶのではないでしょうか。

交流頻度

児童にもよると思いますので、毎週2-3日から月1程度までまちまちな印象です。連休や夏休みなどにはフレンドホーム宅でお泊まりしたりします。

未就学児は比較的多く交流ができ、逆に小学生の高学年以上になってくると施設のイベントや学校のイベント、クラブ活動なんかが週末に予定されていたりしますので、交流の頻度が少なくなる印象です。

せっかくフレンドホームになったのですからできるだけ交流はしたいところですが、ぐっとこらえて児童のペースに合わせて交流するのが良いんじゃないかなと。

フレンドホームになるには?

じゃあ「フレンドホームになりたい」と思ったときにはどうするの? っていうことなのですが、これは「近所にある児童養護施設乳児院」に電話なりメールなりしてみましょう。ということになります。

近くに児童相談所があるなら、そちらに相談してみてもよいかもしれません。ちなみに児童相談所さんに電話連絡すると、電話に出られた方はテンション低めな感じですが、児童虐待関係でないことがわかると元気な声で対応していただけるようになります。

お近くの児童養護施設乳児院

shakaidekosodate.com

で、探すことができたりします。便利ですね。

まとめ

いざフレンドホームについて書いてみようとすると、想像な部分が多かったりで勉強不足を痛感しました。もう少し頑張ります。

PostgreSQLのパラメータを変更する。

PostgreSQLの話です。

パラメータを変更する方法

  1. postgresql.confを変更する。
  2. ALTER SYSTEM SET コマンドで変更する。
  3. SET コマンドで変更する。

の3通りでしょうか。

1のpostgresql.confの変更と、ALTER SYSTEM SET コマンドの変更では永続的に変更されます。

が、変更が適用されるには、PostgreSQLのrestartまたはreloadが必要です。

パラメータ変更後、pg_settings.pending_restartを確認することで、restartが必要か、reloadでOKかが分かります。便利ですね。

パラメータを変更したけど、セッションを閉じたらパラメータが元に戻る!

それは3のSETコマンドで変更したからでしょうか。

SETコマンドは該当セッション内でのみ有効となります。SET LOCALだと該当トランザクションのみ有効な感じらしいです。

postgresql.confで設定したのに反映されない!

restartまたはreloadを忘れている可能性があります。

それでもダメなら、postgresql.auto.confを確認してください。ALTER SYSTEM SET コマンドで変更したものはpostgresql.auto.confに書き込まれ、それはpostgresql.confよりも優先されます。

まとめ

とりあえず設定変更したつもりがされていませんでした、っていうのはダメダメですので再確認は忘れずにしたいものです。

CentOS7上のPostgreSQLを日本語環境にする。

環境

  • CentOS7
  • PostgreSQL のバージョンは問いません。

CentOSの設定

localectl set-locale LANG=ja_JP.UTF-8
localectl set-keymap jp106
timedatectl set-timezone Asia/Tokyo

ロケール文字コードエンコードエンコーディング?)を日本語でUTF8にして、キーボードの設定を日本語にして、タイムゾーンを日本にする。

PostgreSQLの設定

postgresql.conf内で

lc_messages='ja_JP.UTF-8'
log_timezone='Asia/Tokyo'

とすればOK。 タイムゾーンの設定がUTCとなっていると、ログに出力されるメッセージの時間が実際の時間とずれて分かりにくいので修正しておく。

以上

自分用メモでした。