2017/1/25の MyNA会 行ってきました。
赤井さん、やまさきさん、俺、かじやまさんでインプレスさんからMySQLの本が出た順にしゃべるヤーツ。
ネタ的にはこの時のリライトです(ただし結構リライトしてる…)
日々の覚書: 2年越しの #ChugokuDB in 中国地方
基本的にはくだんの本を書いた時より変わった運用とか、書かなかったポエミーなこととか、そんなものを紹介しています。
こちらもあわせてどうぞ!
MyNA(日本MySQLユーザ会)会 2017年1月ハッシュタグまとめ - Togetterまとめ
GA
2017/01/26
2017/01/19
最近のPercona Serverで/usr/local/mysqlにシンボリックリンクを張ったら上手く起動しないでござる
バイナリー.tar.gz版のはなし。
こんな風に/usr/local/mysqlじゃないところにPercona Serverをダウンロードして、/usr/local/mysqlにシンボリックリンクを張る。
で、イニシャライズして起動しようとすると転ける。
Percona Serverはもともと(特にインストールしてなければ) $MY_BASEDIR_VERSION/lib/libjemalloc.so.1 をロードして勝手にjemallocを使ってくれるようになっている けれど、CVE-2016-6662 対策で 変なところからLD_PRELOADできないようにmysqld_safeに修正 が入っている。
ちなみに本家5.7.16は オプションをパースする時にバリデーション してるだけだけど、Percona Serverは「デフォルトで勝手にjemallocをロードする」ために、 LD_PRELOADをセットする手前でもう一回バリデーション している。
290行目 のreadlinkが肝で、自動でロードしようとした /usr/local/mysql/lib/libjemalloc.so.1 をシンボリックリンク展開して /usr/local/Percona-Server-5.7.16-10-Linux.x86_64.ssl101/lib/mysql/libjemalloc.so.1 にしてしまい、結果 $MYSQL_BASEDIR_VERSION/lib ディレクトリーの外側だから不正、NG! となってる。
取り敢えずこの行をコメントアウトすれば動かせるようにはなる。
ただしその場合リアルにlibjemalloc.so.1をシンボリックリンクで変な共有ライブラリーに置き換えられると死ぬ。
…けど、そんなところ置き換えられるような権限取られたらもっとひどいことされてるだろうから大丈夫だとは思う。野良ビルドでなければ。
5.7.16でしか確認していないけど、CVE-2016-6662対応以降 のマイナーバージョンであれば5.5, 5.6も同じことが起こるかも知れない。
こんな風に/usr/local/mysqlじゃないところにPercona Serverをダウンロードして、/usr/local/mysqlにシンボリックリンクを張る。
$ cd /usr/local $ wget https://www.percona.com/downloads/Percona-Server-5.7/Percona-Server-5.7.16-10/binary/tarball/Percona-Server-5.7.16-10-Linux.x86_64.ssl101.tar.gz $ tar xf Percona-Server-5.7.16-10-Linux.x86_64.ssl101.tar.gz $ ln -s Percona-Server-5.7.16-10-Linux.x86_64.ssl101 mysql $ ll total 234348 drwxr-xr-x 2 root root 18 Jun 8 2016 bin drwxr-xr-x 2 root root 6 Sep 23 2011 etc drwxr-xr-x 2 root root 6 Sep 23 2011 games drwxr-xr-x 2 root root 6 Sep 23 2011 include drwxr-xr-x 2 root root 6 Sep 23 2011 lib drwxr-xr-x 3 root root 18 Jun 8 2016 lib64 drwxr-xr-x 2 root root 6 Sep 23 2011 libexec lrwxrwxrwx 1 root root 44 Jan 19 11:47 mysql -> Percona-Server-5.7.16-10-Linux.x86_64.ssl101 drwxr-xr-x 11 root root 4096 Jan 19 11:48 Percona-Server-5.7.16-10-Linux.x86_64.ssl101 -rw-r--r-- 1 root root 239966730 Nov 28 05:07 Percona-Server-5.7.16-10-Linux.x86_64.ssl101.tar.gz drwxr-xr-x 2 root root 6 Sep 23 2011 sbin drwxr-xr-x 6 root root 58 Jun 8 2016 share drwxr-xr-x 2 root root 6 Sep 23 2011 src
で、イニシャライズして起動しようとすると転ける。
$ useradd mysql $ cd mysql $ bin/mysqld --no-defaults --initialize --datadir=./data --user=mysql $ bin/mysqld_safe --no-defaults --datadir=./data --user=mysql mysqld_safe Adding '/usr/local/Percona-Server-5.7.16-10-Linux.x86_64.ssl101/lib/mysql/libjemalloc.so.1' to LD_PRELOAD for mysqld mysqld_safe ld_preload libraries can only be loaded from system directories (/usr/lib64, /usr/lib, /usr/local/mysql/lib)
Percona Serverはもともと(特にインストールしてなければ) $MY_BASEDIR_VERSION/lib/libjemalloc.so.1 をロードして勝手にjemallocを使ってくれるようになっている けれど、CVE-2016-6662 対策で 変なところからLD_PRELOADできないようにmysqld_safeに修正 が入っている。
ちなみに本家5.7.16は オプションをパースする時にバリデーション してるだけだけど、Percona Serverは「デフォルトで勝手にjemallocをロードする」ために、 LD_PRELOADをセットする手前でもう一回バリデーション している。
288 add_mysqld_ld_preload() { 289 lib_to_add="$1" 290 lib_to_add=$(readlink -f $lib_to_add) 291 log_notice "Adding '$lib_to_add' to LD_PRELOAD for mysqld" 292 293 # Check if the library is in the reduced number of standard system directories 294 case "$lib_to_add" in 295 /usr/lib64/* | /usr/lib/* | ${MY_BASEDIR_VERSION}/lib/*) 296 ;; 297 *) 298 log_error "ld_preload libraries can only be loaded from system directories (/usr/lib64, /usr/lib, ${MY_BASEDIR_VERSION}/lib)" 299 exit 1 300 ;; 301 esac
290行目 のreadlinkが肝で、自動でロードしようとした /usr/local/mysql/lib/libjemalloc.so.1 をシンボリックリンク展開して /usr/local/Percona-Server-5.7.16-10-Linux.x86_64.ssl101/lib/mysql/libjemalloc.so.1 にしてしまい、結果 $MYSQL_BASEDIR_VERSION/lib ディレクトリーの外側だから不正、NG! となってる。
取り敢えずこの行をコメントアウトすれば動かせるようにはなる。
ただしその場合リアルにlibjemalloc.so.1をシンボリックリンクで変な共有ライブラリーに置き換えられると死ぬ。
…けど、そんなところ置き換えられるような権限取られたらもっとひどいことされてるだろうから大丈夫だとは思う。野良ビルドでなければ。
5.7.16でしか確認していないけど、CVE-2016-6662対応以降 のマイナーバージョンであれば5.5, 5.6も同じことが起こるかも知れない。
2017/01/06
AWS上でMySQL5.7動作環境を最速で作る方法(MySQL::Sandbox使用)
@sakaik さんの連載(?)を読んでいたらやたら楽しそうで俺もなんかビルドしたくなってたまらなくなったので。
- MySQLをビルドする on AWS Red Hat 7.3 - sakaikの日々雑感~(T)編
- ふたつのバージョンのMySQLを同時に動かす on AWS Red Hat 7.3 - sakaikの日々雑感~(T)編
- MySQL 5.7 のビルドにトライ ~ 5.6とは大違い - sakaikの日々雑感~(T)編
- MySQL 5.7 を t2.micro でもビルドできた! - sakaikの日々雑感~(T)編
- AWS上でMySQL5.7動作環境を最速で作る方法(Generic binaries使用) - sakaikの日々雑感~(T)編
タイトルからわかるように、最後のエントリーに対抗してみました。
先に書いておくと、MySQL::Sandboxのインストールまで終わっていれば 15秒くらい でMySQL 5.7.17の起動までたどり着けます(あとで書きますがこれはMySQL::Sandboxの **中の人** が上手くやってる)
TL;DR
みんなだいすき MySQL::Sandbox ですが、make_sandbox と make_replication_sandbox だけで満足していませんか?
MySQL::Sandbox 3.1.10から(2017年1月6日現在、最新版は3.2.05)は make_sandbox_from_url というコマンドを備えています。
引数なしで叩くとusage吐いてくれるので取り敢えず叩く。
make_sandbox_from_urlという名前ながら、引数はURLではなくてバージョン番号(make_sandboxと同じ)
これもともとは本当にURLだったけど、途中で変わったんじゃないかって気がする。確証はないし調べてもいない。
…しかし…数百MBあるバイナリーを落としてるにしては…? と思ったら、公式バイナリーではなく、MySQL::Sandbox作者のGitHubから取ってきてる。
軽量版MySQLバイナリー.tar.gzは このスクリプト で作っている様子。
というわけでこれを使えば、5.0でも5.1でも5.5でも5.6でも5.7でも8.0でも好きなリリースシリーズが入れられますよ! ;)
ちなみにダウンロードされたバイナリー.tar.gzと展開後のファイルは$HOME/opt/mysql に置かれる。40MB………どんだけいろんなもん積んでるんだよ公式バイナリー。。
- MySQLをビルドする on AWS Red Hat 7.3 - sakaikの日々雑感~(T)編
- ふたつのバージョンのMySQLを同時に動かす on AWS Red Hat 7.3 - sakaikの日々雑感~(T)編
- MySQL 5.7 のビルドにトライ ~ 5.6とは大違い - sakaikの日々雑感~(T)編
- MySQL 5.7 を t2.micro でもビルドできた! - sakaikの日々雑感~(T)編
- AWS上でMySQL5.7動作環境を最速で作る方法(Generic binaries使用) - sakaikの日々雑感~(T)編
タイトルからわかるように、最後のエントリーに対抗してみました。
先に書いておくと、MySQL::Sandboxのインストールまで終わっていれば 15秒くらい でMySQL 5.7.17の起動までたどり着けます(あとで書きますがこれはMySQL::Sandboxの **中の人** が上手くやってる)
TL;DR
$ sudo su -i # yum install -y perl-ExtUtils-MakeMaker perl-Data-Dumper # curl -L cpanmin.us | perl - App::cpanminus # /usr/local/bin/cpanm MySQL::Sandbox # useradd mysql # su - mysql $ make_sandbox_from_url 5.7.17 $ msb 5717
みんなだいすき MySQL::Sandbox ですが、make_sandbox と make_replication_sandbox だけで満足していませんか?
MySQL::Sandbox 3.1.10から(2017年1月6日現在、最新版は3.2.05)は make_sandbox_from_url というコマンドを備えています。
引数なしで叩くとusage吐いてくれるので取り敢えず叩く。
$ make_sandbox_from_url The MySQL Sandbox, version 3.2.05 (C) 2006-2016 Giuseppe Maxia ### version needed This script tries to create a sandbox using binaries downloaded from the web. The success of this scripts depends on good connectivity and availability of downloading tools. ########################## # IT ONLY WORKS ON LINUX ########################## The repository of available binaries is at https://github.com/datacharmer/mysql-docker-minimal/blob/master/dbdata . Supported: # 5.0 -> [ 5.0.96 ] # 5.1 -> [ 5.1.72 ] # 5.5 -> [ 5.5.51 5.5.52 ] # 5.6 -> [ 5.6.32 5.6.33 ] # 5.7 -> [ 5.7.14 5.7.15 ] # 8.0 -> [ 8.0.0 ] The binaries are imported into /usr/mysql . make_sandbox_from_url X.X.XX [options] where X.X.XX is the version number. You can then pass any options accepted by make_sandbox.
make_sandbox_from_urlという名前ながら、引数はURLではなくてバージョン番号(make_sandboxと同じ)
これもともとは本当にURLだったけど、途中で変わったんじゃないかって気がする。確証はないし調べてもいない。
$ make_sandbox_from_url 5.7.17 2017-01-06 07:56:30 URL:https://raw.githubusercontent.com/datacharmer/mysql-docker-minimal/master/dbdata/available.txt [98/98] -> "/tmp/available.txt" [1] wget -nv -O 5.7.17.tar.gz 'https://github.com/datacharmer/mysql-docker-minimal/blob/master/dbdata/5.7.17.tar.gz?raw=true' 2017-01-06 07:56:33 URL:https://raw.githubusercontent.com/datacharmer/mysql-docker-minimal/master/dbdata/5.7.17.tar.gz [40959490/40959490] -> "5.7.17.tar.gz" [1] Executing low_level_make_sandbox --basedir=/home/mysql/opt/mysql/5.7.17 \ --sandbox_directory=msb_5_7_17 \ --install_version=5.7 \ --sandbox_port=5717 \ --no_ver_after_name \ --my_clause=log-error=msandbox.err .. do you agree? ([Y],n) Y # Starting server .. sandbox server started # Loading grants Your sandbox server was installed in $HOME/sandboxes/msb_5_7_17 $ msb 5717 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 5 Server version: 5.7.17 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 [localhost] {msandbox} ((none)) >
…しかし…数百MBあるバイナリーを落としてるにしては…? と思ったら、公式バイナリーではなく、MySQL::Sandbox作者のGitHubから取ってきてる。
軽量版MySQLバイナリー.tar.gzは このスクリプト で作っている様子。
というわけでこれを使えば、5.0でも5.1でも5.5でも5.6でも5.7でも8.0でも好きなリリースシリーズが入れられますよ! ;)
ちなみにダウンロードされたバイナリー.tar.gzと展開後のファイルは$HOME/opt/mysql に置かれる。40MB………どんだけいろんなもん積んでるんだよ公式バイナリー。。
$ ll opt/mysql/ total 79712 drwxrwxr-x 7 mysql mysql 4096 Dec 14 18:46 5.7.17 -rw-rw-r-- 1 mysql mysql 40959490 Jan 6 07:56 5.7.17.tar.gz drwxrwxr-x 7 mysql mysql 4096 Sep 12 15:22 8.0.0 -rw-rw-r-- 1 mysql mysql 40654528 Jan 6 07:57 8.0.0.tar.gz
登録:
投稿
(
Atom
)