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

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

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となっていると、ログに出力されるメッセージの時間が実際の時間とずれて分かりにくいので修正しておく。

以上

自分用メモでした。

共有バッファのPIN

PostgreSQLの話をしていて、知らなかったのですがPINとかいうものがあるそうで、色々と確認してみました。

が、ドキュメントの類には全くPINの解説などがでてこず、よくよく話を聞いてみると"src/backend/storage/buffer/README"に書かれているそうです。

なぜにマニュアル化されていないんでしょうか・・。

ちなみにPINの話は簡単にいうと「共有バッファ内に保存されているデータに対してPINを立てる(打つ?)ことで、そのデータはPINが立っている間は共有バッファから追い出されなくなる」という仕組みらしいです。

チェックポイントの発生タイミング。

  • 前回のチェックポイント実行から checkpoint_timeout 秒経過した時
  • max_wal_size に指定したサイズ分のWALログレコードがWALセグメントファイルに書き込まれたとき
  • CHECKPOINTコマンドを実行したとき
  • PostgreSQL が正常に停止されたとき
  • pg_basebackup 関数を実行した時