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;
}

