set setting reset

インフラ関連の小ネタと備忘録

PostgreSQL を暖気する

postgresqllinux においてファイルキャッシュを信用するので、 データファイルを cat してあげると自然とデータがメモリに乗ります。

メモリ大容量時代が到来していますので、このようなニーズもあるのかなと。

postgresql の再起動後などに以下のようなコマンドを実行することで、全てのデータファイルをメモリに乗せることができます。

find "${PG_DATA}" -name "*" -exec cat {} \;

また、特定のテーブルを除いて暖気したい要求がありましたのでスクリプトを書いてみました。

#!/bin/bash
# warming_up_database.sh

set -e

PG_HOST="host"
PG_USER="user"
PG_PORT="5432"
PG_DATABASE="user_table"
PG_DATA="db_cluster_dir"
PG_CONN="-U ${PG_USER} -H ${PG_HOST} -p ${PG_PORT} -d ${PG_DATABASE}"

warming_up_database_with_exclude_file()
{
    # generate exclude string
    for (( i=1; $#>0; ))
    do
        target=$1
        # need to do without password, using .pgpass or pg_hba.conf
        data_file_name=$(/usr/pgsql-9.3/bin/oid2name ${PG_CONN} -t ${target} -q | awk {'print $1'})

        if [ -z "${data_file_name}" ]; then
            read -p "no datafile -> $1 . if you want continue, hit Enter key."
            break
        fi

        if [ $i = 1 ]; then
            exclude=("-name ${data_file_name}")
        else
            exclude+=(" -o -name ${data_file_name}")
        fi

        shift
    done

    # warming up !
    [ -n "${exclude[*]}" ] && time find ${PG_DATA} ${exclude[@]} -prune -o -print -exec cat {} \; > /dev/null 2>&1 \
    || echo "${FUNCNAME} failed." && exit 1
}

warming_up_database_all()
{
    time find "${PG_DATA}" -name "*" -exec cat {} \; > /dev/null 2>&1 \
    || echo "${FUNCNAME} failed." && exit 1
}

print_usage()
{
    echo "Usage:"
    echo "do all warming up => $0 --all"
    echo "do warming up with exclude file => $0 --exclude exclude_table_name"
    exit 1
}

case $1 in
    --help|*)
        print_usage
        ;;
    --exclude)
        if [ $# -lt 2 ]; then
            print_usage
            exit 1
        fi
        shift
        warming_up_database_with_exclude_file $@
        exit 0
        ;;
    --all)
        warming_up_database_all
        exit 0
        ;;
esac