Mysql toranomaki
Upcoming SlideShare
Loading in...5
×
 

Mysql toranomaki

on

  • 17,169 views

 

Statistics

Views

Total Views
17,169
Views on SlideShare
14,106
Embed Views
3,063

Actions

Likes
94
Downloads
184
Comments
0

20 Embeds 3,063

http://nippondanji.blogspot.jp 2801
https://twitter.com 81
http://192.168.33.10 54
http://s.deeeki.com 50
http://nippondanji.blogspot.com 49
http://slideshare-download.seesaa.net 5
http://news.google.com 4
http://tweetedtimes.com 3
http://b.hatena.ne.jp 3
http://nippondanji.blogspot.sg 2
http://nippondanji.blogspot.ca 2
http://nippondanji.blogspot.hk 1
http://geechscamp.lovepop.jp 1
https://www.linkedin.com 1
http://nippondanji.blogspot.co.uk 1
https://kcw.kddi.ne.jp 1
http://www.peeep.us 1
http://nippondanji.blogspot.kr 1
http://nippondanji.blogspot.fr 1
http://nippondanji.blogspot.tw 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-NonCommercial-NoDerivs LicenseCC Attribution-NonCommercial-NoDerivs LicenseCC Attribution-NonCommercial-NoDerivs License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Mysql toranomaki Mysql toranomaki Presentation Transcript

  • MySQL 運用虎の巻! @ 徳島オープンセミナー 2013 奥野 幹也 @nippondanji mikiya (dot) okuno (at) gmail (dot) com
  • 免責事項 ● 本プレゼンテーションにおいて示されている見解 は、私自身の見解であって、オラクル・コーポレー ションの見解を必ずしも反映したものではありませ ん。ご了承ください。
  • 自己紹介 ● MySQL サポートエンジニア – 日々のしごと ● ● ● ● ライフワーク – 自由なソフトウェアの普及 ● ● トラブルシューティング全般 Q&A 回答 パフォーマンスチューニング など オープンソースではない ブログ – – 漢のコンピュータ道 http://nippondanji.blogspot.com/ 今日は個人として 参加しています。
  • アジェンダ ● ● ● ● ● ● MySQL の概要 インストールと初期設定 ユーザー管理 開発関係の話 バックアップ パフォーマンスチューニング
  • MySQL の概要
  • MySQL とは ● ● ● ● ● オープンソースのリレーショナル・データベース・マネージメ ント・システム MySQL AB => Sun Microsystems => Oracle によって開 発。 Web 開発においては圧倒的なシェア 使い易く、安定して、高速に動作するのがウリ ホームページ – – http://www-jp.mysql.com/ http://dev.mysql.com/
  • MySQL の機能的特徴 ● ● ● ● ● ● ● ● ANSI SQL 標準に準拠(一部の 文法を除く。) 種々のプラットフォームをサポー ト( Windows 、 Linux 、 Mac 、各 種 UNIX 系 OS ) ストレージエンジンによりデータ を格納するレイヤーを仮想化 ACID 準拠のトランザクション XA トランザクション 非同期・準同期 - Master/Slave 型レプリケーション 水平パーティショニング ( Range 、 List 、 Hash 、 Key ) ストアドプロシージャ、ストアド ファンクション、トリガ ● ● ● ● ● ● ● ● ● ● ● UNION ビュー サブクエリ INFORMATION_SCHEMA SSL による通信 Unicode をはじめとした各種文 字コードのサポート 全文検索 タイムゾーンのサポート 多種多様な開発言語のサポー ト( C 、 C+ + 、 Java 、 Perl 、 PHP 、 Python 、 Ruby など) ODBC による接続のサポート NoSQL インターフェイス
  • MySQL の構造的特徴 ● ● ● ● ● ● ● ● ● ● シングルプロセス・マルチスレッド 1 セッション= 1 スレッド ストレージエンジン API によるデータストアの仮想化 その他各種プラグイン API GNU Bison による Lexical Scanner コストベースのオプティマイザ 全ての更新を保存するバイナリログ 2 種類のスレッドで実装された非同期型レプリケーション 移植性の高い関数群( MySQL システムライブラリ mysys )を使って実装 ソースコードは C/C++ 混在
  • MySQL の仕組み(イメージ図) クライアント Java クライアント PHP コネクション スレッド コネクション スレッド クライアント ODBC コネクション スレッド SQL の解析と最 適化は共通 パーサー・オプティマイザ・アクセス管理 等 ストレージエンジン API MyISAM table_name.MYI table_name.MYD InnoDB テーブル スペース ログファイル MySQL Cluster NDB API MySQL サーバ データノード データの格納や アクセス方法は ストレージエンジ ンごとに違う
  • ライセンス ● MySQL はデュアルライセンスを採用 – Community 版 ● ● – GPLv2 FOSS License Exception あり 商用版 ● ● ● コマーシャルライセンス サブスクリプション OEM Oracle がすべての著作権を 保有しているから可能
  • GPL - GNU General Public License ● リチャード・ストールマン氏により考案されたソフトウェアラ イセンス – – – – ● ● 1989 年〜 世界で最も用いられているオープンソースライセンス フリー(自由な)ソフトウェアを実現するために考えられた コピーレフトを具現化するためのライセンス 現在の著作権法の上に立脚 Copyleft – All rights reversed – Copyright – All rights reserved を文字ったもの ● – – 意味は真逆 ユーザーに完全な自由を認める。 再配布物(派生物や 2 次利用した作品)のライセンスを 同じものにすることを要求
  • GPL の適用範囲 ● ライセンスを GPL にする必要がある場合 – – GPL のソフトウェアを改造してまたはそのまま再配布 GPL のソフトウェアを利用したソフトウェアを再配布 ● ● ● ● GPL のライブラリをリンク GPL のソースコードを拝借 プロセス間通信で GPL のプログラムと協調動作。(グ レーゾーン中のグレーゾーン!) ライセンスを GPL にする必要がない場合 – – – – – – ソフトウェアを頒布しない場合 ネットワーク経由で GPL のプログラムと協調動作 単独で動作するプロセスとしてバンドル GPL の OS カーネル上で動作する GPL のシステムライブラリを利用する GPL ソフトウェア用の”インストーラ”
  • インストールと設定
  • インストールは 15 分 ● 3 ステップ – – – – ● ● ● ダウンロード http://dev.mysql.com/downloads パッケージのインストール 起動!! 慣れれば 5 分でインストール可能 最新版を使うべし! Windows 版はインストールウィザードあり – – サーバー本体だけでなく、ドライバや GUI ツールも一発 インストール ただし XP は非対応
  • MySQL Sandbox http://mysqlsandbox.net/ ● ● ● ● Giuseppe Maxia 氏による検証用 MySQL イントールツール 複数のバージョンのインスタンスを同時にインストール レプリケーションも一発構築可能 対応プラットフォームは *NIX – tar.gz 版のパッケージを利用
  • mysql_secure_installation ● セキュリティの脅威になりやすい初期設定を変更するツー ル – – – – root ユーザーのパスワード変更 リモートからの root ユーザーによるログインを無効化 匿名ユーザーの削除 test データベース(誰でもアクセスできる)の削除
  • 鉄板設定 これだけはやっておけ! ● スロークエリログの有効化 – – ● バイナリログの有効化 – – – ● character_set_server = utf8 接続数 – – ● log_bin=mysql-bin expired_logs_days = 30 sync_binlog=1 文字コード – ● slow_query_log=1 long_query_time=1 max_connections = 1000 limits.conf で FD を増やしておくこと InnoDB の各種パラメータ調整 – – – – – innodb_buffer_pool_size = 10G innodb_log_file_size = 1G innodb_log_buffer_size = 64M innodb_file_format = Barracuda innodb_io_capacity = 2000 # SSD の場合
  • ユーザー管理
  • MySQL のユーザーアカウント ● ● ● username@hostname という形式 – username は任意のユーザー名(文字列) – hostname はクライアントのホスト名または IP アドレス – ユーザー名が同じでも接続元が違えば別アカウント! 匿名ユーザー – ''@host1 ワイルドカード = % – john@'%' … 任意のホスト名に一致 – john@'%.hoge.com' … hoge.com というドメイン名に一致 – john@'192.168.1.%' … 192.168.1.0 のネットワークに一致 ● john@'192.168.1.0/255.255.255.0' のほうがベター
  • ユーザーアカウントの マッチング ● ● ● より具体的なアカウントから先にマッチする ユーザー名よりもホスト名優先 優先順位の例 1.john@hoge 2.''@hoge 3.john@'%.hoge.com' 4.john@'%' 5.''@'%' ● 最初にマッチしたユーザーアカウントが選択される
  • MySQL 5.6 で利用可能な 認証プラグイン プラグイン名 説明 商用 Native デフォルトの認証方式 Old Native バージョン 4.1 以前の認証方式 SHA-256 SHA-256 をパスワードのハッシュに利用する方式 Clear Text 平文を用いた認証方式。外部認証を行う場合に必 要 PAM PAM を用いた認証方式。 MySQL サーバーにはパ Y スワードを平文で送る必要がある Windows Native Windows 認証を用いて接続する Socket PeerCredential UNIX ドメインソケットで接続するときに利用可能な 特殊なプラグイン。 Y
  • ユーザーの作成例 SHA-256 プラグインの場合 ● ユーザーの作成 – ● CREATE USER 'sha256user'@'localhost' IDENTIFIED WITH sha256_password; パスワードの設定 – – SET old_passwords = 2; SET PASSWORD FOR 'sha256user'@'localhost' = PASSWORD('sha256P@ss');
  • ドライバ
  • 利用可能なドライバの例 言語 名称 配布元 ライセンス C libmysqlclient Oracle GPLv2 C++ Connector/C++ Oracle GPLv2 Java Connector/J Oracle GPLv2 .NET Connector/.NET Oracle GPLv2 ODBC Connector/ODBC Oracle GPLv2 PHP mysqlnd PHP PHP Python Connector/Python Oracle GPLv2 Perl DBD::mysql cpan GPLv2 Ruby Ruby/MySQL gem(tmtm 氏 ) Ruby
  • FOSS License Exception ● 平たく言うと・・・ – ● ドライバが対象 – ● 自由あるいはオープンソースソフトウェアのために MySQL を利用する場合は、 GPLv2 を適用しなくても良 いという規定 サーバーは Exception なし 適用されるライセンスのリスト – – http://www.mysql.com/about/legal/licensing/fossexception/ 例) AGPLv3 、 GPLv3 、 LGPLv2 〜、 MIT 、 BSD 、 Apac he License 、 PHP License 、 Python License 、 Artistic License
  • 文字コード
  • 意外とハマりやすい文字コード MySQL の文字コードの実装は とても柔軟 柔軟さが増せば複雑さも増す・・・
  • MySQL で利用可能な文字コード 文字コード名 対応文字 ストレージサイズ sjis JIS X 0208:1997 1 〜 2 バイト cp932 JIS X 0208:1997 + NEC 特殊文字・ IBM 拡張文字 1 〜 2 バイト ujis JIS X 0208:1997 1 〜 3 バイト eucjpms JIS X 0208:1997 + NEC 特殊文字・ IBM 拡張文字 1 〜 3 バイト utf8 JIS X 0208:1997 + NEC 特殊文字・ IBM 拡張文字 1 〜 3 バイト utf8mb4 JIS X 0213:2004 1 〜 4 バイト
  • 文字コードと照合順序 ● 文字コード – ● 利用可能な文字の集合をコード化したもの 照合順序 – – – 文字コードに対する並び順を定義したもの 大文字小文字の区別あり・なしなど SHOW COLLATIONS
  • 文字コードが適用される箇所 ● カラム内のデータ – ● ● 文字コードはカラムごとに異なるものを指定可能 テーブル名などのメタデータ クライアントとの通信
  • 文字コードの指定はカラム単位 CREATE TABLE t ( a VARCHAR(100) CHARACTER SET cp932, b VARCHAR(100) CHARACTER SET eucjpms, c VARCHAR(100) CHARACTER SET utf8, : ); 必要に応じて 自動変換
  • MySQL サーバーにおける 文字コード自動変換 ④ データを 蓄える際の 文字コード ② クエリの実行 に利用する 文字コード ⑤ テーブル名や カラム名に対する 文字コード テーブル ① 送信する SQL 文に対する 文字コード クライアント セッション MySQL サーバー ⑥ ファイル名を 解決する際の 文字コード ③ クエリの 実行結果に対する 文字コード ファイルシステム 出展:エキスパートのための MySQL [運用+管理]トラブルシューティングガイド
  • カラムの文字コードのデフォルト値 CREATE TABLE t ( a VARCHAR(100) CHARACTER SET cp932, b VARCHAR(100) CHARACTER SET eucjpms, c VARCHAR(100), : 指定がない ) CHARACTER SET utf8; デフォルト値として テーブルの文字コードが カラムに適用される
  • テーブルの文字コードのデフォルト値 CREATE TABLE t ( a VARCHAR(100), b VARCHAR(100), c VARCHAR(100), : ); カラム、テーブル双方に 文字コードの指定がない CREATE DATABASE db CHARACTER SET utf8; データベースの文字コードが適用される
  • データベースの文字コードの デフォルト値 CREATE DATABASE db1 CHARACTER SET utf8; CREATE DATABASE db2; データベース作成時に 文字コードの指定がない 指定がない場合には character_set_server が適用される
  • 文字コード適用のルール characer_set_server データベースの文字コード ( character_set_database ) テーブルのデフォルト文字コード カラムの文字コード 優先度が 最も高い
  • トランザクション
  • トランザクションが利用可能な ストレージエンジン ● InnoDB – – – – – 標準の MySQL に添付 多くの負荷パターンで良 好な性能を発揮 行レベルロック MVCC クラスタインデックス ● ndbcluster – – – – – – MySQL サーバーとは別 パッケージで配布 並列分散型のデータスト ア シェアードナッシングアー キテクチャ インメモリデータベース ピーキーな性能特性 Join Pushdown
  • 利用可能な分離レベル ダーティ リード 反復不可能読 み取り ファントム O X O READ-COMMITTED X X O REPEATABLE-READ X O X X O X 分離レベル READUNCOMMITTED SERIALIZABLE 分離性 低 高
  • ロックの種類 ● データへのアクセスはすべて行ロック – – Non-locking read Record Locks ● ● – – ● インデックスレコードをロックする X-lock / S-lock Next Key lock Insertion Intention テーブルロックあり – – – LOCK TABLES DDL 用 IX 、 X 、 IS 、 S ロック
  • ネクストキーロック ● ● Next Key Lock = Record Lock + Gap Lock Gap Lock とは – – – レコードとレコードの間の仮想的な空間をロックする S-Lock / X-Lock ファントム防止 ● ● X-Gap-Lock は Insertion Intention Lock と競合する Insertion Intention Lock – – レコードを挿入する前に Gap をロックする 共有ロック ● 同じ Gap に対して同時に INSERT 可能
  • エラー処理 ● ● 最低でもトランザクションのリトライは必須 トランザクション理論では、トランザクションの終了ステータ スは Commit もしくは Abort – Abort を皆無にすることは理論上不可能
  • リトライするべきエラー エラーの種類 エラーの判別方法 追加で行うべき対処 デッドロック エラーコード 1213 または SQLSTATE 40001 行へアクセスする順序の見直し。 Lock Wait Timeout エラーコード 1205 SHOW PROCESSLIST の記録。 長時間ロックを保持するトランザクショ ンのチューニング。 一時的なエラー ( NDB ) エラーコード 1297 各種リソースの見直し。 接続関係のエラー SQLSTATE 08S01 COMMIT 中にエラーが発生した場合 は COMMIT が成功したかどうかの確 認。
  • レプリケーション
  • レプリケーションの用途 ● ● ● ● ● 高可用性用スタンバイ バックアップ レポーティング等の負荷の分離 スケールアウト ディザスタリカバリ
  • スタンバイとしてのレプリケーション ● 非同期または準同期 – 準同期はスレーブへログが到着するのを待つ ● ● ● 切り替えは高速! – – – ● スレーブへ切り替えてもデータの損失はない マスター側で COMMIT の応答が返ったかどうかは分 からない 論理的なコピーなのでクラッシュリカバリは不要 MySQL 自身には切り替えのための機能はない クライアントの繋ぎ変え 問題点 – – 切り戻しの手順が複雑になりがち スレーブが複数ある場合は差分を解消する必要あり
  • 準同期レプリケーション アプリケーション 1. COMMIT 7. send_ok 6-1-2. ack 接続 スレッド 3. ログ更新 ストレージ エンジン 2. 6-1-1. ack スレーブ接続 スレッド バ イ 更 ナリ 新 ロ グ 4. バイナリログ 送信 バイナリログ マスター I/O スレッド SQL スレッド 5. リレーログ更新 6-2. 更新の適用 リレーログ ストレージ エンジン スレーブ
  • クエリのチューニング
  • Explain mysql> EXPLAIN SELECT 'cond1' AS LABEL, COUNT(1) AS COUNT FROM Country WHERE Code LIKE 'J%' UNION SELECT 'cond2', COUNT(1) FROM Country WHERE IndepYear > 1900 UNION SELECT 'cond3', COUNT(1) FROM Country WHERE Continent = 'Africa' UNION SELECT 'cond4', count(1) FROM Country WHERE Name = LocalName; +----+--------------+----------------+-------+---------------+---------+---------+------+------+--------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+--------------+----------------+-------+---------------+---------+---------+------+------+--------------------------+ | 1 | PRIMARY | Country | range | PRIMARY | PRIMARY | 3 | NULL | 3 | Using where; Using index | | 2 | UNION | Country | ALL | NULL | NULL | NULL | NULL | 239 | Using where | | 3 | UNION | Country | ALL | NULL | NULL | NULL | NULL | 239 | Using where | | 4 | UNION | Country | ALL | NULL | NULL | NULL | NULL | 239 | Using where | | NULL | UNION RESULT | <union1,2,3,4> | ALL | NULL | NULL | NULL | NULL | NULL | Using temporary | +----+--------------+----------------+-------+---------------+---------+---------+------+------+--------------------------+ 5 rows in set (0.00 sec)
  • クエリの構造を読み解く ● select_type でクエリの構造が分かる! – JOIN ● – UNION ● – SIMPLE UNION, UNION RESULT サブクエリ ● ● ● FROM 句のサブクエリ ... PRIMARY, DERIVED その他 ... PRIMARY, SUBQUERY, DEPENDENT SUBQUERY, UNCACHEABLE SUBQUERY など。 サブクエリが UNION になっている場合 ... DEPENDENT UNION, UNCACHEABLE UNION
  • Visual Explain
  • JOIN の種類 ● MySQL にある JOIN の種類 – – – – Nested Loop Join Block Nested Loop Join ← 変形 NLJ Batched Key Access Join ← 変形 BNLJ Pushdown Join ( MySQL Cluster のみ。爆速)
  • Block Nested Look Join t2 t1 スキャン 1. WHERE 句の条件に沿って t1 からレコードをフェッチし バッファに格納 2. バッファが満タンに なったら t2 を スキャンして JOIN 3. t1 のすべての レコードについて JOIN Buffer くりかえし Using Join Buffer...
  • Batched Key Access Join t2 t1 1. WHERE 句の条件に沿って t1 からレコードをフェッチし バッファに格納 2. バッファが満タンに なったら MRR で t2 から レコードをフェッチして JOIN MRR Scan 4. t1 のすべての レコードについて くりかえし 3. ROWID の順で t2 からレコードをフェッチ JOIN Buffer
  • Performance Schema ● ● ● ● 各種統計情報を収集するストレージエンジン SELECT で情報にアクセス UPDATE で設定 情報が豊富だが、豊富すぎて直接扱うのは難しい – – ps_helper が便利! http://www.markleith.co.uk/ps_helper/
  • バックアップ
  • バックアップ戦略 〜考慮するべきポイント〜 ● ● ● ● ● オンライン or オフライン 論理 or 物理 フル or 差分 / 増分 どのストレージエンジンが対象か バックアップ / リストアにかかる時間 – – ● スケジュール。 – – ● ● ● 復旧優先? データ保全優先? どの時間帯にとるか? どこまで巻戻っても OK か? 手順は確立されているか? バックアップの保管先 有償 or 無償
  • バックアップツールの種類 バックアップ方法 (ツール名) オン ライン Inno DB My ISAM 形式 バック アップ 速度 リストア 速度 フル 差 分 mysqldump Yes Yes Yes Logical Mid Slow Yes No コールドバックアップ No Yes Yes Raw Fast Fast Yes No スナップショット Yes Yes Yes Raw Instant Fast Yes No バイナリログ Yes Yes Yes Logical -- Slow No Yes MySQL Enterprise Backup Yes Yes Yes InnoDB Fast Native Fast Yes Yes レプリケーション Yes Yes Yes Logical Contigu Very ous Fast Yes Yes
  • バックアップのための レプリケーション活用 ● フルバックアップの負荷分散 – – ● スレーブはマスターの完全なコピー マスターへの影響がないのでどの方式でバックアップを 取ることも可能 遅延レプリケーション – スレーブ側で更新の適用を意図的に遅らせる ● – 例えば1時間など ヒューマンエラー(間違ってテーブルを DROP した!)など が起きても直ぐに代わりとして利用可能
  • まとめ
  • まとめ ● ● ● MySQL はお手頃な RDBMS GPLv2+FOSS License Exception / 商用ライセンス 運用のコツをおさえて安定稼働 – – – – – – – – 設定のツボを抑える 文字コードは確実に指定 トランザクションのエラー処理は忘れずに 使い方広がるレプリケーション 準同期レプリケーションでお手軽 HA MySQL Workbench で Visual Explain バックアップは万全に 遅延レプリケーションでお手軽バックアップ
  • Q&A!! ご静聴ありがとうございました。