タグ

mysqlに関するKinjouJのブックマーク (70)

  • MySQLを1〜2時間でスケールアウトする - クックパッド開発者ブログ

    最近、Elastic BeanstalkやECSと戦っているSREチームの菅原です。 P5をやりたいのにPS3もPS4も持っていないので指をくわえて羨ましがっている毎日です。 この記事では、突然のアクセス増に備えるために、MySQLのスレーブを1〜2時間でスケールアウトできるようにした話を書きます。 MySQL on EC2 クックパッドは周知の通りAWSを利用していますが、主要なデーターベースについてはAmazon RDSではなくMySQL on EC2を使っています。 これは以下のような理由によるものです。 歴史的な経緯: AWS移行当時、RDSが無かった。また、移行後もしばらくはTritonnを使っていたため、RDSを使うことができなかった オンラインメンテナンスの実現: VPCルートテーブルを使った仮想IPとMHA for MySQLを使ってダウンタイムゼロのマスタDBの切り替えを

    MySQLを1〜2時間でスケールアウトする - クックパッド開発者ブログ
  • MySQLでINSERTのデッドロックに嵌る人を1人でも減らすために - ichirin2501's diary

    この記事ははてなデベロッパーアドベントカレンダー2015の12月24日の記事です。 昨日は id:stefafafan さんのエンジニア英語でした。 こんにちは、こんばんは。 クリスマス・イヴですね、皆さんはどのような一日を過ごされる(た)のでしょうか。 僕は一人です。 改めまして、先日初めての合コンを経験/失敗して二度と行かないと誓った はてなの id:ichirin2501 です。今回は小ネタとしてMySQL(InnoDB)のBULK INSERTにおけるデッドロックの話をしようと思います。ただ、外部キー制約が絡むと複雑になるので今回は触れません。それについてはこちらを参照ください。 あ、タイトルはオマージュです*1。 Topic 検証環境 INSERTのデッドロック 避けられないケース もしくはロックする リトライ処理に注意 初期データ Duplicateの場合 Deadlockの

    MySQLでINSERTのデッドロックに嵌る人を1人でも減らすために - ichirin2501's diary
  • [MySQL5.7]マルチソースレプリケーション設定方法 – (っ´∀`)っ ゃー | 一撃

    プライベートIPアドレスはeth1に振っています。さくらのクラウドでCentOS7のeth1にIPアドレスを振る手順はこちらを参考にどうぞ。 今回構築するサーバーの、マスターとスレーブの関係は以下の通りです。 master0 は test0 データベースのマスター。チャネルは0 master1 は test1 データベースのマスター。チャネルは1 slave0 は 上記すべてのデータベースのスレーブになる slave1 は 上記すべてのデータベースのスレーブになる ちなみに、マルチソースレプリケーションはマルチマスターレプリケーションとイコールではありません。 こちらの図表を見ると違いが一目瞭然ですが、マルチマスターレプリケーションは循環型のレプリケーションで、SQLクライアントはどのノードに書き込みを行っても、レプリケーションを構成するすべてのノードに等しくデータが同期されます。いっぽう

    [MySQL5.7]マルチソースレプリケーション設定方法 – (っ´∀`)っ ゃー | 一撃
  • MySQLでカラムごとに圧縮する方法 - CreateField Blog

    MySQLでデータサイズが非常に大きいような場合、データを圧縮して格納したくなることがあります。 InnoDBではROW_FORMAT=compressedとすることで、テーブルを圧縮することができます。 MyISAMではmyisampackコマンドを利用することにより、テーブル全体を圧縮することができます。ただし、MyISAMでは読み取り専用となります。 通常、主キーやタイトル、メタデータなどのサイズは小さく、bodyなどのサイズが大きいことが多いと思います。そのため、テーブル全体ではなく、特定のカラムのみを圧縮するだけで事足りることが大半だと思います。 MySQLではCOMPRESS関数とUNCOMPRESS関数があります。 MySQL :: MySQL 5.6 Reference Manual :: 12.13 Encryption and Compression Functions

    MySQLでカラムごとに圧縮する方法 - CreateField Blog
  • MySQL 5.6のインストール後にチューニングすべき項目 | Yakst

    MySQLコミュニティマネージャのMorgan Tocker氏による、MySQL 5.6をインストールした後にデフォルト値から変更した方がよいパラメータの解説。 数々のデフォルト値の改善によって、過去のバージョンと比べてMySQL 5.6では設定しなくてはならない値がかなり減った。とは言え、変更すべきものについてここで書いておきたい。 InnoDBの設定 innodb_buffer_pool_size - デフォルトは128M。これは、メモリにロードされるデータとインデックスのためにInnoDBがどのくらいメモリを使うかを指定するものなので、設定すべき重要な値だ。MySQLの専用サーバなら、搭載されているメモリの50%から80%が推奨される設定値だ。例えば、64GBのRAMを搭載しているサーバなら、バッファプールは50GB程度にすべきだろう。 innodb_log_file_size -

    MySQL 5.6のインストール後にチューニングすべき項目 | Yakst
  • 良く分かるMySQL Innodbのギャップロック - Qiita

    MySQLのロック ロックとはトランザクションの並列度を上げる為の並列スケジューリング方法の一つ トランザクションをサポートしているデータベースにおいては、トランザクションの並列数を上げる事が性能アップの一つの方法。 他のトランザクションに更新して欲しくないデータだけにロックをかけて、ロックされたデータ以外を更新するトランザクションは並列で実行される。 Innodbは行ロック? Innodbは更新対象の行だけをロックする。と思っていると、意外な落とし穴にハマる。 その一つがギャップロック。 ギャップロックを実際に起こしてみる サンプルテーブル idとstrがあるだけのシンプルなテーブル。idがPKで1~5までは順番に、その後、10,20と飛んで行が入っている。 通常の行ロック トランザクション1 select for updateでid=2の行を明示的にロック トランザクション2 id=1

    良く分かるMySQL Innodbのギャップロック - Qiita
  • kamipo traditional (というかSTRICT_ALL_TABLES) では防げないMyISAMという名の化け物

    kamipo traditional (というかSTRICT_ALL_TABLES) では防げないMyISAMという名の化け物 TL;DR kamipo traditionalですら完全に防ぎきれないアレがあるので、そこを気にするなら出来る限りさっさとMyISAMからInnoDBに引っ越しましょう。 これらの記事を読んだ人向けです。 ルーク!MySQLではkamipo TRADITIONALを使え! | おそらくはそれさえも平凡な日々 Javaでkamipo traditionalを有効にする - その手の平は尻もつかめるさ アプリでミスって不正なデータが入るくらいだった500になったほうがマシ。というのが個人的な考えです。 +激しく同意+ さて、激しく同意したところで、kamipo traditionalでは倒せないMyISAMという名の化け物の話をしたいと思います。 kamipo tr

  • 現代のMySQLはもう不要にINをEXISTSに書き換えない

    漢(オトコ)のコンピュータ道: なぜMySQLのサブクエリは遅いのか。 この記事は 2009/3/25 に書かれたもののようである。 2009年3月といえばMySQL 5.1がGAになってわずか半年、MySQL 6.0.10-alphaがリリースされた頃で、MariaDBもまだ姿を見せていない頃だ。 時は流れて2015年、MySQL 5.6がGAになって早2年半、5.7のGAマダァ-? (・∀・ )っ/凵⌒☆チンチン な頃なので、もういい加減誰か言ってくれてもいいんじゃないかと思う。 もうMySQL(5.6)は不要にINをEXISTSに書き換えたりしないんだよって mysql51> EXPLAIN SELECT * FROM Country WHERE Continent = 'Asia' AND Code IN -> (SELECT CountryCode FROM City WHER

  • MySQL Connector/J (JDBC ドライバ)の罠まとめ - ~saiya/hatenablog

    MySQL JDBC ドライバ(MySQL Connector/J)、JavaMySQL といえばまずコレだが、これまた地味に罠が多い(そして多くの人が踏んで苦しむ)のでまとめてみた。 (2015/03/19) こちら のコメント欄でご指摘ただいた wait_timeout の件について記事修正いたしました。 Summary 以下、いずれもプログラム設計時に理解しておかないと、開発中は大丈夫そうでも実用した途端に苦しまされれてしかも設計から治す羽目になる要注意な罠である: SELECT 結果は全部メモリに載ってしまう (デフォルト設定で) 大量 SELECT する場合は FetchSize, ResultSetType を要設定 利用時には制約があるので、設計段階から考慮しなければならない (後述) idle 時間の「合計で」コネクションが切られる 前回のクエリ処理から一定時間以上経

    MySQL Connector/J (JDBC ドライバ)の罠まとめ - ~saiya/hatenablog
  • MySQL 一度DELETEしたuserと同じ名前のuserを登録しようとすると失敗する - 【はてな】ガットポンポコ

    うーん。MySQLのバグなんだろうか、一度DELETEしたuserと同じ名前のuserを登録しようとすると失敗する。 やったことはこう。 DELETE 構文で user 'boss' を削除する。 mysql> DELETE FROM mysql.user WHERE user='boss' and host='localhost'; CREATE USER 構文で boss を再度作ろうとしたが、失敗。 mysql> CREATE USER 'boss'@'localhost' IDENTIFIED BY 'password'; ERROR 1396 (HY000): Operation CREATE USER failed for 'boss'@'localhost' MySQLクイック・リファレンスによると、 来のユーザ削除はこうらしい。先にREVOKEをやらなかったからいけないの

    MySQL 一度DELETEしたuserと同じ名前のuserを登録しようとすると失敗する - 【はてな】ガットポンポコ
  • JPAでマスター/スレーブ構成のMySQLを使うぞ | nagaseyasuhito Daily works.

    この記事はJava EE Advent Calendarの18日目のエントリです。昨日はn_agetsuさんのApache Shiro を使ってみましたでした。 Webサービスやソーシャルゲームのボトルネックになりやすいのがデータベースアクセスです。そしてこれらのサービスではデータベースにMySQLが多く使われています。 高負荷なMySQLの負荷分散の一つにデータベースをマスター/スレーブのレプリケーション構成にしてINSERT/UPDATE/DELETEなど更新系のクエリはマスターに対して行い、スレーブにマスターの更新内容をレプリケート、SELECTなど参照系のクエリはスレーブのデータベースにクエリを発行して負荷分散を行う手法があります。 このエントリではそのようなマスター/スレーブのレプリケーション構成のMySQLにJPAを使ってクエリを発行する方法をご紹介します。 MySQLのJDB

  • MySQLのrootパスワードを、無停止でリセットする | Yakst

    MySQL Performance Blogの翻訳。rootパスワードが分からなくなった時の対処法としては、MySQLの再起動が必須になる方法が知られているが、DBではできる限り再起動を避けたいところ。そんな時に無停止でリセットするための裏技的な手順を紹介する。 December 10, 2014 by Daniel Guzmán Burgos 注意 : ここに書かれている方法は、自身の責任で実行する事。プラガブルな認証を使用している時はこの方法は使えない。また、MySQLのシステムテーブルがInnoDBにある時も同じく適用不可能だ。 状況 定番の「MySQLのrootパスワードをリセットしたい」という状況だが、MySQLの再起動はできず(番のマスタなど)、--skip-grant-tablesを使ったリセット方法が使えない時。 (訳注 : MySQLの再起動が必要になるリセット方法

    MySQLのrootパスワードを、無停止でリセットする | Yakst
  • MySQLに絵文字を格納するにはutf8mb4を使う必要があった - F.Ko-Jiの「一秒後は未来」

    一体何年前の話をしてるんだと思われそうですが、スマートフォンなどで入力できる絵文字MySQL にきちんと格納するには UTF-8 ではなく utf8mb4 という文字コードを使う必要があります。この文字コードは MySQL 5.5.3 以降で使えます。 » MySQL :: MySQL 5.5 Reference Manual :: 10.1.10.6 The utf8mb4 Character Set (4-Byte UTF-8 Unicode Encoding) 自分がほとんど絵文字を使わないのでまったく考慮してなかったのですが、「#グラドル自画撮り部 の部室」で Twitter から取り込んだツイートデータを見てみると、ツイートの文章が途中で切れてしまっているものが結構たくさんありました。 ↑ ほんとは最後にハッシュタグや画像の URL がついているはず。 調べてみると絵文字のと

    MySQLに絵文字を格納するにはutf8mb4を使う必要があった - F.Ko-Jiの「一秒後は未来」
  • MySQLでの絵文字(4byte文字)対応(utf8)めもめも - Qiita

    問題点 MySQL5.5以前では4byteのutf8文字列を入れることができない ⇒日での絵文字などはこれにあたる。 ⇒他の国の言語も一部ここにあたる 現象 実際に入れてみると、4byte文字を境に後ろの文字列が全て消えてしまう。すっぱりと・・・! あい[絵文字]うえお->あい abc[絵文字]def->abc どんなに長い文字列も絵文字の部分から後ろが全部切れてしまうorz CHARCODE設定 CHARCODE設定をutf-8からutf8mb4に変更 skip-character-set-client-handshake設定 skip-character-set-client-handshakeを入れるといいよ!という記事があるものの、利用環境によるかもしれない。 SQLインジェクションの脆弱性がある。 利用している環境にあわせてskip-character-set-client-h

    MySQLでの絵文字(4byte文字)対応(utf8)めもめも - Qiita
  • ふつうのWeb開発者のためのクエリチューニング

    Your browser doesn't support the features required by impress.js, so you are presented with a simplified version of this presentation. For the best experience please use the latest Chrome or Safari browser. Firefox 10 (to be released soon) will also handle it.

    ふつうのWeb開発者のためのクエリチューニング
  • MariaDB 10.0.10 と Spider ストレージエンジンを使ってみる - akishin999の日記

    MySQL の Sharding 用ストレージエンジンである Spider を試してみました。 公式のバイナリに同梱されている MariaDB 10.0.10 を使っています。 試した環境は CentOS 6.5 x86_64 です。 MariaDB のインストール まずは MariaDB をインストールするために、yum リポジトリ定義ファイルを作成します。 # vi /etc/yum.repos.d/mariadb.repo 内容は以下。 # MariaDB 10.0 CentOS repository list - created 2014-04-02 07:21 UTC # http://mariadb.org/mariadb/repositories/ [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.0/c

    MariaDB 10.0.10 と Spider ストレージエンジンを使ってみる - akishin999の日記
  • MySQL クエリーのキャッシュヒット率をSQLで求める方法 - Qiita

    MySQLのクエリーキャッシュのヒット率を求めるSQLを作成しました。一般的にキャッシュのヒット率が二割以下の場合は、キャッシュを利用しない設定のほうがパフォーマンスを出すことができます。このクエリキャッシュヒット率をSQLで求められるように作成してみました。みなさまのMySQLローカルサーバで直接実行して結果を確認してみてください 以下がクエリーキャッシュのヒット率を求めるSQLです。基的には、show status で計算することができます。私の場合は、それすらめんどくさいのでSQLで対応しました。クエリーキャッシュのヒット率を以下の計算で求めることができます。 SELECT @QCACHE_FREE_BLOCKS := VARIABLE_VALUE FROM information_schema.`GLOBAL_STATUS` where VARIABLE_NAME = 'QCAC

    MySQL クエリーのキャッシュヒット率をSQLで求める方法 - Qiita
  • MySQL5.5でパーティショニング使って時系列のデータを分散する - 256bitの殺人メニュー

    はい、乙カレーさまです。寒い日が続きますね。 そしてMySQLも続きそうな私です。 前回はトリガをやってみましたが、今度はパーティショニングをしてみます。 パーティショニングとは パーティショニングは、特定のカラム情報を使って、テーブルを論理的/物理的に自動で分ける事で管理を簡単にしたり、パフォーマンスを確保する機能のことです。例えば今回は、更新日時でパーティショニングを行うことで、特定期間のデータを削除する等の運用が簡単になります。 パーテションの設定 プライマリキーの設定 まず既存のテーブルの場合は最初にパーテションを行うカラムがプライマリキーが含まれていないといけないので貼り直します。 mysql> ALTER TABLE usermaster_cs DROP PRIMARY KEY, ADD PRIMARY KEY(user_id, upd_datetime); 新規テーブルの場合

    MySQL5.5でパーティショニング使って時系列のデータを分散する - 256bitの殺人メニュー
  • MySQLをインストールしたら、必ず確認すべき10の設定 | Yakst

    MySQL Performance Blogの翻訳。インストール後に必ず設定を確認しなければならない設定パラメータ10つを挙げ、その意味を解説する。MySQLの設定変更時の、一般的な注意点も合わせて。 January 28, 2014 By Stephane Combaudon 我々がパフォーマンス監査の仕事をする時には、MySQLの設定のレビューと改善提案を求められる。大抵の場合、たくさんのオプションがある中でほんのいくつかの設定しか変更するように提案しないことに、多くの顧客は驚く。この記事のゴールは、もっとも重要な設定をいくつか挙げてみることにある。 既にこういった提案は過去にもしているが数年前のもので、それ以来MySQLの世界ではたくさんの変化があったのだ。 話の前に 熟練した人でも、重大なトラブルを引き起こすミスをしでかすことがある。従って、ここに挙げたものを盲目的に適用する前に、

    MySQLをインストールしたら、必ず確認すべき10の設定 | Yakst
  • INSERT ON DUPLICATE KEY UPDATEの構文を使ってランキングテーブルを操作する - 何一つ誇るものがない

    みなさんいかがお過しでしょうか。 MySQL Casual Advent Calendar 2013の22日目です。 今回は他の方とくらべて十分CasualなInsertについて紹介致します。 紹介するのはINSERT ... ON DUPLICATE KEY UPDATEの構文を使ってランキングのテーブルを操作を紹介します。 INSERT ... ON DUPLICATE KEY UPDATEとは、簡単に説明しますと insert時にプライマリのレコードが存在しなかったらinsertし、 レコードが存在したらupdateする 詳しい説明はINSERT ... ON DUPLICATE KEY UPDATE 構文にあります。 簡単にランキングを保存するテーブルを用意します。 CREATE TABLE `ranking` ( `rank_date` DATE NOT NULL, `rank`

    INSERT ON DUPLICATE KEY UPDATEの構文を使ってランキングテーブルを操作する - 何一つ誇るものがない