コンテンツへスキップ

ログ出力設定

postgresql.confの以下パラメータを変更。

logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_rotation_age = 1d
log_min_messages = warning

遅いSQL文(スロークエリ)をログに出力する

デフォルトでは無効になっている以下のパラメータを設定する。

log_min_duration_statement = 1000

1000ミリ秒以上かかったSQLをログに出力する。

特定のユーザが実行したSQL文をログに出力する

log_statementパラメータで制御する。

postgres=# ALTER ROLE postgres SET log_statement = 'all';

よく使うコマンド

  • createdb:データベースを作成する
  • createuser:ユーザを作成する
  • dropdb:データベースを削除する
  • dropuser:ユーザを削除する
  • initdb:データベースクラスタを初期化する
  • pg_controldata <dataディレクトリ>:データベースクラスタの様々な情報を表示する
  • pg_ctl:postmasterを起動・停止する
  • pg_dump:一つのデータベースをバックアップする
  • pg_dumpall:全てのデータベースをバックアップする
  • pg_restore:pg_dumpでダンプしたデータを復元する
  • psql:対話的にSQLを実行する

psql -l:データベース一覧を表示する

  • vacuumdb:vacuumを実行する

ユーザーコマンド

  • ユーザ一覧

testdb=> select * from pg_user;

  • ユーザの追加

$ createuser --interactive testuser

全ての権限を持たないユーザーを作成する。

Shall the new role be a superuser? (y/n) n

Shall the new role be allowed to create databases? (y/n)n

Shall the new role be allowed to create more new roles?(y/n)n

  • ユーザの削除

testdb=> drop user testuser;

  • サンプルコード
# 作成途中

param(
    [parameter(mandatory=$false)][switch]$dbStart,
    [parameter(mandatory=$false)][switch]$dbStop,
    [parameter(mandatory=$false)][switch]$backupStart,
    [parameter(mandatory=$false)][switch]$backupStop,
    [parameter(mandatory=$false)][string]$recovery,
    [parameter(mandatory=$false)][switch]$archiveCleanup,
    [parameter(mandatory=$false)][int]$logCleanup = 30,
    [parameter(mandatory=$false)][switch]$dbStatus,
    [parameter(mandatory=$false)][string]$dbDir
)

. E:\my-document\Programing\powershell\logger.ps1
$log = New-object MyLogger

if($dbDir){
    $dirDbCluster = $dbDir
}

$log.debug("DB管理者:[$dbAdmin]")
$log.debug("DBユーザ:[$dbUser]")
$log.debug("DBクラスターディレクトリ:[$dirDbCluster]")

function isDbRunning([string]$dirDbCluster){
    pg_ctl status -D $dirDbCluster|out-null
    return $?
}

function isBackupRunning([string]$dirDbCluster){
    
}
function dbStartStop([string]$dbAdmin,$dirDbCluster,$dbInit) {
    $argument = ("-U", $dbAdmin, "-D", $dirDbCluster, $dbinit)
    Start-Process -FilePath pg_ctl.exe -ArgumentList $argument -WindowStyle Minimized
    if($?){
        $message = ("Success {0} database.[{1}]" -f $dbInit, $dirDbCluster)
        $log.info($message)
        $retVal = $returnSuccess
    } else {
        $log.error("Error {0} database.[{1}]" -f $dbInit, $dirDbCluster)
        $retVal = $returnErrorValue
    }
    return $retVal
}
function execSql([string]$dbAdmin,$sql){
    #psql -U $dbAdmin -c $sql | Out-Null
}

if($dbStatus){
    if(isDbRunning($dirDbCluster)){
        $log.debug("Database[$dirDbCluster] is running.")
    } else {
        $log.debug("Database[$dirDbCluster] is not running.")
    }
    exit $returnSuccessValue
} elseif($dbStart){
    if(isDbRunning($dirDbCluster)){
        $message = ("Database[{0}] already running" -f $dirDbCluster)
        $log.error($message)
        $retVal = $returnErrorValue      
    } else {
        $retVal = dbStartStop $dbAdmin $dirDbCluster "start"
    }
    exit $retVal
} elseif($dbStop){
    if(isDbRunning($dirDbCluster)){
        $retVal = dbStartStop $dbAdmin $dirDbCluster "stop"
    } else {
        $log.error("Database[$dirDbCluster] is not running.")
        $retVal = $returnErrorValue
    }
    exit $retVal
} elseif($backupStart){
    $sql = "SELECT pg_start_backup(now($dirDbCluster)::text)"
} elseif ($backupStop) {
    $sql = "SELECT pg_stop_backup(now($dirDbCluster)::text)"
} elseif ($recovery) {
    $log.debug("recovery mode")
    $sql = ""
} elseif ($archiveCleanup) {
    $log.debug("Cleanup Archive")
    $sql = ""
} else {
    write-host("usage:")
    exit $returnErrorValue
}

 

位置を表す

\b 単語の境界にマッチ
\B 単語の境界以外にマッチ
^  文字列(行)の先頭にマッチ
$  文字列(行)の終端にマッチ

前方参照

ラモス(?=瑠偉) ラモスのあとに必ず瑠偉があるラモスが対象
ラモス(?!=瑠偉) ラモスの後に必ず瑠偉がないラモスが対象 

 後方参照

(?<=東京都)北区 直前に東京都がある北区が対象 
(?<!東京都)北区 直前に東京都がない北区が対象

英文の単語にマッチ

\b\w+\b

htmlタグにマッチ

<(".?|'.?|[^'")?>

"html"内の特定のタグの要素を取り出す

<title>(.</em>?)</title>

html内の特定のタグの要素を取り出す

<?"|'.?'|[^'"])?>(.*?)

郵便番号にマッチ

\d{3}-\d{4}

電話番号にマッチ

0\d{1,4}-\d{1,4}-\d{4}

メールアドレスにマッチ

[a-zA-Z0-9_-.]+@[a-zA-Z0-9-.]+.[a-zA-Z]+

IPアドレスにマッチ

\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}

空行にマッチ

^\s$
^$

ファイル名の各要素を取り出す

 ((.)/)?(.*?)(.(.+))?

ファイル名にマッチ(linux)

[/\w-]+

ファイルパスにマッチ

(/[\w-]+)+

標準入力からのパターン検索 (grep)

!/usr/bin/env perl
while() { 
print if /ARGV[[0]/o;
}

置換

!/usr/bin/env perl
while(){ 
s/$ARGV[0]/$ARGV[1]/go;print;;
}

 

Python 3.5.5で動作確認済み

■ 使い方
henkan.py [置換前文字列] [置換後文字列] [Inputファイル名] [Outputファイル名(省略した場合は画面出力を行う)]

■ コード

#!/usr/bin/python
import os,sys

n = len(sys.argv)

if not 3 <= n <= 5:
        print("引数が不足しています。")
else:
        stext = sys.argv[1]
        rtext = sys.argv[2]
        input_file = sys.stdin
        output_file = sys.stdout
        if n > 3:
                input_file = open(sys.argv[3])
        if n > 4:
                output_file = open(sys.argv[4], 'w')
        for s in input_file:
                output_file.write(s.replace(stext, rtext))
        output_file.close()
        input_file.close()