ロックオン開発チームブログ -Lockon Knowledge Repositories-

PostgreSQLで手っ取り早くサイズを調べたい

一つのPostgreSQLの中に、いくつかのデータベースを入れていた場合、各サイズを調べるのは意外に面倒なので、以下のようなPHPスクリプトで、ちょいちょいと見ることがあります。


なんか異常に肥大してるけど、どいつが悪さしてんだYo!!というときにでも、お使い下さいませ。


pg_database_sizeなど、PostgreSQL8.1以上の関数を使ってますが、それ以下のバージョンでもcontribで入るdbsizeを使えば同じようなことはできると思います。未検証ですが。。。
あとPEAR::DBを使っていますので、使えない方は適宜読み替えて下さい(・ω・;)

require_once("DB.php");
$db_user = "postgres"; $db_pw = "hogehoge"; $db_ip = "192.168.0.***"; $db_name = "template1"; $dsn = "pgsql://${db_user}:${db_pw}@${db_ip}/${db_name}"; $conn = DB::connect($dsn);
$result = getDbSize($conn); print_R($result);
$result = getTableSize($conn); print_R($result);
function getDbSize(&$conn){ $sql = "SELECT datname FROM pg_database"; $arrDb = $conn->getAll($sql,DB_FETCHMODE_ASSOC); if ( $arrDb ){ foreach($arrDb as $data){ $sql = "SELECT pg_database_size(?) as size, pg_size_pretty(pg_database_size(?)) as disp_size"; $result = $conn->getAll($sql, array($data["datname"], $data["datname"]), DB_FETCHMODE_ASSOC); $return[$result[0]["size"]] = array("size"=>$result[0]["disp_size"], "db_name"=>$data["datname"]); } } krsort($return); return $return; }
function getTableSize(&$conn){ $sql = "SELECT relname FROM pg_class WHERE relkind='r' AND relname not in (SELECT c.relname FROM pg_class c, pg_rewrite r WHERE (r.ev_class = c.oid) AND (r.ev_type = '1') GROUP BY relname ) AND relname !~ '^sql_' AND relname !~ '^pg_' ORDER BY relname"; $arrDb = $conn->getAll($sql, DB_FETCHMODE_ASSOC); if ( $arrDb ){ foreach($arrDb as $data){ $sql = "SELECT pg_total_relation_size(?) as size, pg_size_pretty(pg_total_relation_size(?)) as disp_size"; $result = $conn->getAll($sql, array($data["relname"], $data["relname"]), DB_FETCHMODE_ASSOC); $return[$result[0]["size"]] = array("size"=>$result[0]["disp_size"], "name"=>$data["relname"]); } } krsort($return); return $return; }

Trackback

このエントリーのトラックバックURL:
http://www.lockon.co.jp/cgi-bin/mt/mt-tb.cgi/20

コメント



Copyright(c) LOCKON CO.,LTD. All Rights Reserved.