MySQL5.6の文字コード設定が分からない
環境:Vagrant上のUbuntu14.04
MySQLはapt-get install
で入れた5.5
をhttp://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分ということでざっくりした話の予定でしたが、あまりにざっくりさせすぎていたのが悔やまれます。 会場には結構インフラ寄りの人も多くて懇親会で色々お話させていただけて楽しかったです。
以下、スライドです。
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なのでご注意を。
というかここに書いてある通りにやっただけですが。
- 一時インスタンス作成
- やっちゃったインスタンス停止
- やっちゃったインスタンスのルートデバイスのEBSをデタッチ
- 一時インスタンスに上でデタッチしたEBSをアタッチ
- 上でアタッチしたデバイスをマウント
- マウントしたディレクトリ配下の/etc/sudoersのパーミッション修正
- 修正したらアンマウント
- そしてデタッチ
- やっちゃったインスタンスの/dev/sda1にアタッチ
- そして起動
という感じ。
アホなことしないでちゃんとvisudo使います…。
GlusterFS導入でハマった話
導入方法は検索すれば豊富に出てくると思うので割愛。
軽くハマった話を。
環境は
です。
とりあえずテスト用に導入して、良い感じだったので同じサーバにちゃんとした名前にして再作成しようとしたら
$ 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の認証を突破する
@_tusui: varnishでS3のAuthorization突破する方法が分からんち。
とか考えていたら
@hiro_y: @xcir VarnishからS3の認証突破する方法とかご存知ないですかと思いまして
2012-07-02 17:00:09 via Echofon to @xcir
といわなちゃんさん先生に尋ねると、
なんということでしょう!
というわけで試してみました。
環境はVirtualBox上で
という感じです。
公式RPMからふわっとインストールするのではなく今回試したようにrpmbuildとかやりだすと3.0.2ではどハマりして泣きそうになったので3.0.0で検証しました。
通常S3にマネジメントコンソールからファイルをアップロードすると、自身しかOpen/Downloadは出来ません。
EveryoneにOpen/Downloadを許可する設定を追加してもいいのですが、高貴な恥じらいの精神をもった紳士淑女には抵抗があるかと思われます。
そこで
な感じでヘッダを設定してやればいいのですが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にしても(そもそもそれらが関係あるか分かってませんが)ダメでした。