23
1 KLY と言われたので

Chugoku db 17th-lt-kly

Embed Size (px)

Citation preview

1

KLY と言われたので

2

昨晩の OSC 島根の懇親会

某氏「明日 LT やる人が少ないらしいから LT をやってくれ。

いいね?」

ぬこ「アッハイ」

3

しかし深刻なネタ不足

4

過去のストックからパクる

5

唐突ですがデータベースクラスタのサイズを SQL で見たいと思ったこと

はありますか?

6

データベースサイズ取得

pg_database_size()

7

データベースクラスタサイズ?

全てのデータベースに対してpg_database_size()

を実行すればいいじゃん?

8

そうでもない

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格納域のサイズは意外と大きくなる。

11

データベースクラスタサイズ?

そんな SQL 関数はない。

12

なければ作る

13

あえてplpgsql で作る

14

汎用ファイルアクセス関数

15

汎用ファイルアクセス関数

pg_ls_dir(), pg_stat_file()

16

汎用ファイルアクセス関数

pg_ls_dir() でファイルリストを取得。個々のファイルについて、ディレクトリがどうか判別ディレクトリならそのディレクトリ全体のサイズを取得する関数を再帰的に呼び出し

そうでなければ pg_stat_file() でサイズを取得し、加算していく。

17

つくってみた

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]$

登録しておく

20

やってみた

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

やったね♪

22

これ使えばAWS RDS 上で

DB クラスタサイズ算出できるか!?

23

まことに残念ながら、汎用ファイルアクセス関数はスーパーユーザ権限が必要→ AWS RDS では使えぬ。