PostgreSQL を暖気する
postgresql は linux においてファイルキャッシュを信用するので、
データファイルを 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