揮発性のメモ2

組込みLinux開発を通じて得た知識と通じずに得た知識をメモ書きしておく

ORA-12560

RAC構成で片系が死んでいるとき、ときどきエラーになる

ORA-12560: TNS: プロトコル・アダプタ・エラーが発生しました

straceしてみる

21:05:23.894180 connect(4, {sa_family=AF_INET, sin_port=htons(1521), sin_addr=inet_addr("192.168.0.113")}, 16) = 0
21:05:23.895863 getsockname(4, {sa_family=AF_INET, sin_port=htons(32908), sin_addr=inet_addr("192.168.0.118")}, [16]) = 0
...
21:05:23.908921 connect(4, {sa_family=AF_INET, sin_port=htons(1521), sin_addr=inet_addr("192.168.0.116")}, 16) = -1 EHOSTUNREACH (No route to host)
21:05:26.910766 close(4)                = 0

192.168.0.113 生きている側(仮想)
192.168.0.114 死んでいる側(仮想)(生きている側に振りなおされている)
192.168.0.115 生きている側(本当)
192.168.0.116 死んでいる側(本当)
192.168.0.118 クライアント
ときどき死んでいる側の方の本当のIPにアクセスにいっている

bashのプロンプトに環境変数を出力する

PS1="[\u@\h \W]\\$ "
[hoge@piyo hoge]$ ls

プロンプトの先頭に環境変数を出力したいときは " " で囲ってしまうと展開されてしまうので ' ' で囲んで書き直す。

PS1='$ORACLE_SID[\u@\h \W]\$ '
HOGE[hoge@piyo hoge]$ ls

これで違うインスタンスにアクセスに行って無駄に悩んだりしなくて済むようになる。

週ごとの合計を出す

月の第何週ごとの集計を出すときは

SELECT
    TO_CHAR(hdate,'YYYY-MM/w'),
    COUNT(*) as count
FROM
    hoge
GROUP BY
    TO_CHAR(hdate,'YYYY-MM/w')
ORDER BY
    TO_CHAR(hdate,'YYYY-MM/w')


月またぎを無視して、とにかく週ごとの集計を出すときは

SELECT
    TO_CHAR( TRUNC(hdate,'DAY'),'YYYY-MM-DD'),
    COUNT(*) as count
FROM
    hoge
GROUP BY
    TRUNC(hdate,'DAY')
ORDER BY
    TRUNC(hdate,'DAY')

TO_CHAR()

数値型や日付型などを文字列に変換する関数
TO_CHAR(hdate,'YYYY-MM/w') は、年/月-週 に変換する
('w'は日曜始まりではなく、その月の一日からの経過日数で出される)

TRUNC()

数値型や日付型などを切り詰める関数
TRUNC(hdate,'DAY') は、直前の日曜日の日付に変換する

続きを読む

GROUP BYの注意

GROUP BY を使うときは、フィールドが必ず一意になるように指定する必要がある

MySQLでは許される書き方

SELECT 
    a,
    b,
    c
FROM 
    hoge 
GROUP BY 
    a

MySQLなら、bc を適当に表示してくれるが、Oracleでは許されない
(ORA-00979: GROUP BYの式ではありません。)

Oracleでは次のようにする

SELECT 
    a,
    MAX(b),
    MAX(c)
FROM 
    hoge 
GROUP BY 
    a

ORDER BY でも同様に、一意になるものを指定する

SELECT 
    a,
    MAX(b),
    MAX(c)
FROM 
    hoge 
GROUP BY 
    a
ORDER BY 
    a,
    MAX(b)