Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Chugoku db 17th-lt-kly

337 views

Published on

Kyu-ni-LT-Yareto-Iwaretanode.

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Chugoku db 17th-lt-kly

  1. 1. 1 KLY と言われたので
  2. 2. 2 昨晩の OSC 島根の懇親会 某氏「明日 LT やる人が少ない らしいから LT をやってくれ。 いいね?」 ぬこ「アッハイ」
  3. 3. 3 しかし 深刻なネタ不足
  4. 4. 4 過去のストック からパクる
  5. 5. 5 唐突ですが データベースクラスタのサイズ を SQL で見たいと思ったこと はありますか?
  6. 6. 6 データベースサイズ取得 pg_database_size()
  7. 7. 7 データベースクラスタサイズ? 全てのデータベースに対して pg_database_size() を実行すればいいじゃん?
  8. 8. 8 そうでもない
  9. 9. 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. 10. 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 格納域のサイズは 意外と大きくなる。
  11. 11. 11 データベースクラスタサイズ? そんな SQL 関数はない。
  12. 12. 12 なければ作る
  13. 13. 13 あえて plpgsql で作る
  14. 14. 14 汎用ファイル アクセス関数
  15. 15. 15 汎用ファイルアクセス関数 pg_ls_dir(), pg_stat_file()
  16. 16. 16 汎用ファイルアクセス関数 pg_ls_dir() でファイルリストを取得。 個々のファイルについて、ディレクトリがどうか判別 ディレクトリならそのディレクトリ全体のサイズを取得する 関数を再帰的に呼び出し そうでなければ pg_stat_file() でサイズを取得し、加算して いく。
  17. 17. 17 つくってみた
  18. 18. 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. 19. 19 作った plpgsql 関数 CREATE OR REPLACE FUNCTION get_database_cluster_size() RETURNS integer LANGUAGE plpgsql AS $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 FUNCTION CREATE FUNCTION [nuko@localhost test]$ 登録しておく
  20. 20. 20 やってみた
  21. 21. 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.4 294310856 /home/nuko/pgdata/9.4 やったね♪
  22. 22. 22 これ使えば AWS RDS 上で DB クラスタサイズ 算出できるか!?
  23. 23. 23 まことに残念ながら、 汎用ファイルアクセス関数は スーパーユーザ権限が必要 → AWS RDS では使えぬ。

×