tag:blogger.com,1999:blog-17601993934793609132024-03-06T03:30:37.723+09:00KKIDA-GALAXYIT系、主にデータベースの技術に興味があります。<br>勉強した事、イベント参加ログ、自分用メモ、考え事などを書くところです。Anonymoushttp://www.blogger.com/profile/02234679274621415851noreply@blogger.comBlogger25125tag:blogger.com,1999:blog-1760199393479360913.post-32723384672069219872018-04-01T23:32:00.002+09:002018-04-06T01:14:22.384+09:00PostgreSQL11のJITコンパイリングを試す<style>
.white_text {
color: #cccccc;
}
code{
font-size: 85%;
background:#EEEEEE;
max-height: 500px;
white-space: pre;
overflow: auto;
}
</style>
<html>
<head>
<title>llvm-postgres</title>
<link href="https://stackedit.io/style.css" rel="stylesheet"></link>
</head>
<body class="stackedit">
<div class="stackedit__html white_text">
開発中のPostgreSQL11でJIT(Just In Time=実行時)コンパイリングを行い、クエリ性能の高速化を期待する新機能が登場した。<br />
<h1 id="本記事では">
本記事では</h1>
構築方法を確認したので紹介。JITコンパイリングを使いこなす話はまだ。<br />
<h3 id="構築時のポイント">
構築時のポイント</h3>
JITコンパイリングを有効にするためのPostgreSQL11導入方法や前提ライブラリを把握した。<br />
<ul>
<li>開発版PostgreSQLの最新のソースコードからコンパイルする
<ul>
<li>前提ライブラリは<code>llvm</code>および<code>clang</code>の3.9.0以上</li>
<li><code>./configure</code>時に必要なオプションは<code>--with-llvm</code>、<code>LLVM_CONFIG=<path></code>、<code>CLANG=<path></code>の3つ</li>
</ul>
</li>
<li>構築時に遭遇するかもしれないエラーメッセージたち</li>
</ul>
<h3 id="出来上がった環境を見てみる">
出来上がった環境を見てみる</h3>
最低限のテストを行い、JITコンパイリング機能が発動するところまでを確認。<br />
<ul>
<li>JIT無しで構築した環境との比較</li>
<li>JITに関連すうる初期化パラメーター(postgresql.conf)を見てみる</li>
<li>クエリの見積もりコストが一定以上でJITコンパイリングが発動</li>
</ul>
<h1 id="構築">
構築</h1>
<h2 id="手順1:-llvmおよびclangのインストール">
手順1: llvmおよびclangのインストール</h2>
何度か構築作業のトライ&エラーしたところ、現在の最新dev版PostgreSQLは、configure時にLLVM-3.9.0以上を要求してくることが判明。まずはLLVMをインストールするところから。<br />
普通にepel-releaseからではllvm-3.4系がインストールされてしまうので追加のyumリポジトリを設定。<br />
<pre><code>/* epel-releaseリポジトリを追加 */
# yum install epel-release
# yum update
/* 3.4系がlistされるが、PostgreSQL 11devでは3.9系以上が求められる */
# yum list | grep llvm
llvm.x86_64 3.4.2-8.el7 epel
llvm-devel.x86_64 3.4.2-8.el7 epel
:
</code></pre>
epel-repoに以下を追加。<br />
(本手順は <a href="https://stackoverflow.com/questions/44219158/how-to-install-clang-and-llvm-3-9-on-centos-7">stack overflow - How to install Clang and LLVM 3.9 on CentOS 7</a> を参考)<br />
<pre><code># vi /etc/yum.repos.d/epel.repo
</code></pre>
<pre><code>[alonid-llvm-3.9.0]
name=Copr repo for llvm-3.9.0 owned by alonid
baseurl=https://copr-be.cloud.fedoraproject.org/results/alonid/llvm-3.9.0/epel-7-x86_64/
type=rpm-md
skip_if_unavailable=True
gpgcheck=1
gpgkey=https://copr-be.cloud.fedoraproject.org/results/alonid/llvm-3.9.0/pubkey.gpg
repo_gpgcheck=0
enabled=1
enabled_metadata=1
</code></pre>
llvm-3.9.0をインストール<br />
<pre><code># yum install llvm-3.9.0-devel
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: ftp.iij.ad.jp
* epel: www.ftp.ne.jp
* extras: ftp.iij.ad.jp
* updates: ftp.iij.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ llvm-3.9.0-devel.x86_64 0:3.9.0-7.el7.centos.alonid を インストール
--> 依存性の処理をしています: llvm-3.9.0(x86-64) = 3.9.0-7.el7.centos.alonid のパッケージ: llvm-3.9.0-devel-3.9.0-7.el7.centos.alonid.x86_64
--> 依存性の処理をしています: libLLVM-3.9.so()(64bit) のパッケージ: llvm-3.9.0-devel-3.9.0-7.el7.centos.alonid.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ llvm-3.9.0.x86_64 0:3.9.0-7.el7.centos.alonid を インストール
---> パッケージ llvm-3.9.0-libs.x86_64 0:3.9.0-7.el7.centos.alonid を インストール
--> 依存性解決を終了しました。
依存性を解決しました
===============================================================================================================================================================================================================================================================================
Package アーキテクチャー バージョン リポジトリー 容量
===============================================================================================================================================================================================================================================================================
インストール中:
llvm-3.9.0-devel x86_64 3.9.0-7.el7.centos.alonid alonid-llvm-3.9.0 2.0 M
依存性関連でのインストールをします:
llvm-3.9.0 x86_64 3.9.0-7.el7.centos.alonid alonid-llvm-3.9.0 2.0 M
llvm-3.9.0-libs x86_64 3.9.0-7.el7.centos.alonid alonid-llvm-3.9.0 11 M
トランザクションの要約
===============================================================================================================================================================================================================================================================================
インストール 1 パッケージ (+2 個の依存関係のパッケージ)
総ダウンロード容量: 15 M
インストール容量: 58 M
Is this ok [y/d/N]: y
Downloading packages:
警告: /var/cache/yum/x86_64/7/alonid-llvm-3.9.0/packages/llvm-3.9.0-devel-3.9.0-7.el7.centos.alonid.x86_64.rpm: ヘッダー V3 RSA/SHA1 Signature、鍵 ID c7c0c111: NOKEY ] 289 kB/s | 384 kB 00:00:52 ETA
llvm-3.9.0-devel-3.9.0-7.el7.centos.alonid.x86_64.rpm の公開鍵がインストールされていません
(1/3): llvm-3.9.0-devel-3.9.0-7.el7.centos.alonid.x86_64.rpm | 2.0 MB 00:00:01
(2/3): llvm-3.9.0-3.9.0-7.el7.centos.alonid.x86_64.rpm | 2.0 MB 00:00:02
(3/3): llvm-3.9.0-libs-3.9.0-7.el7.centos.alonid.x86_64.rpm | 11 MB 00:00:03
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
合計 2.9 MB/s | 15 MB 00:00:05
https://copr-be.cloud.fedoraproject.org/results/alonid/llvm-3.9.0/pubkey.gpg から鍵を取得中です。
Importing GPG key 0xC7C0C111:
Userid : "alonid_llvm-3.9.0 (None) <alonid#llvm-3.9.0@copr.fedorahosted.org>"
Fingerprint: d6a8 1fa1 8ab0 d031 5b66 93fa 9455 6bf5 c7c0 c111
From : https://copr-be.cloud.fedoraproject.org/results/alonid/llvm-3.9.0/pubkey.gpg
上記の処理を行います。よろしいでしょうか? [y/N]y
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
インストール中 : llvm-3.9.0-libs-3.9.0-7.el7.centos.alonid.x86_64 1/3
インストール中 : llvm-3.9.0-3.9.0-7.el7.centos.alonid.x86_64 2/3
インストール中 : llvm-3.9.0-devel-3.9.0-7.el7.centos.alonid.x86_64 3/3
検証中 : llvm-3.9.0-3.9.0-7.el7.centos.alonid.x86_64 1/3
検証中 : llvm-3.9.0-libs-3.9.0-7.el7.centos.alonid.x86_64 2/3
検証中 : llvm-3.9.0-devel-3.9.0-7.el7.centos.alonid.x86_64 3/3
インストール:
llvm-3.9.0-devel.x86_64 0:3.9.0-7.el7.centos.alonid
依存性関連をインストールしました:
llvm-3.9.0.x86_64 0:3.9.0-7.el7.centos.alonid llvm-3.9.0-libs.x86_64 0:3.9.0-7.el7.centos.alonid
完了しました!
</code></pre>
もう一つ、llvmに関連するclangの導入も必要。(最初に知っていればいきなりclangでも依存性解決してくれたのかも。)<br />
<pre><code># yum install clang-3.9.0-devel
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: ftp.iij.ad.jp
* epel: mirror.dmmlabs.jp
* extras: ftp.iij.ad.jp
* updates: ftp.iij.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ clang-3.9.0-devel.x86_64 0:3.9.0-3.1.el7.centos.alonid を インストール
--> 依存性の処理をしています: clang-3.9.0(x86-64) = 3.9.0-3.1.el7.centos.alonid のパッケージ: clang-3.9.0-devel-3.9.0-3.1.el7.centos.alonid.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ clang-3.9.0.x86_64 0:3.9.0-3.1.el7.centos.alonid を インストール
--> 依存性の処理をしています: clang-3.9.0-libs(x86-64) = 3.9.0-3.1.el7.centos.alonid のパッケージ: clang-3.9.0-3.9.0-3.1.el7.centos.alonid.x86_64
--> 依存性の処理をしています: libclang.so.3.9()(64bit) のパッケージ: clang-3.9.0-3.9.0-3.1.el7.centos.alonid.x86_64
--> 依存性の処理をしています: libclangAST.so()(64bit) のパッケージ: clang-3.9.0-3.9.0-3.1.el7.centos.alonid.x86_64
--> 依存性の処理をしています: libclangBasic.so()(64bit) のパッケージ: clang-3.9.0-3.9.0-3.1.el7.centos.alonid.x86_64
--> 依存性の処理をしています: libclangCodeGen.so()(64bit) のパッケージ: clang-3.9.0-3.9.0-3.1.el7.centos.alonid.x86_64
--> 依存性の処理をしています: libclangDriver.so()(64bit) のパッケージ: clang-3.9.0-3.9.0-3.1.el7.centos.alonid.x86_64
--> 依存性の処理をしています: libclangFormat.so()(64bit) のパッケージ: clang-3.9.0-3.9.0-3.1.el7.centos.alonid.x86_64
--> 依存性の処理をしています: libclangFrontend.so()(64bit) のパッケージ: clang-3.9.0-3.9.0-3.1.el7.centos.alonid.x86_64
--> 依存性の処理をしています: libclangFrontendTool.so()(64bit) のパッケージ: clang-3.9.0-3.9.0-3.1.el7.centos.alonid.x86_64
--> 依存性の処理をしています: libclangIndex.so()(64bit) のパッケージ: clang-3.9.0-3.9.0-3.1.el7.centos.alonid.x86_64
--> 依存性の処理をしています: libclangRewrite.so()(64bit) のパッケージ: clang-3.9.0-3.9.0-3.1.el7.centos.alonid.x86_64
--> 依存性の処理をしています: libclangRewriteFrontend.so()(64bit) のパッケージ: clang-3.9.0-3.9.0-3.1.el7.centos.alonid.x86_64
--> 依存性の処理をしています: libclangStaticAnalyzerFrontend.so()(64bit) のパッケージ: clang-3.9.0-3.9.0-3.1.el7.centos.alonid.x86_64
--> 依存性の処理をしています: libclangTooling.so()(64bit) のパッケージ: clang-3.9.0-3.9.0-3.1.el7.centos.alonid.x86_64
--> 依存性の処理をしています: libclangToolingCore.so()(64bit) のパッケージ: clang-3.9.0-3.9.0-3.1.el7.centos.alonid.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ clang-3.9.0-libs.x86_64 0:3.9.0-3.1.el7.centos.alonid を インストール
--> 依存性の処理をしています: compiler-rt-3.9.0(x86-64) >= 3.9.0 のパッケージ: clang-3.9.0-libs-3.9.0-3.1.el7.centos.alonid.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ compiler-rt-3.9.0.x86_64 0:3.9.0-3.el7.centos.alonid を インストール
--> 依存性解決を終了しました。
依存性を解決しました
===============================================================================================================================================================================================================================================================================
Package アーキテクチャー バージョン リポジトリー 容量
===============================================================================================================================================================================================================================================================================
インストール中:
clang-3.9.0-devel x86_64 3.9.0-3.1.el7.centos.alonid alonid-llvm-3.9.0 1.5 M
依存性関連でのインストールをします:
clang-3.9.0 x86_64 3.9.0-3.1.el7.centos.alonid alonid-llvm-3.9.0 441 k
clang-3.9.0-libs x86_64 3.9.0-3.1.el7.centos.alonid alonid-llvm-3.9.0 8.6 M
compiler-rt-3.9.0 x86_64 3.9.0-3.el7.centos.alonid alonid-llvm-3.9.0 1.4 M
トランザクションの要約
===============================================================================================================================================================================================================================================================================
インストール 1 パッケージ (+3 個の依存関係のパッケージ)
総ダウンロード容量: 12 M
インストール容量: 60 M
Is this ok [y/d/N]: y
Downloading packages:
(1/4): clang-3.9.0-3.9.0-3.1.el7.centos.alonid.x86_64.rpm | 441 kB 00:00:01
(2/4): clang-3.9.0-devel-3.9.0-3.1.el7.centos.alonid.x86_64.rpm | 1.5 MB 00:00:01
(3/4): compiler-rt-3.9.0-3.9.0-3.el7.centos.alonid.x86_64.rpm | 1.4 MB 00:00:00
(4/4): clang-3.9.0-libs-3.9.0-3.1.el7.centos.alonid.x86_64.rpm | 8.6 MB 00:00:02
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
合計 2.6 MB/s | 12 MB 00:00:04
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
インストール中 : compiler-rt-3.9.0-3.9.0-3.el7.centos.alonid.x86_64 1/4
インストール中 : clang-3.9.0-libs-3.9.0-3.1.el7.centos.alonid.x86_64 2/4
インストール中 : clang-3.9.0-3.9.0-3.1.el7.centos.alonid.x86_64 3/4
インストール中 : clang-3.9.0-devel-3.9.0-3.1.el7.centos.alonid.x86_64 4/4
検証中 : clang-3.9.0-3.9.0-3.1.el7.centos.alonid.x86_64 1/4
検証中 : compiler-rt-3.9.0-3.9.0-3.el7.centos.alonid.x86_64 2/4
検証中 : clang-3.9.0-devel-3.9.0-3.1.el7.centos.alonid.x86_64 3/4
検証中 : clang-3.9.0-libs-3.9.0-3.1.el7.centos.alonid.x86_64 4/4
インストール:
clang-3.9.0-devel.x86_64 0:3.9.0-3.1.el7.centos.alonid
依存性関連をインストールしました:
clang-3.9.0.x86_64 0:3.9.0-3.1.el7.centos.alonid clang-3.9.0-libs.x86_64 0:3.9.0-3.1.el7.centos.alonid compiler-rt-3.9.0.x86_64 0:3.9.0-3.el7.centos.alonid
完了しました!
</code></pre>
導入したllvmおよびclangは<code>/opt/llvm-3.9.0</code>ディレクトリ下に作成されていた。(3.9系のrpmでは各コマンドにパスが通っていなかったため、<code>which</code>が使えなくていろいろ探した。)<br />
<pre><code># cd /opt/llvm-3.9.0/
# ls
bin include lib64
# cd /opt/llvm-3.9.0/bin/
# ls
bugpoint clang++ clang-cl lli llvm-bcanalyzer llvm-cov llvm-dis llvm-dwp llvm-link llvm-mcmarkup llvm-pdbdump llvm-readobj llvm-split llvm-tblgen sancov yaml2obj
c-index-test clang-3.9 clang-format llvm-ar llvm-c-test llvm-cxxdump llvm-dsymutil llvm-extract llvm-lto llvm-nm llvm-profdata llvm-rtdyld llvm-stress obj2yaml sanstats
clang clang-check llc llvm-as llvm-config-64 llvm-diff llvm-dwarfdump llvm-lib llvm-mc llvm-objdump llvm-ranlib llvm-size llvm-symbolizer opt verify-uselistorder
</code></pre>
PostgreSQLのconfigure時、<code>llvm-config</code>コマンドおよび<code>clang</code>コマンドのパスが必要になるので確認しておく。<br />
<pre><code>/* llvm-configコマンドでバージョンを確認(フルパスで実行できることを確認) */
# /opt/llvm-3.9.0/bin/llvm-config-64 --version
3.9.0
/* clangコマンドでバージョンを確認(フルパスで実行できることを確認) */
# /opt/llvm-3.9.0/bin/clang --version
clang version 3.9.0 (tags/RELEASE_390/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /opt/llvm-3.9.0/bin
</code></pre>
<h2 id="手順2:-postgresqlのconfugreとインストール">
手順2: PostgreSQLのconfugreとインストール</h2>
PostgreSQLのソースからインストールしたことがある人は、configureオプションさえ気を付ければいつも通り。慣れていない方向けのもう少し詳しい手順は後述。<br />
<h4 id="configure">
configure</h4>
<pre><code># cd /media/postgres-master/
# ./configure --prefix=/home/pg11/pg11-home-withllvm --with-llvm LLVM_CONFIG=/opt/llvm-3.9.0/bin/llvm-config-64 CLANG=/opt/llvm-3.9.0/bin/clang
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking which template to use... linux
:
</code></pre>
<h4 id="make">
make</h4>
<pre><code># make
make -C src all
make[1]: ディレクトリ `/media/postgres-master/src' に入ります
make -C common all
:
All of PostgreSQL successfully made. Ready to install.
</code></pre>
<h4 id="make-install">
make install</h4>
<pre><code># su pg11
# make install
make -C src install
make[1]: ディレクトリ `/media/postgres-master/src' に入ります
make -C common install
:
PostgreSQL installation complete.
</code></pre>
<h2 id="インストール後の状態">
インストール後の状態</h2>
pg11ユーザーにスイッチし、<code>--prefix</code>で指定したディレクトリにインストールされていることを確認<br />
<pre><code># su - pg11
$ ls
pg11-home-withllvm
$ ls -ltr ./pg11-home-withllvm/
合計 12
drwxrwxr-x. 3 pg11 pg11 23 3月 31 13:17 share
drwxrwxr-x. 4 pg11 pg11 4096 3月 31 13:18 include
drwxrwxr-x. 4 pg11 pg11 4096 3月 31 13:18 lib
drwxrwxr-x. 2 pg11 pg11 4096 3月 31 13:18 bin
$ ls ./pg11-home-withllvm/bin
clusterdb createuser dropuser initdb pg_basebackup pg_controldata pg_dump pg_isready pg_recvlogical pg_restore pg_test_fsync pg_upgrade pgbench postmaster reindexdb
createdb dropdb ecpg pg_archivecleanup pg_config pg_ctl pg_dumpall pg_receivewal pg_resetwal pg_rewind pg_test_timing pg_waldump postgres psql vacuumdb
$ ls ./pg11-home-withllvm/share
postgresql
$ ls ./pg11-home-withllvm/include
ecpg_config.h ecpgerrno.h ecpgtype.h libpq-events.h pg_config.h pg_config_manual.h pgtypes_date.h pgtypes_interval.h pgtypes_timestamp.h postgresql sqlca.h sqlda-native.h
ecpg_informix.h ecpglib.h libpq libpq-fe.h pg_config_ext.h pg_config_os.h pgtypes_error.h pgtypes_numeric.h postgres_ext.h sql3types.h sqlda-compat.h sqlda.h
$ ls ./pg11-home-withllvm/lib
libecpg.a libecpg.so.6 libecpg_compat.a libecpg_compat.so.3 libpgcommon.a libpgport.a libpgtypes.so libpgtypes.so.3.11 libpq.so libpq.so.5.11 postgresql
libecpg.so libecpg.so.6.11 libecpg_compat.so libecpg_compat.so.3.11 libpgfeutils.a libpgtypes.a libpgtypes.so.3 libpq.a libpq.so.5 pkgconfig
</code></pre>
<code>pg_config</code>コマンドで確認すると、<code>CONFIGURE</code>行や<code>LDFLAGS</code>行よりLLVM込みでインストールできていることを読み取ることができる。<br />
<pre><code>$ pg_config
BINDIR = /home/pg11/pg11-home-withllvm/bin
DOCDIR = /home/pg11/pg11-home-withllvm/share/doc/postgresql
HTMLDIR = /home/pg11/pg11-home-withllvm/share/doc/postgresql
INCLUDEDIR = /home/pg11/pg11-home-withllvm/include
PKGINCLUDEDIR = /home/pg11/pg11-home-withllvm/include/postgresql
INCLUDEDIR-SERVER = /home/pg11/pg11-home-withllvm/include/postgresql/server
LIBDIR = /home/pg11/pg11-home-withllvm/lib
PKGLIBDIR = /home/pg11/pg11-home-withllvm/lib/postgresql
LOCALEDIR = /home/pg11/pg11-home-withllvm/share/locale
MANDIR = /home/pg11/pg11-home-withllvm/share/man
SHAREDIR = /home/pg11/pg11-home-withllvm/share/postgresql
SYSCONFDIR = /home/pg11/pg11-home-withllvm/etc/postgresql
PGXS = /home/pg11/pg11-home-withllvm/lib/postgresql/pgxs/src/makefiles/pgxs.mk
CONFIGURE = '--prefix=/home/pg11/pg11-home-withllvm' '--with-llvm' 'LLVM_CONFIG=/opt/llvm-3.9.0/bin/llvm-config-64' 'CLANG=/opt/llvm-3.9.0/bin/clang'
CC = gcc
CPPFLAGS = -DFRONTEND -D_GNU_SOURCE
CFLAGS = -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2
CFLAGS_SL = -fPIC
LDFLAGS = -L../../src/common -L/opt/llvm-3.9.0/lib64 -Wl,--as-needed -Wl,-rpath,'/home/pg11/pg11-home-withllvm/lib',--enable-new-dtags
LDFLAGS_EX =
LDFLAGS_SL =
LIBS = -lpgcommon -lpgport -lpthread -lz -lreadline -lrt -lcrypt -ldl -lm
VERSION = PostgreSQL 11devel
</code></pre>
<h2 id="postgersqlインストールの補足">
PostgerSQLインストールの補足</h2>
<h4 id="pg11ユーザー作成">
pg11ユーザー作成</h4>
今回はPostgreSQLをpg11ユーザーの所有でインストールする & インストール先ディレクトリをpg11ユーザーのホーム直下にしたくて事前にユーザーを作成。<br />
<pre><code># useradd pg11
# su - pg11
$ pwd
/home/pg11
$ exit
#
</code></pre>
<h4 id="最新版ソースコードの取得">
最新版ソースコードの取得</h4>
上述の「configure」以降の手順は、以下の通り最新版のソースコードを取得したうえで、解凍したディレクトリ(~/postgres-master/)に移動して実行している。<br />
<pre><code># cd /media
# wget https://github.com/postgres/postgres/archive/master.zip
# unzip master.zip
# cd /media/postgres-master/
# ls
COPYRIGHT GNUmakefile GNUmakefile.in HISTORY Makefile README README.git aclocal.m4 config config.log config.status configure configure.in contrib doc src
</code></pre>
<h4 id="configure時のエラー">
configure時のエラー</h4>
ありがちなエラーを整理(llvm関係ないものも含む。)<br />
<ul>
<li>readline関連</li>
<li>zlib関連<br />
→それぞれ<code>readline-devel</code>、<code>zlib-devel</code>を事前に導入しておく</li>
</ul>
<pre><code># yum install readline-devel
# yum install zlib-devel
</code></pre>
<ul>
<li>llvmのバージョン関連<br />
→メッセージに従い、要求されているバージョンをなんとかして追加する</li>
</ul>
<pre><code>/* エラーメッセージの例 */
checking for llvm-config... /usr/bin/llvm-config
configure: error: /usr/bin/llvm-config version is 3.4.2 but at least 3.9 is required
</code></pre>
<ul>
<li>LLVM_CONFIG関連</li>
<li>CLANG関連<br />
→<code>llvm_config</code>コマンドや<code>clang</code>コマンドの正しいパスを確認して、<code>LLVM_CONFIG</code>オプションまたは<code>CLANG</code>オプションで指定。</li>
</ul>
<pre><code>/* エラーメッセージの例 */
checking for llvm-config... no
checking for llvm-config-6.0... no
checking for llvm-config-5.0... no
checking for llvm-config-4.0... no
checking for llvm-config-3.9... no
configure: error: llvm-config not found, but required when compiling --with-llvm, specify with LLVM_CONFIG=
</code></pre>
<pre><code>/* エラーメッセージの例 */
checking for LLVM_CONFIG... /opt/llvm-3.9.0/bin/llvm-config-64
checking for clang... no
checking for clang-6.0... no
checking for clang-5.0... no
checking for clang-4.0... no
checking for clang-3.9... no
configure: error: clang not found, but required when compiling --with-llvm, specify with CLANG=
</code></pre>
本稿のために実行時のログを整理していて、LLVMやCLANGのバージョンが3.9指定ではなく、もっと新しいもの(6.0や5.0など)であれば、PostgreSQLがちゃんと探して使ってくれるのだな・・・と気づいた。新しいほうが賢かったりするんだろうか。<br />
<h1 id="出来上がった環境を見る">
出来上がった環境を見る</h1>
<h2 id="llvm無しで作った環境と比較">
llvm無しで作った環境と比較</h2>
<h4 id="llvmサポートのために追加されたファイル">
LLVMサポートのために追加されたファイル</h4>
<code><path-to-postgres>/lib/postgresql</code>配下に以下のファイル・ディレクトリが追加されている。<br />
<pre><code>$ cd lib/postgresql/
$ ls -ltr
drwxrwxr-x. 3 1002 1002 45 3月 31 13:18 bitcode
-rwxr-xr-x. 1 1002 1002 138560 3月 31 13:18 llvmjit.so
-rw-r--r--. 1 1002 1002 6044 3月 31 13:18 llvmjit_types.bc
(その他は省略)
</code></pre>
ファイルサイズ。ノーマルのPostgreSQLに対して結構でかい。<br />
<pre><code>/* 追加されたファイルが15MB強 */
$ du -sh ./pg11-home-withllvm/lib/postgresql/*
15M ./bitcode
136K ./llvmjit.so
8.0K ./llvmjit_types.bc
(その他は省略)
/* PostgreSQLのインストール先全体の約25MBに対して、15MBほど追加されて計40MB程度になる。*/
$ du -sh ./pg11-home-withllvm/*
12M ./pg11-home-withllvm/bin
6.1M ./pg11-home-withllvm/include
20M ./pg11-home-withllvm/lib
2.9M ./pg11-home-withllvm/share
$ du -sh ./pg11-home-nollvm/*
12M ./pg11-home-nollvm/bin
6.1M ./pg11-home-nollvm/include
4.6M ./pg11-home-nollvm/lib
2.9M ./pg11-home-nollvm/share
</code></pre>
ちなみに<code>bitcode</code>ディレクトリ配下はたくさんのLLVM Bitcodeが配置されている。<br />
<pre><code>$ cd ./pg11-home-withllvm/lib/postgresql
$ ls
ascii_and_mic.so dict_snowball.so euc_jp_and_sjis.so latin2_and_win1250.so llvmjit.so pgxs utf8_and_big5.so utf8_and_euc_cn.so utf8_and_euc_tw.so utf8_and_iso8859.so utf8_and_sjis.so utf8_and_win.so
bitcode euc2004_sjis2004.so euc_kr_and_mic.so latin_and_mic.so llvmjit_types.bc plpgsql.so utf8_and_cyrillic.so utf8_and_euc_jp.so utf8_and_gb18030.so utf8_and_iso8859_1.so utf8_and_sjis2004.so
cyrillic_and_mic.so euc_cn_and_mic.so euc_tw_and_big5.so libpqwalreceiver.so pgoutput.so utf8_and_ascii.so utf8_and_euc2004.so utf8_and_euc_kr.so utf8_and_gbk.so utf8_and_johab.so utf8_and_uhc.so
$ cd bitcode
$ ls
postgres postgres.index.bc
$ cd postgres
$ ls
access bootstrap catalog commands executor foreign jit lib libpq main nodes optimizer parser port postmaster regex replication rewrite statistics storage tcop tsearch utils
$ cd executor
$ ls
execAmi.bc execIndexing.bc execProcnode.bc execUtils.bc nodeBitmapAnd.bc nodeCustom.bc nodeGroup.bc nodeLimit.bc nodeModifyTable.bc nodeResult.bc nodeSubplan.bc nodeValuesscan.bc tstoreReceiver.bc
execCurrent.bc execJunk.bc execReplication.bc functions.bc nodeBitmapHeapscan.bc nodeForeignscan.bc nodeHash.bc nodeLockRows.bc nodeNamedtuplestorescan.bc nodeSamplescan.bc nodeSubqueryscan.bc nodeWindowAgg.bc
execExpr.bc execMain.bc execSRF.bc instrument.bc nodeBitmapIndexscan.bc nodeFunctionscan.bc nodeHashjoin.bc nodeMaterial.bc nodeNestloop.bc nodeSeqscan.bc nodeTableFuncscan.bc nodeWorktablescan.bc
execExprInterp.bc execParallel.bc execScan.bc nodeAgg.bc nodeBitmapOr.bc nodeGather.bc nodeIndexonlyscan.bc nodeMergeAppend.bc nodeProjectSet.bc nodeSetOp.bc nodeTidscan.bc spi.bc
execGrouping.bc execPartition.bc execTuples.bc nodeAppend.bc nodeCtescan.bc nodeGatherMerge.bc nodeIndexscan.bc nodeMergejoin.bc nodeRecursiveunion.bc nodeSort.bc nodeUnique.bc tqueue.bc
</code></pre>
<h2 id="使ってみる">
使ってみる</h2>
<h4 id="環境変数の設定">
環境変数の設定</h4>
最低限、.bash_profileにこれぐらい追加しておけば良い。今回は複数の環境で違いを見くらべたいのでこんな感じに環境変数設定ファイルを都度読むようにする。<br />
<pre><code>$ cp .bash_profile .withllvm_profile
$ vi .withllvm_profile
</code></pre>
<pre><code>export PGHOME=$HOME/pg11-home-withllvm
export PGDATA=$HOME/data-withllvm
export PGPORT=5435
export PGDATABASE=postgres
export PATH=$PGHOME/bin:.:$PATH
</code></pre>
こっちのファイルを反映するときは<code>source</code>で読みこむ。<br />
<pre><code>$ source .withllvm_profile
</code></pre>
<h4 id="initdb">
initdb</h4>
JITサポートのためのinitdbオプションも探したがそのようなものはない。普通initdbすればOK。<br />
<pre><code>$ initdb -E utf8 --no-locale
</code></pre>
<pre><code>The files belonging to this database system will be owned by user "pg11".
This user must also own the server process.
The database cluster will be initialized with locale "C".
The default text search configuration will be set to "english".
Data page checksums are disabled.
creating directory /home/pg11/data-withllvm ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok
WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.
Success. You can now start the database server using:
pg_ctl -D /home/pg11/data-withllvm -l logfile start
</code></pre>
データディレクトリが作成された。<br />
<pre><code>$ cd $PGDATA
$ pwd
/home/pg11/data-withllvm
$ ls
PG_VERSION base global pg_commit_ts pg_dynshmem pg_hba.conf pg_ident.conf pg_logical pg_multixact pg_notify pg_replslot pg_serial pg_snapshots pg_stat pg_stat_tmp pg_subtrans pg_tblspc pg_twophase pg_wal pg_xact postgresql.auto.conf postgresql.conf
</code></pre>
<h4 id="設定ファイルの編集起動">
設定ファイルの編集&起動</h4>
<ul>
<li>
postgresql.confでは以下のパラメーターを修正<br />
<ul>
<li>listen_addresses = ‘*’</li>
<li>port = 5435</li>
<li>logging_collector = on</li>
</ul>
</li>
<li>
pg_hba.confは以下<br />
<ul>
<li>自分のノートPCのIPアドレスを許可</li>
</ul>
</li>
</ul>
<h4 id="データベース起動">
データベース起動</h4>
<pre><code>$ pg_ctl start
</code></pre>
<h4 id="パラメーター一覧からjitを検索">
パラメーター一覧からjitを検索</h4>
<pre><code>postgres=# SELECT name,setting,context,category,short_desc,extra_desc FROM pg_settings WHERE name LIKE '%jit%' ORDER BY category DESC,name ASC;
name | setting | context | category | short_desc | extra_desc
-------------------------+---------+-------------------+---------------------------------------+------------------------------------------------------+------------------------------
jit_above_cost | 100000 | user | Query Tuning / Planner Cost Constants | Perform JIT compilation if query is more expensive. | -1 disables JIT compilation.
jit_inline_above_cost | 500000 | user | Query Tuning / Planner Cost Constants | Perform JIT inlining if query is more expensive. | -1 disables inlining.
jit_optimize_above_cost | 500000 | user | Query Tuning / Planner Cost Constants | Optimize JITed functions if query is more expensive. | -1 disables optimization.
jit | on | user | Query Tuning / Other Planner Options | Allow JIT compilation. |
jit_provider | llvmjit | postmaster | File Locations | JIT provider to use. |
jit_debugging_support | off | superuser-backend | Developer Options | Register JIT compiled function with debugger. |
jit_dump_bitcode | off | superuser | Developer Options | Write out LLVM bitcode to facilitate JIT debugging. |
jit_expressions | on | user | Developer Options | Allow JIT compilation of expressions. |
jit_profiling_support | off | superuser-backend | Developer Options | Register JIT compiled function with perf profiler. |
jit_tuple_deforming | on | user | Developer Options | Allow JIT compilation of tuple deforming. |
(10 rows)
</code></pre>
<strong>注意:</strong> LLVM無しで作った環境もパラメーター自体は同じものが設定されていた。<br />
<h2 id="jitが発動するとどうなるか">
JITが発動するとどうなるか</h2>
クエリの見積もりコストが<code>jit_above_cost</code>を超えると発動するとのことなので、pgbenchのテーブルを使って超雑にコストの高いクエリを作ってみた。<strong>複雑にしたいがために適当of適当で作った。クエリの意味を考えてはいけない。</strong><br />
<pre><code>/* サンプルはpgbenchのテーブルで */
$ pgbench -i -s 100 -U bench bench
creating tables...
generating data...
100000 of 10000000 tuples (1%) done (elapsed 0.23 s, remaining 23.10 s)
200000 of 10000000 tuples (2%) done (elapsed 0.48 s, remaining 23.76 s)
:
done.
/* pgbenchのベンチマークではなく、無駄に重く作ってみたクエリ。★の行数でコストが変わる。 */
EXPLAIN ANALYZE
WITH a AS (SELECT a.aid,abalance,b.bid,tbalance FROM pgbench_accounts a
JOIN pgbench_branches b ON a.bid=b.bid
JOIN pgbench_tellers t ON b.bid = t.bid
WHERE a.aid between 50000 and xxxxxx) --★
SELECT * FROM pgbench_branches
RIGHT OUTER JOIN a ON pgbench_branches.bbalance = tbalance
WHERE tbalance % 35 in (0,2,5,7,9,11,13,17);
</code></pre>
★を調整して、見積もりコスト(1行目の<code>Hash Left Join (cost=33360.21..100000.04</code>)が100000を超えると、JITが発動した。<br />
<pre><code>bench=> explain analyze with A as (select a.aid,abalance,b.bid,tbalance from pgbench_accounts a join pgbench_branches b on a.bid=b.bid JOIN pgbench_tellers t ON b.bid = t.bid
WHERE a.aid between 50000 and 262926) -- ★
select * from pgbench_branches right outer join A on pgbench_branches.bbalance = tbalance where tbalance % 35 in (0,2,5,7,9,11,13,17);
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Hash Left Join (cost=33360.21..100000.04 rows=81144 width=380) (actual time=45.816..3774.989 rows=212927 loops=1)
Hash Cond: (a.tbalance = pgbench_branches.bbalance)
CTE a
-> Hash Join (cost=49.72..33355.96 rows=2028610 width=16) (actual time=45.637..1518.676 rows=2129270 loops=1)
Hash Cond: (a_1.bid = b.bid)
-> Index Scan using pgbench_accounts_pkey on pgbench_accounts a_1 (cost=0.43..9977.66 rows=202861 width=12) (actual time=0.076..207.748 rows=212927 loops=1)
Index Cond: ((aid >= 50000) AND (aid <= 262926))
-> Hash (cost=36.79..36.79 rows=1000 width=12) (actual time=45.497..45.497 rows=1000 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 51kB
-> Hash Join (cost=4.25..36.79 rows=1000 width=12) (actual time=43.046..44.835 rows=1000 loops=1)
Hash Cond: (t.bid = b.bid)
-> Seq Scan on pgbench_tellers t (cost=0.00..20.00 rows=1000 width=8) (actual time=0.041..0.610 rows=1000 loops=1)
-> Hash (cost=3.00..3.00 rows=100 width=4) (actual time=42.934..42.934 rows=100 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 12kB
-> Seq Scan on pgbench_branches b (cost=0.00..3.00 rows=100 width=4) (actual time=42.699..42.805 rows=100 loops=1)
-> CTE Scan on a (cost=0.00..65929.82 rows=81144 width=16) (actual time=45.665..3541.279 rows=212927 loops=1)
Filter: ((tbalance % 35) = ANY ('{0,2,5,7,9,11,13,17}'::integer[]))
Rows Removed by Filter: 1916343
-> Hash (cost=3.00..3.00 rows=100 width=364) (actual time=0.122..0.122 rows=100 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 12kB
-> Seq Scan on pgbench_branches (cost=0.00..3.00 rows=100 width=364) (actual time=0.011..0.058 rows=100 loops=1)
Planning Time: 1.694 ms
JIT:
Functions: 36
Generation Time: 11.757 ms
Inlining: false
Inlining Time: 0.000 ms
Optimization: false
Optimization Time: 2.401 ms
Emission Time: 39.496 ms
Execution Time: 3894.130 ms
(31 rows)
Time: 3903.549 ms (00:03.904)
</code></pre>
試しに★を1行へらして、コストが100000を下回ると、JITは発動しない。<br />
<pre><code>bench=> explain analyze with A as (select a.aid,abalance,b.bid,tbalance from pgbench_accounts a join pgbench_branches b on a.bid=b.bid JOIN pgbench_tellers t ON b.bid = t.bid
WHERE a.aid between 50000 and 262925) -- ★
select * from pgbench_branches right outer join A on pgbench_branches.bbalance = tbalance where tbalance % 35 in (0,2,5,7,9,11,13,17);
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Hash Left Join (cost=33360.07..99999.58 rows=81144 width=380) (actual time=3.699..3824.800 rows=212926 loops=1)
Hash Cond: (a.tbalance = pgbench_branches.bbalance)
CTE a
-> Hash Join (cost=49.72..33355.82 rows=2028600 width=16) (actual time=3.499..1532.521 rows=2129260 loops=1)
Hash Cond: (a_1.bid = b.bid)
-> Index Scan using pgbench_accounts_pkey on pgbench_accounts a_1 (cost=0.43..9977.64 rows=202860 width=12) (actual time=0.054..201.977 rows=212926 loops=1)
Index Cond: ((aid >= 50000) AND (aid <= 262925))
-> Hash (cost=36.79..36.79 rows=1000 width=12) (actual time=3.411..3.411 rows=1000 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 51kB
-> Hash Join (cost=4.25..36.79 rows=1000 width=12) (actual time=1.076..2.791 rows=1000 loops=1)
Hash Cond: (t.bid = b.bid)
-> Seq Scan on pgbench_tellers t (cost=0.00..20.00 rows=1000 width=8) (actual time=0.023..0.613 rows=1000 loops=1)
-> Hash (cost=3.00..3.00 rows=100 width=4) (actual time=1.024..1.024 rows=100 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 12kB
-> Seq Scan on pgbench_branches b (cost=0.00..3.00 rows=100 width=4) (actual time=0.005..0.085 rows=100 loops=1)
-> CTE Scan on a (cost=0.00..65929.50 rows=81144 width=16) (actual time=3.520..3594.655 rows=212926 loops=1)
Filter: ((tbalance % 35) = ANY ('{0,2,5,7,9,11,13,17}'::integer[]))
Rows Removed by Filter: 1916334
-> Hash (cost=3.00..3.00 rows=100 width=364) (actual time=0.130..0.130 rows=100 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 12kB
-> Seq Scan on pgbench_branches (cost=0.00..3.00 rows=100 width=364) (actual time=0.009..0.056 rows=100 loops=1)
Planning Time: 1.282 ms
Execution Time: 3931.001 ms
(23 rows)
Time: 3935.137 ms (00:03.935)
</code></pre>
と、パラメーターの設定にしたがってJITが発動している様子がわかります。<br />
本稿ではここまで。<br />
今後はJITが得意な処理をちゃんと調べて、「こんなケースで効果がでる」みたいなところを明らかにしていきたい。<br />
</div>
</body>
</html>
Anonymoushttp://www.blogger.com/profile/02234679274621415851noreply@blogger.com1tag:blogger.com,1999:blog-1760199393479360913.post-82090633748493732642018-02-12T21:06:00.001+09:002018-02-12T21:06:33.487+09:00pgAdmin4をバージョンアップする(Windows版)<textarea border-style:dotted="border-style:dotted" class="markdown" disabled="disabled">
# pgAdmin4とは
PostgreSQLの簡単な運用管理やクエリ作成に使える標準のGUIツールです。
以前に英語のみ提供されていたpgAdmin4を日本語化する方法を紹介しました。
[pgAdmin4を日本語化する](http://kkida-galaxy.blogspot.jp/2017/12/pgadmin4ja.html)
# pgAdmin4をバージョンアップする
2018年1月11日にバージョン2.1がリリースされました。
以前のバージョンではGUIツールとして~~残念な~~表示上の不具合などがあったのですが、そのようなバグ修正や、クエリツールの利便性を改善するような修正が行われています。
pgAdmin4はクライアントツールなので、「メンテナンス」というと嫌がられるDBサーバーの中身をバージョンアップするのとは違います。各担当者の作業用PCの中で、好き勝手にバージョンアップしてしまいましょう!
> *ちなみに「4」は製品名で「2.1」がバージョンです。中の人の中心は同じだったりしますが、「pgAdmin3」とは別プロジェクト、別物として開発されています。と言うワケで、pgAdmin3をお使いの方は4に乗り換えるかどうかと言う話で、本記事とはまた別と考えましょう。*
# バージョンアップ手順
実のところ、私も探り探りです。やりながら書いていきます。笑
## 現在の環境
32bitのWindows10にpgAdmin4 2.0をインストールして、日本語にしてあります。
DBサーバーへの接続を2つ(2つのDBに対する接続)を登録してあります。
![バージョンアップ前](https://lh3.googleusercontent.com/cKgMxWRbnHbnhyJ7S4rr9pt3RrJw5o_ymtp89eroR9m07kh7W1M5Du8yg1ViugE9djRfVovH92qr "バージョンアップ前")
今回の目標はこの`接続定義を保持したままバージョン2.1に上げる`こととします。
※ pgAgentを導入し、DBに対するタスクスケジューリングをしている場合、本手順で完全に移行できるかどうかは***未確認***です。ご注意ください!
<br>
## 最新版のダウンロード
pgAdmin4プロジェクトの[ダウンロードページ](https://www.pgadmin.org/download/pgadmin-4-windows/)から最新版のexeファイルを取得します。
* CURRENT_MAINTAINER
* pgadmin4-2.1-x86.exe ★必要なのはコレのみ
* pgadmin4-2.1-x86.exe.sig
<br>
## インストーラーを実行
取得したexeファイルを右クリックして「管理者として実行」します。
インストーラーの中身は英語ですが、次々と進めてOK。
今回はバージョンアップなので、インストール先だけ既存フォルダを指定します。
### インストールを開始
![enter image description here](https://lh3.googleusercontent.com/2W_bQXAvfezHT1__lp31z94nR6mhkMK_nO23iFfSEtaFUlqW4AbrEAooNpIC6YUVWEGvd-oe3QDS "インストール開始")
### 規約に同意
![enter image description here](https://lh3.googleusercontent.com/6laOjeUR6qslPz2KO2Pj8yxF4nO8Jm7I_A8yYH57oyq_hHlZd3GnIYdm6XQrGPUQATM-WKx9pCHD "規約")
### インストールフォルダを指定
ここで今回は既存のフォルダを指定しました。
![フォルダ指定](https://lh3.googleusercontent.com/XAvWuu6KrXsyGQ-lhob_z1ZdT0Fbb2ammgN9vrMyXVciKof4Zo6Xli-4_xUsYpOJRax92Z_wBKgH "フォルダ指定")
既に同ファイルが存在する旨の警告がでますが、そのまま進めて問題ありませんでした。
![enter image description here](https://lh3.googleusercontent.com/bt3sJvTqjQsLumd4BEGUwTVDOedq6s3-Op-4ev8ajAc3Y03n_XYXM7ZgafM02szeUYcGNkM7mnwS "警告")
### メニューの作成
Windowsのスタートメニューに追加するかどうかの確認です。
![enter image description here](https://lh3.googleusercontent.com/WzG5QbLNJwtiuodeJgACWrbkY96F_BIygNq2s4fnR-mKXvy3yTW_zkpFkLle6p_tLTtUk2boEjWk "メニュー作成")
### インストール内容の確認
![enter image description here](https://lh3.googleusercontent.com/1hFdcILn2IaGxO2zpFWoPcBFTzjD2HnutFQClYwwNPMrz2BVv-Dkak3Vomr2pZHYTjdYLQZmK44k "確認")
### インストール完了
「Launch pgAdmin4」にチェックを入れると、インストーラー終了後にpgAdmin4が自動起動されます・・・が、一回目は上手くいかないのがお約束(大きな声では言えない。。。)
![enter image description here](https://lh3.googleusercontent.com/a4InolTiq4jtIVx5fFj-D7aSZj9Lu05FBojk3_9e14f3pvCt39YLtaWntr94euIcK2e0oaH2_IXP "完了")
## インストール後の状態
以下の2点を確認します。
* 日本語になっている
* 設定済みの接続情報(サーバー定義)がきちんと残っている事
![enter image description here](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgY8PRduZQMAHW8x-ljyBpL_HutKoQXb-TZULSzzlOWxNp8st0waU1IMjLVBUiLDrBVWFIonfTRrLuWxXO5TyywINgpG4sOaRnc13e-3YpAhyphenhyphenaWB5e-6i_HvohBSgEie_-fwp8AVv99_sY/ "バージョンアップ後")
問題なさそうです!**よかった!**
</textarea>Anonymoushttp://www.blogger.com/profile/02234679274621415851noreply@blogger.com0tag:blogger.com,1999:blog-1760199393479360913.post-61593040704974786652017-12-13T12:37:00.001+09:002018-02-01T00:08:52.136+09:00pgAdmin4を日本語化するこの記事は<a href="https://qiita.com/advent-calendar/2017/postgresql" target="_blank">PostgreSQL Advent Calendar 2017</a>の13日目です。昨日はkmoriさんの「<a href="http://kmori.blog.jp/archives/9718320.html" rel="noopener noreferrer" target="_blank">.psqlrcの話</a>」でした。<br />
本記事では、私もメンバーの一員として取り組んでいるpgAdmin4の日本語化について書きます。<br />
<br />
<h2>
<span style="color: #3d85c6;">pgAdmin4とは?</span></h2>
クライアントPCからリモートのPostgreSQLサーバーに接続し、メンテナンス、状態監視、簡単な開発に利用できるGUIクライアントです。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhy1xM21e6y821oIECJf5oTeaZrssMjdrqnRFT5tM0P-n2Er5Ghrtre2xqlpg1ZQrRWy3MdcY8g-CPTS0WpHHzLLPRSLFPVExb3FJ9nvOFMB4Mi9sJTlQk9pkMg2A7HZyyAV__GV4OkAlY/s1600/whatispgadmin.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="545" data-original-width="951" height="183" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhy1xM21e6y821oIECJf5oTeaZrssMjdrqnRFT5tM0P-n2Er5Ghrtre2xqlpg1ZQrRWy3MdcY8g-CPTS0WpHHzLLPRSLFPVExb3FJ9nvOFMB4Mi9sJTlQk9pkMg2A7HZyyAV__GV4OkAlY/s320/whatispgadmin.png" width="320" /></a></div>
<h2>
<span style="color: #3d85c6;"><b>pgAdmin4、こんな人におススメ</b></span></h2>
<b> ・データベースをGUIで手軽に操作したい</b><br />
<b> ・PostgreSQLを使い始めたので、まずはアクセスみたい </b><br />
<b> ・監視やチューニングに関しても、手元でちょろっとできて欲しいんよ</b><br />
<br />
データベースを利用する上で、例えばマルチDB対応している<a href="https://a5m2.mmatsubara.com/" target="_blank"><b><span style="color: orange;">A5</span></b></a>や、補完機能などが抜群で圧倒的支持とウワサの<a href="https://products.sint.co.jp/siob/products/pg" target="_blank"><b><span style="color: orange;">オブジェクトブラウザ-</span></b></a>など、便利なクライアントツールは複数知られていますが、PostgreSQL向けにとにかく気軽に使いたいなら<a href="https://www.pgadmin.org/" target="_blank"><b><span style="color: orange;">pgAdmin</span></b></a>でしょう。<br />
特にGUIクライアントの需要が高いであろうWindows版であれば、PostgreSQLのインストーラーに同梱されていますので、使い始めが簡単ですし、簡単な監視、SQLチューニングまでいろいろできます。<br />
<br />
<br />
<h2>
<span style="color: #3d85c6;">日本語対応しました! </span></h2>
知る人ぞ知る、<span style="color: orange;"><b><span style="color: orange;">pgAdminの<span style="color: orange;"><a href="https://www.postgresql.org/message-id/E1e83J5-0007sU-Ex%40gothos.postgresql.org" target="_blank">開発メーリングリスト</a></span></span></b></span>。<br />
ついに日本語対応しました。日本PostgreSQLユーザ会の有志で数ヶ月にわたる翻訳を行い、この度日本語対応することができました。<br />
<br />
<br />
<h2>
<b><span style="color: #3d85c6;">日本語化する方法</span></b></h2>
PostgreSQL10に同梱されているpgAmind4 v2以降、簡単に日本語化することができます。既に稼働しているpgAdmin4を日本語化する手順を説明します。<br />
<br />
<b><span style="color: orange;">・翻訳ファイルの配置</span></b><br />
まずは以下のファイルを手元にダウンロードしておいてください。<br />
<a href="https://github.com/postgres/pgadmin4/tree/master/web/pgadmin/translations/ja/LC_MESSAGES" target="_blank"> poファイルのダウンロード</a><br />
こちらのリンク先で、「messages.po」「messages.mo」をそれぞれ入手しておいてください。(注:右クリックで「リンク先を保存」では正しく保存できませんでした。私の場合、pgadmin4のトップでソースコード全体をDOWNLOADしました)<br />
<br />
Windowsの場合、デフォルトで「C:\Program Files\PostgreSQL\10\pgAdmin 4\web\pgadmin\translations」に各国語の翻訳ファイルが配置されていますので、「ja\LC_MESSAGES」フォルダを作成し、両ファイルを配置します。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzpRmKKfkuMjhTl4vmGnwDT6DAV7GJNjlMr0CYCaikZp28B12CTbHsNvgYkSbJ7eEPU-o0AayUBW2ImUJkR4n-UjSA2HZBVukQLHxrv5u6ec67epARZVXQOdr9a99_au5pHF-Ye3MvviA/s1600/lc_messages.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="299" data-original-width="802" height="147" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhzpRmKKfkuMjhTl4vmGnwDT6DAV7GJNjlMr0CYCaikZp28B12CTbHsNvgYkSbJ7eEPU-o0AayUBW2ImUJkR4n-UjSA2HZBVukQLHxrv5u6ec67epARZVXQOdr9a99_au5pHF-Ye3MvviA/s400/lc_messages.png" width="400" /></a></div>
<br />
<b><span style="color: orange;">・設定変更</span></b><br />
「C:\Program Files\PostgreSQL\10\pgAdmin 4\web」にpgAdmin起動時に読み込まれる「config.py」がありますので、これをテキストエディタで開き、一か所編集します。<br />
<br />
<span style="color: red;"><b>'ja','Japanese'の行を追加します。'Polish'の後のカンマも忘れずに。</b></span><br />
---<br />
# Languages we support in the UI<br />
LANGUAGES = {<br />
'en': 'English',<br />
'zh': 'Chinese (Simplified)',<br />
'de': 'German',<br />
'pl': 'Polish'<b><span style="color: red;">,</span></b><br />
<b><span style="color: red;"> 'ja': 'Japanese'</span></b><br />
}<br />
---<br />
<br />
<b><span style="color: orange;">・pgAdminの起動と設定変更</span></b><br />
追加したフォルダのパスや設定が間違っていたりするとpgAdminが上手く起動しません。私は↑の設定ファイルでカンマを付け忘れて数時間悩みましたw<br />
<br />
pgAdmin4を起動し、上部メニューの「File」-「Preferences」より設定変更を行います。<br />
「Miscellaneous」-「User Language」で使用する言語を選択します。 ここでは config.pyファイルに記述した言語が候補になります。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNTUwt3wQSY28CyOWsnq9zVsbOhHkCKvF1SXJX3wYxAIibw8VJyrTrUmQctCy6hR2_LAqN30wFSCjQJ938CBXhW2VULmgVeeWt7IofkjArLXvQ3t6oDuDe4C38V86QlXuL5Wd59ewlsYI/s1600/changelang.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="602" data-original-width="1038" height="370" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNTUwt3wQSY28CyOWsnq9zVsbOhHkCKvF1SXJX3wYxAIibw8VJyrTrUmQctCy6hR2_LAqN30wFSCjQJ938CBXhW2VULmgVeeWt7IofkjArLXvQ3t6oDuDe4C38V86QlXuL5Wd59ewlsYI/s640/changelang.png" width="640" /></a></div>
<br />
変更はすぐには反映されませんので、「File」-「Reset Layout」します。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqR0RG6ybyBcyuAxEC0170HbJgfMAsKZ4JhUIOXmD-us_m71gCLystzAS0cHLUj2DVeA3BrhWymVFsigMA8gZYvyBSgyAaurJrf_kNtltAu76kVXSvFAW9QvvPyDKmd3L-L_djODtbN-s/s1600/reset.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="155" data-original-width="604" height="102" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqR0RG6ybyBcyuAxEC0170HbJgfMAsKZ4JhUIOXmD-us_m71gCLystzAS0cHLUj2DVeA3BrhWymVFsigMA8gZYvyBSgyAaurJrf_kNtltAu76kVXSvFAW9QvvPyDKmd3L-L_djODtbN-s/s400/reset.png" width="400" /></a></div>
<br />
なにやら警告が。pgAdminから実行中の処理がある場合は気をつけましょう。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrPpsyGhUobwIqgzLf4xY3V0joUsTfmyuuOqSLLwmfItY7wwJkkVOzJwEgoNoRB3dgVP_u9f9J809zeUitsvtv2lXpwCAoPlOo2DskhCTwyLLkyYhpPXzYf1smfdMzNihwgNdlvhDntRQ/s1600/japanese.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1366" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrPpsyGhUobwIqgzLf4xY3V0joUsTfmyuuOqSLLwmfItY7wwJkkVOzJwEgoNoRB3dgVP_u9f9J809zeUitsvtv2lXpwCAoPlOo2DskhCTwyLLkyYhpPXzYf1smfdMzNihwgNdlvhDntRQ/s640/japanese.png" width="640" /></a></div>
日本語になりました!<br />
<br />
<br />
ところで、最初から日本語に対応した版が出るのはもう少し先になりそうです。そして今は日本語化しても英語交じりで「ん?!」って感じです。パッと見は確かに日本語なのですが、実用的なメニューではどこが変わったのよ?!という方に日本語版おススメポイントを1つ挙げておきます。<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK1YkM0am0a-g03Fa-fPOh3F5H-dYx3fHS6Wif1FimCL9XpzbroW-GXdy-cLjnjxBqtVp8dUXWJLg7zLUM-O4S7lttxEadudBnsgQhYuQhKxMHn5n7kJvVWVSEG_URcHIXt_B7Ux_K-v8/s1600/query.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="413" data-original-width="1238" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiK1YkM0am0a-g03Fa-fPOh3F5H-dYx3fHS6Wif1FimCL9XpzbroW-GXdy-cLjnjxBqtVp8dUXWJLg7zLUM-O4S7lttxEadudBnsgQhYuQhKxMHn5n7kJvVWVSEG_URcHIXt_B7Ux_K-v8/s640/query.png" width="640" /></a></div>
<br />
ちょっとマニアックな部分ですが、SQL実行する「Query Tool」では(そもそも「Query Tool」を日本語にしてよ、という意見が・・・<span class="st">(∩゚д゚)<i>アーアーきこえ</i>なーい</span>)<br />
雷アイコンでユーザーが書いたSQLを実行します。が、ん?実行どこ?!って思ってました。昔のpgAdmin3は雷アイコンが黄色かったのでなんとなく目についたんですよね。<br />
<br />
「どれだよ実行~」と思って探していくと、雷アイコンのマウスオーバーでちゃんと日本語ヘルプが出ますし、複数の実行オプションがあるのですが、こういうマニアックなメニューが日本語になっているのは嬉しい気がします。<br />
(「EXPLAIN ANALYZE」はSQLコマンドなのでこのまま英語表記かな・・・)<br />
<br />
<br />
以上です。<br />
<br />
明日はやっさん(<a href="https://qiita.com/yassan168">yassan168</a>)さんがデータ分析でPostgreSQLな話をしてくれるそうです!Anonymoushttp://www.blogger.com/profile/02234679274621415851noreply@blogger.com0tag:blogger.com,1999:blog-1760199393479360913.post-75427117005491966062017-12-01T23:42:00.000+09:002017-12-01T23:42:19.264+09:00コピペで試す PG10 の 3ステップレプリケーション!<div class="adventCalendarJumbotron_heading">
本記事は PostgreSQL Advent Calendar 2017 の1日目です。</div>
<div class="adventCalendarJumbotron_heading">
のっけから23時台の更新とひやひやさせてすみません。</div>
<div class="adventCalendarJumbotron_heading">
<br /></div>
<div class="adventCalendarJumbotron_heading">
<span style="color: orange;"><b>■何を書くか</b></span></div>
<div class="adventCalendarJumbotron_heading">
11/3に開催されたPostgreSQL Conforence 2017 JapanでPostgreSQLのレプリケーションに関するチュートリアルを受け持ったのですが、その準備中、PG10でレプリケーション作成の簡単さにびっくりしたのです。当然チュートリアル内でもその簡単さを熱く語ったわけですが、それを書こうと思います。</div>
<div class="adventCalendarJumbotron_heading">
</div>
<iframe allowfullscreen="" frameborder="0" height="485" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/jbarsKgE4wuJin" style="border-width: 1px; border: 1px solid #ccc; margin-bottom: 5px; max-width: 100%;" width="595"> </iframe> <br />
<div style="margin-bottom: 5px;">
<b> <a href="https://www.slideshare.net/kkida85/t4postgresreplication" target="_blank" title="PostgreSQLレプリケーション(pgcon17j_t4)">PostgreSQLレプリケーション(pgcon17j_t4)</a> </b> from <b><a href="https://www.slideshare.net/kkida85" target="_blank">Kosuke Kida</a></b><br />
<br />
<br />
<span style="color: orange;"><b>■PG10のレプリケーションはこうなった!</b></span><br />
・パラメータのデフォルト値が変わって、簡単にレプリケーションできるようになった<br />
・ロジカルレプリケーションができるようになった<br />
<br />
その他にも細かい話題はあるにせよ、このうち、ロジレプの陰で感動するほど簡単になったレプリケーション作成を取り上げたいと思います。<br />
<br />
<span style="color: orange;"><b> ■ステップ0:インストール</b></span><br />
AWSでEC2インスタンス(CentOS)にPostgreSQLをインストールします。<br />
<br />
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">$ </span><span style="color: black; font-family: "MS ゴシック";">sudo</span><span style="color: black; font-family: "MS ゴシック";">
yum install </span><span style="color: black; font-family: "MS ゴシック";">wget</span><span style="color: black; font-family: "MS ゴシック";">
</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">$ </span><span style="color: black; font-family: "MS ゴシック";">wget</span><span style="color: black; font-family: "MS ゴシック";">
https://download.postgresql.org/pub/repos/yum/testing/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">$ </span><span style="color: black; font-family: "MS ゴシック";">sudo</span><span style="color: black; font-family: "MS ゴシック";">
rpm -</span><span style="color: black; font-family: "MS ゴシック";">ivh</span><span style="color: black; font-family: "MS ゴシック";"> </span><span style="color: black; font-family: "MS ゴシック";">pgdg</span><span style="color: black; font-family: "MS ゴシック";">-</span><span style="color: black; font-family: "MS ゴシック";">centos10</span><span style="color: black; font-family: "MS ゴシック";">-10-</span><span style="color: black; font-family: "MS ゴシック";">2.noarch.rpm</span><span style="color: black; font-family: "MS ゴシック";">
</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">$ </span><span style="color: black; font-family: "MS ゴシック";">sudo</span><span style="color: black; font-family: "MS ゴシック";">
yum install </span><span style="color: black; font-family: "MS ゴシック";">postgresql10</span><span style="color: black; font-family: "MS ゴシック";"> </span><span style="color: black; font-family: "MS ゴシック";">postgresql10</span><span style="color: black; font-family: "MS ゴシック";">-server
</span><span style="color: black; font-family: "MS ゴシック";">postgresql10-contrib</span><span style="color: black; font-family: "MS ゴシック";"> </span><span style="color: black; font-family: "MS ゴシック";">postgresql10-devel</span><span style="color: black; font-family: "MS ゴシック";">
</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">$ </span><span style="color: black; font-family: "MS ゴシック";">sudo</span><span style="color: black; font-family: "MS ゴシック";">
vi /</span><span style="color: black; font-family: "MS ゴシック";">usr</span><span style="color: black; font-family: "MS ゴシック";">/lib/</span><span style="color: black; font-family: "MS ゴシック";">systemd</span><span style="color: black; font-family: "MS ゴシック";">/system/</span><span style="color: black; font-family: "MS ゴシック";">postgresql-10.service</span></span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">---起動スクリプトのパスを変更---</span><span style="color: black; font-family: "MS ゴシック";">
</span></span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";"># Location of
database directory</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";"># Environment=</span><span style="color: black; font-family: "MS ゴシック";">PGDATA</span><span style="color: black; font-family: "MS ゴシック";">=/</span><span style="color: black; font-family: "MS ゴシック";">var</span><span style="color: black; font-family: "MS ゴシック";">/lib/</span><span style="color: black; font-family: "MS ゴシック";">pgsql</span><span style="color: black; font-family: "MS ゴシック";">/10/data/</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">Environment=</span><span style="color: black; font-family: "MS ゴシック";">PGDATA</span><span style="color: black; font-family: "MS ゴシック";">=/home/</span><span style="color: black; font-family: "MS ゴシック";">postgres</span><span style="color: black; font-family: "MS ゴシック";">/data/</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">--</span><span style="color: black; font-family: "MS ゴシック";"> </span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">
</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">
</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">
</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">
</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">$ </span><span style="color: black; font-family: "MS ゴシック";">su</span><span style="color: black; font-family: "MS ゴシック";">
- </span><span style="color: black; font-family: "MS ゴシック";">postgres</span><span style="color: black; font-family: "MS ゴシック";">
</span></span></div>
<span style="font-size: xx-small;">
<span style="color: black; font-family: "MS ゴシック";">$
vi .</span><span style="color: black; font-family: "MS ゴシック";">bash_profile</span></span></div>
<div style="margin-bottom: 5px;">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">---ユーザーの環境変数を変更--<b>-</b></span></span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";"><b>
</b></span></span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">### edit for </span><span style="color: black; font-family: "MS ゴシック";">PostgreSQL10</span><span style="color: black; font-family: "MS ゴシック";">
</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">export </span><span style="color: black; font-family: "MS ゴシック";">PGDATA</span><span style="color: black; font-family: "MS ゴシック";">=/home/</span><span style="color: black; font-family: "MS ゴシック";">postgres</span><span style="color: black; font-family: "MS ゴシック";">/data</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">export PATH=/</span><span style="color: black; font-family: "MS ゴシック";">usr</span><span style="color: black; font-family: "MS ゴシック";">/</span><span style="color: black; font-family: "MS ゴシック";">pgsql</span><span style="color: black; font-family: "MS ゴシック";">-10/bin:.:$PATH</span></span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">---</span></span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<br /></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: small;"><span style="color: black; font-family: "MS ゴシック";">プライマリのデータベースを作成しておきます。</span></span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";"><br /></span></span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">$ </span><span style="color: black; font-family: "MS ゴシック";">sudo</span><span style="color: black; font-family: "MS ゴシック";">
</span><span style="color: black; font-family: "MS ゴシック";">systemctl</span><span style="color: black; font-family: "MS ゴシック";"> start </span><span style="color: black; font-family: "MS ゴシック";">postgresql-10.service</span><span style="color: black; font-family: "MS ゴシック";">
</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">$ </span><span style="color: black; font-family: "MS ゴシック";">sudo</span><span style="color: black; font-family: "MS ゴシック";">
</span><span style="color: black; font-family: "MS ゴシック";">systemctl</span><span style="color: black; font-family: "MS ゴシック";"> status </span><span style="color: black; font-family: "MS ゴシック";">postgresql-10.service</span><span style="color: black; font-family: "MS ゴシック";">
</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">$ </span><span style="color: black; font-family: "MS ゴシック";">su</span><span style="color: black; font-family: "MS ゴシック";">
– </span><span style="color: black; font-family: "MS ゴシック";">postgres</span><span style="color: black; font-family: "MS ゴシック";">
</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">$ createuser -d -r
-l -P demo</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">$ createdb -O demo
demodb</span></span></div>
</div>
<div style="margin-bottom: 5px;">
<span style="color: black; font-family: "MS ゴシック"; font-size: 10.0pt; language: en-US; mso-ascii-font-family: "MS ゴシック"; mso-bidi-font-family: +mn-cs; mso-color-index: 13; mso-fareast-font-family: "MS ゴシック"; mso-font-kerning: 12.0pt; text-combine: letters;">サンプルデータも入れておきましょう。</span></div>
<div style="margin-bottom: 5px;">
<span style="color: black; font-family: "MS ゴシック"; font-size: 10.0pt; language: en-US; mso-ascii-font-family: "MS ゴシック"; mso-bidi-font-family: +mn-cs; mso-color-index: 13; mso-fareast-font-family: "MS ゴシック"; mso-font-kerning: 12.0pt; text-combine: letters;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";"><br /></span><span style="color: black; font-family: "MS ゴシック";">
</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">$ </span><span style="color: black; font-family: "MS ゴシック";">psql</span><span style="color: black; font-family: "MS ゴシック";">
-U demo </span><span style="color: black; font-family: "MS ゴシック";">demodb</span><span style="color: black; font-family: "MS ゴシック";">
</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">demodb</span><span style="color: black; font-family: "MS ゴシック";">=>
create table sample (a </span><span style="color: black; font-family: "MS ゴシック";">int,b</span><span style="color: black; font-family: "MS ゴシック";"> text);</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">demodb</span><span style="color: black; font-family: "MS ゴシック";">=>
insert into sample values (</span><span style="color: black; font-family: "MS ゴシック";">1,'test1</span><span style="color: black; font-family: "MS ゴシック";">');</span></span></div>
<span style="color: black; font-family: "MS ゴシック"; font-size: 10.0pt; language: en-US; mso-ascii-font-family: "MS ゴシック"; mso-bidi-font-family: +mn-cs; mso-color-index: 13; mso-fareast-font-family: "MS ゴシック"; mso-font-kerning: 12.0pt; text-combine: letters;"> </span></div>
<div style="margin-bottom: 5px;">
<span style="color: black; font-family: "MS ゴシック"; font-size: 10.0pt; language: en-US; mso-ascii-font-family: "MS ゴシック"; mso-bidi-font-family: +mn-cs; mso-color-index: 13; mso-fareast-font-family: "MS ゴシック"; mso-font-kerning: 12.0pt; text-combine: letters;"></span></div>
<div style="margin-bottom: 5px;">
<b><span style="color: orange;"><span style="font-family: "MS ゴシック"; font-size: 10pt;">■ステップ1:プライマリ側の設定</span></span></b></div>
<div style="margin-bottom: 5px;">
<span style="color: black; font-family: "MS ゴシック"; font-size: 10.0pt; language: en-US; mso-ascii-font-family: "MS ゴシック"; mso-bidi-font-family: +mn-cs; mso-color-index: 13; mso-fareast-font-family: "MS ゴシック"; mso-font-kerning: 12.0pt; text-combine: letters;"></span></div>
<div style="margin-bottom: 5px;">
<span style="color: black; font-family: "MS ゴシック"; font-size: 10.0pt; language: en-US; mso-ascii-font-family: "MS ゴシック"; mso-bidi-font-family: +mn-cs; mso-color-index: 13; mso-fareast-font-family: "MS ゴシック"; mso-font-kerning: 12.0pt; text-combine: letters;">レプリケーション用のユーザーを作成し、ユーザーのアクセス制御をpg_hba.confに書きます。</span></div>
<div style="margin-bottom: 5px;">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">$ </span><span style="color: black; font-family: "MS ゴシック";">createuser</span><span style="color: black; font-family: "MS ゴシック";">
--replication </span><span style="color: black; font-family: "MS ゴシック";">rep_user</span><span style="color: black; font-family: "MS ゴシック";">
</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">$</span><span style="color: black; font-family: "MS ゴシック";">
vi $</span><span style="color: black; font-family: "MS ゴシック";">PGDATA</span><span style="color: black; font-family: "MS ゴシック";">/</span><span style="color: black; font-family: "MS ゴシック";">pg_hba.conf</span><span style="color: black; font-family: "MS ゴシック";">
</span></span></div>
<span style="font-size: xx-small;"> ----pg_hba.confを編集---</span></div>
<div style="margin-bottom: 5px;">
<span style="font-size: xx-small;">
</span><span style="font-size: xx-small;">
</span><table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; width: 764px;">
<colgroup><col style="mso-width-source: userset; width: 83pt;" width="111"></col>
<col style="mso-width-source: userset; width: 115pt;" width="153"></col>
<col style="mso-width-source: userset; width: 98pt;" width="131"></col>
<col style="mso-width-source: userset; width: 147pt;" width="195"></col>
<col style="mso-width-source: userset; width: 130pt;" width="173"></col>
</colgroup><tbody>
<tr height="20" style="height: 15.34pt; mso-height-source: userset;">
<td class="oa1" height="20" style="height: 15.34pt; width: 83pt;" width="111">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ; font-weight: bold;">TYPE</span><span style="font-family: メイリオ; font-weight: bold;">
</span></span></div>
</td>
<td class="oa1" style="width: 115pt;" width="153">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ; font-weight: bold;">DB</span><span style="font-family: メイリオ; font-weight: bold;">
</span></span></div>
</td>
<td class="oa1" style="width: 98pt;" width="131">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ; font-weight: bold;">USER</span><span style="font-family: メイリオ; font-weight: bold;">
</span></span></div>
</td>
<td class="oa1" style="width: 147pt;" width="195">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ; font-weight: bold;">CIDR</span><span style="font-family: メイリオ; font-weight: bold;">-ADDRESS</span><span style="font-family: メイリオ; font-weight: bold;">
</span></span></div>
</td>
<td class="oa1" style="width: 130pt;" width="173">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ; font-weight: bold;">METHOD</span><span style="font-family: メイリオ; font-weight: bold;">
</span></span></div>
</td>
</tr>
<tr height="25" style="height: 18.66pt;">
<td class="oa2" height="25" style="height: 18.66pt; width: 83pt;" width="111">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">host</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa2" style="width: 115pt;" width="153">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">replication</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa2" style="width: 98pt;" width="131">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">rep_user</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa2" style="width: 147pt;" width="195">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">192.168.10.0/24</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa2" style="width: 130pt;" width="173">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">trust</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
</tr>
<tr height="25" style="height: 18.66pt; mso-height-source: userset;">
<td class="oa3" height="25" style="height: 18.66pt; width: 83pt;" width="111">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">host</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa3" style="width: 115pt;" width="153">
<div style="direction: ltr; line-height: normal; margin: 0pt 0in; text-align: left; text-indent: 0in; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">all</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa3" style="width: 98pt;" width="131">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">rep_user</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa3" style="width: 147pt;" width="195">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">0.0.0.0/0</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa3" style="width: 130pt;" width="173">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">reject</span><span style="font-family: メイリオ;">
</span></span></div>
</td></tr>
</tbody></table>
<span style="font-size: xx-small;"> ---</span></div>
<div style="margin-bottom: 5px;">
このように、アクセス許可設定はもちろのこと、拒否設定もすると良いと思ってます。</div>
<div style="margin-bottom: 5px;">
</div>
<div style="margin-bottom: 5px;">
レプリケーション用のパラメータを修正します。ここがポイント。デフォルト値が変更になり、(最小ではパラメータ変更なしでも)レプリケーションできます。</div>
<div style="margin-bottom: 5px;">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">$</span><span style="color: black; font-family: "MS ゴシック";">
vi $</span><span style="color: black; font-family: "MS ゴシック";">PGDATA</span><span style="color: black; font-family: "MS ゴシック";">/</span><span style="color: black; font-family: "MS ゴシック";">postgresql.conf</span><span style="color: black; font-family: "MS ゴシック";">
</span></span></div>
<span style="font-size: xx-small;">
</span><table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; width: 800px;">
<colgroup><col style="mso-width-source: userset; width: 236pt;" width="315"></col>
<col style="mso-width-source: userset; width: 64pt;" width="85"></col>
<col style="mso-width-source: userset; width: 300pt;" width="400"></col>
</colgroup><tbody>
<tr height="20" style="height: 15.34pt; mso-height-source: userset;">
<td class="oa1" height="20" style="height: 15.34pt; width: 236pt;" width="315">
<br />
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<b><span style="font-size: xx-small;"><span style="font-family: メイリオ;">パラメータ</span><span style="font-family: メイリオ;">
</span></span></b></div>
</td>
<td class="oa1" style="width: 64pt;" width="85">
<br />
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<b><span style="font-size: xx-small;"><span style="font-family: メイリオ;">設定</span><span style="font-family: メイリオ;">
</span></span></b></div>
</td>
<td class="oa1" style="width: 300pt;" width="400">
<br />
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<b><span style="font-size: xx-small;"><span style="font-family: メイリオ;">説明</span><span style="font-family: メイリオ;">
</span></span></b></div>
</td>
</tr>
<tr height="25" style="height: 18.66pt;">
<td class="oa2" height="25" style="height: 18.66pt; width: 236pt;" width="315">
<br />
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">listen_addresses</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa2" style="width: 64pt;" width="85">
<br />
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">*</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa2" style="width: 300pt;" width="400">
<br />
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">(通常は</span><span style="font-family: メイリオ;">DB</span><span style="font-family: メイリオ;">作成後にほぼ必須で実施)</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
</tr>
<tr height="25" style="height: 18.66pt;">
<td class="oa3" height="25" style="height: 18.66pt; width: 236pt;" width="315">
<br />
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">wal_level</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa3" style="width: 64pt;" width="85">
<br />
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">replica</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa3" style="width: 300pt;" width="400">
<br />
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">レプリケーションに必要な</span><span style="font-family: メイリオ;">WAL</span><span style="font-family: メイリオ;">情報を生成</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
</tr>
<tr height="25" style="height: 18.66pt;">
<td class="oa4" height="25" style="height: 18.66pt; width: 236pt;" width="315">
<br />
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">max_wal_senders</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa4" style="width: 64pt;" width="85">
<br />
<div style="direction: ltr; line-height: normal; margin: 0pt 0in; text-align: left; text-indent: 0in; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">10</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa4" style="width: 300pt;" width="400">
<br />
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">起動可能な</span><span style="font-family: メイリオ;">wal</span><span style="font-family: メイリオ;"> sender</span><span style="font-family: メイリオ;">プロセスの上限</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
</tr>
<tr height="25" style="height: 18.66pt;">
<td class="oa3" height="25" style="height: 18.66pt; width: 236pt;" width="315">
<br />
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">max_replication_slots</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa3" style="width: 64pt;" width="85">
<br />
<div style="direction: ltr; line-height: normal; margin: 0pt 0in; text-align: left; text-indent: 0in; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">10</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa3" style="width: 300pt;" width="400">
<br />
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">作成可能なレプリケーションスロットの上限</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
</tr>
<tr height="25" style="height: 18.66pt;">
<td class="oa4" height="25" style="height: 18.66pt; width: 236pt;" width="315">
<br />
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">synchronous_standby_names</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa4" style="width: 64pt;" width="85">
<br />
<div style="direction: ltr; line-height: normal; margin: 0pt 0in; text-align: left; text-indent: 0in; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">任意</span></span></div>
</td>
<td class="oa4" style="width: 300pt;" width="400">
<br />
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">同期スタンバイの名前を指定</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
</tr>
<tr height="25" style="height: 18.66pt;">
<td class="oa3" height="25" style="height: 18.66pt; width: 236pt;" width="315">
<br />
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">synchronous_commit</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa3" style="width: 64pt;" width="85">
<br />
<div style="direction: ltr; line-height: normal; margin: 0pt 0in; text-align: left; text-indent: 0in; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">on</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa3" style="width: 300pt;" width="400">
<br />
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">同期レベルを指定</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
</tr>
<tr height="25" style="height: 18.66pt;">
<td class="oa5" height="25" style="height: 18.66pt; width: 236pt;" width="315">
<br />
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">hot_standby</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa5" style="width: 64pt;" width="85">
<br />
<div style="direction: ltr; line-height: normal; margin: 0pt 0in; text-align: left; text-indent: 0in; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">on</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa5" style="width: 300pt;" width="400">
<br />
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">自身がスタンバイの時に参照可能とする</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
</tr>
<tr height="25" style="height: 18.66pt; mso-height-source: userset;">
<td class="oa5" height="25" style="height: 18.66pt; width: 236pt;" width="315">
<br />
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">hot_standby_feedback</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa5" style="width: 64pt;" width="85">
<br />
<div style="direction: ltr; line-height: normal; margin: 0pt 0in; text-align: left; text-indent: 0in; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">on</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa5" style="width: 300pt;" width="400">
<br />
<div style="direction: ltr; line-height: normal; margin: 0pt 0in; text-align: left; text-indent: 0in; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">自身の情報をプライマリに送信</span></span></div>
</td>
</tr>
</tbody></table>
</div>
<div style="margin-bottom: 5px;">
</div>
<div style="margin-bottom: 5px;">
自分がスタンバイになったときのために、サンプルのrecovery.confを作成しておきます。</div>
<div style="margin-bottom: 5px;">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: x-small;"><span style="color: black; font-family: "MS ゴシック";">$</span><span style="color: black; font-family: "MS ゴシック";">
vi $</span><span style="color: black; font-family: "MS ゴシック";">PGDATA</span><span style="color: black; font-family: "MS ゴシック";">/</span><span style="color: black; font-family: "MS ゴシック";">recovery</span><span style="color: black; font-family: "MS ゴシック";">.conf.node1</span><span style="color: black; font-family: "MS ゴシック";">
</span></span></div>
<table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; width: 800px;">
<colgroup><col style="mso-width-source: userset; width: 236pt;" width="315"></col>
<col style="mso-width-source: userset; width: 64pt;" width="85"></col>
<col style="mso-width-source: userset; width: 300pt;" width="400"></col>
</colgroup><tbody>
<tr height="20" style="height: 15.34pt; mso-height-source: userset;">
<td class="oa1" height="20" style="height: 15.34pt; width: 236pt;" width="315">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ; font-weight: bold;">パラメータ</span><span style="font-family: メイリオ; font-weight: bold;">
</span></span></div>
</td>
<td class="oa1" style="width: 64pt;" width="85">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ; font-weight: bold;">設定</span><span style="font-family: メイリオ; font-weight: bold;">
</span></span></div>
</td>
<td class="oa1" style="width: 300pt;" width="400">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ; font-weight: bold;">説明</span><span style="font-family: メイリオ; font-weight: bold;">
</span></span></div>
</td>
</tr>
<tr height="25" style="height: 18.66pt;">
<td class="oa2" height="25" style="height: 18.66pt; width: 236pt;" width="315">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">standby_mode</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa2" style="width: 64pt;" width="85">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">on</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa2" style="width: 300pt;" width="400">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">起動時にスタンバイモードになる</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
</tr>
<tr height="25" style="height: 18.66pt;">
<td class="oa3" height="25" style="height: 18.66pt; width: 236pt;" width="315">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">primary_conninfo</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa3" colspan="2" style="width: 364pt;" width="485">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">プライマリへの接続情報</span><span style="font-family: メイリオ;">
</span></span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">
</span></span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">
</span></span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">
</span></span></div>
</td>
</tr>
<tr height="25" style="height: 18.66pt;">
<td class="oa5" height="25" style="height: 18.66pt; width: 236pt;" width="315">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">primary_slot_name</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa5" style="width: 64pt;" width="85">
<div style="direction: ltr; line-height: normal; margin: 0pt 0in; text-align: left; text-indent: 0in; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">slot2</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa5" style="width: 300pt;" width="400">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">プライマリのレプリケーションスロット名</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
</tr>
<tr height="25" style="height: 18.66pt; mso-height-source: userset;">
<td class="oa3" height="25" style="height: 18.66pt; width: 236pt;" width="315">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">recovery_target_timeline</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa3" style="width: 64pt;" width="85">
<div style="direction: ltr; line-height: normal; margin: 0pt 0in; text-align: left; text-indent: 0in; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">latest</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa3" style="width: 300pt;" width="400">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">最新のマスターに追従する設定</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
</tr>
</tbody></table>
</div>
<div style="margin-bottom: 5px;">
<span style="color: black; font-family: "MS ゴシック"; font-size: 10.0pt; language: en-US; mso-ascii-font-family: "MS ゴシック"; mso-bidi-font-family: +mn-cs; mso-color-index: 13; mso-fareast-font-family: "MS ゴシック"; mso-font-kerning: 12.0pt; text-combine: letters;"> </span></div>
<div style="margin-bottom: 5px;">
<span style="color: orange;"><b><span style="font-family: "MS ゴシック"; font-size: 10pt;">■ステップ2:スタンバイの作成</span></b></span></div>
<div style="margin-bottom: 5px;">
<span style="color: black; font-family: "MS ゴシック"; font-size: 10.0pt; language: en-US; mso-ascii-font-family: "MS ゴシック"; mso-bidi-font-family: +mn-cs; mso-color-index: 13; mso-fareast-font-family: "MS ゴシック"; mso-font-kerning: 12.0pt; text-combine: letters;"><br /></span></div>
<div style="margin-bottom: 5px;">
<span style="font-size: small;"><span style="color: black; font-family: "MS ゴシック";">スタンバイ側でpg_basebackupを使ってプライマリのバックアップを取得します。取得したデータはそのまま展開され、スタンバイのデータディレクトリになります。</span></span></div>
<div style="margin-bottom: 5px;">
<span style="color: black; font-family: "MS ゴシック"; font-size: 10.0pt; language: en-US; mso-ascii-font-family: "MS ゴシック"; mso-bidi-font-family: +mn-cs; mso-color-index: 13; mso-fareast-font-family: "MS ゴシック"; mso-font-kerning: 12.0pt; text-combine: letters;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">$ </span><span style="color: black; font-family: "MS ゴシック";">pg_basebackup</span><span style="color: black; font-family: "MS ゴシック";">
-U </span><span style="color: black; font-family: "MS ゴシック";">rep_user</span><span style="color: black; font-family: "MS ゴシック";"> -h <</span><span style="color: black; font-family: "MS ゴシック";">node1_ip</span><span style="color: black; font-family: "MS ゴシック";">>
-p 5432 -D /home/</span><span style="color: black; font-family: "MS ゴシック";">postgres</span><span style="color: black; font-family: "MS ゴシック";">/data</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">$ </span><span style="color: black; font-family: "MS ゴシック";">ls</span><span style="color: black; font-family: "MS ゴシック";">
-</span><span style="color: black; font-family: "MS ゴシック";">ltr</span><span style="color: black; font-family: "MS ゴシック";"> </span><span style="color: black; font-family: "MS ゴシック";">$</span><span style="color: black; font-family: "MS ゴシック";">PGDATA</span><span style="color: black; font-family: "MS ゴシック";">
</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">drwx</span><span style="color: black; font-family: "MS ゴシック";">------.
3 </span><span style="color: black; font-family: "MS ゴシック";">postgres</span><span style="color: black; font-family: "MS ゴシック";"> </span><span style="color: black; font-family: "MS ゴシック";">postgres</span><span style="color: black; font-family: "MS ゴシック";"><span> </span>60 Oct 28 15:44 </span><span style="color: black; font-family: "MS ゴシック";">pg_wal</span><span style="color: black; font-family: "MS ゴシック";">
</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">drwx</span><span style="color: black; font-family: "MS ゴシック";">------.
6 </span><span style="color: black; font-family: "MS ゴシック";">postgres</span><span style="color: black; font-family: "MS ゴシック";"> </span><span style="color: black; font-family: "MS ゴシック";">postgres</span><span style="color: black; font-family: "MS ゴシック";"><span> </span>54 Oct 28 15:44 base</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">drwx</span><span style="color: black; font-family: "MS ゴシック";">------.
2 </span><span style="color: black; font-family: "MS ゴシック";">postgres</span><span style="color: black; font-family: "MS ゴシック";"> </span><span style="color: black; font-family: "MS ゴシック";">postgres</span><span style="color: black; font-family: "MS ゴシック";"><span> </span>4096 Oct 28 15:44 global</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">drwx</span><span style="color: black; font-family: "MS ゴシック";">------.
2 </span><span style="color: black; font-family: "MS ゴシック";">postgres</span><span style="color: black; font-family: "MS ゴシック";"> </span><span style="color: black; font-family: "MS ゴシック";">postgres</span><span style="color: black; font-family: "MS ゴシック";"><span> </span>32 Oct 28 15:44 log</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">-</span><span style="color: black; font-family: "MS ゴシック";">rw</span><span style="color: black; font-family: "MS ゴシック";">-------.
1 </span><span style="color: black; font-family: "MS ゴシック";">postgres</span><span style="color: black; font-family: "MS ゴシック";"> </span><span style="color: black; font-family: "MS ゴシック";">postgres</span><span style="color: black; font-family: "MS ゴシック";">
22844 Oct 28 15:44 </span><span style="color: #4472c4; font-family: "MS ゴシック"; font-weight: bold;">postgresql.conf</span><span style="color: #4472c4; font-family: "MS ゴシック"; font-weight: bold;">
</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">-</span><span style="color: black; font-family: "MS ゴシック";">rw</span><span style="color: black; font-family: "MS ゴシック";">-------.
1 </span><span style="color: black; font-family: "MS ゴシック";">postgres</span><span style="color: black; font-family: "MS ゴシック";"> </span><span style="color: black; font-family: "MS ゴシック";">postgres</span><span style="color: black; font-family: "MS ゴシック";"><span> </span>88 Oct 28 15:44 </span><span style="color: black; font-family: "MS ゴシック";">postgresql.auto.conf</span><span style="color: black; font-family: "MS ゴシック";">
</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">-</span><span style="color: black; font-family: "MS ゴシック";">rw</span><span style="color: black; font-family: "MS ゴシック";">-</span><span style="color: black; font-family: "MS ゴシック";">rw</span><span style="color: black; font-family: "MS ゴシック";">-r--.
1 </span><span style="color: black; font-family: "MS ゴシック";">postgres</span><span style="color: black; font-family: "MS ゴシック";"> </span><span style="color: black; font-family: "MS ゴシック";">postgres</span><span style="color: black; font-family: "MS ゴシック";"><span> </span>169 Oct 28 15:44 </span><span style="color: #4472c4; font-family: "MS ゴシック"; font-weight: bold;">recovery.conf.node1</span><span style="color: #4472c4; font-family: "MS ゴシック"; font-weight: bold;">
</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">-</span><span style="color: black; font-family: "MS ゴシック";">rw</span><span style="color: black; font-family: "MS ゴシック";">-------.
1 </span><span style="color: black; font-family: "MS ゴシック";">postgres</span><span style="color: black; font-family: "MS ゴシック";"> </span><span style="color: black; font-family: "MS ゴシック";">postgres</span><span style="color: black; font-family: "MS ゴシック";"><span> </span>4760 Oct 28 15:44 </span><span style="color: #4472c4; font-family: "MS ゴシック"; font-weight: bold;">pg_hba.conf</span><span style="color: #4472c4; font-family: "MS ゴシック"; font-weight: bold;">
</span></span></div>
<span style="font-size: xx-small;"> :</span></div>
<div style="margin-bottom: 5px;">
<span style="font-size: x-small;"> </span></div>
<div style="margin-bottom: 5px;">
<span style="font-size: small;">スタンバイサーバーの設定もプライマリから取得したバックアップに含まれているのでほぼそのまま流用できます。変更すべき点は、recovery.confです。これはレプリケーション時にスタンバイがプライマリに接続しにいくための設定ですので、常にレプリケーションの相手ノードの情報が書いておくものだからです。</span></div>
<div style="margin-bottom: 5px;">
<span style="font-size: x-small;"> </span></div>
<div style="margin-bottom: 5px;">
<span style="font-size: x-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">$</span><span style="color: black; font-family: "MS ゴシック";">
cp $</span><span style="color: black; font-family: "MS ゴシック";">PGDATA</span><span style="color: black; font-family: "MS ゴシック";">/</span><span style="color: black; font-family: "MS ゴシック";">recovery.conf.node1</span><span style="color: black; font-family: "MS ゴシック";">
$</span><span style="color: black; font-family: "MS ゴシック";">PGDATA</span><span style="color: black; font-family: "MS ゴシック";">/</span><span style="color: black; font-family: "MS ゴシック";">recovery.conf.node2</span><span style="color: black; font-family: "MS ゴシック";">
</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">$ vi $</span><span style="color: black; font-family: "MS ゴシック";">PGDATA</span><span style="color: black; font-family: "MS ゴシック";">/</span><span style="color: black; font-family: "MS ゴシック";">recovery.conf.node2</span><span style="color: black; font-family: "MS ゴシック";"> </span></span></div>
<div style="direction: ltr; language: ja; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; mso-line-break-override: none; punctuation-wrap: hanging; text-align: left; unicode-bidi: embed; word-break: normal;">
<br /></div>
<div style="direction: ltr; language: ja; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; mso-line-break-override: none; punctuation-wrap: hanging; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="color: black; font-family: "MS ゴシック"; font-size: 14.0pt; language: en-US; mso-ascii-font-family: "MS ゴシック"; mso-bidi-font-family: +mn-cs; mso-color-index: 13; mso-fareast-font-family: "MS ゴシック"; mso-font-kerning: 12.0pt; text-combine: letters;">
</span></div>
<table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; width: 800px;">
<colgroup><col style="mso-width-source: userset; width: 236pt;" width="315"></col>
<col style="mso-width-source: userset; width: 64pt;" width="85"></col>
<col style="mso-width-source: userset; width: 300pt;" width="400"></col>
</colgroup><tbody>
<tr height="25" style="height: 18.66pt; mso-height-source: userset;">
<td class="oa1" height="25" style="height: 18.66pt; width: 236pt;" width="315">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">primary_conninfo</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa1" colspan="2" style="width: 364pt;" width="485">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">プライマリへの接続情報</span><span style="font-family: メイリオ;">
</span></span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">
</span></span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">
</span></span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">
</span></span></div>
</td>
</tr>
<tr height="25" style="height: 18.66pt; mso-height-source: userset;">
<td class="oa3" height="25" style="height: 18.66pt; width: 236pt;" width="315">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">primary_slot_name</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa3" style="width: 64pt;" width="85">
<div style="direction: ltr; line-height: normal; margin: 0pt 0in; text-align: left; text-indent: 0in; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">slot1</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
<td class="oa3" style="width: 300pt;" width="400">
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="font-family: メイリオ;">プライマリのレプリケーションスロット名</span><span style="font-family: メイリオ;">
</span></span></div>
</td>
</tr>
</tbody></table>
</div>
<div style="margin-bottom: 5px;">
<span style="font-size: small;">この2行をプライマリへの接続情報に変更します。</span></div>
<div style="margin-bottom: 5px;">
<b> </b></div>
<div style="margin-bottom: 5px;">
<span style="color: orange;"><b>■ステップ3:スタンバイを起動</b></span></div>
<div style="margin-bottom: 5px;">
<span style="font-size: small;">レプリケーションスロットを使う場合、スタンバイ起動時に、必ずレプリケーションスロットを作成、または状態を確認するようにします。(レプリケーションスロットで運用する場合。)</span></div>
<div style="margin-bottom: 5px;">
<span style="font-size: small;"> recovery.confに書いた<span style="font-family: メイリオ;"> primary_slot_name がまさにそのための設定で、ここで指定したスロットがマスター側に存在しないとレプリケーションできません。</span></span></div>
<div style="margin-bottom: 5px;">
<span style="font-size: small;"><span style="font-family: メイリオ;"> </span></span></div>
<div style="margin-bottom: 5px;">
<span style="font-size: small;"><span style="font-family: メイリオ;"><b>プライマリで</b>レプリケーションスロットを作成します。</span></span></div>
<div style="margin-bottom: 5px;">
<span style="font-size: x-small;"><span style="font-family: メイリオ;">
</span></span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">$</span><span style="color: black; font-family: "MS ゴシック";">
</span><span style="color: black; font-family: "MS ゴシック";">su</span><span style="color: black; font-family: "MS ゴシック";"> - </span><span style="color: black; font-family: "MS ゴシック";">postgres</span><span style="color: black; font-family: "MS ゴシック";">
</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">$ </span><span style="color: black; font-family: "MS ゴシック";">psql</span><span style="color: black; font-family: "MS ゴシック";">
-h</span><span style="color: black; font-family: "MS ゴシック";"> </span><span style="color: black; font-family: "MS ゴシック";"><</span><span style="color: black; font-family: "MS ゴシック";">node1_ip</span><span style="color: black; font-family: "MS ゴシック";">>
-</span><span style="color: black; font-family: "MS ゴシック";">U </span><span style="color: black; font-family: "MS ゴシック";">postgres</span><span style="color: black; font-family: "MS ゴシック";"> </span><span style="color: black; font-family: "MS ゴシック";">postgres</span><span style="color: black; font-family: "MS ゴシック";">
</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">postgres</span><span style="color: black; font-family: "MS ゴシック";">=#
select </span><span style="color: black; font-family: "MS ゴシック";">pg_create_physical_replication_slot</span><span style="color: black; font-family: "MS ゴシック";">('</span><span style="color: black; font-family: "MS ゴシック";">slot1</span><span style="color: black; font-family: "MS ゴシック";">');</span></span></div>
<span style="font-size: small;">
<span style="font-family: メイリオ;"> </span></span></div>
<div style="margin-bottom: 5px;">
<span style="font-size: small;"><span style="font-family: メイリオ;"><b>スタンバイで</b>データベースを起動します。</span></span></div>
<div style="margin-bottom: 5px;">
<span style="font-size: x-small;"><span style="font-family: メイリオ;">
</span></span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">$</span><span style="color: black; font-family: "MS ゴシック";">
</span><span style="color: black; font-family: "MS ゴシック";">sudo</span><span style="color: black; font-family: "MS ゴシック";"> </span><span style="color: black; font-family: "MS ゴシック";">systemctl</span><span style="color: black; font-family: "MS ゴシック";">
start </span><span style="color: black; font-family: "MS ゴシック";">postgresql-10.service</span><span style="color: black; font-family: "MS ゴシック";">
</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">$ </span><span style="color: black; font-family: "MS ゴシック";">su</span><span style="color: black; font-family: "MS ゴシック";">
- </span><span style="color: black; font-family: "MS ゴシック";">postgres</span><span style="color: black; font-family: "MS ゴシック";">
</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">$ </span><span style="color: black; font-family: "MS ゴシック";">ps</span><span style="color: black; font-family: "MS ゴシック";">
x</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">11089 ?<span> </span>Ss<span>
</span>0:00 /</span><span style="color: black; font-family: "MS ゴシック";">usr</span><span style="color: black; font-family: "MS ゴシック";">/</span><span style="color: black; font-family: "MS ゴシック";">pgsql</span><span style="color: black; font-family: "MS ゴシック";">-10/bin/postmaster -D /home/</span><span style="color: black; font-family: "MS ゴシック";">postgres</span><span style="color: black; font-family: "MS ゴシック";">/data/</span><span style="color: black; font-family: "MS ゴシック";">
</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">11093 ?<span> </span>Ss<span>
</span>0:00 </span><span style="color: black; font-family: "MS ゴシック";">postgres</span><span style="color: black; font-family: "MS ゴシック";">: startup process<span> </span>recovering 000000010000000000000005</span><span style="color: black; font-family: "MS ゴシック";">
</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";">11097 ?<span> </span>Ss<span>
</span>0:00 </span><span style="color: black; font-family: "MS ゴシック";">postgres</span><span style="color: black; font-family: "MS ゴシック";">: </span><span style="color: black; font-family: "MS ゴシック";">wal</span><span style="color: black; font-family: "MS ゴシック";">
receiver process<span> </span>streaming 0/5000140</span></span></div>
<span style="font-size: xx-small;">
</span><div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 0pt; text-align: left; unicode-bidi: embed; word-break: normal;">
<span style="font-size: xx-small;"><span style="color: black; font-family: "MS ゴシック";"><span> </span>:</span></span></div>
<span style="font-size: x-small;">
<span style="font-family: メイリオ;"></span><span style="font-family: メイリオ;"></span></span></div>
<div style="margin-bottom: 5px;">
<span style="font-size: small;"><span style="font-family: メイリオ;">ほら、レプリケーションできました<span style="font-family: sans-serif;">!</span></span></span></div>
<div style="margin-bottom: 5px;">
<span style="font-size: small;"><span style="font-family: メイリオ;"> </span></span></div>
<div style="margin-bottom: 5px;">
<span style="font-size: small;"><span style="font-family: メイリオ;">今回は、AWSでたぶん一番簡単にPostgreSQLをインストールするところから、レプリケーションができるまでをコピペして使えるそのままのコマンドで紹介しました。</span></span></div>
<div style="margin-bottom: 5px;">
<span style="font-size: small;"><span style="font-family: メイリオ;">(書式がぐっちゃぐちゃで申し訳なさすぎます。見栄えはあとでコソッと変更します。)</span></span></div>
<div style="margin-bottom: 5px;">
<span style="font-size: small;"><span style="font-family: メイリオ;"><br /></span></span></div>
<div style="margin-bottom: 5px;">
<span style="font-size: small;"><span style="font-family: メイリオ;">明日は、</span><span style="font-family: メイリオ;"><a href="https://qiita.com/Morihaya">Morihaya</a>さんが担当してくださいます。</span></span></div>
<div style="margin-bottom: 5px;">
<span style="font-size: x-small;"><span style="font-family: メイリオ;"><br /></span></span></div>
Anonymoushttp://www.blogger.com/profile/02234679274621415851noreply@blogger.com0tag:blogger.com,1999:blog-1760199393479360913.post-86231217413708339912017-10-24T18:21:00.000+09:002017-10-24T19:51:13.512+09:00PostgreSQLでサンプルデータを生成するPostgreSQLカンファレンスのチュートリアルトラックに向けて準備して(後輩のお世話、というか半強制的に「やります!」と言わせたセッションなので手を差し伸べて)るんだけど、インデックスチューニングの話をするのに美しくランダムなデータが欲しいわけじゃん。<br />
<br />
というわけで、Let's PostgreSQLの記事を参考にいろんな型のサンプルデータを作るSQLを作成した。<br />
<br />
<br />
<pre class="console">
SELECT * FROM
(SELECT i
,(random()*1000)::int%80 num_sample
,(now()-(random()*1000)::int%365*interval'1day')::date date_sample
,(now()-(random()*1000000000)::int*interval'1microseconds')::timestamp ts_sample
,lpad(string_agg(str1,''),8) text_sample1
,lpad(string_agg(str2,''),4) text_sample2
,string_agg(str3, '') mbyte_sample
FROM ( SELECT
i,
chr(97+(random() * 1000)::int % 26 ) as str1,
chr(97+(random() * 10)::int % 3 ) as str2,
chr(12354+(random() * 1000)::int % 85 ) as str3
FROM generate_series(1,20) length
,generate_series(1,1000) num(i)
)t
GROUP BY i) datagen
;
</pre>Anonymoushttp://www.blogger.com/profile/02234679274621415851noreply@blogger.com0tag:blogger.com,1999:blog-1760199393479360913.post-23592877283066996832016-12-20T19:46:00.001+09:002016-12-22T19:53:13.722+09:00PostgreSQL 9.6 パラレルクエリに関する小ネタよく考えたら当たり前なんだけど、いざ気付くと「えーっ!」となった衝撃的な話。<br />
<h4>
「パラレルクエリは、<span style="color: red;">マテリアライズド・ビューのリフレッシュに使えない</span>」疑惑</h4>
パラレルクエリの制限事項って結構あるんですね。そのうちの1つを9.6.1時点のマニュアルから抜粋すると<span style="color: #666666;"> </span><br />
<br />
<blockquote class="tr_bq">
<span style="color: #666666;">クエリがデータを書き込むか、データベースの行をロックする場合。
クエリがデータ更新操作をトップレベルあるいはCTE内で含むと、そのクエリに対するパラレルプランは生成されません。
これは現在の実装の制限で、将来のリリースでは解除される可能性があります。 </span></blockquote>
<br />
要はDMLはダメと言っているように見える。じゃあマテビュー作るのもダメじゃね?という当然の話ではあるのですが。夜間に巨大なテーブルの加工や集計(そんな処理を数十分とか、数時間かけて)した結果をマテビューにして、なんとか日中はサクサク動くように頑張るわけじゃないですか。<br />
で、パラレルクエリが入ったときに、「くそ重いロックをとるマテビューのリフレッシュが、2時間かかってたやつが1分になったら(キラキラ)」などと夢をいだいたものです。ところがそれが現状のパラレルクエリでは何も変わらないのです。がびーん。<br />
<br />
そんなわけで、実際に試してみることにします。 わざわざ実行計画を見るのは<strike>めんどい</strike>マテビューでは内部で実行されたクエリの実行計画は覆い隠されてしまうので、単に所要時間で(psqlの\timingで)パラったか判断します。<br />
<br />
今回使う表(今回、表の中身は重要ではない。件数と所要時間だけ注目)<br />
<pre class="console">demo=# \timing
demo=# SELECT count(*) FROM tab1;
count
----------
28864000
(1 行)
時間: 669.988 ms --- パラレルの時は1秒以下、非パラレルだと4秒強かかることを確認済み。
/* 実行計画はこんな感じ */
demo=# EXPLAIN ANALYZE
demo-# SELECT count(*) FROM tab1;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------
Finalize Aggregate (cost=333435.96..333435.97 rows=1 width=8) (actual time=1015.604..1015.604 rows=1 loops=1)
-> Gather (cost=333435.33..333435.94 rows=6 width=8) (actual time=1015.510..1015.594 rows=7 loops=1)
Workers Planned: 6
Workers Launched: 6
-> Partial Aggregate (cost=332435.33..332435.34 rows=1 width=8) (actual time=1008.983..1008.983 rows=1 loops=7)
-> Parallel Seq Scan on tab1 (cost=0.00..320408.67 rows=4810667 width=0) (actual time=0.043..622.811 rows=4123429 loops=7)
Planning time: 0.126 ms
Execution time: 1017.730 ms
/* テーブルサイズはこれぐらい */
demo=# SELECT pg_size_pretty(pg_relation_size('tab1'));
pg_size_pretty
----------------
2127 MB
</pre>
<br />
<h3>
<span style="color: #3d85c6;">マテリアライズド・ビューを作成してリフレッシュ</span></h3>
<pre class="command">demo=# CREATE MATERIALIZED VIEW mv1 AS
demo-# SELECT count(*) FROM tab1;
SELECT 1
時間: 4510.077 ms --- む、この時間は・・・。
demo=# REFRESH MATERIALIZED VIEW mv1;
REFRESH MATERIALIZED VIEW
時間: 4451.020 ms --- む、この時間は・・・。
</pre>
うーん、パラられない。残念でならない!<br />
というわけで、何かそれに代わる策がないか試してみます。<br />
<br />
<h3>
<span style="color: #3d85c6;">VIEWの場合 </span></h3>
<pre class="command">demo=# CREATE VIEW v2 AS
SELECT count(*) FROM tab1;
CREATE VIEW
時間: 2.151 ms
demo=# SELECT * FROM v2;
count
----------
28864000
(1 行)
時間: 682.303 ms --- viewならOKだよねうん。
</pre>
まあ、これは大丈夫か。SELECTだけだし。でも結果を保存して再利用できない。<br />
<br />
<h3>
<span style="color: #3d85c6;">普通の表をつくってINSERT SEELCT</span></h3>
<pre class="command">demo=# CREATE TABLE t3 (count numeric);
CREATE TABLE
demo=# INSERT INTO t3
demo-# SELECT count(*) FROM tab1;
INSERT 0 1
時間: 4506.088 ms --- だめ
</pre>
だめ。デスヨネー。<br />
<br />
<h3>
<span style="color: #3d85c6;">外部テーブルを介してMビュー。</span></h3>
外部テーブルで問合せた先は、リモートのサーバー側でよしなに実行計画を作ってくれるはずなので淡い期待を込めてやってみるが・・・<br />
<pre class="command">demo=# CREATE SERVER loopback FOREIGN DATA WRAPPER postgres_fdw
demo-# OPTIONS (dbname 'demo',host 'localhost',port '5432'); -- 自分自身を見に行くFDW
CREATE SERVER
時間: 1.331 ms
demo=# CREATE USER MAPPING FOR public SERVER loopback
demo-# OPTIONS (user 'postgres',password 'postgres');
CREATE USER MAPPING
時間: 0.914 ms
demo=# IMPORT FOREIGN SCHEMA public LIMIT TO (tab1)
demo-# FROM SERVER loopback
demo-# INTO loopback;
IMPORT FOREIGN SCHEMA
時間: 7.039 ms
demo=# EXPLAIN ANALYZE
demo-# SELECT * FROM loopback.tab1 WHERE sales_id = 0; -- 一応ループバックしてFOREIGN SCANしてることを確認
QUERY PLAN
----------------------------------------------------------------------------------------------------------------
Foreign Scan on tab1 (cost=100.00..117.59 rows=3 width=112) (actual time=396.211..4527.848 rows=1152 loops=1)
Planning time: 0.286 ms
Execution time: 4528.583 ms
(3 行)
時間: 4529.705 ms
demo=# CREATE MATERIALIZED VIEW mv2 AS
demo-# SELECT count(*) FROM loopback.tab1;
SELECT 1
時間: 71687.426 ms ---パラレルかどうかよりaggrigate push downが効いてないせいかな。
demo=# REFRESH MATERIALIZED VIEW mv2;
REFRESH MATERIALIZED VIEW
時間: 68418.958 ms
</pre>
ダメ。むしろダメ。Aggrigateのpush downはまだ実装されてないんだった。全件もってきて集計してるんだとしたら、仮にリモートでパラレルで動いてくれても、ネットワークが重すぎる。<br />
<br />
<br />
<h3>
<span style="color: #3d85c6;">\copy と COPY</span></h3>
<pre class="command">demo=# \copy (SELECT count(*) FROM tab1) TO demo.copy;
COPY 1
時間: 4518.860 ms --ダメ
demo=# COPY (SELECT count(*) FROM tab1) TO '/home/enterprisedb/demo.copy';
COPY 1
時間: 4524.612 ms --ダメ
</pre>
だめ。うーん、これぐらいはイケると思ったんだが。<br />
<br />
<h3>
<span style="color: #3d85c6;">\oでファイルに出力</span></h3>
<pre class="command" style="background: #FFCCFF;">demo=# \o demo2.copy
demo=# SELECT count(*) FROM tab1; -- OK
時間: 699.871 ms
</pre>
OK!うれしい!<br />
<br />
<h3>
<span style="color: #3d85c6;">psqlの引数としてクエリを投げ、結果をファイルに出力</span></h3>
<pre class="command" style="background: #FFCCFF;">[postgres@demo ~]$ time psql -U postgres demo -At -c 'SELECT count(*) FROM tab1' -o demo3.copy
real 0m0.725s -- OK
user 0m0.003s
sys 0m0.009s
[postgres@demo ~]$ psql -U postgres demo -At -c "COPY t3 FROM '/home/enterprisedb/demo3.copy'"
-- これで格納もできる。(t3は上部検証で作成したやつ)
-- もちろん、集計ずみの1行だけ格納するので一瞬で終わる。
</pre>
OK!うれしい!これだ感!これができればシェルとかプログラムで簡単にマテビューチックなことができる、はず。<br />
<br />Anonymoushttp://www.blogger.com/profile/02234679274621415851noreply@blogger.com0tag:blogger.com,1999:blog-1760199393479360913.post-52204507481728414712016-12-16T03:20:00.001+09:002016-12-16T03:41:13.956+09:00PostgreSQL 9.6のパラレルが間違う件!本投稿は、<a href="http://qiita.com/advent-calendar/2016/postgresql" target="_blank">PostgreSQL Advent Calendar 2016</a> の 12/16 担当です。<br />
昨日は「<a href="https://creativeweb.jp/archive/20161215" target="_blank">.NET Core で PostgreSQL を使ってみたら結構いけていたという話</a>」を <a href="https://twitter.com/creativewebjp" target="_blank">@creativewebjp</a> さんが書いてくださいました。<br />
<h2>
<br /></h2>
<h2>
<span style="color: orange;">■パラレルクエリと戯れて</span></h2>
<br />
さて、Ver9.6の登場までポスグレ界の話題を総ざらいしていた<a href="https://www.postgresql.jp/document/9.6/html/parallel-query.html" target="_blank">パラレルクエリ</a>ですが、みなさん使ってますか?<br />
大量データの領域で真価を発揮するものあって、なかなか現実的なサイズで試せていないのが現状で、採用に二の足を踏んでしまう、なんて話もちらほら聞いています。私は仕事で<a href="http://www.enterprisedb.com/" target="_blank">EnterpriseDB</a>社が開発するPostgreSQLの商用版、<a href="https://www.ashisuto.co.jp/product/category/database/postgresql/" target="_blank">EDB Postgres</a>を担当していますが、そのβテストを兼ねてOSS版PostgreSQLのパラレル動作をみていたのですが、やはり試してみてわかることが結構ありました。<br />
採用するかどうか迷っている方がいたら、とっかかりは非常に簡単なので、是非トライして、自身のアプリケーションでどの程度使えるかを評価してみるべきだと思います。バッチリとハマったときの効果は抜群ですよ。<br />
<br />
とは言え、良いときの性能評価はそこそこ出回っていると思うので、今回は、案外うまくいかないパラレルクエリの話を紹介します。<br />
<br />
<br />
<h2>
<span style="color: orange;">■いろいろ検証して得られた「間違うケース」</span></h2>
<br />
<h3>
<span style="color: #3d85c6;">間違うケース1 でかい表同士をJOINするとき</span></h3>
<br />
前提知識として、PostgreSQLのパラレル・クエリは、表のサイズで並列度が決定されます。<br />
適当な例で言うなら、10GBの表は8並列、500MBの表は4並列ぐらいで動きます。<br />
んまあ、これはあくまでも単一の表をFROM句に書いてSELECTした場合に、これぐらいの並列度が良さそうと判断されたにすぎないです。<br />
10GBを<b> </b><br />
<blockquote class="tr_bq">
1プロセスで読むコスト > 8プロセスで分担して、後でGather(集約)するコスト</blockquote>
と判断したので、そういう実行計画が選択されるということですね。<br />
<br />
これが、JOINの場合はどうやら変わってくるようです。<br />
2つの表をパラレルで読んで、Gatherするとなると、 そのオーバーヘッドの方が大きくなってしまって、せっかくパラレルにしたのに所要時間はむしろ長くなってしまいます。<br />
<br />
どちらもパラレルが効くぐらい大きい表なので、適切にパラレル処理して欲しいところではありますが、単純に表のサイズだけでは決められず、どちらか一方だけパラレルに動いてくれた方が良い結果になるのです。もちろんそういう目論見で、プランナはどちらか一方の表をパラレルで読もうとします。<br />
問題は、PostgreSQLだと「どちらの表をパラレルで処理するか?」の調整が非常に難しいこと。約10GBのlineoder表と、約500MBのpart表をごく単純に結合してみると、このような実行計画になりました。<br />
<pre class="console">
/* 実行したクエリ(ごく単純なJOIN) */
EXPLAIN ANALYZE
SELECT lo_partkey,sum(lo_quantity)
FROM lineorder
JOIN part
ON lo_partkey = p_partkey
WHERE p_name LIKE 'k%'
GROUP BY lo_partkey;
</pre>
<pre class="command">
/* いかにもパラレルが効きそうなlineorderが普通にSeqScanされてる */
-> Hash Join (cost=28661.34..3682122.56 rows=1111820 width=9)
(actual time=67.061..57496.965 rows=1286337 loops=1)
-> Seq Scan on lineorder (cost=0.00..3214594.56 rows=114066256 width=9)
★(actual time=0.010..27750.208 rows=114066226 loops=1)
-> Hash (cost=28490.76..28490.76 rows=13646 width=4)
(actual time=66.904..66.904 rows=15731 loops=1)
Buckets: 16384 Batches: 1 Memory Usage: 682kB
-> Gather (cost=1000.00..28490.76 rows=13646 width=4)
(actual time=0.342..61.640 rows=15731 loops=1)
Workers Planned: 3
Workers Launched: 3
-> Parallel Seq Scan on part (cost=0.00..26126.16 rows=4402 width=4)
★(actual time=0.029..59.519 rows=3933 loops=4)
Filter: ((p_name)::text ~~ 'k%'::text)
Rows Removed by Filter: 346067
</pre>
<br />
今回のケースでは、どうしても小さい方の表をパラレルにしたがる(先に読むからだろうか?)で、大きい方の表をシーケンシャルに読んでしまいました。<br />
<br />
効果は未確認ですが、解決策としては、ALTER TABLEでそのテーブルを読むときに使うワーカーの数を指定できるので、それでpartテーブルの方は0に固定してしまうことでしょうか。<br />
ただし、「こっちクエリではpart表をパラレルに読んでほしいんだよね~」という要望に応えるのが難しくなります。<br />
<br />
<br />
そこでEDB Postgresです。EDB Postgresでは、オプティマイザ・ヒントを指定でき、2017年1月にリリース予定のEDB 9.6ではパラレル・ヒントに対応します。そこで実行計画をいじくるとこんな感じです。<br />
<br />
<pre class="console">
/* EDB版の実行したクエリ(パラレル・ヒントで各表の並列度を指定) */
EXPLAIN ANALYZE
SELECT /*+ PARALLEL(part 0) PARALLEL(lineorder 4) */ lo_partkey,sum(lo_quantity)
FROM lineorder
JOIN part
ON lo_partkey = p_partkey
WHERE p_name LIKE 'k%'
GROUP BY lo_partkey;
</pre>
<pre class="command" style=background:#FFBF00>
/* スキャンの並列度が変わり、Hash Joinまでパラレル実行している */
HashAggregate (cost=2624706.98..2636997.29 rows=983225 width=36)
(actual time=17414.085..17421.061 rows=11272 loops=1)
Group Key: lineorder.lo_partkey
-> Gather (cost=39151.57..2619147.88 rows=1111820 width=9)
(actual time=181.809..16260.314 rows=1286337 loops=1)
Workers Planned: 4
Workers Launched: 4
-> Hash Join (cost=38151.57..2506965.88 rows=1111820 width=9)
☆(actual time=233.851..16886.113 rows=257267 loops=5)
Hash Cond: (lineorder.lo_partkey = part.p_partkey)
-> Parallel Seq Scan on lineorder (cost=0.00..2359097.64 rows=28516564 width=9)
★(actual time=0.034..8187.008 rows=22813245 loops=5)
-> Hash (cost=37981.00..37981.00 rows=13646 width=4)
(actual time=233.525..233.525 rows=15731 loops=5)
Buckets: 16384 Batches: 1 Memory Usage: 682kB
-> Seq Scan on part (cost=0.00..37981.00 rows=13646 width=4)
★(actual time=0.026..225.321 rows=15731 loops=5)
</pre>
<br />狙った表をパラレルスキャンさせることで、PostgreSQLで生じていた問題をバッチリ解決することができました。<br />
<br />
<br />
<h3>
<span style="color: #3d85c6;">間違うケース2 Window関数なのか、ソートなのか。原因不明(ヲイ!)</span></h3>
<br />
PostgreSQLでは、Windows関数つかって、それでないと1クエリで得ることがなかなか難しい複雑な集計を任せることができます。<br />
とは言えその複雑さはなかなかなもので、さぞかしプランナは頭を悩ませることでしょう。<br />
<br />
以前に本ブログで書いた「<a href="http://kkida-galaxy.blogspot.jp/2016/09/schoo-postgres1.html" target="_blank">PostgreSQLらしい集計クエリ</a>」で紹介しているテーブルで、データを何重にもいれまくって、2GBぐらいの表を用意しました。それを集計してみます。<br />
<br />
<pre class="console">
/* window関数 */
EXPLAIN ANALYZE
SELECT *,
rank() OVER (PARTITION BY "ブランド" ORDER BY "売上" DESC) AS "順位"
FROM (
SELECT
sales_date::date as "売上日"
,shop as "ブランド"
,sum(price) as "売上"
FROM tab1
GROUP BY "売上日","ブランド") AS "集計";
/* 結果イメージ。ブランド毎に売上の多かった日ランキング */
売上日 | ブランド | 売上 | 順位
------------+------------+-----------+------
2016-05-11 | DIESEL | 632141504 | 1
2016-07-31 | DIESEL | 622096896 | 2
2016-11-29 | DIESEL | 620818688 | 3
:
2016-04-06 | Dior | 962435003 | 1
2016-03-23 | Dior | 889015872 | 2
:
</pre>
<pre class="command">
/* この時の実行計画がこちら。パラレルになってる。約9秒。 */
WindowAgg (cost=3430456.39..3454473.19 rows=1200840 width=52) (actual time=9776.175..9777.199 rows=1095 loops=1)
-> Sort (cost=3430456.39..3433458.49 rows=1200840 width=44) (actual time=9776.165..9776.300 rows=1095 loops=1)
Sort Key: "集計"."ブランド", "集計"."売上" DESC
Sort Method: quicksort Memory: 134kB
-> Subquery Scan on "集計" (cost=3115228.89..3235312.89 rows=1200840 width=44)
(actual time=9764.055..9773.283 rows=1095 loops=1)
-> Finalize GroupAggregate (cost=3115228.89..3223304.49 rows=1200840 width=44)
(actual time=9764.054..9773.062 rows=1095 loops=1)
Group Key: ((tab1.sales_date)::date), tab1.shop
-> Sort (cost=3115228.89..3133241.49 rows=7205040 width=44)
(actual time=9764.012..9765.509 rows=7665 loops=1)
Sort Key: ((tab1.sales_date)::date), tab1.shop
Sort Method: quicksort Memory: 1270kB
-> Gather (cost=1064650.75..1851272.12 rows=7205040 width=44)
(actual time=6412.121..9757.054 rows=7665 loops=1)
Workers Planned: 6
Workers Launched: 6
-> Partial GroupAggregate (cost=1063650.75..1129768.12 rows=1200840 width=44)
(actual time=6518.572..9655.286 rows=1095 loops=7)
Group Key: ((tab1.sales_date)::date), tab1.shop
-> Sort (cost=1063650.75..1075676.95 rows=4810477 width=19)
(actual time=6516.858..8298.955 rows=4123429 loops=7)
Sort Key: ((tab1.sales_date)::date), tab1.shop
☆Sort Method: external merge Disk: 125680kB
-> Parallel Seq Scan on tab1 (cost=0.00..332432.96 rows=4810477 width=19)
★(actual time=0.071..1195.131 rows=4123429loops=7)
</pre>
<br />
お、パラレルになった。<br />
しかし、これ、Disk Sortになっていますね。メモリソートになればもっと早くなるんじゃ。SET work_mem to '2GB' などとして再実行<br />
<br />
あれ?
<pre class="command">
/* 実行計画がこちら。メモリソートになったらなぜか非パラレルに。約20秒かかっている。 */
WindowAgg (cost=1000838.70..1024855.50 rows=1200840 width=52) (actual time=21083.366..21084.609 rows=1095 loops=1)
-> Sort (cost=1000838.70..1003840.80 rows=1200840 width=44) (actual time=21083.347..21083.521 rows=1095 loops=1)
Sort Key: "集計"."ブランド", "集計"."売上" DESC
Sort Method: quicksort Memory: 134kB
-> Subquery Scan on "集計" (cost=849559.20..879580.20 rows=1200840 width=44)
(actual time=21075.482..21080.224 rows=1095 loops=1)
-> HashAggregate (cost=849559.20..867571.80 rows=1200840 width=44)
(actual time=21075.480..21080.024 rows=1095 loops=1)
Group Key: (tab1.sales_date)::date, tab1.shop
-> Seq Scan on tab1 (cost=0.00..633087.75 rows=28862860 width=19)
★(actual time=0.064..7888.289 rows=28864000 loops=1)
Planning time: 0.234 ms
Execution time: 21097.712 ms
</pre>
なんと、ソートが軽量に済むやいなや、パラレル動くことをやめちゃいました。なんてこった。ディスクソートしていたときのほうが圧倒的に早いので、このケースこそプランナが間違えてるとしか思えません。<br />
<br />
しかもこれ、上記のJOINのケースのように<b><span style="color: red;">パラレルさせない</span></b>という選択ではなく、<b><span style="color: red;">パラレルして欲しい</span></b>方向なので、これ以上PostgreSQLでは調整のやりようがないです。困った。<br />
<br />
<br />
そんなときはEDB Postgres<br />
ヒントを使って・・・・<br />
<pre class="console">
EXPLAIN ANALYZE
SELECT /*+ PARALLEL(tab1 6) */ *,
rank() OVER (PARTITION BY "ブランド" ORDER BY "売上" DESC) AS "順位"
FROM (
SELECT
sales_date::date as "売上日"
,shop as "ブランド"
,sum(price) as "売上"
FROM tab1
GROUP BY "売上日","ブランド") AS "集計";
</pre>
あれ。<br />
<br />
悩むこと数十分。サブクエリの側にヒントを入れて、無事解決しました。<br />
<pre class="console">
/* EDBでヒントをいれてみる。正解はこの位置 */
EXPLAIN ANALYZE
SELECT *,
rank() OVER (PARTITION BY "ブランド" ORDER BY "売上" DESC) AS "順位"
FROM (
SELECT /*+ PARALLEL(tab1 6) */
sales_date::date as "売上日"
,shop as "ブランド"
,sum(price) as "売上"
FROM tab1
GROUP BY "売上日","ブランド") AS "集計":
</pre>
<pre class="command" style=background:#FFBF00>
/* EDBでヒントを使うと、パラレルスキャンし、メモリソートもできた */
WindowAgg (cost=1327297.76..1351662.32 rows=1218228 width=56) (actual time=9667.291..10095.048 rows=441334 loops=1)
-> Sort (cost=1327297.76..1330343.33 rows=1218228 width=48) (actual time=9667.270..9746.242 rows=441334 loops=1)
Sort Key: "集計"."ブランド", "集計"."売上" DESC
Sort Method: quicksort Memory: 46768kB
-> Subquery Scan on "集計" (cost=1176747.00..1204157.13 rows=1218228 width=48) (actual time=8986.449..9216.731 rows=441334 loops=1)
-> Finalize HashAggregate (cost=1176747.00..1191974.85 rows=1218228 width=48) (actual time=8986.447..9129.055 rows=441334 loops=1)
Group Key: tab1.sales_date, tab1.shop
-> Gather (cost=357488.67..1103653.32 rows=7309368 width=48) (actual time=3751.793..5775.296 rows=3081355 loops=1)
Workers Planned: 6
Workers Launched: 6
-> Partial HashAggregate (cost=356488.67..371716.52 rows=1218228 width=48) (actual time=3736.607..4506.717 rows=440194 loops=7)
Group Key: tab1.sales_date, tab1.shop
-> Parallel Seq Scan on tab1 (cost=0.00..320408.67 rows=4810667 width=23) (actual time=0.041..870.314 rows=4123429 loops=7)
</pre>
ぶっちゃけactual timeを見ると元々9秒だったのが10秒と、むしろ若干悪いのだが・・・ディスクソートを排除したいという欲望を満たすべく試したらこうなった、と言う話。たぶんデータ量とかでこの辺はセンシティブに最適解は変わってしまうのだと思います。<br />
<br />
<h3>
<span style="color: #3d85c6;">間違・・・わないケース3 グループ集計(GROUPING SETS)</span></h3>
<br />
結論から言うと、いろいろ頑張ったけど思ったより早くならないのでプランナが正しかった!説があります。以下のクエリを実行してみると、PostgreSQLで一向にパラレルになってくれません。<br />
<br />
<pre class="console">
/* グループ集計のクエリ */
EXPLAIN ANALYZE
SELECT
shop AS "ブランド"
,kind AS "種類"
,count(*) AS "数量"
FROM tab1
GROUP BY GROUPING SETS (("ブランド"),("種類"),());
/* 結果のイメージ */
ブランド | 種類 | 数量
------------+------------+----------
DIESEL | | 8448000
Paul Smith | | 15488000
dior | | 4928000
| | 28864000
| シャツ | 15488000
| ジャケット | 4224000
| パンツ | 9152000
</pre>
<pre class="command">
/* PostgreSQLでの実行計画 パラレルにならない */
GroupAggregate (cost=4137591.06..8147200.27 rows=14 width=26)
(actual time=27350.631..48641.465 rows=7 loops=1)
Group Key: shop
Group Key: ()
Sort Key: kind
Group Key: kind
-> Sort (cost=4137591.06..4209751.06 rows=28864000 width=18)
(actual time=22549.349..26069.469 rows=28864000 loops=1)
Sort Key: shop
Sort Method: quicksort Memory: 2953433kB
-> Seq Scan on tab1 (cost=0.00..560942.00 rows=28864000 width=18)
(actual time=0.025..5461.728 rows=28864000 loops=1)
Planning time: 0.160 ms
Execution time: 49108.929 ms
</pre>
EDBでヒントをいれてみます。
<pre class="command" style=background:#FFBF00>
GroupAggregate (cost=6784457.73..10794066.94 rows=14 width=26)
(actual time=45959.909..70152.520 rows=7 loops=1)
Group Key: shop
Group Key: ()
Sort Key: kind
Group Key: kind
-> Sort (cost=6784457.73..6856617.73 rows=28864000 width=18)
(actual time=39595.620..44537.665 rows=28864000 loops=1)
Sort Key: shop
Sort Method: quicksort Memory: 2953433kB
-> Gather (cost=1000.00..3207808.67 rows=28864000 width=18)
(actual time=0.442..18630.270 rows=28864000 loops=1)
Workers Planned: 6
Workers Launched: 6
-> Parallel Seq Scan on tab1 (cost=0.00..320408.67 rows=4810667 width=18)
(actual time=0.052..1111.439 rows=4123429 loops=7)
Planning time: 0.130 ms
Execution time: 70680.047 ms
</pre>
パラレル度が上がったが早くならないケースもある。ということで。
<br />
<br />
<h2>
<span style="color: orange;">■総評 </span></h2>
<br />
パラレルクエリで効果を得づらいケースを3パターン紹介しました。<br />
<br />
これはたまたま私が検証する中で気付いたもので、他にもあるかもしれないし、賢い解決策があるのかもしれません。<br />
本投稿では触れていませんが、同じ検証の中で、1クエリ実行するのに<b><span style="color: red;">50分かかっていた処理が、パラレルクエリとテーブル・パーティショニングの組合せで8秒まで短縮しています</span></b>から、ハマれば効果は抜群です。 <br />
しかしながら、間違うケースもこうやってポンポン出てきたということは、これから採用を考えている人は、自身のアプリケーションでどの程度性能がでるか、どんな書き方をすれば効果がでるか、(そしてEDBにすればどう変わるか。ぐへへ!)是非試してみて欲しいと思います。<br />
策をいろいろ考えるのはパズルみたいで楽しかったです。<br />
<br />
明日は<a href="https://twitter.com/nuko_yokohama?lang=ja" target="_blank">ぬこ@横浜</a>さんが書いてくれます。楽しみです!<br />
<br />Anonymoushttp://www.blogger.com/profile/02234679274621415851noreply@blogger.com0tag:blogger.com,1999:blog-1760199393479360913.post-52441066721961546202016-12-03T11:10:00.003+09:002016-12-03T12:01:14.740+09:00【PGConf.asia】PostgreSQLの初期設定PostgreSQLのインストールができて、initdbが終わると、PostgreSQLサーバーを起動してデータベースとして使い始めることができますが、当たり前にここまではやっておいたほうが良い、といういくつかの初期設定がありますので、ここではそれを紹介します。<br />
<br />
<ul>
<li>パラメータ設定(postgresql.conf)</li>
<li>認証設定(pg_hba.conf)</li>
<li>ユーザー作成</li>
<li>データベース作成</li>
<li>(必要に応じて)スキーマ作成</li>
</ul>
<br />
を扱います。<br />
<br />
<span style="color: orange;"><b>■パラメータ設定</b></span><br />
PostgreSQLの動作設定は、すべてpostgresql.confというテキスト形式のパラメータファイルに記載されています。<br />
その中でも、設定しておかないと使えないものがlisten_addressesです。<br />
デフォルトは「loclhost」となっていて、外部からのアクセスを一切受け付けません。<br />
この値を「*」または、自サーバーのIPアドレスを設定します。NICが二つ以上ある場合に「*」はすべてだし、IPを指定していれば、そのIPアドレスに対するアクセスが来た時だけ受け付けます。<br />
<br />
※ちなみに、インストーラを使った場合はデフォルトからよしなに変更されているようです。<br />
<br />
そのほかにも、現代のサーバースペックを考えるとごく小さいデフォルト値が採用されているメモリ関連の設定などがありますので、実用を考えると5個ぐらい見直したほうが良い値があるのですが、「PostgreSQL データベースチューニング」などで検索すると情報がたくさん公開されています。<br />
<br />
<b><span style="color: orange;">■認証設定</span></b><br />
PostgreSQLは、ユーザーからの接続要求を受け取ると、pg_hba.confというテキスト形式の認証設定に従って接続の許可・拒否を判断します。<br />
このファイルは、接続元のホスト、接続先のデータベース/ユーザー、認証方法の組み合わせで書かれたリストになっており、上から順に評価されることに注意してください。<br />
<br />
# TYPE DATABASE USER ADDRESS METHOD<br />
<br />
# IPv4 local connections:<br />
host all all 127.0.0.1/32 md5<br />
host demo kkida 192.168.200.0/24 md5<br />
<br />
<br />
<br />
サービスからPstgreSQLサーバーを再起動して、ここまでの設定を反映します。<br />
<br />
<b><span style="color: orange;">■ユーザー作成、データベース作成 </span></b><br />
PostgreSQLを操作するには、psqlというコマンドラインツール、またはpgAdminというGUIツールで対象のデータベースに接続します。<br />
<br />
$ psql -U kkida -p 5432 -d demo<br />
<br />
このとき、kkidaユーザーをまだ作成していないので当然接続に失敗します。demoデータベースもありません。<br />
デフォルトでは、postgresユーザーとpostgresデータベースが作られているので、それを指定してアクセスし、自分用のユーザーやデータベースを作成します。(これも、インストーラーを使用した場合は、OSユーザーと同名でDBユーザーが作られている場合があります。)<br />
<br />
$ psql -U postgres postgres<br />
postgres=#<br />
<br />
または、すでにユーザーがいる場合は、以下のように確認できます。セキュリティ的にゆるゆるな初期の今だからこそできることですが。<br />
$ psql postgres (ユーザー名の入力を省略してログイン)<br />
postgres=# \du<br />
名前 |属性<br />
------+--------------- <br />
kkida | スーパーユーザ<br />
<br />
<br />
ここでCREATE ROLEやCREATE DATABASEといったSQLを実行し、任意のユーザー、データベースを作成します。<br />
<br />
postgres=# CREATE ROLE kkida SUPERUSER LOGIN;<br />
postgres=# \c postgres kkida<br />
postgres=# CREATE DATABASE demo;<br />
postgres=# \c demo kkida<br />
demo=# \q<br />
<br />
これで、初期設定は完了です。<br />
$ psql -U kkida demo<br />
demo=# CREATE TABLE demo (no int , val text);<br />
demo=# INSERT INTO demo VALUES (1,'aaa');<br />
demo=# SELECT * FROM demo;<br />
no | val<br />
-----+----------<br />
1 | aaa<br />
<br />
demo=# \q<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/02234679274621415851noreply@blogger.com0tag:blogger.com,1999:blog-1760199393479360913.post-10699580145444444522016-12-03T08:00:00.001+09:002016-12-03T08:00:03.055+09:00【PGConf.Asia】Windows版PostgreSQLのインストールここでは、PostgreSQLを初めてインストールする方向けに、Windows環境での手順を説明します。<br />
<br />
<h2>
<span style="color: orange;">■インストーラーの準備と対象バージョンについて</span></h2>
<br />
現時点の最新版、PostgreSQL 9.6.1を対象にします。<br />
Windowsへの対応は、64bitのサーバーOS(最近だとWin 2008以降ぐらいだろうか?)とか、32bitのWindows 7,8とか10では実績があると思います。これといって細かいOS側に対する要件は無くて、<a href="http://www.pgconf.asia/JP/" target="_blank">PostgreSQLの開発コミュニティ</a>では構築テストをして実績のあるものが公開されているような感じです。<br />
<br />
ただし、商用版PostgreSQLである<a href="https://www.ashisuto.co.jp/product/category/database/postgresql/" target="_blank">EDB Postgres</a>はサーバーOSのみに対応し、つまり現行の64bit機のみに対応するように、ここ数年で変わってきています。インストーラーが提供されているかどうかというレベルで、32bit環境では将来を気にしておくべきだと思います。<br />
<br />
Windows版のインストーラーは、上記のEDB Postgresを作っていてPostgreSQL自体の機能・性能向上にも大きく貢献している<a href="http://www.enterprisedb.com/" target="_blank">EnterpriseDB社</a>が作成し、公開しています。<a href="http://www.enterprisedb.com/products-services-training/pgdownload#windows" target="_blank">ここ</a>から自分が該当するインストーラーをダウンロードしておきます。<br />
また、日本PostgreSQLユーザ会のwebサイトでは、<a href="http://www.postgresql.jp/download" target="_blank">各OS向けのインストーラ、yum(rpm)やaptパッケージ、ソースコードへのリンク</a>を記載しており、こちらから辿るのも簡単です。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgay8F4hkVJe8VH2-ok0l6k0JkhduRtbl_6HImpk8doQnIiEexx4vpK7dxWaP8q-ik32qfPAx3rAekW4UNrhGoS2HDoG5hE2_bFp4iUypiH_AgL3f8-djrvmiW8DEmcETt2CLqNTNbhViY/s1600/jpug.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgay8F4hkVJe8VH2-ok0l6k0JkhduRtbl_6HImpk8doQnIiEexx4vpK7dxWaP8q-ik32qfPAx3rAekW4UNrhGoS2HDoG5hE2_bFp4iUypiH_AgL3f8-djrvmiW8DEmcETt2CLqNTNbhViY/s320/jpug.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<br />
<h2>
<span style="color: orange;">■インストーラの実行</span></h2>
<br />
Windows機では、Administrator権限を持ったOSユーザでインストーラーを実行します。<br />
このとき、UAC(ユーザーアクセス制御:Windowsのセキュリティ機能)は弱くしておかないと起動に失敗することがあります。(正確にどうしたらいいか、試していないので忘れた・・・まあ、失敗したら変更すればよいよね?)<br />
<br />
インストーラーを実行すると、以下のように次々値を指定していくことになるのですが・・・<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhyphenhyphen_RoqAWDjzQy4uAGPZLg_yZ5YivIFeEgg5NJ2N51wxJSvrrVRA6g-UrDLEJXYJeJFc3mY7M8j6vpwrqG49VGHmS2qJMtDFeVr-3BCy-1CH2oxi-UD8AmzsOPZxNviFVQxhxs7HDo7eA/s1600/02.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="250" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhyphenhyphen_RoqAWDjzQy4uAGPZLg_yZ5YivIFeEgg5NJ2N51wxJSvrrVRA6g-UrDLEJXYJeJFc3mY7M8j6vpwrqG49VGHmS2qJMtDFeVr-3BCy-1CH2oxi-UD8AmzsOPZxNviFVQxhxs7HDo7eA/s320/02.png" width="320" /></a></div>
<br />
<br />
画面キャプチャを次々と載せるのでも良いのですが、各項の解説をしておくほうが大事だと思いますので、PostgreSQL用語満載ですが、ご容赦ください。勉強しましょう!<br />
<br />
<h3>
<span style="color: #6fa8dc;">インストール先 (Installation Directory)</span></h3>
PostgreSQLをインストールするフォルダです。デフォルトはProgram Filesの下。この何階層か下にbinディレクトリがあり、そこにPostgreSQLのコマンドが配置されますので、後でbinに環境変数PATHを通しておくとよいでしょう。<br />
<br />
<h3>
<span style="color: #6fa8dc;">データディレクトリ(Data Directory)</span></h3>
PostgreSQLのデータファイルおよび管理ファイルの配置先です。デフォルトはインストールしたフォルダ配下が使われますが、データ領域であるためディスク容量や性能の問題で専用のストレージ領域を指定することが多いです。<br />
<br />
<h3>
<span style="color: #6fa8dc;"><span style="background-color: white;">WALについて</span></span></h3>
これまでのバージョンでは、データディレクトリと併せてWALディレクトリ位置を聞かれていました。<br />
WALはデータベースに対する変更の歴史を記録するファイルで、これをある時点の断面に次々適用することで最新状態まで戻す用途で保持されます。<br />
WALがデータディレクトリと物理的に同じディスクに配置されていると、ディスク障害時の復旧に必要なWALまで失われており泣き寝入りするしかありません。というわけなのですが、最近のディスク領域はRAID構成になっていたりするのが普通なので入力を省いたのでしょうか。<br />
WALの位置を変更するには、最後まで構築が済んだ後にごにょごにょします。(ここでは扱わない。) <br />
<br />
<h3>
<span style="color: #6fa8dc;">ユーザーとパスワード</span></h3>
インストーラで入力を求められるのは、「postgres」というデーベース内に一人必ず作成される管理者ユーザーのパスワードです。<br />
ただし、同名/同パスワードのOSユーザーを勝手につくろうとするので、OS側のセキュリティポリシー設定が厳しかったりすると、パスワードがポリシーに違反してる旨のメッセージが出てしまい、それはOS側の制約だったりするのでインストール中の作業者には心当たりがなく、ハマることがあります。<br />
<br />
<h3>
<span style="color: #6fa8dc;">ポート番号</span></h3>
PostgreSQLがクライアントからの通信を待ち受けるポートを指定します。デフォルトは5432です。<br />
あとからでも変更できるので影響は小さいです。既存のポートとバッティングしないようチェックが入りますので、警告がでなければ進めて問題ありません。<br />
<br />
<h3>
<span style="color: #6fa8dc;"><b>上位設定(Advanced Options)</b></span></h3>
ロケールはデフォルトではなく、「C」にすることを推奨します。<br />
ロケールで地域を指定すると、その言語の並び順でソートされたりして、特にソート時のパフォーマンスでは大きな差が生じるようです。「C」でのソート順は、UTF-8など使用している格納文字コードのコード順になります。<br />
<br />
全て入力して、「Next」を押すとインストールが開始されます。<br />
<br />
<br />
<h2>
<span style="color: orange;">■データベースクラスタの再作成(必要に応じて)</span></h2>
<br />
出来上がったデータベースは、環境によって格納文字コードがASCIIになっている場合があり、日本語を格納できません。その場合、日本語を格納するにはデータベースクラスタ作成時に指定するエンコードを「UTF-8」などにしなければなりません。<br />
インストーラが内部で勝手に実行してくれたデータベースクラスタ作成時のオプション指定がイケてないんですね。というわけで再作成します。<br />
<br />
<h3>
<span style="color: #6fa8dc;">データベースの停止</span></h3>
インストーラーが終了した時点で、データベースが起動していますので、不正なステータスのまま壊してしまわないよう停止しておきます。Windowsでは「サービス」からデータベースの起動・停止を操作します。 <br />
<br />
<h3>
<span style="color: #6fa8dc;">データディレクトリの削除</span></h3>
インストーラーで指定したデータディレクトリ配下には、データファイル、WALファイル、各種パラメータ設定ファイル、DBの状態を管理するファイルなどが一式格納されていて、でも再作成したいいまとなってはこれが邪魔な存在なのでフォルダごと一括で消します。<br />
<br />
<h3>
<span style="color: #6fa8dc;">データディレクトリの初期化</span></h3>
同じ意味の言葉で、「initdb」「データベースクラスタの初期化」 などと表現されますが、削除したデータディレクトリをまるっと新たに作り直してくれるinitdbというコマンドがありますので、それを実行してデータディレクトリを作ります。この時に指定するオプションで、問題のエンコードを指定したり、WALファイルの位置を指定したりカスタマイズが効きます。<br />
<br />
> initdb -D <データディレクトリ位置> -E UTF8 --no-locale<br />
<br />
<h3>
<span style="color: #6fa8dc;">データベースの起動</span></h3>
手動でinitdbしたあとは、データベースの起動が必要です。<br />
WindowsのサービスからPostgreSQLを探し、起動します。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirZ_kUGd0W9W8LlfngDahBdKLYK-Gyp0Vyj9ZBEgu3xdSf02dweNnbfBP49wC72fga77J5OIRzDT8NW6o8wLve5man4ItnijDGotkx4fDfP0wmiVbcW34dQ58V2YiMZx3Iuo8c0ws0Zbg/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="235" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirZ_kUGd0W9W8LlfngDahBdKLYK-Gyp0Vyj9ZBEgu3xdSf02dweNnbfBP49wC72fga77J5OIRzDT8NW6o8wLve5man4ItnijDGotkx4fDfP0wmiVbcW34dQ58V2YiMZx3Iuo8c0ws0Zbg/s320/11.png" width="320" /></a></div>
<br />
この時、データディレクトリの位置が最初と変わっていると、サービススクリプトの作り替えも必要になりますが、応用なので今回はそのようなケースは扱いません。<br />
<br />
<br />
これで、PostgreSQLのインストールは完了です。<br />
テーブルを作ってデータを入れるには、もう少し作業があって、ユーザやデータベースの作成、認証のための設定が必要です。 以降の手順はOSプラットフォームやディストリビューションによらず、PostgreSQLの初期設定一般になりますので、別記事に整理します。Anonymoushttp://www.blogger.com/profile/02234679274621415851noreply@blogger.com0tag:blogger.com,1999:blog-1760199393479360913.post-87912573746622360972016-12-03T08:00:00.000+09:002016-12-03T08:00:05.391+09:00【PGConf.Asia】 チュートリアルセッション序文今、ユーザーコミュニティたる我々が発信していくべきことは何かと考えると、初めの一歩を踏み出す人を後押しすることではないか。などと唐突に書いてみる。<br />
この投稿は、2016年12月3日 <a href="http://www.pgconf.asia/JP/" target="_blank">PGConf.asia</a>の<a href="http://www.pgconf.asia/JP/tutorial/" target="_blank">チュートリアル枠</a>について書いた非技術的な話です。 <br />
<br />
<h2>
<span style="color: orange;">■これまでのPostgreSQL勉強会</span></h2>
<br />
過去数年、日本PostgreSQLユーザ会(JPUG)で開催した「<a href="https://www.postgresql.jp/wg/shikumi/" target="_blank">初級者向け勉強会</a>」は、それでもデータベース経験者というか実務で扱ってる人を対象にした、バックアップ入門、チューニング入門などなど、すでにデータベースに興味を持ってる人が知識を整理し、中上級者になるとか・実務を担当できるようになるという方向性であったように思う。<br />
それはとても良いことで、ある話題の最低限を1コマに凝縮しモジュール化した講義内容は再利用できるし、そのテーマで調べた人がたどり着いて利用するのにもっともよい形になっていると思う。<br />
それらは今でも<a href="https://www.postgresql.jp/wg/shikumi/" target="_blank">スライド資料+録画</a>が公開されていて、利用したい人の需要にこたえることができる一つの方法として価値あるものを提供できていると思う。<br />
(コミュニティの場で発表することは、発表者にとっても、苦労に対してメリットが非常に大きく、知識を整理したことで自身がレベルアップできることはもちろん、そこでの経験は仕事の評価につながったり、転職活動に明確に有利になったりする。) <br />
<br />
上級者向けは言わずもがな。<a href="http://dbstudychugoku.github.io/" target="_blank">中国地方DB勉強会</a>とか、<a href="https://database-lounge-tokyo.connpass.com/" target="_blank">Database Lounge</a>では、新機能やデータベースの新たな領域での活用という話が繰り広げられている。特にこれまでにそのレベルに達している人(≒既にその製品・分野の勉強してきた人)にとってもう一歩先の話はとても興味深く、自慢の機能を作った開発者と、新しいことを得たい受講者の需要と供給が一致して半端ないエネルギーを生んでいるように見える。<br />
<br />
<h2>
<span style="color: orange;">■苦労を伴う初心者育成</span></h2>
<br />
良い意味で勝手に回っていく上記のような話とは違い、初めの一歩を踏み出す人に向けてスキルを伝えていくことは、双方に努力が必要な話である。どちらかが話を持ち掛けて、相手に努力を強いることになる。<br />
<br />
<ul>
<li>経験者が「○○は大事だから絶対勉強しとくべき」とか、「俺が教えてやるよ」なんて非常に上から目線すぎる話だけど、本当に大事な技術はそうでもして伝承していかないといけない。それにつきあって新たなことを学ぶ初心者の苦労は相当のものかもしれない。</li>
<li>初心者が「わからないので教えてよ」って言うのは、有能で成果を上げてる経験者の時間を消費することで、若気の至りにしたって厚かましいかもしれない。そのために時間を割き、経験値を形に変えて教えてくれる経験者の損失は実は計り知れない。その上、わかりにくいと叩かれたりする。</li>
</ul>
<h3>
<span style="color: #6fa8dc;"><b>苦労のデッドロック</b></span>である。(上手いこと言った。←)</h3>
<br />
それでも、長い目でみたら製品の利用者が増え、知の総和が増え、製品クオリティの向上にもつながるし、各個人はそこでなければ得られなかった技術領域を習得し、個としてのバリューを発揮できるようになる。<br />
”生み出したい価値” と ”育成に費やすコスト” を天秤にかけて、結果、技術力をものにできたところが最終的に勝つのだと思う。それをお金と上司命令で実現するのが企業だとしたら、我々コミュニティがやるべきことは何か。<br />
お金と苦労の等価交換ではなく、自分がこれまで経験した楽しさを喜んで人に伝えるとか、コミュニティで得たものを還元するとか、そういう気持ちが原料になってデッドロック状態を解放することができるのがコミュニティなのだと思う。<br />
<br />
<h2>
<span style="color: orange;">■さて、自分にできることは</span></h2>
<br />
ということを意識しはじめた今年の6月、<a href="http://kkida-galaxy.blogspot.jp/" target="_blank">このブログ</a>をはじめた。(更新サボってるけど。それでも死んではいない。)自分がコミュニティの中の人として何ができるか、何を発信できるかを考えてきた結果の一つが<a href="http://www.pgconf.asia/JP/tutorial/" target="_blank">今回のチュートリアル</a>になった。<br />
この文脈から、「教えてやるよ」と言っちゃってるようなものなんだけど、自分のコンプレックスでもあるプログラミング経験のなさとかは世の技術者と比べたら一目瞭然で、「出来ることは教える、出来ないことは教えてもらう」を体現できる存在として、自分が、JPUGが、誰かが一歩踏み出すお手伝いをするのだ!と決意をもって始めるのである。<br />
<br />
っていうか、これまでのJPUGの構成員は何から何まで優秀すぎるっていうか。だからこそ学ばせていただいたことがめちゃくちゃあるんだけど。<br />
このチュートリアルを実現できたことをきっかけに、<span style="color: #6fa8dc;"><b>イチ庶民として</b></span>、やれることをやっていきたいと思います。Anonymoushttp://www.blogger.com/profile/02234679274621415851noreply@blogger.com0tag:blogger.com,1999:blog-1760199393479360913.post-76628570409846750812016-11-27T13:58:00.003+09:002016-11-27T14:00:14.189+09:00OSC2016 広島に参加しました秋の広島遠征!<br />
<a href="http://dbstudychugoku.github.io/events/event-018.html" target="_blank">中国地方DB勉強会</a>と<a href="http://www.ospn.jp/osc2016-hiroshima/" target="_blank">OSC広島</a>に参加してきました。<br />
<br />
本エントリは、11月27日(日)の<a href="http://www.ospn.jp/osc2016-hiroshima/" target="_blank">OSC広島</a>についてです。<br />
<br />
<br />
■発表資料<br />
<br />
<br />
PostgreSQLへの移行入門<br />
商用データベースからPostgreSQLへ まず知っておいて欲しいまとめ<br />
<iframe src="//www.slideshare.net/slideshow/embed_code/key/bj8r1RBN8XK2Gv" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/kkida85/oratopostgreshiroshima" title="Oratopostgres-hiroshima" target="_blank">Oratopostgres-hiroshima</a> </strong> from <strong><a target="_blank" href="//www.slideshare.net/kkida85">Kosuke Kida</a></strong> </div>
<br />
<br />
その他のことは後日追記します。 Anonymoushttp://www.blogger.com/profile/02234679274621415851noreply@blogger.com0tag:blogger.com,1999:blog-1760199393479360913.post-5783868645396869002016-11-26T11:11:00.001+09:002016-11-26T17:28:14.237+09:00第18回 中国地方DB勉強会 に参加しました秋の広島遠征!<br />
<a href="http://dbstudychugoku.github.io/events/event-018.html" target="_blank">中国地方DB勉強会</a>と<a href="http://www.ospn.jp/osc2016-hiroshima/" target="_blank">OSC広島</a>に参加してきました。<br />
<br />
本エントリは、11月26日(土)の<a href="http://dbstudychugoku.github.io/events/event-018.html" target="_blank">中国地方DB勉強会</a>についてです。<br />
<br />
<h2>
<span style="color: orange;">■はじめに</span></h2>
私はPostgreSQLの人として、Schooさんで講座を持たせてもらった「<a href="https://schoo.jp/class/3529" target="_blank">PostgreSQLで学ぶデータベース技術</a>」を元ネタにツギハギし、2コマしゃべらせてもらいました。(Schooさんでの講座は、Webアプリ開発者向けに、PostgreSQLを使う人に知ってほしいことを全5回にまとめたもので、今回全く触れていない運用管理の話とか、PostgreSQLの使いどころをより詳しく説明しています!)<br />
<br />
で、今回のネタ(特に1コマ目)は、データベース初級者に向けて、データベースの勉強をするきっかけになればと思ってつくったもので、初級者の方には純真な気持ちで受け止めてもらい、中上級者には、もっとこうしたらわかりやすい、的なご意見をいただいて、より良いものにして"大切な概念を易しく伝える "講義として息の長いものにしていけたらなーと思っています。<br />
<br />
<h2>
<span style="color: orange;"><b>■発表資料</b></span></h2>
<h3>
<span style="color: #3d85c6;">1コマ目:アプリ開発とデータベース、アプリ開発とPostgreSQL</span></h3>
アプリ開発者(プログラムを書く人、SQLを書く人)が、データベースってこういうところが便利、PostgreSQLってこう使える、と理解し、データベースの大事さを理解し、もう一段階成長するためにデータベースの勉強してみよう!と思っていただけることを目指しています。<br />
その中での重要な話題として、「リレーショナルデータベース」「トランザクション」に絞って易しく解説しています。<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="485" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/ekUPQKYMoq7Rjo" style="border-width: 1px; border: 1px solid #ccc; margin-bottom: 5px; max-width: 100%;" width="595"> </iframe> <br />
<div style="margin-bottom: 5px;">
<b> <a href="https://www.slideshare.net/kkida85/chugokudb181-69540159" target="_blank" title="Chugokudb18_1">Chugokudb18_1</a> </b> from <b><a href="https://www.slideshare.net/kkida85" target="_blank">Kosuke Kida</a></b> </div>
<br />
<h3>
<span style="color: #3d85c6;">2コマ目:SQL開発入門 - SELECTとパフォーマンス</span></h3>
仕事でSQLを書くけど、普段からそればっかりというワケじゃないし、ぶっちゃけ得意とは言えないみたいな方へ。<br />
SQLを書く上でのちょっとしたポイントと、中級者になるために索引の構造やJOINのことを知り、パフォーマンスを意識しましょう、という話をしました。<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="485" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/CTHwgxvVgmbY0d" style="border-width: 1px; border: 1px solid #ccc; margin-bottom: 5px; max-width: 100%;" width="595"> </iframe> <br />
<div style="margin-bottom: 5px;">
<b> <a href="https://www.slideshare.net/kkida85/chugokudb182" target="_blank" title="Chugokudb18_2">Chugokudb18_2</a> </b> from <b><a href="https://www.slideshare.net/kkida85" target="_blank">Kosuke Kida</a></b><br />
<br />
<br />
だからといって、じゃあどうすればパフォーマンス良くなるの?と言われると、実データで実行例なんかを出せなかったのでイメージがしにくいかと思いますが、<a href="https://www.postgresql.jp/wg/shikumi/shikumi30/" target="_blank">JPUGでこれまでに開催してきたパフォーマンスチューニング系の勉強会資料</a>なんかを見て行く上で、大前提となるような話ですので、ここからより詳しい話を肉付けしていくのにお役立ていただければなと思っています。<br />
<br />
</div>
Anonymoushttp://www.blogger.com/profile/02234679274621415851noreply@blogger.com0tag:blogger.com,1999:blog-1760199393479360913.post-53552179175076848882016-09-21T23:03:00.000+09:002016-11-15T15:57:02.443+09:00【schoo連動】PostgreSQLらしい集計クエリ<a href="https://schoo.jp/" target="_blank">schoo</a>のオンライン授業でPostgreSQLの話をすることになりました。<br />
<br />
<a href="https://schoo.jp/class/3529" target="_blank">PostgreSQLで学ぶデータベース技術</a>という全五回の授業で、9/25(日)と9/28(水)に生放送されます。(有料会員の方はアーカイブも見れるそうなので、そちらでも。)<br />
<br />
<br />
<h2>
<span style="color: orange;">■本記事について</span></h2>
授業の第3回では、「SQL開発入門 -PostgreSQLを選ぶ理由-」として、SQLの中でもPostgreSQLならではの便利なところ、拡張が豊富でアプリ開発をより高度に行えるところ、運用管理性の向上や、SQL開発のレベルでは無く、データ連携のようなDBサーバーとしての機能まで拡張できるところを取り上げました。<br />
その中には、PostgreSQLらしいクエリがたくさん登場し、SQLの実習講座ではないが、試せるものなら是非ためして欲しいものがたくさん登場しますので、ここに実行例を細かく書くことにします。<br />
<br />
ここでは、テーブルを作ってデータを入れて集計してみるという一連の流れを紹介します。<br />
<br />
<h2>
<span style="color: orange;">■データ生成まで</span></h2>
<span style="color: #3d85c6;"><b>・テーブルの作成</b></span><br />
授業のデモ用なので、正規化してなかったり構造はイケてないのですが。<br />
<br />
メインのテーブル。<br />
アパレルの店舗(=ここではブランド名) いくらのどの商品が売れたかを格納してるテーブルだと思ってください。<br />
<br />
<b>テーブル作成</b><br />
<pre class="command">CREATE TABLE sales_result (
sales_id int,
sales_date timestamp,
shop text,
kind text,
price numeric,
color int);
</pre>
<br />
外部キー制約のために関連する表も作成しておきますが、JOINの練習ではないので、この表は以降は登場しません。<br />
<br />
<b>関連オブジェクト作成 </b><br />
<pre class="command">CREATE TABLE color (color_code int,color_name text);
INSERT INTO color VALUES (1,'BLACK'),(2,'RED'),(3,'WHITE');
ALTER TABLE color ADD PRIMARY KEY (color_code);
</pre>
<span style="color: #3d85c6;"><b>・制約の定義</b></span><br />
PostgreSQLでは、入力されるデータを正しく保つ制約が作れます。<br />
<br />
<b>制約の定義 </b><br />
<pre class="command">ALTER TABLE sales_result ADD PRIMARY KEY (sales_id);
ALTER TABLE sales_result ADD CHECK (shop in ('dior','Paul Smith','DIESEL'));
ALTER TABLE sales_result ADD FOREIGN KEY (color) REFERENCES color(color_code);
</pre>
<br />
<br />
テーブル定義を確認するとこんな感じです。<br />
<pre class="console">demo=# \d sales_result
テーブル "public.sales_result"
列 | 型 | 修飾語
------------+-----------------------------+----------
sales_id | integer | not null
sales_date | timestamp without time zone |
shop | text |
kind | text |
item | numeric |
color | integer |
インデックス:
"sales_result_pkey" PRIMARY KEY, btree (sales_id)
検査制約:
"sales_result_shop_check" CHECK (shop = ANY (ARRAY['dior'::text, 'Paul Smith'::text, 'DIESEL'::text]))
外部キー制約:
"sales_result_color_fkey" FOREIGN KEY (color) REFERENCES color(color_code)
</pre>
<br />
<span style="color: #3d85c6;"><b>・データの投入</b></span><br />
バルクインサートと、ON CONFLICTを含めたINSERTの例です。このようなデータを一括で投入します。<br />
<pre class="console">demo=# INSERT INTO sales_result VALUES
demo-# (5280,2016-07-11,'DIESEL' ,'パンツ' ,22000,2)
demo-# ,(6368,2016-02-15,'DIESEL' ,'シャツ' ,21000,1)
demo-# ,(5018,2016-01-27,'Paul Smith','シャツ' ,13000,3)
demo-# ,(7022,2015-09-29,'dior' ,'ジャケット',22000,2)
demo-# ON CONFLICT DO NOTHING
demo-# ;
</pre>
なのですが、この後のクエリではある程度の行数を集計したいので、INSERTの行数を増やして、かつ手動で30回ほど実行しておきます。<br />
数値や日付はランダムな値を入れるようになっていますので、そのまま30回繰り返しコピペで良いです。それぐらいならすぐ終わります。(とは言え、手作業でいくスタイルです。がんばってくださいw 一応言い訳しておくと、今回はスクリプト化とかするより、今やってることを体験するコーナーです。)<br />
<br />
<b>データ投入 </b><br />
<pre class="command">INSERT INTO sales_result VALUES
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'Paul Smith','ジャケット',10000+1001+(random()*100)::int%2,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'Paul Smith','ジャケット',10000+1001+(random()*100)::int%2,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'Paul Smith','パンツ' ,10000+2001+(random()*100)::int%3,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'Paul Smith','パンツ' ,10000+2001+(random()*100)::int%3,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'Paul Smith','シャツ' ,10000+3001+(random()*100)::int%8,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'Paul Smith','シャツ' ,10000+3001+(random()*100)::int%8,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'Paul Smith','シャツ' ,10000+3001+(random()*100)::int%8,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'Paul Smith','シャツ' ,10000+3001+(random()*100)::int%8,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'Paul Smith','シャツ' ,10000+3001+(random()*100)::int%8,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'Paul Smith','シャツ' ,10000+3001+(random()*100)::int%8,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'Paul Smith','シャツ' ,10000+3001+(random()*100)::int%8,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'Paul Smith','シャツ' ,10000+3001+(random()*100)::int%8,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'Paul Smith','シャツ' ,10000+3001+(random()*100)::int%8,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'Paul Smith','シャツ' ,10000+3001+(random()*100)::int%8,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'Paul Smith','シャツ' ,10000+3001+(random()*100)::int%8,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'Paul Smith','シャツ' ,10000+3001+(random()*100)::int%8,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'Paul Smith','シャツ' ,10000+3001+(random()*100)::int%8,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'Paul Smith','シャツ' ,10000+3001+(random()*100)::int%8,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'Paul Smith','シャツ' ,10000+3001+(random()*100)::int%8,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'Paul Smith','シャツ' ,10000+3001+(random()*100)::int%8,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'Paul Smith','シャツ' ,10000+3001+(random()*100)::int%8,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'Paul Smith','シャツ' ,10000+3001+(random()*100)::int%8,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'DIESEL' ,'ジャケット',20000+1001+(random()*100)::int%2,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'DIESEL' ,'パンツ' ,20000+2001+(random()*100)::int%5,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'DIESEL' ,'パンツ' ,20000+2001+(random()*100)::int%5,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'DIESEL' ,'パンツ' ,20000+2001+(random()*100)::int%5,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'DIESEL' ,'パンツ' ,20000+2001+(random()*100)::int%5,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'DIESEL' ,'パンツ' ,20000+2001+(random()*100)::int%5,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'DIESEL' ,'パンツ' ,20000+2001+(random()*100)::int%5,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'DIESEL' ,'パンツ' ,20000+2001+(random()*100)::int%5,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'DIESEL' ,'パンツ' ,20000+2001+(random()*100)::int%5,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'DIESEL' ,'パンツ' ,20000+2001+(random()*100)::int%5,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'DIESEL' ,'パンツ' ,20000+2001+(random()*100)::int%5,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'DIESEL' ,'シャツ' ,20000+3001+(random()*100)::int%3,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'dior' ,'ジャケット',30000+1001+(random()*100)::int%2,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'dior' ,'ジャケット',30000+1001+(random()*100)::int%2,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'dior' ,'ジャケット',30000+1001+(random()*100)::int%2,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'dior' ,'パンツ' ,30000+2001+(random()*100)::int%3,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'dior' ,'シャツ' ,30000+3001+(random()*100)::int%1,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'dior' ,'シャツ' ,30000+3001+(random()*100)::int%1,(random()*100)::int%3+1),
((random()*10000)::int,(now()-(random()*1000)::int%365*interval'1day'),'dior' ,'シャツ' ,30000+3001+(random()*100)::int%1,(random()*100)::int%3+1)
ON CONFLICT DO NOTHING
;
</pre>
<br />
お疲れ様でした★<br />
<h2>
<span style="color: orange;">■クエリを実行する</span></h2>
<span style="color: #3d85c6;"><b>・普通のSELECT文</b></span><br />
まずは、INSERTした件数と、どんなデータが入ったか上位5件とか、テーブルの物理サイズを見ておきましょう。 <br />
<pre class="console">demo=# SELECT count(*) FROM sales_result;
count
-------
1159
(1 行)
demo=# SELECT * FROM sales_result LIMIT 5;
sales_id | sales_date | shop | kind | price | color
----------+----------------------------+------------+------------+-------+-------
9396 | 2015-09-26 16:23:57.248001 | Paul Smith | ジャケット | 11001 | 3
5179 | 2016-05-13 16:23:57.248001 | Paul Smith | ジャケット | 11002 | 3
3925 | 2016-01-24 16:23:57.248001 | Paul Smith | パンツ | 12003 | 1
6720 | 2016-01-17 16:23:57.248001 | Paul Smith | パンツ | 12001 | 2
9054 | 2016-01-29 16:23:57.248001 | Paul Smith | シャツ | 13006 | 3
(5 行)
demo=# SELECT pg_size_pretty(pg_relation_size('sales_result'));
pg_size_pretty
----------------
88 kB
(1 行)
</pre>
<br />
<span style="color: #3d85c6;"><b>・集計してみる</b></span><br />
さて集計編。まずは基本のGROUP BYです。2種類試します。<br />
集計する項目を「売上」か「件数」かで見比べます。単価が高いものがぽつぽつとでも売れたほうが、売上額では勝るんですね。世の中って複雑ですw<br />
<br />
<b>売上で集計するクエリ
</b><br />
<pre class="command">SELECT
sales_date::date as "売上日"
,shop as "ブランド"
,sum(price) as "売上"
FROM sales_result
GROUP BY "売上日","ブランド"
ORDER BY "売上" DESC
LIMIT 10;
</pre>
<br />
<br />
<b>販売点数で集計するクエリ
</b><br />
<pre class="command">SELECT
sales_date::date as "売上日"
,shop as "ブランド"
,count(*) as "件数"
FROM sales_result
GROUP BY "売上日","ブランド"
ORDER BY "件数" DESC
LIMIT 10;
</pre>
<br />
<pre class="console">demo=# SELECT
demo-# sales_date::date as "売上日"
demo-# ,shop as "ブランド"
demo-# ,sum(price) as "売上" --★ここだけ異なる
demo-# FROM sales_result
demo-# GROUP BY "売上日","ブランド"
demo-# ORDER BY "売上" DESC
demo-# LIMIT 10;
売上日 | ブランド | 売上
------------+------------+--------
2016-03-12 | dior | 129007
2016-09-08 | dior | 99003
2015-10-12 | dior | 97003
2016-04-21 | DIESEL | 89015
2016-03-03 | DIESEL | 88018
2015-10-22 | DIESEL | 88011
2016-09-02 | DIESEL | 87009
2016-07-16 | Paul Smith | 78029
2016-06-20 | DIESEL | 67011
2016-06-21 | DIESEL | 67009
(10 行)
demo=# SELECT
demo-# sales_date::date as "売上日"
demo-# ,shop as "ブランド"
demo-# ,count(*) as "件数" --★ここだけ異なる
demo-# FROM sales_result
demo-# GROUP BY "売上日","ブランド"
demo-# ORDER BY "件数" DESC
demo-# LIMIT 10;
売上日 | ブランド | 件数
------------+------------+------
2016-07-16 | Paul Smith | 6
2016-06-14 | Paul Smith | 5
2015-12-28 | Paul Smith | 5
2016-02-09 | Paul Smith | 5
2016-06-05 | Paul Smith | 5
2016-09-21 | Paul Smith | 5
2016-06-16 | Paul Smith | 5
2016-04-07 | Paul Smith | 5
2016-07-31 | Paul Smith | 5
2016-09-15 | Paul Smith | 5
(10 行)
</pre>
<br />
<span style="color: #3d85c6;"><b>・ランキング(window関数) </b></span><br />
次はいきなりPostgreSQL力の高い例題ですが、window関数を試します。<br />
上記の集計結果にランキングをつけます。 あるブランドでは、何月何日が一番売れたかが見れます。結果はめちゃくちゃ長いので頑張ってスクロールしましょうw<br />
<br />
<b>ランキングを取得するクエリ </b><br />
<pre class="command">SELECT *,
rank() OVER (PARTITION BY "ブランド" ORDER BY "売上" DESC) AS "順位"
FROM (
SELECT
sales_date::date as "売上日"
,shop as "ブランド"
,sum(price) as "売上"
FROM sales_result
GROUP BY "売上日","ブランド") AS "集計"
;
</pre>
<pre class="console">demo=# SELECT *,
demo-# rank() OVER (PARTITION BY "ブランド" ORDER BY "売上" DESC) AS "順位"
demo-# FROM (
demo(# SELECT
demo(# sales_date::date as "売上日"
demo(# ,shop as "ブランド"
demo(# ,sum(price) as "売上"
demo(# FROM sales_result
demo(# GROUP BY "売上日","ブランド") AS "集計"
demo-# ;
売上日 | ブランド | 売上 | 順位
------------+------------+--------+------
2016-04-21 | DIESEL | 89015 | 1
2016-03-03 | DIESEL | 88018 | 2
2015-10-22 | DIESEL | 88011 | 3
2016-09-02 | DIESEL | 87009 | 4
2016-06-20 | DIESEL | 67011 | 5
2016-06-21 | DIESEL | 67009 | 6
:
(結果は省略)
</pre>
<br />
<span style="color: #3d85c6;"><b>・ピボットテーブル(GROUPING集計)</b></span><br />
もうちょっと簡単な集計を例にします。どのブランドのどの服が何個売れたかを出します。<br />
しかし、RDBの結果はいかんせん見づらい。アプリでステキに表示するために、よく行列変換を施します。<br />
<pre class="console">demo=# SELECT
demo-# shop AS "ブランド"
demo-# ,kind AS "種類"
demo-# ,count(*) AS "数量"
demo-# FROM sales_result
demo-# GROUP BY "ブランド","種類";
ブランド | 種類 | 数量
------------+------------+------
Paul Smith | シャツ | 538
dior | シャツ | 86
DIESEL | シャツ | 30
dior | ジャケット | 89
dior | パンツ | 30
DIESEL | ジャケット | 29
DIESEL | パンツ | 299
Paul Smith | ジャケット | 61
Paul Smith | パンツ | 61
(9 行)
</pre>
<br />
この結果をまるっとExcelに張り付け、「ピボット変換」機能を使うと、各中計と合計を出して見やすくしてくれます。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgw8L2IhkYi-BG1cWOhmNvIDO2FyHqL2016k4M2FK8IZj5-2Wxhq0xu3lLCNkWc92q4rP7i37qESuoTJTy3pweLxqMtNr2Hboapt-UbYoFQ2y3of2GJbVyTQRWsa4ZtXYid6tmeSLS3358/s1600/schoo_pivot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="306" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgw8L2IhkYi-BG1cWOhmNvIDO2FyHqL2016k4M2FK8IZj5-2Wxhq0xu3lLCNkWc92q4rP7i37qESuoTJTy3pweLxqMtNr2Hboapt-UbYoFQ2y3of2GJbVyTQRWsa4ZtXYid6tmeSLS3358/s400/schoo_pivot.png" width="520" /></a></div>
<br />
<br />
PostgreSQLでは、この中計や合計の値を一回のクエリで取ることができます。従来のGORUP BYでは、合計で一回、ブランド別の集計で一回、種類別の集計で一回のクエリを発行する必要がありました。最新のPostgreSQLでは、GROUPING SETS、ROLLUP、CUBEといくつか構文があり、取得したい集計によって使い分けます。その一番基本となるGROUPING SETSを今回は例にしています。ちなみに、CUBEやROLLUPを使うと、中計、合計だけでなく、普通にGROUP BYした結果も一緒に取れるので、Excelのピボット変換したのと同じ結果が1クエリで取れます。<br />
<br />
<b>中計と合計を取得するクエリ </b><br />
<pre class="command">SELECT
shop AS "ブランド"
,kind AS "種類"
,count(*) AS "数量"
FROM sales_result
GROUP BY GROUPING SETS (("ブランド"),("種類"),());
</pre>
<br />
結果は以下のようになります。上記のEXCELのピボット変換して得た値(中計や合計)がSQLで取れています。(例えば「合計」の1223という値がちゃんと取れています。)<br />
<br />
<pre class="console">demo=# SELECT
demo-# shop AS "ブランド"
demo-# ,kind AS "種類"
demo-# ,count(*) AS "数量"
demo-# FROM sales_result
demo-# GROUP BY GROUPING SETS (("ブランド"),("種類"),());
ブランド | 種類 | 数量
------------+------------+------
DIESEL | | 358
Paul Smith | | 660
dior | | 205
| | 1223 --★この合計はExcelで計算されたものと一致
| シャツ | 654
| ジャケット | 179
| パンツ | 390
(7 行)
</pre>
<br />
<span style="color: #3d85c6;"><b>・行列の表示変換(crosstab) </b></span><br />
なお、これはオマケなのですが、これをさらに見やすく整形し、本当にピボット変換したのと同じ表をつくる整形用の拡張もあります。<br />
<br />
拡張を入手できるかはインストールした環境次第なので、ここではそのまま実行例を貼っておきます。EXCELの例とおなじ結果SQLを整形だけしたものです。(この時点で中計や合計は計算していない)<br />
<pre class="console">postgres=# CREATE EXTENSION tablefunc;
CREATE EXTENSION
demo=# SELECT * FROM crosstab(
demo(# 'SELECT
demo'# shop
demo'# ,kind
demo'# ,count(*)
demo'# FROM sales_result
demo'# GROUP BY 1,2
demo'# ORDER BY 1,2'
demo(# ,
demo(# 'SELECT
demo'# DISTINCT kind FROM sales_result
demo'# ORDER BY kind'
demo(# )
demo-# AS results(
demo(# "ブランド" text,
demo(# "シャツ" numeric,
demo(# "ジャケット" numeric,
demo(# "パンツ" numeric
demo(# );
ブランド | シャツ | ジャケット | パンツ
------------+--------+------------+--------
DIESEL | 30 | 29 | 299
Paul Smith | 538 | 61 | 61
dior | 86 | 89 | 30
(3 行)
</pre>
<br />
すげー複雑!と思った方が多いと思いますが、SQLが複雑ということは、その裏でデータベースはもっと頑張って、取得する行数の見積もり、実行計画の策定、スキャン、集計、などをこなしているのです。複雑なSQLを書けるということは、賢いデーターベースであることの証でもあります。<br />
<br />
PostgreSQL 9.6では、\crosstabviewという整形用メタコマンドが追加されました。直前に実行されたSQLを整形してくれます。<br>
メタコマンドなのでpsql大好きっ子的には嬉しいこの機能。一般ウケはし無さそう。
<pre class="console">
schoo=#
SELECT
shop AS "ブランド"
,kind AS "種類"
,count(*) AS "数量"
FROM sales_result
GROUP BY CUBE( "ブランド", "種類");
ブランド | 種類 | 数量
------------+------------+--------
DIESEL | シャツ | 9856
DIESEL | ジャケット | 9856
DIESEL | パンツ | 93568
DIESEL | | 113280
Paul Smith | シャツ | 180352
Paul Smith | ジャケット | 20096
Paul Smith | パンツ | 20096
Paul Smith | | 220544
dior | シャツ | 29696
dior | ジャケット | 30592
dior | パンツ | 10496
dior | | 70784
| | 404608
| シャツ | 219904
| ジャケット | 60544
| パンツ | 124160
(16 行)
schoo=# \crosstabview "ブランド"
ブランド | シャツ | ジャケット | パンツ |
------------+--------+------------+--------+--------
DIESEL | 9856 | 9856 | 93568 | 113280
Paul Smith | 180352 | 20096 | 20096 | 220544
dior | 29696 | 30592 | 10496 | 70784
| 219904 | 60544 | 124160 | 404608
(4 行)
</pre>
あと、こういういかにも重いクエリが、パラレルクエリでチョッパヤになります。夢が膨らむ!
<pre class="console">
schoo=# explain analyze
SELECT /*+ PARALLEL(sales_result 8) */
shop AS "ブランド"
,kind AS "種類"
,count(*) AS "数量"
FROM sales_result
GROUP BY CUBE( "ブランド", "種類");
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------
----------
GroupAggregate (cost=83465.04..128227.47 rows=32 width=26) (actual time=447.751..883.691 rows=16 loops=1)
Group Key: shop, kind
Group Key: shop
Group Key: ()
Sort Key: kind
Group Key: kind
-> Sort (cost=83465.04..84476.56 rows=404608 width=18) (actual time=441.059..503.051 rows=404608 loops=1)
Sort Key: shop, kind
Sort Method: quicksort Memory: 42643kB
-> Gather (cost=1000.00..45783.56 rows=404608 width=18) (actual time=1.582..192.417 rows=404608 loops=1)
Workers Planned: 8
Workers Launched: 7
-> Parallel Seq Scan on sales_result (cost=0.00..4322.76 rows=50576 width=18) (actual time=0.017..11.969 rows=50576
loops=8)
Planning time: 0.245 ms
Execution time: 891.296 ms
(15 行)
</pre>
<br />
ということで、単にSQLをぺたぺた貼って行っただけですが、このぐらいで。 Anonymoushttp://www.blogger.com/profile/02234679274621415851noreply@blogger.com0tag:blogger.com,1999:blog-1760199393479360913.post-51924159689497066092016-09-21T21:41:00.003+09:002016-09-21T21:42:52.493+09:00【schoo連動】PostgreSQLで学ぶデータベース技術※ 本記事はポエムかつ炎上するような物でも無いのでまったく読む必要ないやつです ※<br />
<br />
<br />
<a href="https://schoo.jp/" target="_blank">schoo</a>のオンライン授業でPostgreSQLの話をすることになりました。<br />
<br />
<a href="https://schoo.jp/class/3529" target="_blank">PostgreSQLで学ぶデータベース技術</a>という全五回の授業で、9/25(日)と9/28(水)に生放送されます。(有料会員の方はアーカイブも見れるそうなので、そちらでも。)<br />
<br />
<h2>
<span style="color: orange;">■データベース技術とは</span></h2>
タイトルに使った<b><span style="color: #3d85c6;">「データベース技術」</span></b>という言葉について。<br />
<br />
授業の内容を考えながら、SQLの解説では言葉だけの説明では限界があるし、全体で10話したとしても、PostgreSQLならではのことって3以下ぐらいにしかならないよなーとか思っていました。schooさんではこの夏、数回にわたりSQLやデータベース理論に関する授業が公開されていたそうなので、PostgreSQLに絞っていっても相当に重複するであろうという懸念もありました。<br />
それでも、SQLは学んだはずなのに、(むしろ普段から書いてるのに)得意とは言えない、思うようにパフォーマンスがでない、という相談は私も日々いただいているのです。特に、schooさんで対象としている学生の多くは「webアプリ開発者を目指す(または駆け出し)」とか「社会人数年目」だったりするので、ここにまだ学びの余地があると考えました。 <br />
データベースを使う人の立場で、<br />
<ul>
<li><b><span style="color: #3d85c6;">最初にこれを勉強しておけば苦労が減るだろうな</span></b></li>
<li><b><span style="color: #3d85c6;">何かあったときにググるために、脳内のインデックスを作れてるといいのにな</span></b></li>
</ul>
というゴールを設定して、広く浅く易しく、「RDBのことを勉強した気になれる」講座にしたいと思いました。こういうテーマでは、<b><span style="color: #3d85c6;">RDBが本来満たすべき領域を質実剛健に、しっかりとカバーしているPostgreSQLは最適</span></b>です。<br />
<br />
つまり、「RDBが本来満たすべき領域」のことをひっくるめて「データベース技術」としました。<br />
<br />
<br />
<h2>
<span style="color: orange;">■授業をつくってみて</span></h2>
「データベース技術」の中には、トランザクションのこともあるし、SQL言語のこともあるし、セキュリティのこと、バックアップのこと、いろいろあるでしょう。そしてそれらは、きちんと実装されているPostgreSQLにとっては当たり前のことだし、おそらく意識しなくてもある程度使うことはできてしまっていることでもあります。これらに光をあて、でも、難しさよりも、勉強した感を大事に、易しく扱う内容を目指しました。 <br />
<br />
さて、そんな感じで準備をしてきたのですが、 PostgreSQLを使う人(=アプリ開発者)にとって、RDBを知っているとどんなところが有利なのか、PostgreSQLならではのどういうところが便利なのか、そういう点をちゃんと紹介するのは、私にとっても普段から(DB管理者よりで、移行、障害対応やDBA教育をやっている)身近に扱う話題ではないので、とても勉強になりました。<br />
<br />
作っていると、 細かい言葉の意味だったり、他のDBのことが気になってきたり、図の細かいところが気になったりw それでいて、説明に最適な実行例を考えるのはめんどくさくなってみたり。いろいろ雑念が生まれてくるのですが、そういうのもだんだん楽しくなってきて、最終的には手抜きしない内容にできたと思います。<br />
仕事ではOpen Office、Libre Office慣れして数年やってきたのですが、Power Point on Windows10 対応(自分がw)したことも良かった点です。<br />
<br />
<h2>
<span style="color: orange;">■と、いうわけで。</span></h2>
そんなシルバーウィークを過ごして、今は資料を提出した喜びでこんなポエムを詠っているわけですが、せっかく作ったので<b><span style="color: #3d85c6;">いろんな人に見てもらいたい</span></b>し、<span style="background-color: #3d85c6;"><b><span style="background-color: white;"><span style="color: #3d85c6;">ツッコミどころがあったら指摘してもらってより良くしていきたい</span></span></b></span>し、良くなったものを今後もどこかで話したりして、<b><span style="color: #3d85c6;">PostgreSQLの普及、製品問わずRDBスキルの向上、Webアプリだけじゃなくていろんなシステムへの応用</span></b>など、いろんなところに少しでもお役立ちできたらなーと思っています。<br />
<br />
それでは、本番まであと数日、私も楽しみにしています! Anonymoushttp://www.blogger.com/profile/02234679274621415851noreply@blogger.com0tag:blogger.com,1999:blog-1760199393479360913.post-81702963738257104082016-09-10T23:00:00.000+09:002016-09-11T04:05:57.306+09:00第8回 PostgreSQLアンカンファレンスに参加しました<a href="http://pgunconf.connpass.com/event/37285/" target="_blank">PostgreSQLアンカンファレンス</a>に参加してきました。<br />
参加っていうか運営?これに関しては参加者気分もとてもありつつ、運営も楽しくやらせていただいているのです。何より日程が会場優先で、俺得になっていてもう幸せ☆<br />
<br />
<span id="goog_1618075336"></span><span id="goog_1618075337"></span><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkkjTcvwJ8Ay1wzXCMy1-6_0O_-LdhU2bA3wqTM1qMKYJTjyxj9XUt0hgW1mYW4PUvz1gWVPw5Gxymbt2cgYrmxJG3JCBxY2QJ0O5ggiKt3HpSsV135hUY_0sfFoeDEaAdAjJJALZbTJU/s1600/IMG_4958.JPG" imageanchor="1"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkkjTcvwJ8Ay1wzXCMy1-6_0O_-LdhU2bA3wqTM1qMKYJTjyxj9XUt0hgW1mYW4PUvz1gWVPw5Gxymbt2cgYrmxJG3JCBxY2QJ0O5ggiKt3HpSsV135hUY_0sfFoeDEaAdAjJJALZbTJU/s320/IMG_4958.JPG" width="240" /></a><br />
※ところでこのゾウの看板を<a href="http://kkida-galaxy.blogspot.jp/2016/09/DBLT2.html" target="_blank">連日つくっていたら</a>、急激に可愛く見えてきたんですがどっかの病気でしょうか?目つきが悪いとか良く言われているが、前から肯定的な気持ちでは見ていました。でもこんな気持ちになるなんて。<br />
<span id="goog_1618075336"></span><span id="goog_1618075337"></span><br />
<br />
<h2>
<span style="color: orange;">■PostgreSQLアンカンファレンスについて</span></h2>
<br />
<a href="http://pgunconf.connpass.com/" target="_blank">PostgreSQLアンカンファレンス</a>は、何が出るかは当日来てのお楽しみで、いろんな興味の範囲をそれぞれに持った人たちがPostgreSQLという共通点に導かれて集まり(大げさ?)、発表し、聞きあう場所です。<br />
<blockquote class="tr_bq">
「PostgreSQLについてしゃべりたいことがある、聞いてほしいことがある!」<br />
「PostgreSQLについて聞いてみたい、相談したい!」<br />
「PostgreSQLに興味があるのでとりあえず参加してみたい」</blockquote>
そんな、色んな人たちを受け入れてくれるイベントです。 <br />
今回はその<a href="http://pgunconf.connpass.com/event/37285/" target="_blank">PostgreSQLアンカンファレンスの第8回</a>でした。<br />
毎年秋はPostgreSQLの新バージョンがリリース目前で期待が高まっている時期であり、更に次のバージョンの機能デザインが決まり始めていたりで、かつもう少し後ろになるとITイベント目白押しになってしまうので、だいたいこの時期にやっている気がします。<br />
<br />
<h4>
<span style="color: #3d85c6;">1~2月</span></h4>
次バージョンで取り込む機能を決める数回のCommit Festを経て、PostgreSQL本体開発しているみなさまが燃えている時期。一番ホットな話が聞けたり<br />
<br />
<h4>
<span style="color: #3d85c6;">5~7月</span></h4>
新バージョンのα?βがでるか?ぐらいの時期で、つまりあらかた固まってきた新バージョンをいち早く試した人たちの発表が聞ける。仕事にしている身としてはとても勉強になる回<br />
<br />
<h4>
<span style="color: #3d85c6;">9~10月</span></h4>
今回のように、新バージョンのリリースが迫ってきて、そろそろユーザー目線の「新機能はこうやって使うといいよ」みたいな話が出てきたり。<br />
<br />
あとは一年を通して、実際にサービスで使っている方がシステム開発/運用/アップグレード/性能などの話題で経験談を話してくれたりしています。<br />
<br />
<br />
<h2>
<span style="color: orange;">■今日のセッション</span></h2>
<br />
どーん!<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjel_OiuvoowVt5qmXUdfMSZB_mnYvaNQ_6bVYjC5QnzaJQQJBBRXFY09rJHZJRF2QYW_vlH31V2JDKENr3SBtTvUrR-h-bcCEPZidNDxzPKi42y1TzZk3YEhDf8DoB49Cc8G5sDfrOTH0/s1600/IMG_4963.JPG" imageanchor="1"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjel_OiuvoowVt5qmXUdfMSZB_mnYvaNQ_6bVYjC5QnzaJQQJBBRXFY09rJHZJRF2QYW_vlH31V2JDKENr3SBtTvUrR-h-bcCEPZidNDxzPKi42y1TzZk3YEhDf8DoB49Cc8G5sDfrOTH0/s320/IMG_4963.JPG" width="240" /></a><br />
<br />
<span style="color: #3d85c6;">・PostgreSQLはグラフデータベースの夢を見るか(ぬこ@横浜さん)</span><br />
<blockquote class="tr_bq">
Neo4jをPostgreSQLから触る話。更新はロジデコ→JSON→Cypher→RESTで。参照はNeo4j_fdwで。 </blockquote>
<br />
<span style="color: #3d85c6;">・俺のキュー(っぽいもの) (@aoyagikouheiさん)</span><br />
<blockquote class="tr_bq">
PostgreSQL以外のミドルをいれてメンテしたくないので、キューっぽいデータ構造を自作した話。</blockquote>
<br />
<span style="color: #3d85c6;">・ポスグレとスクワットと私(永安さん)</span><br />
<blockquote class="tr_bq">
話題の健康法「30日スクワットチャレンジ」をPythonとかBlumixとかSoftlayerとかPostgreSQLでWebシステム化している話。そして懇親会2次会ではそこに秘められたアツい想い、黒い想いをたくさん聞けたのであった笑</blockquote>
<br />
<span style="color: #3d85c6;">・PostgreSQLを用いた動画検索エンジンMoovieおよびMoovie TEOのシステム概要(内山さん)</span><br />
※情報求む<br />
<br />
<span style="color: #3d85c6;">・PostgreSQLのエコシステム/Windowsでのチューニング/メモリ暴発 防止のヒント(綱川さん)</span><br />
<blockquote class="tr_bq">
諸事情あってmaumau名義で活動していたが表にでれる事になったとの自己紹介。開発者としてもだけど、自分的にはMLの救世主maumauさんにお目にかかれて感無量です。<br />
Windows環境では無意味な"update_process_title"パラメータをoffると性能がとても良くなる。<br />
ODBCドライバで全件フェッチする問題があるのでドライバの設定を見直すと良い。<br />
PostgreSQLが対応できるソフトウェアを調査し開発本家のMLに掲載している(→JPUGでも是非その活動を後押ししていきたい!と申し出たところ快く受け入れていただいた!)</blockquote>
<br />
<span style="color: #3d85c6;">・自動フェイルオーバー(澤田さん)</span><br />
<blockquote class="tr_bq">
PostgreSQL自身はレプリ構成にしても相手ノードの監視やフェイルオーバーの判断をしないが、それを作っている話?</blockquote>
※情報求む<br />
<br />
<span style="color: #3d85c6;">・CacooのPostgreSQLを9.3から9.5にアップグレードした話</span><br />
<blockquote class="tr_bq">
Webサービスで使っている3TBのデータベースクラスタを9.3から9.5にアップグレードした話。停止時間を短く、失敗時のリスクを軽くするオペレーションをちゃんと考えつつ、PostgreSQL的な手順に関して言えばpg_upgradeのマニュアル通りで上手く行きました!という報告。</blockquote>
※情報求む<br />
<br />
<span style="color: #3d85c6;">・PostgreSQLと他のDB(MySQL、Oracle)との違い※非技術的 (北山さん)</span><br />
<blockquote class="tr_bq">
いくつかのコミュニティに参加してきて、とか、PGEConsの活動について、など思うトコロをいろいろ。(懇親会でいろいろ話しすぎてどこまでがセッションの内容だったか忘れてしまったっっ・・不覚)</blockquote>
<br />
<span style="color: #3d85c6;">・pg_stats_reporterで読影会をやってみた(@masudakzさん)</span><br />
※情報求む<br />
<br />
<span style="color: #3d85c6;">・とあるサービスでのパフォーマンス障害とその対策を赤裸々に報告(桑田さん)</span><br />
※情報求む<br />
<br />
<span style="color: #3d85c6;">・9.6パラレルやってみたよ(喜田)</span><br />
<blockquote class="tr_bq">
集計系クエリ(DWHや夜間バッチ)で効果を期待される9.6の新機能「パラレルクエリ」を実際に近いベンチマークで試してみました、と言う話。<br />
PostgreSQLが昔から注目されるイチ要素であった「テーブル・パーティショニング」との組み合わせで、元々10分かかっていたクエリが7秒に、1時間かかっていたクエリが5分になった。やっぱOracleすごいね、という要素も多々見つかったが、使い方をそれなりにPostgreSQL向けに工夫すると同等の結果まで頑張れる!</blockquote>
<br />
<span style="color: #3d85c6;">・私のストレージ チョットカシコイ(海外さん)</span><br />
※情報求む <br />
<br />
<span style="color: #3d85c6;">・PostgreSQLでデータ分析 10の理由(永安さん)</span><br />
<blockquote class="tr_bq">
ユーザーの目線を考えると「データ分析したい!今ならどの技術が適してるんだろう?」という動機で言語なり製品を選ぶのであって、目的に合う事がわかればどのDBでもいいのだが、いろんな要素から今ならPostgreSQLを推すよ、と言う話。<br />
パラレルできるようになって分析クエリが早いだけじゃなくて、FDWでデータを取ってくるところができるとか、「データ分析」に必要とされるいろんな要素を満たせる。 </blockquote>
<br />
<span style="color: #3d85c6;">・FDW使える?(山田さん)</span><br />
※情報求む<br />
<br />
<span style="color: #3d85c6;">・PostGIS Bundleで循環セールスマン問題(TSP)(国府田さん)</span><br />
※情報求む<br />
<br />
<span style="color: #3d85c6;">・SSDハック(海外さん)</span><br />
※情報求む<br />
<br />
あれ、最後の方なんだか聞けてないな。。。<br />
それぞれ見つかり次第、資料をリンクしていくつもり。<br />
<br />
<br />
<h2>
<span style="color: orange;">■懇親会</span></h2>
<br />
上海ブギにて。ブギ様のマーボー丼はうますぎる。<br />
PostgreSQL界の人はtwitterしない問題<br />
若者をとりこむ策(若者とは?)<br />
今日のアンカンファレンスを思い出しながら、次の勉強会のネタ考案とか<br />
<br />
二次会は魚八にて。<br />
永安さんのスクワットアプリ開発秘話や、シンガポールでのイベント開催秘話をブラック永安が出てきていろいろ語っていただいた。がんばりたいと思った。 Anonymoushttp://www.blogger.com/profile/02234679274621415851noreply@blogger.com0tag:blogger.com,1999:blog-1760199393479360913.post-9273911428986806242016-09-09T23:00:00.000+09:002016-09-11T01:54:22.834+09:00Database Lounge Tokyo #2 に参加しました<a href="http://database-lounge-tokyo.connpass.com/event/37649/" target="_blank">Database Lounge Tokyo #2</a> に参加しました。<br />
今回はバックアップ回で、きっとメインのパネルディスカッションは壮絶な感じなんだろうなーと誰もが予感していたと思いますが、ネタとしては基本中の基本の範囲でカバーしておくべきでもあり、データベースに関わる人すべてが(少なくとも自分が触っているデータベースに関して)きちんと理解しているべき内容です。<br />
というわけで、弊社の新人ちゃんも誘って参加してみました。<br />
<br />
イベントの流れは、Lighting Talksがババッとあって、その後、バックアップ・リカバリ観点でのOracle DB、PostgreSQL、MySQLの比較の話と、それを肴にパネルディスカッション。<br />
イベントページで録画や発表資料が公開されると思うので、現時点では記憶を頼りにザザっと書いています。ゆるっと追記・修正していく予定。<br />
<br />
<h2>
<span style="color: orange;">■Lighting Talks</span></h2>
<br />
<h4>
<span style="color: #3d85c6;">・ 「差分、増分、デルタ(って何?) バックアップあれやこれや」 by @meijik</span></h4>
<br />
firebirdやMySQLでのバックアップ手法について。<br />
特に差分や増分というデータベース製品によって意味するところが異なるキーワードを解説されていました。今日の一発目として、基本のおさらいだったり、知らない人的には「ほー」っと言う感じ。アーカイブ(トランザクションログ)を適用する話がそもそも増分と呼ばれていたり、文化の違いを感じる。<br />
<br />
<h4>
<span style="color: #3d85c6;"><span style="background-color: white;">・「Postgresはグラフデータベースの夢を見るか?」 by @nuko_yokohama</span></span></h4>
<br />
グラフデータベース neo4j を PostgreSQL のインターフェース で扱っちゃう話。<br />
PostgreSQLではロジカルデコーディングという、論理WALを吐くことができるので、PostgreSQLに対して実行したクエリを別のデータベースに伝えて実行させることが可能である。それを受信する側の機構を自作する必要があるが。今回は論理WALをjson型に変換→Cypherクエリ→REST APIでneo4jに突っ込む。<br />
データを参照する方はneo4j_fdwで。PostgreSQLはForeign Data Wrapperという、外部データソースからデータを取ってくる(実装によっては更新も可)基盤があるが、データソース、今回で言うとNeo4jに対応したものを作らないといけない。と思ったら、以前にぬこさん自身が作ったものが公式Wikiにまで掲載されいている!<br />
<br />
<h4>
<span style="color: #3d85c6;">・「An intelligent storage?」 by @kkaiga</span></h4>
<br />
実は運営などバタバタしていて全然聞けなかった。。。<br />
GPUの超メニーコアを使った高速化をやり続けている海外さんの取り組み。フラッシュ上に配置したデータを、CPUがちょろちょろGPUに渡しているとCPUがボトルネックになってしまうので、直接渡せると嬉しいよね!という話(だったと思う。資料が公開されたらちゃんと読む。)<br />
<br />
<h4>
<span style="color: #3d85c6;"> ・「ポスグレのバックアップでやらかした話 (˚இ˚) 」 by @kkkida_twtr</span></h4>
<br />
僭越ながら発表させていただきました。弊社では、取り扱う製品を自分たちで使ってみて、酸いも甘いも経験して、ちゃんとノウハウを得てからサービス提供してるんですよ!という美しいお話でした。(ウソ)<br />
バックアップ取得先の容量管理とか、シェルのロジックとかの問題で、消し込みがうまく回らずPostgreSQLのアーカイブ領域が埋まる→新規のWALが書けずにDB停止、というのを実際にやっちゃうと運用担当者(俺)がパニくるんですよ。とか。VACUUM FULLの後にVACUUMやってるから意味無くね?って言ってコメントアウトしてみたらANALYZE止めちゃって本来5分のクエリが2時間かかったとか。そんな情けない話でも共有してみんなを救いたい!っていう健気な俺ちゃんのゆるふわな発表でした。<br />
<br />
<h2>
<span style="color: orange;">■メインテーマ</span></h2>
<br />
<h4>
<span style="color: #3d85c6;">・ 「バックアップと障害復旧から考えるOracle Database, MySQL, PostgreSQLの違い」 @wrcsus4</span></h4>
<br />
実はお仕事などバタバタしていてあんまり聞けなかった。。。<br />
各データベースのオンラインバンクアップ(アーカイブ運用とか、ポスグレ界でいうところのPITR前提の取り方)について比較し、酔った勢いでMySQLを変わり者と評する感じの流れw。と思いきや、早々にマサカリが飛びかっていることをtwitterで知りあわてて会場に戻りましたw<br />
途中をいろいろ端折って抱いたイメージは、MySQLはOra、Posの当たり前が通用しないけど、論理バックアップにログを適用して最新に追いつけるよ?的な?それはそれで便利そうではある。(取る人は楽ちん、戻す人は大変そうだけど。)<br />
これも資料公開されたらちゃんと勉強する。と思ったけど↑は本題ではないようだwマサカリおそろしいwww<br />
<br />
<h4>
<span style="color: #3d85c6;">・ディスカッション@wrcsus4 @yoku0825 @kasa_zip @kumagi</span></h4>
<br />
テーマが5個ぐらいあったけどメモれず。こういう用途でどんな方法でバックアップ取るか、どう戻すか、みたいなパターンがいくつか。<br />
印象的だったのは、MySQLはスレーブから戻すケースが多くて、「死んだノードで整合性を保った状態で復旧せよ」みたいな問題を考えるほうが珍しいということ。<br />
あとは、PostgeSQLで長年疑問に思っていた、「トランザクション位置を指定したPITRって需要どんだけあるんだろうか?」に対して「普通xid記録してないよね。」ということが分かった。収穫。<br />
<br />
全体的に、新たに知ったことや、へーっと思ったことは記憶に残ってるのでMySQLのメモが多いが、PostgreSQLやOracleについてももちろんたくさん話がでていました。総じて両者は似ている。フラッシュバック憧れる。(どれだけ使うかは別として。)<br />
そして@kumagiさんの容赦ない切り口。いろんな経験の人がしゃべってるの面白いなーと思いました。 <br />
<br />
<br />
<h2>
<span style="color: orange;">■その他</span></h2>
今回は、弊社で会場提供して、その活動報告を弊社の広報ブログで取り上げる予定です。<br />
そのために皆さんにも写真撮影にご協力いただきました。きっとキャッキャウフフした感じが撮れていると思いますので、記事の公開を楽しみにしておいてください。 <br />
<br />
次のテーマは「トランザクション」とのこと。<br />
学術的な方面の人たちがフィーバーしてそうで今から楽しみです。Anonymoushttp://www.blogger.com/profile/02234679274621415851noreply@blogger.com0tag:blogger.com,1999:blog-1760199393479360913.post-11275891823470697792016-08-10T22:00:00.000+09:002016-08-11T02:27:56.017+09:00みんなのPython勉強会#15 に参加しました<a href="http://startpython.connpass.com/event/35028/" target="_blank">みんなのPython勉強会#15</a>に参加しました。<br />
<br />
Pythonを書いたのは昨日が初めてですが。。。いろいろ教わりたい立場でありながら、お役に立てることもあろうと思って、のっけからLTなんかもさせていただきました。<br />
<iframe src="https://www.slideshare.net/kkida85/slideshelf" width="490px" height="470px" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:none;" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe>
<br />
<br />
自分なりの今のワクワクした気持ち、疑問、Pythonという言語にもっているイメージ、そして期待をふわっと詰め込んだ感じです。PostgreSQL愛とPythonへの期待が少しでも伝わると嬉しいです。笑
<br />
<br />
<h2>
<span style="color: orange;">■参加してみて</span></h2>
率直に言ってとても楽しかったです。<br />
<br />
運営のみなさま、会場提供やビアバッシュを開催してくださったであろうクリーク・アンド・リバー様、リーディング・エッジ様ありがとうございました!!<br />
<br />
これからは、PostgreSQLの能力をちゃんと活かせる(試せる)よう、自分でコード書いたりしたいなーと思っていて、そのために知人のススメもあり選んだのが自分の場合Pythonでした。今日のセッションでも述べられていた「意思をもってPythonを選んだ大人」です。まさに。笑<br />
今日LTでお話させていただいたように、PostgreSQLとPythonはとても相性がよい、これからのデータ分析とかの用途で絶対活きてくる組合せだと思っています。<br />
会社も近所なので是非また参加させていただきたいと思いました。<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/02234679274621415851noreply@blogger.com0tag:blogger.com,1999:blog-1760199393479360913.post-8600209747105197742016-08-08T21:09:00.000+09:002016-08-08T21:09:32.480+09:00sysbench 0.5 で PostgreSQL 9.5 のベンチマーク!環境構築編<a href="https://github.com/akopytov/sysbench" target="_blank">sysbench</a>はCPU、メモリ、ディスクなどに負荷をかけてベンチマークをとれるツールで、標準ではMySQLに対応したOLTP系の負荷掛けにも対応しています。<br />
<br />
<h2>
<span style="color: orange;">■本投稿の目的 </span></h2>
最新(2016年8月8日現在)のsysbench 0.5 では、ネットに出回ってる情報と一部異なる手順であったのと、PostgreSQLで使用するにはマニュアルが無いなど、ちょっとしたつまづきがあったのでメモしておきます。<br />
<br />
<h2>
<span style="color: orange;">■環境</span></h2>
何度か本ブログで触れているCentOS 7.2環境、rpmでインストールしたPostgreSQL 9.5を使用します。<br />
<br />
PostgreSQLインストール先(バイナリ配置先) /usr/pgsql-9.5/bin<br />
PostgreSQL実行ユーザのホーム /var/lib/pgsql<br />
PostgreSQLのデータディレクトリ($PGDATA) /var/lib/pgsql/9.5/data<br />
<br />
PostgreSQLを起動しておきます。
<br />
<pre class="console"># systemctl start postgresql-9.5.service
</pre>
<br />
<h2>
<span style="color: orange;">■sysbenchの入手</span></h2>
<br />
入手<br />
<a href="https://github.com/akopytov/sysbench">https://github.com/akopytov/sysbench</a><br />
<br />
rootユーザで適当なディレクトリに配置、解凍しておきました。
<br />
<pre class="console"># cd /tmp
# unzip sysbench-0.5.zip
</pre>
<br />
<h2>
<span style="color: orange;">■sysbenchのインストール</span></h2>
sysbenchのマニュアルにはMySQL対応についてしか書かれていないため、この手順で少々試行錯誤しました。
<br />
<pre class="console"># cd sysbench-0.5/
# ./autogen.sh
# ./configure --prefix=/usr/sysbench \
> --without-mysql \
> --with-pgsql=/usr/pgsql-9.5 \
> --with-pgsql-includes=/usr/pgsql-9.5/include \
> --with-pgsql-libs=/usr/pgsql-9.5/lib
# make
</pre>
<br />
成功すると、以下の状態になっていることを確認<br />
<ul>
<li>/tmp/sysbench-0.5/sysbench配下に、sysbenchコマンドが作成される。</li>
<li>/tmp/sysbench-0.5/sysbench/drivers/pgsql 配下に、ドライバモジュールが作成される。
</li>
</ul>
<pre class="console"># ls /tmp/sysbench-0.5/sysbench/drivers/pgsql
Makefile Makefile.am Makefile.in drv_pgsql.c libsbpgsql.a libsbpgsql_a-drv_pgsql.o
</pre>
<br />
なお、実行ユーザでPATHを通しておくと便利なので、今回はpostgresユーザで環境変数を設定しておきます。
<br />
<pre class="console"># su - postgres
$ vi .bash_profile
-----
export PATH=/tmp/sysbench-0.5/sysbench:.:$PATH
-----
$ source .bash_profile
</pre>
<h2>
</h2>
<h2>
<span style="color: orange;">■実行前のPostgreSQL側の作業</span></h2>
sysbenchでは、デフォルトでlocalhost、sbtestデータベース、sbtestユーザ、5432ポートでPostgreSQLにアクセスします。そのつもりでPostgreSQL側の環境を準備します。
<br />
<pre class="console">$ psql
postgres=# CREATE ROLE sbuser login password 'sbpass';
CREATE ROLE
postgres=# CREATE DATABASE sbdb OWNER sbuser;
CREATE DATABASE
postgres=# \q
</pre>
今回はいろいろ試すべく、データベース名、ユーザ名、パスワードそれぞれ変えておきました。 <br />
<br />
<h2>
<span style="color: orange;">■sysbenchの実行</span></h2>
oltpベンチマークの実行では、sysbenc 0.4までと違って、testモードを以下のように指定します。<br />
sysbench/tests/db/ディレクトリを見ると、ベンチマークのパターンごとにluaファイルが用意されているので、これを指定しています。<br />
<br />
まずは、prepareでテーブル等の準備をします。
<br />
<pre class="console">$ sysbench --test=/tmp/sysbench-0.5/sysbench/tests/db/oltp.lua \
> --db-driver=pgsql \
> --pgsql-user=sbuser --pgsql-password=sbpass --pgsql-db=sbdb \
> prepare
sysbench 0.5: multi-threaded system evaluation benchmark
Creating table 'sbtest1'...
Inserting 10000 records into 'sbtest1'
</pre>
<br />
つづいてベンチマークの取得です。
<br />
<pre class="console">$ sysbench --test=/tmp/sysbench-0.5/sysbench/tests/db/oltp.lua \
> --db-driver=pgsql \
> --pgsql-user=sbuser --pgsql-password=sbpass --pgsql-db=sbdb \
> run
sysbench 0.5: multi-threaded system evaluation benchmark
Running the test with following options:
Number of threads: 1
Random number generator seed is 0 and will be ignored
Initializing worker threads...
Threads started!
OLTP test statistics:
queries performed:
read: 140000
write: 40000
other: 20000
total: 200000
transactions: 10000 (96.53 per sec.)
read/write requests: 180000 (1737.48 per sec.)
other operations: 20000 (193.05 per sec.)
ignored errors: 0 (0.00 per sec.)
reconnects: 0 (0.00 per sec.)
General statistics:
total time: 103.5983s
total number of events: 10000
total time taken by event execution: 103.5635s
response time:
min: 4.04ms
avg: 10.36ms
max: 23.20ms
approx. 95 percentile: 10.97ms
Threads fairness:
events (avg/stddev): 10000.0000/0.00
execution time (avg/stddev): 103.5635/0.00
</pre>
実行時のオプションでは、OLTPの並列度や実行回数などを調整可能です。
その辺の実行方法や、結果の見方は別の機会に。
Anonymoushttp://www.blogger.com/profile/02234679274621415851noreply@blogger.com0tag:blogger.com,1999:blog-1760199393479360913.post-7685094197907654912016-07-27T23:00:00.000+09:002016-07-29T18:05:01.298+09:00Database Lounge Tokyo #1 に参加しました巷でウワサのキャンセル待ち続出イベント<a href="http://database-lounge-tokyo.connpass.com/event/35318/" target="_blank">Database Lounge Tokyo #1</a>に参加してきました。ありがたいことに抽選あたりました。<br />
<br />
感想は一言で言うと「楽しかったけど脳は疲労困憊!」です。<br />
全編通して「ゆるふわ」の定義を再確認したほうが良さそうなゆるふわっぷりに、登壇者の御三方も、参加者もみんな楽しそうでした!<br />
(ひそかに流行らせたい「きゃっきゃうふふ」も同種のものだろうか。きゃっきゃうふふ専門家の意見が求められるところである。あと、一緒にいった会社の後輩ちゃんが「次は本当のゆるふわを見せてやる!」と意気込んでいたw)<br />
<br />
<h2>
<span style="color: orange;">■イベント情報まとめ</span></h2>
セッション資料や動画公開されているので、内容を知りたい人は是非<a href="http://database-lounge-tokyo.connpass.com/event/35318/" target="_blank">こちら</a>を見てください。 <br />
資料や動画が公開されています。勉強会の趣旨とかは<a href="http://database-lounge-tokyo.connpass.com/" target="_blank">コチラ</a>のグループページへ。<br />
<br />
ツイッターまとめました。<a href="http://togetter.com/li/1005895" target="_blank">Database Lounge Tokyo#1 ツイートまとめ</a><br />
(誰でも編集可能にしたので、漏れてたら追加してください)<br />
<br />
資料<br />
<a href="http://www.slideshare.net/nippondanji/mysql-64455514" target="_blank">MySQLアーキテクチャ図解講座</a>(奥野 幹也氏)<br />
<a href="http://www.slideshare.net/kaigai/postgresql-64441503" target="_blank">並列クエリを実行するPostgreSQLのアーキテクチャ</a>(海外 浩平氏)<br />
<a href="http://www.slideshare.net/kumagi/ss-64459138" target="_blank">トランザクションの設計と進化</a>(熊崎 宏樹氏)<br />
<br />
<h2>
<span style="color: orange;">■セッション</span></h2>
ゆるふわしたセッションたちの「感想文」です。内容が知りたい人は動画をみてください(キリッ!)<br />
<br />
<h3>
<span style="color: #3d85c6;">・MySQLアーキテクチャ図解講座(奥野 幹也氏) </span></h3>
奥野さんの発表を生で聞くのは初めて。多岐にわたるMySQLの基礎~新機能までを、知らない人向けに、1時間足らずで、次々話していくんだけど、なぜかスッと伝わってくる感じであった。<br />
実況ツイートしてたけど、各所で話されてることが明確なのでなんか書きやすかったです。<br />
こうやってMySQL触った事ないマンだけど知った気になっていくw<br />
<br />
<h3>
<span style="color: #3d85c6;">・並列クエリを実行するPostgreSQLのアーキテクチャ(海外 浩平氏)</span></h3>
海外さんも一枚かんでた最新機能「パラレルクエリ」を中心にPostgreSQLのアーキテクチャを語る。<br />
ポスグレの内部実装の話は何度も聞いているのでついていけたが、実運用する上では1㍉も知らなくて良い話(失礼w)であった。いや、ほんとは30%ぐらいは知っておいて欲しい。<br />
けどけど、このセッションが難しかったかもしれないけど、ポスグレ使うのは簡単なんですよ!パラレルクエリも簡単に使えるようになるんですよ、なんと無料で!●racle EEオプションに何百万円、何千万円とかけた人だけ使えた機能が、やっとポスグレでも追い付いてきたんですよ!<br />
<br />
<h3>
<span style="color: #3d85c6;">・トランザクションの設計と進化(熊崎 宏樹氏)</span></h3>
脳みそがパニック。(ダイイングメッセージばりに短いメモだけとれたので、勉強してから出直します。)<br />
<br />
えーっと、(恐る恐るまとめると、)トランザクションが守るべき原則(ACID)があって、それを実現しようとすると、今まではRDBみたいな実装、つまりロックで順序を決めて、定期的に変更履歴を書くことでやってきた。しかしそんなのはメモリが貧弱だった時代のものであって、今のハードにあったトランザクションができるじゃないか、という学術レベルの話。<br />
TPC-Cベンチで現公式記録を数倍?数十倍?ぐらい塗り替えるスコアをたたき出す半面、必ず全てのクエリが40msかかる、レイテンシを犠牲にして並列実行性をめちゃくちゃ高めた方式である。<br />
商用製品は2020年ごろには出てくるんじゃないか、とのこと。<br />
<br />
<h2>
<span style="color: orange;">■その他</span></h2>
今日の会場はインサイトテクノロジー様に提供いただき、飲み物もビールからソフドリ各種まで振舞っていただきました。ありがとうございました!<br />
インサイトさんの北海道(と言ってた?) と中継で繋がっており、たくさんの方が画面の向こうで見ていたのは印象的でした。上記の飲み物の件といい、この実行力、どなただろうと思ったら社長さんがガッツリ興味を持たれていたとのこと。うーんなるほど。<br />
と思ったらセッション中の講師(主に熊崎さん) に絡む絡むw会場は爆笑(&ちょっと苦笑)でした。<br />
<br />
さて、第二回はバックアップをエサにゆるふわしてくださる方々がいらっしゃるそうです。<br />
9月頃開催予定だそうです! <br />
<br />
以上<br />
<br />Anonymoushttp://www.blogger.com/profile/02234679274621415851noreply@blogger.com0tag:blogger.com,1999:blog-1760199393479360913.post-4051607917262577422016-07-23T22:57:00.000+09:002016-07-28T22:57:56.642+09:00CPI MEGA MIX 2016に参加しました<a href="http://www.shared-blog.kddi-web.com/mega-mix2016/" target="_blank">CPI MEGA MIX 2016</a>に参加してきました。<br />
<br />
レンタルサーバーのCPIが中心となり、そのエバンジェリスト8人からWeb 制作に役立つ情報発信ありの、Web 制作者が交流するイベントです。Web製作者じゃないけど紹介いただき興味を持ったので参加してきました。<br />
<br />
体調不良でその後のみなさまの動きを追えてなかったのと、ブログ書くのも遅くなってしまいましたが。<br />
<br />
<h2>
<span style="color: orange;">■参加の経緯と目的</span></h2>
<a href="http://kkida-galaxy.blogspot.jp/2016/07/css-nite-lp46.html" target="_blank">前回</a>参加したCSS Niteの懇親会で知り合った方が、本イベントに関わっているとのことで紹介いただき、興味を持ったため、キャンセル待ち登録して空きが出たので参加。(というか事前に一言添えていただいて、飛び入り参加歓迎と快く受け入れていただけた!)<br />
データベースがどんな人たちに使われ、課題を孕んでいるのか、その課題はPostgreSQLで解決できるのか、DB目線でどう解決できるか。<br />
<br />
<blockquote class="tr_bq">
PostgreSQL<br />
オープンソースのデータベースで、信頼性や複雑なクエリに強いことが特徴。<br />
年々高機能化、高性能化しており、業務系ではOracleに取って代わる存在として話題になっているが、Web界では多くのCMSが採用してるMySQLにまだまだ遠く及ばない。<br />
読み方は「ぽすとぐれすきゅーえる」、略すと「ポスグレ」「ポストグレス」って感じ。</blockquote>
<br />
自分と違う技術者のクラスタにあって実感したいというのがあって、今回もそんな話を1つでも聞けることを期待しつつ、あとは登壇者の一人は知っている方、もう一人は知人の知人だったのでご挨拶もしたいなと。<br />
<br />
<h2>
<span style="color: orange;">■イベント全体</span></h2>
イベントは半日のセミナーと、裏ではハンズオンをやっていました。 会場は株式会社 KDDI ウェブコミュニケーションズさんオフィスのオープンスペース的なところで、椅子が100ほど並んでいました。一番後ろに座ったのですが、プロジェクターの高さの関係か、非常に見やすかったのが良かったです。空調はちょっとキツカッタ(後から判明したのですが私が勝手に寒かったのかも。帰宅後から高熱がでたので。ちなみに感染しない系だったので当日絡んだ方も、ご安心を。)<br />
私は所用で遅れて参加、セミナー2コマ目から、最後の懇親会まで参加しました。<br />
<br />
<h2>
<span style="color: orange;">■セッション</span></h2>
6セッション+座談会があり、私は遅れて参加したので3つめから。<br />
<br />
<h3>
<span style="color: #3d85c6;">WebSocket を介してデバイスを利用する Web システム構築術(大月 茂樹氏)</span></h3>
サーバとクライアントのコネクション確立後、そのコネクション上で専用のプロトコルを用いて双方向通信(サーバーからのプッシュ等)が可能なWebSocket技術の応用でした。<br />
PC向けの非接触ICカードリーダ/ライター(SONY PaSoRi)を用いてNFC対応デバイス/ICカードをかざすと、その固有IDを読み取る.Netアプリケーションのデモ、さらにその読み取った情報をWebSocketを介してブラウザから見る(つまり、Webサイトに表示)するサンプルが紹介されました。<br />
NFCに関するわりと詳しい詳細もあり、この1コマでその技術で何ができるかがちゃんとイメージでき、「知っているだけで、あとは工夫次第で難しいことがクリアできる」 ことをお話されていました。<br />
<br />
<h3>
<span style="color: #3d85c6;">協業プロジェクトにおけるコミュニケーション設計ケーススタディー(古川 勝也氏)</span></h3>
ITエンジニア+料理研究ユニット古川家(KOGAWA-K)として、またローカル雑誌の編集部としてマルチに活躍されている古川さん。イベント会場でのコラボ弁当の出展では、販促に客層を考慮したInstagramの活用を、雑誌の作成ではメンバーの物理的な距離や世代間のコミュニケーション手段の格差を埋めるタスク管理・スケジュール管理をいかに浸透させたか、と言う話でした。<br />
例えば、スマホのクラウド連携機能とか、Googleカレンダーの共有は、メンバーの知識に歩み寄って使えるようにしてあげることで、煩雑さを無くし便利さを実感してもらい浸透した。Instagramの活用では、若い女性から出てきた案を形にすべく、IFTTTで実装。<br />
各コミュニティにマッチしたやり方があり、ちゃんと使ってもらえるようなアプローチを考えることが成功のポイントになるとのことでした。<br />
<br />
<h3>
<span style="color: #3d85c6;">コミュニティがあなたを強くする~事例に学ぶコミュニティというエコシステムの活用術~ (江頭 竜二氏)</span></h3>
純国産CMSのbaserCMSの作成、コミュニティ運営をされている、そしてそれを中心としたWeb開発会社キャッチアップの社長をされている江頭さん。江頭さんとはPostgreSQLつながりでお話したことがあり、今日はPostgreSQLのコミュニティの発展のために来たようなところもあるので、とても興味深い内容でした。ITコミュニティが早くから活発であった福岡で、どんなコミュニティの変遷があったか、どんな良い事があったかと言う話でした。<br />
人と人のつながり・助け合い、言いだしっぺがやる文化(そしてやった人が結局一番成長できる)、無茶ぶり、飲み会 など!(ざっくりw)そして自虐ネタがおもしろすぎた。<br />
そして秋にbaserCMSの新バージョンが出る、CPIレンタルサーバーにも乗るよ、という発表がありました。PostgreSQLの回し者としては嬉しい話です。触ってみたいです。<br />
<br />
<h3>
<span style="color: #3d85c6;">クラウドデータベースで業務効率化と、安全な Web サイト運用術(たにぐち まこと氏)</span></h3>
世にデータベースはいろいろあるが、簡単・安全なデータベースがつかえるサイボウズのkintoneでできることが紹介されました。<br />
「簡単」とは、 インターフェース込みで提供されるサービスなのでクエリを書かずに簡単なwebアプリ向けぐらいのスキーマが作れる、データの格納・取り出しができる、ジョインっぽいことも当然できちゃう。<br />
「安全」とは、自身のWebサイトで収集した個人情報をどこに保管するかと言う話で、ローカルに持つよりクラウドに置くのが安全。平文メールで送るよりもSSL通信でクラウドに連携する方が安全。<br />
AWSのRDSのようなクラウドデータベースを想像すると、簡単さと引き換えにクエリによる自由度や性能は犠牲にしているようで、目的に応じてマッチしたら非常に良い、という印象でした。<br />
<br />
<h3>
<span style="color: #3d85c6;">座談会 2016年上期 Web 業界ニュース~トレンドから未来予測しよう~</span></h3>
LINEやFacebookAPIが公開されさらにコミュニケーションの幅が広がりそう(特にエンジニアにとって、自サービスとLINEの連携的な意味で。)な話とか、古今東西のデザイナー論をまとめたサイトが公開された話とか、ポケモンGOとか、その他、全10トピックぐらい。<br />
総括は、意外とIoTなかったなー、けどIoTもあるよなー的な感じ(?)ちょっとボーッとしてましたごめんなさい。(言い訳するとこの辺が高熱のピークだったんだと思う。)<br />
<br />
<h2>
<span style="color: orange;">■懇親会</span></h2>
世界のクラフトビールで乾杯、プレゼントくじ引きがあたりまくる、メイン料理はタコスとチリコンカン、とてもウマかったです。<br />
私自身は参加に至る経緯が紹介であったこともあり、主催の阿部さんを始め、なんかいろんな方とご挨拶させていただき、セッションの質問なり、データベースのこと、Webのこと、知人のことなどなどいろいろ話をさせていただきました。<br />
参加者の中にはOracleの業務システムを置き換える先を探しているという、まさに私が会うべくして会った様な方もいて、とても参加した甲斐のある懇親会でした。<br />
これを機に自分もレンタルサーバーで遊んでみたり、データベースの普及、コミュニティの活性化に一役買えたらなと思いました。(もちろん今もその活動をしてるんだけど。いい刺激になりました。)<br />
<br />
以上Anonymoushttp://www.blogger.com/profile/02234679274621415851noreply@blogger.com0tag:blogger.com,1999:blog-1760199393479360913.post-10342535379658079672016-07-18T01:41:00.000+09:002016-07-19T02:07:28.858+09:00CSS Nite「ビジュアル・ドリブンのデザイン」に参加しましたCSS Nite <a href="http://cssnite.jp/lp/lp46/reprise.html" target="_blank">LP46「ビジュアル・ドリブンのデザイン」再演版</a> に参加してきました。<br />
<a href="http://togetter.com/li/1000698" target="_blank">tweetまとめ</a>られてました。 自分もわりとつぶやきました。(実況とは程遠い、私の目線でのつぶやきなので意味があるかは謎い)<br />
<br />
とても多くの学び、今後も大切にさせていただきたい出会いがありましたが、それはセミナーの本筋とは関係ないところで、参加レポートと言ってもここで多くを語るべき内容ではないというのが正直なところですが。<br />
<br />
<h2>
<span style="color: orange;">■参加の目的</span></h2>
CSS Niteには初参加で、デザイン寄りの畑違いの内容であることはわかっていたのですが、サーバーサイドのエンジニアとして、あと<a href="http://www.postgresql.jp/" target="_blank">日本PostgreSQLユーザ会</a>の一員として、上の層を担っている人たちの課題、データベースを知ってれば解決できるかもしれないテーマが眠っていないか探りたいと思ってセッション+懇親会に申し込みました。<br />
<br />
結果は期待通りで、データベース層ではデザインの領分と直接的なつながりは無さそうであると。<br />
しかし、CMSは日常的に触るのでデータベースの存在ぐらいは意識する方、上から下までWebサービス全般を担う方、地方での勉強会需要など、皆さんの話を聞くことができ、また、私の話にも耳を傾けていただき、今回をきっかけに人とつながれたことは(もちろんそれを狙ってはいたのですが)予想をはるかに超える収穫になりました。<br />
<br />
<br />
<h2>
<span style="color: orange;">■セッションのこと</span></h2>
どのセッションも、デザインの専門家としていろいろお話していただいて、デザイナーさんの領域がイメージできたというところが今回の総括的な収穫になりました。<br />
<br />
普段サーバーしか触らない私の目線からすると、とあるWebサービスで、ユーザが触れるUIの部分、そこから入力を受け取って動作するプログラムの領域、やっとそここら必要があればデータにアクセスしにくるわけで、上の層って誰がどう作ってるんだろうと(一人でWebサービス全部作っちゃうような知人はいるのでw)仕事の領域はどうなってるんだろうという、そんなところがちょっと見えてきました。<br />
<br />
で、会場で書いたアンケートがそのまま参加メモというか感想文になってたので、それをそのまま写メって帰ってきました(笑)。以下はその程度の感想文です。セッションの受講レポートが見たい方は別で調べてくださいw <br />
<br />
<h3>
<span style="color: #6fa8dc;">・わずかな工夫で劇的に変わるデザインの対話術(長谷川 恭久氏)</span></h3>
自分が作るデザインが人に伝わるようにどう扱うか(解説する、会話する、意見を求める)という話で、素人目線でも大いに納得でした。<br />
素人からすると、デザイナーさんから出てきた時点で見栄えとしては劇的に違うので頷いてしまう場合が多い。しかしなぜその色なのか、なぜその配置なのか、ぶっちゃけその必然性には全く思考が及んでいませんが、それが「好みに合わない」場合にデザイナーさんのこだわりなのか、モノ申して良いポイントなのか判断しづらかったり、でもこちらの根拠は好みかどうかだけだし、で、製品プロモーション的には意味のない議論になってしまうとか。<br />
ちゃんと会話ができ、必然性を説明いただけるという点こそ、プロと素人の違いになるのかなと思いました。 (素人=イラレ、フォトショとかのツールは使えるちょっとセンスのある人)<br />
<br />
<h3>
<span style="color: #6fa8dc;">・スマホアプリにおけるUIのトレンドと、動的デザインの重要性~テクニカルクリエイターが担うサービス開発の今後(佐藤 洋介氏)~</span></h3>
私の中で注目セッションその1。<br />
「テクニカルクリエイター」とはデザイナー、プログラマーのどの領域を担うのか。(それがサーバーサイドまで意識するようなエンジニアの領域と関わるのか、が注目していたポイント。)<br />
聞くと、動的なUIを実現するようなツールが増えてきて、デザイナーでも自分でプロトタイプを作って動かせるようになってきた。プログラム的な制約がわかってデザインレビューを進めないといけないというように、デザイナーとエンジニアの垣根を低くしていくような取り組みであった。と同時に、やはり業務は分担されていて、サーバーサイドを意識するのはエンジニアだなというのがイメージできてきました。<br />
<br />
<h3>
<span style="color: #6fa8dc;">・こだわりを実現するためのデータを介したコミュニケーション(北村 崇氏)</span></h3>
私の中で注目セッションその2<br />
データとはデータベースか。例えばデザイナー側でWebサービスのレスポンスまで意識してデータ層のことを考えるの?!などと思って受講しましたが、「データ=入稿データ」のお話しでした。<br />
入稿データのレイヤにわかりやすい名前をつけるとか(ソースコードにコメント書くとかに似てる?!)普通に仕事をするうえで、自分の成果物を次の工程で待っている人に配慮した仕事をしましょうという話で、それはそれは、デザインじゃなくとも意識しないといけないよなーと思いました。<br />
<br />
<h3>
<span style="color: #6fa8dc;">・クリエイティブ・ディレクション~リアルダメ出しから発掘するデザインのヒント~(李 優未氏)</span></h3>
より良いアウトプットに近づけるための仕事の進め方、育成の方法という話。実例は素人目にはどれもよく見えてしまってあんまりビフォーアフターの差がわからなかったですが、本題は大いに納得でした。<br />
ステークホルダーの意見を求める場をつくりましょうとか、そのために意見しやすいフォーマットでだしてもらいましょうとか(スマホUIの例ならスマホの幅で縦長に出力した短冊型でWebサイトを印刷して付箋貼っていってもらう)、この辺は一本目の長谷川氏の会話しなさいという話と重なる印象でした。部下の育成なら、その人のレベルに合わせた指摘のやり方をするとか。正解がないもの(だけど失敗はある、と言えば良いのか)を正しく教えていくための方法は難しそうだが大事であると思いました。<br />
<br />
<h3>
<span style="color: #6fa8dc;">・エディトリアルとウェブ、コンテンツファーストでつながるビジュアルドリブン(筒井 美希氏、関口 裕氏)</span></h3>
雑誌(≒エディトリアル)出身の同期お二人組とのこと。トーク形式で進めつつ、雑誌とWebの違いあるある、結局のところ両者の違いはなにか、共通するところは何かを語っていった。<br />
で、コンテンツに合わせて、書式をはじめに決める(WebでいうところのHTMLとCSSの分離)場合もあれば、フリーフォーマット?で各ページごとに適切な配置を考えるケースもある。後者は従来エディトリアルとされてきたような部分だが、Webでもそれはありえるぞと。(エディトリアルという初見の単語だったので、どういうイメージで使われているかとかよくわかんなかったけど。)<br />
これは、スライド作成で使える話ではあるかもしれない。いつもの「タイトル、本文数行、図」みたいな構造化してるやつと、1スライドにどーんと数字がでてきたりするスタイルとの使い分け。みたいな。なんか考えたい。<br />
<br />
<h3>
<span style="color: #6fa8dc;">・築城10年、落城3日。こだわりあるWebデザイン、やるからには本気で良いものを!(中川直樹氏)</span></h3>
デザインに依頼者の意図を余すところなく取り込むためのやりかた。<br />
お願いする側としては、近くて遠い(表現したい自社のイメージはあるのかもしれないがそれを伝えられなくてあきらめる?結局そのイメージって自社内ですら共有できてる?)話でした。<br />
製品販促の施策とかは考えることがよくあるので、デザインでその一端を担うところをちゃんと考えると効果ありそうかもと思いました。<br />
<br />
<h3>
<span style="color: #6fa8dc;">・クロージングトーク:PVを稼ぐグラフィックの作り方(矢野りん氏)</span></h3>
PV=拡散された数×クリック率でクリック率を上げるところでデザインが威力を発揮する話。具体的には写真がSNSによってどう切り抜かれるか知って、それに合わせた画像を用意せよ、等。<br />
これは素人目にも結果が理解しやすく、写真の切り抜きとか撮影の時のテクニックでも使えそうなので 自分でUPする写真なんかでも気にしてみようと思いました。<br />
<br />
<h2>
<span style="color: orange;">■会全体についてや懇親会のこと</span></h2>
イベント全体を通して、会話を生むとか、初めての人にも優しい、けどリピーターとか全体的には良く見知った人たちの集い、その両立をうまく実現しているようでした。<br />
<br />
昼に会場に到着すると、広い部屋に広々とスペースが取れるよう机が配置され、うーんさすが有償イベントと言いう感じ。「空席」の紙を裏返すと今日のタイムテーブルになっており、新参者にも優しい配慮であるなと感じました。<br />
セッション前には隣の人と強制自己紹介タイム!自分は懇親会までいくのでボッチ回避にはありがたすぎるけど恥ずかしい企画。で、お隣、後ろの方は懇親会でなかったのですが、「僕初めてなんです~」というところから、いつもは○○な雰囲気だよ~などと教えていただきました。そして混んできて椅子が追加された後も、ちょっと腕当たっちゃったりしても問題なしな雰囲気になりましたw<br />
<br />
終了後の懇親会は会場の1Fのお店。自由な雰囲気に最初こそ戸惑いましたが、講演者の周りを囲むように席が配置され、とっかかりの会話が生まれやすく、そこからは隣の人とフランクに話せました。<br />
ここでみなさんとお話したことでは、<br />
<ul>
<li>デザイナーとエンジニアの領域は、やはりしっかり分かれている</li>
<li>デザイナー寄りの人ではデータベースはブラックボックス</li>
<li>CMSとかやっている人だと、データ層の存在ぐらいは意識するがクエリまでは意識しない(CMSがやってくれる範囲か)</li>
<li>参加者側では、Webサービスを作っている人とかいて、マジでフルスタックに求められてツラたんそうだったけどやりがいありそう。</li>
<li>学生を教育する立場の人では、その学生の方向性が決まってないのでデザイン系でもphpからデータベースにアクセスするぐらいは教えているとか</li>
</ul>
デザイン系の人がphpやりだして、ってことはデータにアクセスするのでSQLも覚えて、その先まで一人でやらないといけなくなったらDB設計・運用とかってなるのはさすがに範囲広すぎだよなと思った。<br />
<br />
今日の目的には以下があり、どちらも上々(お金かけてきた価値あった)かな、と思います。<br />
<ul>
<li>データベースの人がちょっと興味もって来てみたよ、という存在アピール(ツイートしてたらすぐに気づいてもらえた!)</li>
<li>参加者の中で数人でも良いので、データベース系イベントの開催地やターゲット層のヒントになる方とお話しする(懇親会まで参加して本当によかった)</li>
</ul>
そしてデザインの人が語ることを自身の仕事に置き換えてみたり、きれいなスライド、参加しやすい運営など何から何まで勉強になりました。また機会を見つけて参加したいと思います。Anonymoushttp://www.blogger.com/profile/02234679274621415851noreply@blogger.com0tag:blogger.com,1999:blog-1760199393479360913.post-72016750602286385992016-07-01T23:34:00.001+09:002016-07-11T20:08:12.931+09:00Ora2Pgでやってみよう!テーブル定義移行編こんにちは、kkidaです。<br />
沖縄合宿2日目です。<br />
<br />
昨日に引き続き、他DBからPostgreSQLへの移行の話を聞いていただいた方へ、是非この機会に紹介しておきたいのが、OracleまたはMySQLからテーブル定義・データを抽出してPostgreSQL用に書き換え、ロードまでを一括実行できる便利ツール、<a href="http://ora2pg.darold.net/index.html" target="_blank">Ora2Pg</a>を使用したデータ移行(とっかかり)です。<br />
<br />
<br />
<h2>
<span style="color: orange;">■ここでは何をやるか </span></h2>
移行してみるにあたり、<a href="http://ora2pg.darold.net/documentation.html#configuration" target="_blank">Ora2Pgのオプション設定</a>等は細かくはいろいろあるのですが、最初のハードルは「使える状態にすること」だと思います。(経験談w)<br />
まずは使える状態にして、Oracleからテーブル定義を抜いてくるところができれば、あとは<a href="http://ora2pg.darold.net/documentation.html" target="_blank">Ora2Pgのマニュアル</a>とにらめっこで、オプションをいろいろいじってみて、やりたい事に近づけるのではないでしょうか。<br />
<br />
<a href="http://kkida-galaxy.blogspot.jp/2016/07/pg95-on-cent7.html" target="_blank">昨日紹介したPostgreSQL on CentOS 7環境</a>で構築します。<br />
例によって、DBサーバーは外部公開しづらい前提で、CentOSのインストールDVDからyumできるもの以外は、個々にモジュールを持って来てサーバーに配置するようにして、実際に動くところまでやってみました。<br />
<br />
<br />
<h2>
<span style="color: orange;">■準備</span></h2>
以下をダウンロードしておきます。WinSCPなどの転送ツールを使用して、サーバーの/media/ora2pgにrootユーザの所有で配置しておくものとします。<br />
<ul>
<li><a href="http://osdn.jp/projects/sfnet_ora2pg/downloads/17.4/ora2pg-17.4.tar.bz2/">ora2pg-17.4.tar.bz2</a></li>
<li><a href="http://search.cpan.org/CPAN/authors/id/P/PY/PYTHIAN/DBD-Oracle-1.74.tar.gz">DBD-Oracle-1.74.tar.gz</a></li>
<li><a href="https://sourceforge.net/projects/perlce/files/perlce/perl-582-1/DynaLoader.pm/download?use_mirror=tenet&download=&failedmirror=kent.dl.sourceforge.net">DynaLoader.pm</a></li>
<li><a href="http://www.oracle.com/technetwork/jp/topics/linuxx86-64soft-085244-ja.html">Oracle Instant Client</a>(Oracle社のアカウント登録が必要) </li>
<ul>
<li>oracle-instantclient11.2-basic-11.2.0.2.0.x86_64.rpm</li>
<li>oracle-instantclient11.2-devel-11.2.0.2.0.x86_64.rpm</li>
<li>oracle-instantclient11.2-sqlplus-11.2.0.2.0.x86_64.rpm</li>
</ul>
</ul>
今回は使用したバージョンまで書いておきますが、相手のOracleのバージョンや、いずれかのモジュールの将来のバージョンでは、これらの組合せがそのままでは使えない可能性があることをご注意ください。 <br />
<br />
Ora2Pgはperlスクリプトで、各DBへの接続はDBD::xxxというDBへの接続ライブラリ(xxxはDB製品名、DBD::Oracleとか)を用います。その前提となるパッケージで、yumで入るものは入れてしまいましょう。また、昨日の続きなので、yum groupinstall "Development Tools"は導入済みとします。<br />
<pre class="console">
# mount /dev/cdrom /media/CentOS
# yum --disablerepo=* --enablerepo=c7-media install libdbi-dbd-pgsql
# yum --disablerepo=* --enablerepo=c7-media install perl-ExtUtils-MakeMaker
# yum --disablerepo=* --enablerepo=c7-media install perl-DBI
</pre>
<br />
<h2>
<span style="color: orange;">■Oracle Clientのインストール</span></h2>
以下の順でRPMからインストール、環境変数を設定します。後続の手順であるDBD::Oracleのインストール時に、ここで作成したOracleのライブラリが参照されます。<br />
<pre class="console">
# cd /media/ora2g
# rpm -ivh oracle-instantclient11.2-basic-11.2.0.2.0.x86_64.rpm
# rpm -ivh oracle-instantclient11.2-devel-11.2.0.2.0.x86_64.rpm
# rpm -ivh oracle-instantclient11.2-sqlplus-11.2.0.2.0.x86_64.rpm
# export LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client64/lib
# export ORACLE_HOME=/usr/lib/oracle/11.2/client64/
</pre>
<br />
<h2>
<span style="color: orange;">■DBD::Oracleのインストール</span></h2>
以下の手順でソースファイルを展開、インストールします。<br />
<pre class="console">
# cd /media/ora2pg
# tar zxvf DBD-Oracle-1.74.tar.gz
# cd DBD-Oracle-1.74
# cp ../DynaLoader.pm ./.
# perl Makefile.PL
# make install
</pre>
<br />
<h2>
<span style="color: orange;">■Ora2Pgのインストール</span></h2>
以下の手順でソースファイルを展開、インストールします。<br />
<pre class="console">
# cd /media/ora2pg
# tar jxvf ora2pg-17.4.tar.bz2
# cd ora2pg-17.4/
# perl Makefile.PL
# make && make install
</pre>
<br />
<h2>
<span style="color: orange;">■Ora2Pgを使ってみる</span></h2>
構築が完了すると、/usr/local/bin/ora2pgコマンドと、/etc/ora2pg/ora2pg.conf.distファイルが出来上がります。Ora2Pgは、詳細動作を全て設定ファイルに書いて、ora2pgコマンド実行時にその設定ファイルを指定するという使い方をします。 <br />
<br />
設定ファイルの編集<br />
<pre class="console">
# cd /etc/ora2pg
# cp ora2pg.conf.dist ora2pg.conf
# vim ora2pg.conf
</pre>
<br />
最低限書いておく必要があるのは、Oracleへの接続方法と、移行対象です。<br />
<ul>
<li>ORACLE_DSN dbi:Oracle:host=<oracleのホスト名>;sid=<SID名></li>
<li>ORACLE_USER <Oracleの移行対象オブジェクトを触れるユーザー名></li>
<li>ORACLE_PWD <上記ユーザのパスワード> </li>
<li>SCHEMA <移行対象スキーマ名></li>
</ul>
設定ファイルができたら、ora2pgコマンドを実行します。-cで設定ファイルを指定します。<br />
<pre class="console">
# cd <任意のディレクトリ>
# /usr/local/bin/ora2pg -c /etc/ora2pg/ora2pg.conf
[========================>] 1/1 tables (100.0%) end of scanning.
[========================>] 1/1 tables (100.0%) end of table export.
# ls
output.sql ### PostgreSQL用のスクリプトが生成されている
</pre>
<br />
出力されたファイルの中身を確認すると、PostgreSQL用のDDLスクリプトであることがわかります。参考までに、Oracleではnumber(8)、varchra2(30)、dateを各列のデータ型としていましたがPostgreSQLの対応するデータ型に書き変わっていることが読み取れます。
<pre class="console">
# more output.sql
-- Generated by Ora2Pg, the Oracle database Schema converter, version 17.4
-- Copyright 2000-2016 Gilles DAROLD. All rights reserved.
-- DATASOURCE: dbi:Oracle:host=192.168.160.179;sid=v11204
SET client_encoding TO 'UTF8';
\set ON_ERROR_STOP ON
CREATE TABLE test (
no integer NOT NULL, --- number(8) がintegerに変換された
val varchar(30), --- varchar2(30) がvarchar(30)に変換された
time timestamp --- date が timestampに変換された
) ;
ALTER TABLE test ADD PRIMARY KEY (no);
</pre>
<br />
本例では、Ora2Pgの実行時設定はほとんどをデフォルトとし、Oracleから指定スキーマの定義情報だけを抽出し、PostgreSQL用のスクリプトを生成するところまでとなりました。<br />
定義情報と併せてデータも抜き出す設定であれば、一気にデータ移行が済んでしまいますし、PostgreSQLへの接続情報を書いておけば、直接PostgreSQLに投入することもできます。詳細動作はOra2Pgのマニュアルから、やりたいことに合わせて試していくことをお勧めします。<br />
<br />
以上です。Anonymoushttp://www.blogger.com/profile/02234679274621415851noreply@blogger.com1tag:blogger.com,1999:blog-1760199393479360913.post-741510662907829272016-07-01T06:55:00.002+09:002016-07-11T20:25:44.596+09:00CentOS7上でのPostgreSQL構築手順(RPM編)はいさい!<br />
<br />
<a href="http://www.ospn.jp/osc2016-okinawa/" target="_blank">OSC 2016 OKINAWA</a>に参加すべく、沖縄にやってまいりました、kkidaです。<br />
<br />
OSCでは、前に<a href="http://connpass.com/event/29167/" target="_blank">福岡</a>や<a href="https://dbstudychugoku.github.io/events/event-014.html" target="_blank">福山(広島)</a>でしゃべらせてもらった、「<a href="http://www.slideshare.net/kkida85/dbpostgresql" target="_blank">他DBからPostgreSQLへの移行</a>」の話をします。つまり、新たにPostgreSQLを使い始めるかもしれない人にこそご参加いただきたいわけで、せっかくなので、受講だけじゃなくて、一歩踏みこんで試すところまでやってもらいたい。そのための情報を整備しとかなきゃなーと思って、ひとり合宿in沖縄で本稿を書いています。<br />
<br />
ここでは、最近仕事でCentOS 7を触っているので、自分の復習も兼ねて、CentOS 7上でのPostgreSQLインストールを超初心者向けに書こうと思います。<br />
<br />
<h2>
<span style="color: orange;">■PostgreSQLインストール方法の選択肢</span></h2>
主要なOSディストリビューション向けにはいくつか方法があって、<a href="http://www.postgresql.jp/download" target="_blank">日本PostgreSQLユーザ会のダウンロードページ</a>で各配布先が紹介されています。初心者向けなので、これらのページの渡り歩き方から紹介しておこうと思います。<br />
<br />
●ダウンロードリンク<br />
<ul>
<li>Windows:GUI環境(WindowsまたLinux)向けにインストーラーが提供されていて、簡単にインストール先を変えたい場合は便利です。</li>
<li>Linux(yum):実は私、yumでPostgreSQLいれたことありません。DBサーバーはインターネットにつながっていないケースが多く、ハードル高かった記憶があります。</li>
<li>Linux(rpm)、Linux(apt):目的のパッケージをダウンロードしサーバーに転送しておけば良いので、知っていれば簡単ですが知らないと「?」が出まくりです。今回はこれを説明(後述)します。</li>
<li>ソースコード:PostgreSQLの実行ユーザやインストール先を変えたい場合、または詳細動作のカスタマイズをしたい場合はソースコードからインストールすることになります。</li>
</ul>
<br />
●インストールガイド<br />
本稿を書くにあたってリンク先を確認しましたが、そこそこ古く<br />
「そのまま実行したら上手くいった」レベルの情報は期待できなさそうです。<br />
<br />
●その他<br />
PostgreSQLの本体開発に参加する人向けのWikiや、JPUGのマスコットロゴについて<br />
書かれています。(ダウンロードページなので、そういうのも一色多に配布してるw)<br />
<br />
※ちなみに、日本PostgreSQLユーザ会では、上記ウェブサイトの刷新を鋭意進めている最中で、本稿の内容は新しいものがリリースされたら読み替えが必要になります。もって1年の命でしょう。<br />
<br />
<h2>
<b><span style="color: orange;">■PostgreSQL(RPM版)のインストール準備</span></b></h2>
今回はRPM版でPostgreSQL 9.5をインストールします。<br />
配布先から<a href="http://yum.postgresql.org/9.5/redhat/rhel-7-x86_64/repoview/postgresqldbserver95.group.html" target="_blank">ズンズンたどって</a>、以下を入手します。<br />
<ul>
<li>postgresql95</li>
<li>postgresql95-contrib</li>
<li>postgresql95-libs</li>
<li>postgresql95-server </li>
</ul>
2016年7月の現時点だと、各リンク先に「postgresql95-9.5.3-2PGDG.rhel7.x86_64」のようにPostgreSQL 9.5.3のRPM内のtypoを修正した「-2」がありますので、こちらを使用します。<br />
(初心者向けに直接DL先を挙げておくなら、ダウンロードしサーバーに配置しておくべきは、<a href="http://yum.postgresql.org/9.5/redhat/rhel-7-x86_64/postgresql95-9.5.3-2PGDG.rhel7.x86_64.rpm" target="_blank">postgresql95</a>、<a href="http://yum.postgresql.org/9.5/redhat/rhel-7-x86_64/postgresql95-contrib-9.5.3-2PGDG.rhel7.x86_64.rpm" target="_blank">contrib</a>、<a href="http://yum.postgresql.org/9.5/redhat/rhel-7-x86_64/postgresql95-libs-9.5.3-2PGDG.rhel7.x86_64.rpm" target="_blank">libs</a>、<a href="http://yum.postgresql.org/9.5/redhat/rhel-7-x86_64/postgresql95-server-9.5.3-2PGDG.rhel7.x86_64.rpm" target="_blank">server</a>の4つです。←リンク先は2016年7月時点のものであることに注意)<br />
開発者向けのincludeファイルも必要である場合は、<a href="http://yum.postgresql.org/9.5/redhat/rhel-7-x86_64/postgresql95-devel-9.5.3-2PGDG.rhel7.x86_64.rpm" target="_blank">devel</a>も取得します。まあこの辺は他のソフトウェアと変わらないでしょう。<br />
<br />
サーバーへの配置はwinSCPとかを使って、rootユーザの持ち物で/media/pg95とかに置いておけば良いです。<br />
<pre class="console">
# mkdir -p /media/pg95 (ココにRPMを転送)
# ls /media/postgres
postgresql95-9.5.3-2PGDG.rhel7.x86_64.rpm
postgresql95-contrib-9.5.3-2PGDG.rhel7.x86_64.rpm
postgresql95-devel-9.5.3-2PGDG.rhel7.x86_64.rpm
postgresql95-libs-9.5.3-2PGDG.rhel7.x86_64.rpm
postgresql95-server-9.5.3-2PGDG.rhel7.x86_64.rpm
</pre>
<br />
RPMだと、前提パッケージが足りていないと途中でこけてしまいますが、CentOS 7.2ではOSメディアから"Development Tools"を入れておけば大丈夫でした。<br />
<pre class="console">
# mount /dev/cdrom /media/CentOS
# yum --disablerepo=* --enablerepo=c7-media groupinstall "Development Tools"
</pre>
<br />
<h2>
<span style="color: orange;">■インストール</span></h2>
ここまで準備できれば、インストールは簡単です。依存性でつまづく事の無いよう、以下の順にインストールします。<br />
<pre class="console">
# rpm -ivh postgresql95-libs-9.5.3-2PGDG.rhel7.x86_64.rpm
# rpm -ivh postgresql95-9.5.3-2PGDG.rhel7.x86_64.rpm
# rpm -ivh postgresql95-devel-9.5.3-2PGDG.rhel7.x86_64.rpm
# rpm -ivh postgresql95-server-9.5.3-2PGDG.rhel7.x86_64.rpm
</pre>
<br />
これで、/usr/pgsql-9.5配下にPostgreSQLがインストールされます。postgresユーザが作成され、systemctlコマンドで起動・停止の管理ができるようになります。<br />
<pre class="console">
# ls /usr/pgsql-9.5
bin include lib share
# systemctl list-unit-files | grep postgres
postgresql-9.5.service disabled
</pre>
<br />
ところが、まだデータベースとして使用できる準備はできていませんので後続の手順を実施してから起動です。(以前のバージョンではこの時点で使えたような記憶がある。)<br />
どうやら最近のRPM版では、初期設定(データベース作成、PostgreSQL用語でいうinitdb)をまるっとやってくれる便利コマンドが用意されているようで、これを使います。<br />
<pre class="console">
# cd /usr/pgsql-9.5/bin
# ./postgresql95-setup initdb --no-locale
Initializing database ... OK
</pre>
<br />
なななななんじゃこりゃーって感じでしたが、そうなのです。自動化しちゃうと、出来上がったデータベースクラスタがどこにどうできてるの?と気になってしまいますが、初心者向けなののでココは後に譲ります。いつか調べる。(@soudaiさんに指摘いただき、日本語環境においては是非やっておくべきinitdbコマンドのオプション(--no-locale)を追記しました。2016.7.11)<br />
<br />
<br />
<h2>
<span style="color: orange;">■起動と自動起動設定</span></h2>
初CentOS 7だったので、sysytemctl慣れしたい私の勉強にお付き合いください。笑<br />
<pre class="console">
# systemctl list-unit-files | grep postgres
postgresql-9.5.service disabled
# systemctl start postgresql-9.5.service
# systemctl status postgresql-9.5.service
● postgresql-9.5.service - PostgreSQL 9.5 database server
Loaded: loaded (/usr/lib/systemd/system/postgresql-9.5.service; enabled; vendor preset: disabled)
Active: active (running) since 水 2016-06-22 22:31:50 JST; 14s ago
</pre>
<br />
起動時のログも拾ってくれるんですね。なかなか便利。(実は↑の初期設定が必要なことに気づかす、起動に失敗してログがでたことで発覚しました。systemctlに感謝!)<br />
自動起動はデフォルトでdisabledでしたので、必要に応じて有効にしておきます。<br />
<pre class="console">
# systemctl enable postgresql-9.5.service
Created symlink from /etc/systemd/system/multi-user.target.wants/postgresql-9.5.service to /usr/lib/systemd/system/postgresql-9.5.service.
# systemctl list-unit-files | grep postgres
postgresql-9.5.service enabled
</pre>
<br />
ついでに、社内サーバー前提でRPMからインストールを解説しているわけですので、デフォルトで有効になっているfirewallはoffっちゃいましょう。(異論は認める。)<br />
<pre class="console">
# systemctl stop firewalld.service
# systemctl disable firewalld.service
</pre>
<br />
これで、データベースが起動しました。<br />
ここから先は、PostgreSQLの初期設定であり、OSやバージョンによらない内容を別の投稿としたいと思います。<br />
<br />
では、今日から楽しいPostgreSQLライフをお送りください。 Anonymoushttp://www.blogger.com/profile/02234679274621415851noreply@blogger.com0tag:blogger.com,1999:blog-1760199393479360913.post-15307602564450772422016-06-18T15:00:00.002+09:002016-07-19T09:35:37.216+09:00JPUG 2016 夏セミナーに参加してきましたこんにちは、kkidaです。<br />
<br />
日本PostgreSQLユーザ会(JPUG)の2016 夏セミナーに参加してきました。<br />
<a href="http://www.postgresql.jp/events/jpug201606semi">http://www.postgresql.jp/events/jpug201606semi</a><br />
<br />
<br />
<b><span style="color: orange;">■JPUG夏セミナーとは</span></b><br />
NPO法人であるJPUGは、年に一回、正会員(≒NPO法人の社員)が全員参加して今後の会のあり方を決定する「総会」を開催しています。JPUGは日本全国各地に会員がいて、みなさんが必ず集まる場はこの総会のみです。 (その他に年一回ペースで開催しているカンファレンスがあり、多くの方がそちらにも参加されます。)<br />
せっかく皆さんに集まっていただくので、今イマ世の中で注目されているテーマ、PostgreSQLの最新情報などをお持ちの方に講演をお願いし、各地に持ち帰って広めていただこうと始まったのが夏セミナーです。<br />
<br />
<b><span style="color: orange;">■今日のセッションは2本</span></b><br />
いつもPostgreSQLの新機能をイチ早く試して情報発信されている篠田さんと、IoT、BigData、画像処理などに実務で取り組まれている佐藤さんによる発表です。最新機能の紹介と、やりたいことをどうやって実現するかの両側面から学べた勉強会でした。<br />
<br />
・<a href="http://www.slideshare.net/noriyoshishinoda/postgresql-96-new-features-jpug-2016-summer" target="_blank">PostgreSQL 9.6 新機能紹介</a><br />
日本ヒューレット・パッカード株式会社 篠田典良氏<br />
<br />
・FA分野におけるPostgreSQLの使われ方<br />
住友金属鉱山株式会社 佐藤健司氏<br />
<br />
<br />
<b><span style="color: orange;">■併設イベント</span></b>(本当はこっちがメイン)<br />
昨年度、PostgreSQLに関する技術貢献、情報発信などで普及に貢献していただいた方に、JPUGから感謝賞を授与しています。今年の受賞者は以下の3名でした。<br />
<br />
・松田 伸一氏<br />
・斎藤 登氏<br />
・須藤 功平氏<br />
<br />
本日のメインは最後の総会・理事会で、 各役割を担う理事から、昨年度の活動報告と今年度の活動計画が提示されました。<br />
総会での大きな話題は、前理事長を始め数名の理事退任と、それに替わる新任理事が紹介され、承認されています。(ただしこの段顔では「役職案」を基に理事会を構成するメンバーが承認されるのみ)<br />
もう1つ、今年度はPGconf.Asiaという新たなイベントが別団体で企画されており、JPUGとしてはそこに協賛するかどうか、どうやって関わるかなども話し合われました。<br />
総会後は、承認されたてほやほやの理事による理事会を行います。ここでの理事会は、役職決めが主で、特に前理事長が退任した今回は様々な意見が飛び交いました。自薦他薦あり、今後の会の方向性などが話し合われ、最後は投票により、高塚理事長の就任となりました。<br />
ちなみに、こういう決め方をしたのは15年のJPUGの歴史の中で初めて、とのことです!<br />
もう1つちなみに、私kkidaは「広報・企画担当」理事として、上述のAsiaイベント運営に関わることになりました〜<br />
<br />
<br />
<b><span style="color: orange;">■懇親会</span></b><br />
会場であったアシスト社の向かいすぐの「上海ブギ」さんで懇親会です。安くて美味しい!<br />
<br />
毎年恒例、地方支部メンバーからのお土産争奪戦あり、初参加の方も数名いらっしゃって、ご自身とPostgreSQLの関わりなどをベテランメンバーと話されていたりして各テーブルで盛り上がっていました。あとは常連さんのうち、諸事情ありしばらく来れなくなってしまうであろう方がいて、皆から惜しまれ、愛されてるのが伝わってきました。どうやらポスグレ愛は薄れていないとのことだったので、地方支部の参加(立ち上げ?)もお願いしますよ!S氏!<br />
<br />
という感じで、ほぼ丸一日を久々に会う皆さんと過ごし、笑いあり真面目あり、勉強も飲みもありの盛りだくさんな会でした。<br />
<br />
以上<br />
<br />
<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/02234679274621415851noreply@blogger.com0tag:blogger.com,1999:blog-1760199393479360913.post-45182453782915371212016-06-18T13:25:00.000+09:002016-06-18T14:41:03.122+09:00ご挨拶、および投稿の練習などこんにちは、kkidaです。<br />
<br />
今の時代に何か残す・発信するには何が良いだろうと思っていますが、FacebookもTwitterもリアルな知人が多く、その範囲で書く事が多い(そもそもあんま書いてない)ので、今回はブログにしてみました。<br />
<br />
<br />
<b>■このブログで書くこと</b><br />
オープンソースデータベースのPostgreSQLを中心に、学んだ事、勉強会の参加メモ、告知、技術に限らず仕事に限らず、その他好きな事を書きたいと思っています。<br />
<br />
<b>■ブログを始めたきっかけ</b><br />
今日は2016年6月18日(土)です。日本PostgreSQLユーザ会の総会に来ています。<br />
ユーザー会に顔を出すようになって3年目になり、その中で関わった人、勉強したこと、上手くいかなかったこと、これからやらないとけないこと、など色々思い当たることがでてきました。<br />
何をすると良いのか、モヤモヤするところではありますが、できる事から手を出してみるタイプではあるので、 手の届くところで早速始めてみようと思った内の1つがこのブログです。<br />
<br />
<br />
ひとまず、@soudaiさんをはじめ、アドバイスをいただいた方の目に留まり、「お、やってるね~」と思ってもらう事。そしてまずは近しい人たちの、ゆくゆくは多くの人たちの役にたつ内容を出していければなと思っております。<br />
<br />Anonymoushttp://www.blogger.com/profile/02234679274621415851noreply@blogger.com0