MySQL5.6の文字コード設定が分からない

環境:Vagrant上のUbuntu14.04

MySQLapt-get installで入れた5.5http://dev.mysql.com/get/mysql-apt-config_0.8.0-1_all.debを使って5.6にアップグレードした。

文字コードを全部utf8mb4にしようとしていて、設定はすべて/etc/mysql/my.cnfに書いた。 作業しているOSユーザがrootの場合は希望通りの設定となっていたのだが、別のOSユーザでDB接続した際には設定が違っていてびっくりした。

OSユーザが違うことで適用される設定が変わるとかあるのでしょうか……?


tusui@hogehoge:~$ sudo su - root
root@hogehoge:~# mysql -uroot -p

rootユーザで接続すると

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.35 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show variables like '%character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

mysql> show variables like '%collat%';
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database   | utf8mb4_general_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

utf8mb4ベースになっている。


tusui@hogehoge:~$ mysql -uroot -p

rootじゃないOSユーザで接続すると

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.35 MySQL Community Server (GPL)

Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show variables like '%character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

mysql> show variables like '%collat%';
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8_general_ci    |
| collation_database   | utf8mb4_general_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

なぜ……?

この状態からset names utf8mb4すると、rootユーザと同じ設定になる。

追記

次の日、vagrant upしてrootユーザ以外で接続すると、期待通りのcharacter set、collationになっていたとさ……。

勉強会で喋った

ちょっと前にみんなのウェディングさんとの合同勉強会で喋りました。 15分ということでざっくりした話の予定でしたが、あまりにざっくりさせすぎていたのが悔やまれます。 会場には結構インフラ寄りの人も多くて懇親会で色々お話させていただけて楽しかったです。

以下、スライドです。

speakerdeck.com

MySQL 5.7でrootユーザがパスワード認証になっていない時にパスワード認証に変更するやり方

環境はAWS

# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS"

Ansibleを使っていてrolesの下が

db
├── tasks
│   └── main.yml
└── templates
    └── mysql.preseed.j2

$ cat roles/db/tasks/main.yml
- template: src=mysql.preseed.j2 dest=/tmp/mysql.preseed
- shell: debconf-set-selections /tmp/mysql.preseed
- apt: name={{ item }} update_cache=yes
  with_items:
  - mysql-server
  - mysql-client
$ cat roles/db/templates/mysql.preseed.j2
mysql-community-server mysql-community-server/root-pass    password {{ password }}
mysql-community-server mysql-community-server/re-root-pass password {{ password }}

みたいな状態で{{ password }}部分を変数として与えてMySQL 5.7をインストールしたら、rootユーザのパスワードが設定されておらず、OSのrootユーザのみがパスワード無しで(かつ、どんなテキトーパスワードでも)接続できるようになっていた。

中身を見てみると

mysql> select plugin, authentication_string from mysql.user where user = 'root';
+-------------+-----------------------+
| plugin      | authentication_string |
+-------------+-----------------------+
| auth_socket |                       |
+-------------+-----------------------+

だと。 パスワードの設定とpluginの値をmysql_native_passwordを変更するには

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'hogehoge';

としてやる。 SET PASSWORD文やALTER USER 'root'@'localhost' IDENTIFIED BY 'hogehoge'ではダメ。

そもそもmysql.preseed.j2の内容がおかしい気もするがここ直せばパスワード設定されるのかは未検証。

homebrew

久しぶりにbrew installしたらこけた。 原因はhomebrewのアップデートをしていなかったのと、Mavericksになってデフォルトがruby2.0になったから。 最初は https://github.com/Homebrew/homebrew/issues/23655 にあったみたいに

/usr/local/bin/brew

shebangをruby1.8に変更したが、gitに怒られたので結局元に戻して

cd /usr/local/Library/Homebrew
git pull origin master

で解決。

sudoers

うっかり /etc/sudoers のパーミッションを変更してしまったのでメモ。

環境はEC2なのでご注意を。


というかここに書いてある通りにやっただけですが。

  1. 一時インスタンス作成
  2. やっちゃったインスタンス停止
  3. やっちゃったインスタンスのルートデバイスのEBSをデタッチ
  4. 一時インスタンスに上でデタッチしたEBSをアタッチ
  5. 上でアタッチしたデバイスをマウント
  6. マウントしたディレクトリ配下の/etc/sudoersのパーミッション修正
  7. 修正したらアンマウント
  8. そしてデタッチ
  9. やっちゃったインスタンスの/dev/sda1にアタッチ
  10. そして起動

という感じ。

アホなことしないでちゃんとvisudo使います…。

GlusterFS導入でハマった話

導入方法は検索すれば豊富に出てくると思うので割愛。

軽くハマった話を。

環境は

  • 3.2.21-1.32.6.amzn1.x86_64
  • gluster関連パッケージは全て3.3.0-1.el6.x86_64

です。


とりあえずテスト用に導入して、良い感じだったので同じサーバにちゃんとした名前にして再作成しようとしたら

$ sudo gluster volume create <ボリューム名> <option> <peer1>:<パス> <peer2>:<パス>
<パス> or a prefix of it is already part of a volume

と怒られ作成できない。

調べてみると

gluster volume delete <ボリューム名>

とボリュームを削除しても属性までは削除してくれず、残ってしまうっぽい。

(参考:https://bugzilla.redhat.com/show_bug.cgi?id=812214)


なので、属性を削除してみる。

$ sudo getfattr -m - -d <パス>
# file: <パス>/
trusted.glusterfs.volume-id=*********************

で確認して

$ sudo setfattr --remove=trusted.glusterfs.volume-id <パス>

で削除。

trusted.gfid も表示された場合はこれも削除


もう一度。

$ sudo gluster volume create <ボリューム名> <option> <peer1>:<パス> <peer2>:<パス>
Creation of volume <ボリューム名> has been successful. Please start the volume to access data.

出来ました。

カジュアルに対応するとこんな感じでしょうか。

vmodでS3の認証を突破する

とか考えていたら

といわなちゃんさん先生に尋ねると、

なんということでしょう!

というわけで試してみました。


環境はVirtualBox上で

  • CentOS 5.6(x86_64)
  • Varnish 3.0.0
  • libvmod-awsrest

という感じです。

公式RPMからふわっとインストールするのではなく今回試したようにrpmbuildとかやりだすと3.0.2ではどハマりして泣きそうになったので3.0.0で検証しました。

通常S3にマネジメントコンソールからファイルをアップロードすると、自身しかOpen/Downloadは出来ません。

EveryoneにOpen/Downloadを許可する設定を追加してもいいのですが、高貴な恥じらいの精神をもった紳士淑女には抵抗があるかと思われます。

そこで

http://docs.amazonwebservices.com/AmazonS3/latest/dev/RESTAuthentication.html#ConstructingTheAuthenticationHeader

な感じでヘッダを設定してやればいいのですがAWSSecretAccessKeyからハッシュ値を出してやらなければなりません。

それを簡単かつお手軽に可能にしてくれるのが今回いわなちゃんさん先生が作成したlibvmod-awsrestなのです!

それでは早速やってみましょう。

1.ソースをダウンロード

https://www.varnish-cache.org/releases/varnish-cache-3.0.0

2.展開して/usr/src/redhat/SOURCESに

必要なもの(https://www.varnish-cache.org/docs/3.0/installation/install.html#build-dependencies-on-red-hat-centos)は事前に入れておきます。rpm-buildとgccも当然必要です。

docutilsが必要なのでhttp://sourceforge.net/projects/docutils/?source=directoryからダウンロードして展開し

python setup.py install

してあげます。

3.RPM作成

とりあえずRPMだけ作成したいので、ソースディレクトリ内のredhatディレクトリから

rpmbuild -bb varnish.spec

してやります。specファイルのバージョン部分の修正が必要です。

4.インストール

適当にrpm ivhとかして下さい。

5.libvmod-awsrestインストール

mhashが必要なので事前にインストールしておきます。

ダウンロードはhttps://github.com/xcir/libvmod-awsrestから。

VARNISHSRCは/usr/src/redhat/BUILDでconfigure。

6.VCL編集

Varnishが使用するVCLを編集します。Exampleの通りで大体できると思いますが、backendの「.host」に指定するドメイン名にはバケット名を先頭につけてやらないとダメかも?

そんなこんなでAWSAccessKeyId、AWSSecretAccessKeyを記載してlookupしてやります。

お望みの通りファイルは取得できたでしょうか。

おまけ.隠蔽工作

高貴な恥じらいをもつ紳士淑女ならS3を使用していることをちょっと隠したいかもしれません。

S3からのレスポンス内のヘッダをvcl_fetchの中で

unset beresp.http.x-amz-request-id;
unset beresp.http.x-amz-id-2;

等としてやると謎めいた雰囲気をより一層醸し出せるかもしれません。


いわなちゃんさん先生本当にありがとうございました!


おまけのおまけ

Varnish 3.0.2だとvarnishtestでコケまくりました。

使用ポートのレンジを広げてもulimit -nを増やしてもsomaxconnを増やしてもテストの並列度?を1にしても(そもそもそれらが関係あるか分かってませんが)ダメでした。