MySQL 5.6 on Ubuntu 14.04で少しはまったこと
3号です。
オンプレ+CentOS6系なインフラをちょめちょめしてたのが一年くらい前でそっから会社辞めて、今の会社で久々にMySQL構築おじさんをしたらちょっとはまりました。私にUbuntuの知見がほとんど無かったというのも原因ですね。そのメモになります。
インストール時にMySQLのユーザパスワードを聞かれないようにする
通常ubuntuにaptでMySQLをインストールするとrootのパスワードどうする?とかインタラクティブなやりとりが行われます。しかしシェルスクリプトやchefなどからインストールする場合、これをスキップしたいです。そこで下記のようにDEBIAN_FRONTEND=noninteractiveをコマンドに渡すとスキップすることができます。
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y mysql-server-5.6 mysql-client-5.6 libmysqlclient-dev
をバーンでいけます。Ubuntu力が低くてはまった事柄です。
mysqldが落ちない
上記インストール直後、ps -ef | grep mysql
ってやるとmysqldが存在しています。で、このプロセスなのですが、/etc/init.d/mysql stop
ってやっても落ちてくれません。killしてもダメです。
service mysql stop
ってやる必要があります。普段serviceコマンドほとんど使わないので解決するまで結構時間を食ってしまった...。serviceコマンドで落としたあとは/etc/init.d/mysql stop
や/etc/init.d/mysql start
が効くようになります。
File 'mysql-bin.index' not found (Errcode: 13 - Permission denied)とか言われる
データディレクトリの場所を変えたんですが、そしたらこれに当たりました。データディレクトリ変える場合は注意ですね。原因は/etc/apparmor.d/usr.sbin.mysqld
というファイルがあってですね(知らなかった)、このファイルに下記を追記します。以下の例はデータディレクトリを/db/mysqlにする場合になります。
/db/mysql/ r, /db/mysql/** rwk,
そしてsudo service apparmor reload
で解消します。
[ERROR] Function 'innodb' already existsがログに記録される
http://www.faqssys.info/error-function-innodb-already-exists/
これですね。たぶんバグだと思います。mysql.plugin
テーブルに入っているinnodbプラグインがないよ、って意味です。他にもFEDERATEDがないよとかいろいろログに出ます...。
これについてはそもそもinnodbはビルトインされたものを使ってますので、mysql.pluginテーブルで不要なものを消しました。このエラーログが出ていても動作に影響は無いようなのですが、ERRORって文字が気持ち悪いので。
[ERROR] InnoDB: Tablespace open failed for '"mysql"."innodb_index_stats"', ignored.がログに記録される
http://bugs.mysql.com/bug.php?id=67179
これですね。該当のバージョンではないのですが...これが発生しました。
http://bugs.mysql.com/file.php?id=19725&bug_id=67179&text=1
こちらの要領に従って従ってテーブルを再作成してMySQLを再起動して完了です。
以上です。
ncコマンドでTCP/UDPポートの疎通確認をする
3号です。
このシノギをしていると謎の力によって通信が遮断されてとても困ることがあります。 私の現場ではfluentdを運用しているのですが、つい先ほど転送元ホストから転送先ホストにログが転送できなくなってしまいました。
fluentdはログの受け口として24224番ポートをTCP、UDP双方でリスンするのでこのポートを調査します。
まずTCP24224ポートの調査です。telnetを用いるのが定番ですが掲題のncコマンドでもできるので今回はncコマンドでやってみます。
次のようにして転送先ホストで24224番をTCPでリスンします。
nc -l -p 24224
そして転送元から次のようにhello tcpというメッセージを送ります。
echo "hello tcp" | nc TARGET_HOST 24224
疎通ができれば転送先にhello tcpというメッセージが表示されます。
続いてUDP24224番を調査します。ncコマンドに-uをつけることでUDPでリスンすることができます。
nc -l -u -p 24224
転送元ホストから同じく-uオプションをつけてUDPでメッセージ(hello udp)を送信。
echo "hello udp" | nc -u TARGET_HOST 24224
UDP24224番の疎通ができるのであればメッセージが表示されます。
私の環境ではダメでした。どうやらUDP24224番に謎の力が働いたようです。突然です。iptablesも動いてないし。
困ったなあ、と思いながらこのブログを書きました。
追記
今、fluentdはheatbeat_type tcpを設定すればudp空いてなくてもいいんだよ、と教えてもらえました。なぜ突然udpがダメになったか不思議なんですが、困らなくて済みそうです。
Linuxのビープ音を鳴らさないようにする
3号です。今年も残すところあと356日くらいです。がんばっていきましょう。
- OS
vim /etc/inputrc #set bell-style none のコメントアウトをはずして一度ログアウトする
- vim
~/.vimrc set visualbell
っていう。
2014年のまとめ
『飲んだ勢いで俺たちのブログを開設しました』
と、このブログが始まってから1ヶ月がたちました。
今回は今年最後の記事ということで、今年の総まとめ的なやつです。
※ちなみに7人で、週一当番制で書いてました。
記事数、はてブ数、アクセス数!
1ヶ月でどういう記事がどのぐらいのユーザに届いたのかについてです。
それではまず、
総記事数 28!
- 飲んだ勢いで俺たちのブログを開設しました
- rpmのconfigfilesクエリ
- Pingdomで外形監視
- Sinatra の configure で書く必要がないかも知れない項目
- GoConveyでerror型をテストする時に気をつける事
- crontabの曜日の指定
- 俺とおまえとawk
- 俺とおまえとperlワンライナー
- lessの--no-initオプション
- BigQueryのunixtimeなカラムをdateに変換する
- (tmux) ペインを独立したウィンドウに変える
- ELBのIPアドレス個数でサービス規模は推定できるのか
- Sinatraライクなgin-gonicで手軽にGolangを試す。
- scpとrsyncでパスのケツスラッシュのありなしの挙動を毎回迷うのでメモ
- test-unitさえあればご飯大盛り三杯はイケる
- はてなAPIとS3を使って隊員ごとのブクマ数をブログパーツ化してみた
- Vagrantのshell provisionerはシェルスクリプト以外も指定出来る
- gentooでびっくりしたこと
- Ruby の Object Data Dumper
- Travis CIでMongoDB 2.6系を使う設定
- catで複数行の文字を入力してファイルへ出力
- Macでお手軽にリモートマシンからのコマンド終了通知
- CloudFront+S3の画像配信にリサイズ機能を追加する
- 例えばディレクトリの作成にinstallコマンドを使う
- mysqldumpで欲しいレコードだけ抽出する
- ちょっとしたファイルの転送に便利な SimpleHTTPServer
- Golang + mgoを使う時にクエリはbson型にするんだよ、というお話
- DHCP だけど DNS サーバを手動で指定したい
総はてブ数 671!!
そして
総アクセス数 12000!!!
広告収入 無し!!!
おおー、けっこういきましたね。
1ヶ月にしてはまぁまぁじゃないでしょうか。
続いてもうちょっと細かく見てみます。
はてブ数のTOP10はこうなりました。
- 俺とおまえとawk - 俺たちのブログ
- scpとrsyncでパスのケツスラッシュのありなしの挙動を毎回迷うのでメモ - 俺たちのブログ
- CloudFront+S3の画像配信にリサイズ機能を追加する - 俺たちのブログ
- Ruby の Object Data Dumper - 俺たちのブログ
- (tmux) ペインを独立したウィンドウに変える - 俺たちのブログ
- test-unitさえあればご飯大盛り三杯はイケる - 俺たちのブログ
- ELBのIPアドレス個数でサービス規模は推定できるのか - 俺たちのブログ
- 例えばディレクトリの作成にinstallコマンドを使う - 俺たちのブログ
- mysqldumpで欲しいレコードだけ抽出する - 俺たちのブログ
- Sinatraライクなgin-gonicで手軽にGolangを試す。 - 俺たちのブログ
上から7号、6号、1号!!!
記事ごとのアクセス数分布もだいたい同じです。
awkとケツスラの記事が特に人気でした。
書いてる人がおっさんばっかだから、やたら古めかしいツールの運用系TIPSが多いですねぇ。
みんなもっとDockerとかHubot+Slackとかみたいなオシャレ記事書けや。
各隊員ごとのはてブ数はこうなりました。
- 1号 : 77
- 2号 : 24
- 3号 : 34
- 4号 : 81
- 5号 : 24
- 6号 : 189
- 7号 : 242
次の飲み会は2号と5号のオゴリですね。
まとめ
というわけで、この1年のブログまとめでした。
まぁなんといっても、開始から28日欠かさずに書いたのがすごいですね。
やっぱ匿名が良かったのかな。
最初は名前を出さずに書くってなんか不毛だなと思いましたが、
そのぶん、時間無かったり、いいネタ思いつかなったりしても、
『もうなんでもいいから書いちまえ!』
という割り切りがしやすかった気がします。
やっぱブログで一番大事なのはとにかく書くことですよね。
アクセス数、はてブ数もけっこういい数字になって良かったです。
という感じでした!!!
それではみなさん、今年はお疲れ様でした。
今後どういう形で続けてくのかは謎ですが、来年もよろしくお願いします!
DHCP だけど DNS サーバを手動で指定したい [Linux]
さっき調べてたことのメモ。
Vagrant で Linux マシンを起動したときに、ネットワーク設定を NAT (+ DHCP) にした状態で、DNS サーバは社内のやつを使いたかった。 普通に /etc/resolv.conf を編集して
+ nameserver x.x.x.x
とかしても、/etc/init.d/network restart
とかしてネットワークを再起動すると DHCP (正確には dhclient-script) によって、/etc/resolv.conf が書き換えられてしまう。
$ cat /etc/resolv.conf ; generated by /sbin/dhclient-script nameserver 10.0.2.3
VirtualBox の 10.0.2.3 が指定される。これをなんとかしたいという話。
方法1:PEERDNS=no を使う
/etc/sysconfig/network-scripts/ifcfg-eth0 に PEERDNS=no を追加すると、DHCP で /etc/resolv.conf を更新されないようにできる。
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 ONBOOT=yes BOOTPROTO=dhcp PEERDNS=no
なので、あとは /etc/resolv.conf を手動でいじって良い
$ cat /etc/resolv.conf nameserver x.x.x.x nameserver y.y.y.y
方法2:DNS1/DNS2 を使う
DNS1/DNS2 を書いて置くと network を再起動した時に、/etc/resolv.conf に追記してくれる。
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 ONBOOT=yes BOOTPROTO=dhcp DNS1=x.x.x.x DNS2=y.y.y.y
$ sudo /etc/init.d/network restart $ cat /etc/resolv.conf ; generated by /sbin/dhclient-script nameserver x.x.x.x nameserver y.y.y.y
ifcfg-eth1 もある場合どうなるんや!と思って試した所、どうやら後勝ちするようだ。
おわりに
PEERDNS=no がよさそう。なんかもっとうまい方法あればおしえてちょ。
Golang + mgoを使う時にクエリはbson型にするんだよ、というお話
メリークリスマス。5号です。こんな時間にブログ書いている時点でお察し下さい。
そろそろネタが無くなって来たので、本当に小ネタで。
Golang + mongodbを利用する時にmgo
mgo - Rich MongoDB driver for Go
というドライバを使っているんですが、クエリを投げる時にベタにstringで
var result ResultEntity query := "\"delete_flg\": 0" err := session.Find(query).All(&result)
みたいに書いてもクエリが動いてくれません。(かなり色々端折っています・・・。)
どうするかと言うと一度bson型に入れる必要があり、さらに中でネストされているような場合もそれをbsonにする必要があります。
var result ResultEntity query := bson.M{"test": testid, "hoge_flg": 1, "fuga_flg": 0, "time_start_at": bson.M{"$lte": now}, } err := session.Find(query).All(&result)
みたいに書くと動きます、というお話です。まあ、普通にちゃんとドキュメント読んだ人なら迷いません。ちなみに僕は初めの頃に今回の例で言うクエリ内の「{"$lte": now}」をbsonにしなくてドハマりした記憶があります。
以上、メリクリでした!
ちょっとしたファイルの転送に便利な SimpleHTTPServer
サーバ間でちょっとしたファイルの受け渡しをしたいことはよくあると思う。
そういうときには scp
とか rsync
とかを使ったりすると思う。
だけど ssh
がそのサーバ間で許可されてなかったり、ケツスラッシュとかを気にしたりしなくてはならなかったりして意外とダルい。
あとは netcat
とかあるけど日常的に使わないから毎回使い方調べたりしなくてはならなくて*1ダルい。
そこで SimpleHTTPServer ですよ
たぶんみんな知ってて普通に使ってるんじゃないかなと思ったけど、たまたま同僚のおじさんが 3 人連続で知らなくて俺が教えてあげるみたいな機会があったからこのブログにも書いておこうと思う。
SimpleHTTPServer とは
python
の簡易WEBサーバ。
コマンドラインから起動すると、カレントディレクトリ以下が DocumentRoot
になる。
起動方法
いずれの場合も第一引数で任意のポート番号を指定できる。デフォルトは 8000
- python 2 系
$ python -m SimpleHTTPServer
- python 3 系
$ python -m http.server
で
送りたいファイルのあるディレクトリに cd
して SimpleHTTPServer
を起動すれば、受け取らせたいサーバ側から wget
などでカンタンにファイルを取得出来る。超便利。
ssh
できるかとかケツスラッシュとかを気にしたりしなくていいし、どっか適当に空いてて疎通が取れるポートがあればいいだけ〜。最高。
*1:わたしだけですかね。そうですね。