読者です 読者をやめる 読者になる 読者になる

セカイモンの裏側

★毎週木曜日更新★ 海外ショッピングサイト『セカイモン』のブログです。私たちスタッフの仕事風景や日々の出来事など、     “セカイモンの舞台裏”とも言える日常を綴っていきます。

NetworkManagerではまった

ディスプレイ画面付きのCentOSをインストールするとデフォルトで付いてくるらしい。

 

固定IPアドレス降っているにも関わらず書き換わってしまう。

resolve.confも書き換わってしまって????の状態が続いた。

 

調べてみたらNetworkManagerという事が判明

固定IPにしたければすぐに停止すべし

13.3.2. Network Manager の無効化 を参考

 

service NetworkManager stop

で一時的に停止して試しながら、うまくいけば

chkconfig NetworkManager off

で再起動後も停止した方がよさそう。

あと業務でよくある特異なネットワークの設定が必要でした。

 

 

f:id:sekaimon-staff:20170526091558p:plain

 

普段はこんな感じで1つのデフォルトルートだけで問題ないのでが今回の場合は

オフィスとデータセンターのルーティングが必要との事でした。

デフォルトルートだけの場合

[root@localhost ~]# netstat -rn

Kernel IP routing table

Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface

192.168.181.0   0.0.0.0         255.255.255.0   U         0 0          0 eth0

169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth0

0.0.0.0         192.168.181.210 0.0.0.0         UG        0 0          0 eth0

ルーティングが2つある場合

Kernel IP routing table

Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface

192.168.181.0   0.0.0.0         255.255.255.0   U         0 0          0 eth0

192.168.9.0     192.168.181.1   255.255.255.0   UG        0 0          0 eth0

169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth0

0.0.0.0         192.168.181.210 0.0.0.0         UG        0 0          0 eth0

これが必要なのでその設定方法は?

vi /etc/sysconfig/network-scripts/route-eth0

このパスに新しいファイルを作成して

GATEWAY0=192.168.181.1

NETMASK0=255.255.255.0

ADDRESS0=192.168.9.0

と設定して再起動すればOK

ここが今回つまったところ

他設定が必要なファイルをまとめると

/etc/sysconfig/network-scripts/route-eth0

/etc/sysconfig/network-scripts/ifcfg-eth0

/etc/resolv.conf

/etc/sysconfig/network

で設定は終わり。

 

MACでOracle にアクセスした時のtips

1.マックのターミナルでの話

oracleが文字化けで激しいのでというか未だにSJISなのでターミナルから入った場合、

文字列が炸裂します。

 

いつも忘れるのでここでメモ

export NLS_LANG=Japanese_Japan.AL32UTF8

マックは関係ないかも

 

2.他のテーブルを参照して更新

oracleでは update ** from ** where ** でもできなかったんで調べてみたら違うSQLのようです。

update (
select
A.ITEM_AMOUNT_DLLR A_ITEM_AMOUNT_DLLR, B.ITEM_AMOUNT_DLLR B_ITEM_AMOUNT_DLLR
from h_mypage_history A INNER join h_sales_dt_left B
on A.SALES_ID = B.SALES_ID
) set
A_ITEM_AMOUNT_DLLR = B_ITEM_AMOUNT_DLLR

 

これで違うテーブルから参照して更新できます。

「テーブル移動」「テーブル複数」って検索してもなかなか出てこなかったんでメモ

 

MySQLからORACLEにデータを移行するまでの道のり

ORACLEがライセンスの問題で複数サーバーを立てられない。

なのでバックアップサーバーとかはなかなか立てられない。。

という事でバックアップにMySQLサーバーに使っています。

あと分析用とかもMySQLを使わざる終えないのでOracle > MySQL

のデータ移行をしないといけないという悲しい状況です。

 

今回はそのバックアップを取っていたデータから新しいテーブルを作成してそれを本番のOracleDBに移行するっという作業でしたがいろいろ詰まったところがあったんでメモ

 

エンコードを合わせないといけない

バックアップの方はUTF8なので問題ないですが、オラクルの方はふる~~いのSJISでした。しかもエンコードを調べるSQLでの結果もわかりにくい。

SELECT VALUE FROM NLS_DATABASE_PARAMETERS
WHERE PARAMETER='NLS_CHARACTERSET';

「JA16SJIS」

見たこともないエンコードが。。なのではじめはSJISなのかEUCなのかさえわからなかったのですが、このコードでさらにぐぐると SJIS?っていう事がわかる。

www.atmarkit.co.jp

 

なのでmysqlでエクスポートしたテーブルをUTF8>SJISに変換しないといけない作業。

mysql> select * from h_mypage_history INTO OUTFILE "/tmp/h_mypage_history.tsv" FIELDS TERMINATED BY '\t';

,(カンマ)よりもタブの方がごみデータがすくないと重いTSVでエクスポート

nkf -s /tmp/h_mypage_history.tsv > /tmp/h_mypage_history_sjis.tsv

nkfSJISに変換

・NULLの取り扱いが違う

MySQLでは\Nっていう風に記載されているのに対し、オラクルはそういう記述の仕方ではないらしい。

なのでNULLをデータなしに変換。

sed -e 's/\\N//g' /tmp/h_mypage_history_tab_sjis.tsv > /tmp/h_mypage_history_tab_sjis2.tsv 

 

・インポートが難しい

[~]$ sqlldr ユーザー/パスワード control=mypage.ctl direct=true

というコマンドを叩く。そのまえにmypage.ctl

というコントロールファイルを作成しないといけない。

その内容は

LOAD DATA
INFILE '/tmp/h_mypage_history_sjis2.tsv'
INTO TABLE h_mypage_history
APPEND
FIELDS TERMINATED BY X'9' trailing nullcols
(
USER_ID

)

タブテキストの場合はFIELDS TERMINATED BY X'9'

としないといけないみたいです。

あと失敗すると、mypage.ctlファイルを作成する場合は

mypage.logていうログが生成されるのでそこからエラーなどを見てデバッグするみたいで直接のコマンドからエラーが見れないっていう遠まわしな。。。

 

なんだかんだ3人日ぐらいかかってデータ移行ができました。

参考URL

http://blog.livedoor.jp/ncad_webdb/archives/51384321.html

http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/server.102/B19211-01/ldr_control_file.html

http://www.shift-the-oracle.com/config/multibyte-characterset.html

http://www.oracle.co.jp/forum/thread.jspa?threadID=8008600

http://www.oracle.co.jp/forum/thread.jspa?threadID=35001617

http://www.searchman.info/tips/1150.html

http://vertex.air-nifty.com/blog/2008/10/oraclecsv-fe87.html

ORACLEのゾンビテーブル

オラクルでは大文字小文字を区別してテーブルも作れるらしい。

でも区別しなくてもいい設定もできるらしい。

どっちかにして欲しい

今回間違えて小文字で作成して、大文字でも作成して、削除したのにまだ残ってしまうっていうおかしな現象に突入しました。

 

selectは受け付けない 表がないから。。。

dropは受け付けない 表があるから。。。

うわぁー。

 

hito4-t.hatenablog.com

nmtuiって面倒くさい

楽にするためのCUIなのにCentOS7から推奨のnmtuiを使用して1時間ぐらいつまったのでメモ

>ntmui

f:id:sekaimon-staff:20170427133847j:plain

接続の編集

f:id:sekaimon-staff:20170427133929j:plain

編集、ここも追加がトップにくるのでつい追加してしまいそうになる。

f:id:sekaimon-staff:20170427134047j:plain

はまった箇所、サブネットマスクを入れないといけない。

エラーも出ないのでなかなか気づかない所

あとの設定はこんなものでいいかな。。

OKでエンタ

f:id:sekaimon-staff:20170427133847j:plain

またここで接続をアクティベートしないと動かない

OKでエンタでさらに

systemctl restart NetworkManager

でやっと反映される。

簡単になったのか難しくなったのか。。

 しかもteratermとかのターミナルで入れるけども、途中でサイズを変更するとCUIの画面がくずれるからはじめからやり直しという無残な結果に

MySQL 他のテーブルを参照してUPDATEとカラムの追加

他のテーブルを参照してUPDATEする場合

update h_mypage_history, tmp_settlement
set h_mypage_history.shipping_fee_settlement = tmp_settlement.current_amount
where h_mypage_history.BUNDLING_ID = tmp_settlement.settlement_key;

このSQLupdate h_mypage_history tmp_settlementのようにコンマが抜けてたから、

エラーが出て若干つまった

 

10:52:29 update `h_mypage_history` `tmp_settlement` set `h_mypage_history.shipping_fee_settlement` = `tmp_settlement.current_amount` where `h_mypage_history.BUNDLING_ID` = `tmp_settlement.settlement_key` Error Code: 1054. Unknown column 'h_mypage_history.BUNDLING_ID' in 'where clause' 0.015 sec

こういうエラーが出てきたけども、単純にコンマが足りないミスだった。

 

bashalog.c-brains.jp

 

alter add が遅い?? 一瞬かと思ったけどレコード分待たないといけないみたい。。

結局10分ぐらいかかった。残念な話。

試しにDROP COLUMNをしても一瞬とかではなく10分ぐらいかかる。

レコード多いテーブルにカラムを追加、削除する時はメンテナンスが必要!?

となると運用がさらに難しくなりそう。。。

key_buffer_size を変更すると早くなるみたい、やっぱりMySQLはデフォルトでは運用が難しくカスタマイズがそこそこ必要っぽい。

やっぱり俺はPostgresが好きですな。

d.hatena.ne.jp

よく100万件~1000万件ぐらいの場合は件数としてはたいした事がなくて、インデックスを貼れば問題ないみたいな話になるけど、100万件以上はパフォーマンスに影響すると思う。特に主要テーブルとかになるとカラム数とかも増えるんで

件数は100万件を超えない、カラム数は10カラムを超えないを心がけたいところです。

google analytics(GA)のビューのフィルタはビュー毎に独立していない

google analyticsのフィルタ設定で次のような問題起こってしまった。


1.google analyticsの管理>コピー対象のビューを選択>ビュー設定>ビューをコピー
2.コピー元のビューにフィルタ設定がされていました(今回の場合は社内からのIPを制限するフィルタ)
3.コピーして新規で作成したビューは「社内からのIPのみを許可する」フィルタを設定
4.コピー元のフィルタ設定まで「社内からのIPのみを許可する」に変わってしまった。

 

■過ち
コピー元ビューのもともと設定されていた「社内からのIPを制限する」フィルタを編集してしまった。正しいやりかたは新規でフィルタを作成する。

■結論
フィルタは各ビュー間で共通の設定を持っていてビュー毎に独立していない。