postgres テーブル一覧2

postgres9.1で確認しましたが、統計情報VIEWというのが色々と内部情報を持っていて面白い

SELECT * FROM pg_stat_user_tables ORDER BY relname;

現在のデータベース内の各テーブル(TOASTテーブルを含みます)に関する、テーブルのOID、スキーマおよびテーブル名、
開始されたシーケンシャルスキャン数、シーケンシャルスキャンで取り出された実際の行数、(そのテーブルに属するす
べてのインデックスに対して)開始されたインデックススキャン数、インデックススキャンで取り出された実際の行数、
挿入、更新、削除された行数、HOT(つまり分離したインデックス更新がない)だった更新行の数、有効行数、無効行数、
手動でそのテーブルがFULL無しでバキュームされた最後の時刻、自動バキュームデーモンによりバキュームされた最後の
時刻、手動でアナライズされた前回の時刻、自動バキュームデーモンによりアナライズされた前回の時刻、手動でそのテ
ーブルがFULL無しでバキュームされた回数、自動バキュームデーモンによりバキュームされた回数、手動でアナライズさ
れた回数、自動バキュームデーモンによりアナライズされた回数です。

SELECT * FROM pg_statio_user_indexes ORDER BY relname, indexrelname;

現在のデータベース内の各インデックスに関する、テーブルとインデックスのOID、スキーマ、テーブルおよびインデック
スの名前、そのインデックスから読み取られたディスクブロック数とバッファヒット数。

↑は使いそうな2つだけピックアップしましたが、運用で必要な統計情報を取るのであれば、もっと読み解く必要がありそうです。

※前回のpg_tablesの時に、VIEWも一緒にとありましたが、残念ながら一緒には出力できませんでした。
select schemaname,viewname from pg_catalog.pg_views where schemaname='public';

Postgres テーブル一覧

SELECT tablename FROM pg_catalog.pg_tables WHERE schemaname = 'public';

DBの中のテーブル一覧を取得して、件数チェックするプログラムを作らなきゃいけなくなったので、ちょっと調べた。

schemanameをpublicにしないと、pg_catalogのテーブルも出てきちゃいます。
↑Postgres 9.1で検証しました。

テーブル一覧参照

select * from pg_tables;

データベースとテーブルのサイズを取得
select pg_relation_size('table_name');
select pg_total_relation_size ('table_name');
select pg_database_size('db_name');

データベース名とOIDの取得
select datid,datname from pg_stat_database;


$DATADIR/base/のデータを直接調べる。OIDごとのディレクトリが作られているので

$ cd $DATADIR/base
$ du -sk *

基本的にSQLが余り得意ではないので、20行を超えるSQLとか読んだ日には、
解析だけで1時間以上かかる私ですが。

SQLで何とかして情報を取得しようとする人って、異常に難しい正規表現を書く人と同じ気がします。
なので私はメモリを食いつぶさない程度にSQLでデータを纏め、残りはプログラムで集約させるのが好き。
余りにも長いSQLだと、webですから修正も多いと思います。
そういう時に完全組直しが非常に厄介。

もちろんロジック部分はオブジェクトにしておいて改修しやすいのがベスト。
たまにべた書きしちゃいますけど。。。

findコマンドTIPS

【*.txtか.htaccessを抽出】
find . -name "*.txt" -o -name "*.htaccess"

【*.txtと*.phpと*.pl以外のファイルを抽出】
find ./ ! -name "*.txt" ! -name "*.php" ! -name "*.pl"

【50日以前のデータを探して移動】
find ./ -mtime +50 -name "*.txt" | xargs mv --target-directory=./aaa

【10日以内のデータを探して移動】
find ./ -mtime -10 -name "*.txt" | xargs mv --target-directory=./aaa

【1日以内のデータをコピー】
find ./ -mtime -1 -name "*" | xargs cp -p --target-directory=./test

【13時間以内のデータをコピー】
find ./ent -mmin -780 -name "jpg" | xargs cp -p --target-directory=./test

【200日以上のファイルを削除】
find ./ -mtime +200 -name "*.jpg" | xargs rm -f

PHPでダウンロード・出力機能

通常ダウンロードは特に問題なかったと思いますが、SSL環境でのダウンロード(PDF)でたまたま詰まっている人が居たので、下記のように。
ま、ダウンロードに困ったときは、#!/usr/bin/perlぐらいの勢いでおまじないと思ってればいいのかもね。

header("Content-Type: application/pdf");
header("Content-Disposition: inline; filename=" . $filename . ".pdf");
header("Content-Transfer-Encoding: binary");
header("Expires: 0");
// Microsoft Internet Explorer
if( strstr($_SERVER['HTTP_USER_AGENT'], 'MSIE')) {
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Pragma: public");
} else {
    header("Pragma: no-cache");
}
header("Content-Length: $len");