Upload
toshi-harada
View
262
Download
3
Embed Size (px)
Citation preview
9
データベースクラスタ構成
/home/nuko/pgdata/9.6|--PG_VERSION|--base| |--1| | |--112| | |--113| | |--1247| | |--1247_fsm| | |--1247_vm(中略)| | |--PG_VERSION| | |--pg_filenode.map| | |--pg_internal.init|--global| |--1136| |--1136_fsm| |--1136_vm(中略)| |--pg_control| |--pg_filenode.map| |--pg_internal.init(右につづく)
|--pg_clog| |--0000|--pg_commit_ts|--pg_dynshmem|--pg_hba.conf|--pg_ident.conf|--pg_logical| |--mappings| |--snapshots|--pg_multixact| |--members| | |--0000| |--offsets| | |--0000|--pg_notify| |--0000|--pg_replslot|--pg_serial|--pg_snapshots|--pg_stat|--pg_stat_tmp| |--db_0.stat
|--pg_subtrans| |--0000|--pg_tblspc|--pg_twophase|--pg_xlog| |--000000010000000000000001| |--archive_status|--postgresql.auto.conf|--postgresql.conf|--postmaster.opts|--postmaster.pid
10
データベースクラスタ構成
/home/nuko/pgdata/9.6|--PG_VERSION|--base| |--1| | |--112| | |--113| | |--1247| | |--1247_fsm| | |--1247_vm(中略)| | |--PG_VERSION| | |--pg_filenode.map| | |--pg_internal.init|--global| |--1136| |--1136_fsm| |--1136_vm(中略)| |--pg_control| |--pg_filenode.map| |--pg_internal.init(右につづく)
|--pg_clog| |--0000|--pg_commit_ts|--pg_dynshmem|--pg_hba.conf|--pg_ident.conf|--pg_logical| |--mappings| |--snapshots|--pg_multixact| |--members| | |--0000| |--offsets| | |--0000|--pg_notify| |--0000|--pg_replslot|--pg_serial|--pg_snapshots|--pg_stat|--pg_stat_tmp| |--db_0.stat
|--pg_subtrans| |--0000|--pg_tblspc|--pg_twophase|--pg_xlog| |--000000010000000000000001| |--archive_status|--postgresql.auto.conf|--postgresql.conf|--postmaster.opts|--postmaster.pid
pg_database_size()で取得できるサイズは
この下だけ。
WAL格納域のサイズは意外と大きくなる。
16
汎用ファイルアクセス関数
pg_ls_dir() でファイルリストを取得。個々のファイルについて、ディレクトリがどうか判別ディレクトリならそのディレクトリ全体のサイズを取得する関数を再帰的に呼び出し
そうでなければ pg_stat_file() でサイズを取得し、加算していく。
18
作った plpgsql 関数CREATE OR REPLACE FUNCTION get_dir_size(path text) RETURNS integer LANGUAGE plpgsql
AS $function$DECLARE files RECORD; stat RECORD; size INTEGER; dir_size INTEGER; target_size INTEGER;BEGIN size = 0; FOR files IN SELECT pg_ls_dir(path) AS name LOOP
-- RAISE NOTICE 'file name = %', path || '/' || files.name;
SELECT * INTO stat FROM pg_stat_file( path || '/' || files.name ); IF NOT FOUND THEN RAISE EXCEPTION 'file not found, %', files.name; END IF;
target_size = stat.size; IF stat.isdir = 'f' THEN size := size + target_size; ELSE dir_size = get_dir_size(path || '/' || files.name) + target_size; size := size + dir_size; END IF; END LOOP; RETURN size;END;$function$;
19
作った plpgsql 関数CREATE OR REPLACE FUNCTION get_database_cluster_size() RETURNS integer LANGUAGE plpgsqlAS $function$DECLARE size INTEGER; stat RECORD;BEGIN SELECT * INTO stat FROM pg_stat_file('.'); size = stat.size; size := size + get_dir_size('.'); RETURN size;END;$function$;
使うときには、 get_database_cluster_size() を呼び出す。
[nuko@localhost test]$ psql postgres -U postgres -f get_size.sql CREATE FUNCTIONCREATE FUNCTION[nuko@localhost test]$
登録しておく
21
SQL 関数を実行[nuko@localhost test]$ psql postgres -U postgres -c "SELECT get_database_cluster_size()" get_database_cluster_size --------------------------- 294310856(1 row)
du コマンドを実行[nuko@localhost 9.4]$ du -s -b /home/nuko/pgdata/9.4294310856 /home/nuko/pgdata/9.4
やったね♪