ページ

2014年4月27日日曜日

postgresのバックアップを1ファイルずつgoogleドライブに保存する

自分用に作ったpostgresを1ファイルずつGoogleドライブに保存したいと考えシェルを作成。
pg_dumpを利用し対処1ファイルずつなのは除外したいDBもあるためです。
GoogleドライブはGoogleから出ているアプリを利用しフォルダに移動するだけなので保存すること自体は簡単です。
DropBoxとかもディレクトリを変更すれば対応できると思います。
※Macを利用しているのでLinux系では一部動作しない可能性もあります。
その際は一部改変が必要になるかと思います。


バックアップ詳細はDB名_yyyyMMdd.tar.gzで保存されています。
while read部分が少し戸惑いました。
パイプを利用してreadを行うないようです。




#/bin/sh

DATE=`date "+%Y%m%d"` # 日付のフォーマット
TMP_DIR="/tmp/pg_dump_$DATE" # 作業ディレクトリ
EXECLUDE_DB="template|postgres" # バックアップ除外対象
BACKUP_DIR="/Users/genya/Google ドライブ/backup" # バックアプディレクトリ
DB_USER=postgres # 動作ユーザー

# 作業ディレクトリ作成
echo "作業用ディレクトリを作成 $TMP_DIR"
mkdir $TMP_DIR

# DB一覧を取得する.
psql -c "select datname FROM pg_database;" -t -U postgres | while read db_name
do
 if [ -z "$db_name" ]; then
  continue
 fi
 # バックアップ対象外を除外
 DB_COUNT=`echo "$db_name" | grep  -E "($EXECLUDE_DB)" | wc -l`
 if [ "$DB_COUNT" -eq "1" ]; then
  echo "execlude database no backup $db_name"
  continue
 fi
 echo "backup database:$db_name"
 # バックアップ
 pg_dump -U $DB_USER $db_name > ${TMP_DIR}/${db_name}.sql
 # 圧縮
 tar zcvf ${TMP_DIR}/${db_name}_${DATE}.tar.gz ${TMP_DIR}/${db_name}.sql >/dev/null 2>&1
 # 元のファイルを削除
 rm ${TMP_DIR}/${db_name}.sql
 # googleドライブに移動
 mv ${TMP_DIR}/${db_name}_${DATE}.tar.gz "${BACKUP_DIR}/${db_name}_${DATE}.tar.gz"
done

# 作業ディレクトリ削除
rm -rf $TMP_DIR

2014年4月9日水曜日

postgresで区切り文字を集計する

備忘録のないようです。

以下のように「,」区切りの文字が連結されている状態でグループ化を行うための操作を記述

CREATE TABLE nodes(tags TEXT);
INSERT INTO nodes VALUES('tag1,tag2,tag3');
INSERT INTO nodes VALUES('tag1,tag3');
INSERT INTO nodes VALUES('tag1,tag3');
INSERT INTO nodes VALUES('tag1,tag4,tag5');
このデータを以下のようにしたい
tag   | count 
-------+-------
 tag1  |     4
 tag3  |     3
 tag2  |     1
 tag4  |     1
 tag5  |     1

このような処理はどのようにと呼ぶのか分からないがニュアンス的には
・区切り文字配列化
・パース配列化
・文字列分割結合
などか?

正式名称が知りたい・・・・
とりあえずSQLだけ記載
SELECT tag, COUNT(tag) FROM (SELECT UNNEST(STRING_TO_ARRAY(tags, ',')) FROM nodes) AS T1 GROUP BY tag ORDER BY COUNT(tag) DESC, tag;
UNNESTとSTRING_TO_ARRAYを利用することで対応が可能である。

UNNESTで検索を行うといろいろ応用が出てくるので参考にしてみたい。
とりあえず自分の目的は上記で解決です。