ablog

不器用で落着きのない技術者のメモ

MySQL

MySQL でショート/ロングトランザクション実行中のインデックス作成の影響

MySQL (5.7 InnoDB) で本番稼働中にインデックス作成すると、対象テーブルにショートトランザクション実行中の場合は並行でできるけど、ロングトランザクションが実行中*1の場合は Waiting for table metadata lock (synch/cond/sql/MDL_context::COND_wait_…

MySQL のクエリチューニングでボトルネック分析に使える機能

MySQL のクエリチューニングでボトルネック分析に使える機能。 MySQL show profile 再現性のあるスロークエリーには「SHOW PROFILE」を試してみよう | Think IT(シンクイット) show profile は廃止されて、後継は MySQL :: MySQL 5.7 Reference Manual :: …

mysql で結果セットをファイルに出力する

mysql> tee show_variables.txt mysql> SHOW VARIABLES; (中略) mysql> notee mysql> exit $ head show_variables.txt mysql> SHOW VARIABLES; +----------------------------------------------------------+-------------------------------------------…

MySQL の log_queries_not_using_indexes でインデックス未使用のクエリをログ出力する

MySQL で log_queries_not_using_indexes を 1 に設定すると、インデックスを使用しないログが出力される(デフォルトは 0 で無効)。 スロークエリーログは、実行に要した時間が long_query_time 秒を超え、 少なくとも min_examined_row_limit 行を検査す…

MySQL で performance_schema を有効化する

performance_schema=1 参考 MySQL :: MySQL 5.6 リファレンスマニュアル :: 22.2.2 パフォーマンススキーマ起動構成 パフォーマンスインサイトの有効化 - Amazon Relational Database Service

sysbench で MySQL に負荷をかける

EC2 に sysbench をインストール Amazon Linux 2 に sysbench をインストールしようとすると、libmysqlclient_r.so.16 とlibmysqlclient_r.so.16 が必要と怒られる - ablog sysbench でテーブルを作成してデータを投入する。 export HOST=rds-mysql-57-22.**…

MySQL で接続先サーバのホスト名を確認する

MySQL [(none)]> show variables like 'hostname'; +---------------+--------------+ | Variable_name | Value | +---------------+--------------+ | hostname | ip-10-7-1-22 | +---------------+--------------+ 1 row in set (0.01 sec) 参考 接続先の…

macOS に mysql クライアントをインストールする

インストール インストールする $ brew install mysql mysql-client バージョンを確認する $ mysql -V mysql Ver 8.0.19 for osx10.14 on x86_64 (Homebrew) 接続する $ mysql -h aurora-mysql57.cluster-******.ap-northeast-1.rds.amazonaws.com -u awsuse…

sysbench で MySQL にカスタムクエリを同時多重実行して一時ファイルを大量に使ってみる

インストール curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash sudo yum -y install sysbench mysql 準備 初期データロード $ sysbench /usr/share/sysbench/oltp_read_write.lua \ --db-driver=mysql \…

MySQL on CentOS 6.9 に sysbench でベンチマークをかけてみる

ファイルシステムの初期化 ファイルシステムを初期化する # mkdir /nvme0n1 /e32000 # fdisk -l # mkfs.ext4 /dev/nvme0n1 # mkfs.ext4 /dev/xvdb # mount /dev/nvme0n1 /nvme01 # mount /dev/xvdb /e32000 インストール MySQL の yum リポジトリを追加する …

MySQL の InnoDB テーブルの断片化の影響を調べてみた

準備 テーブルを作成して1千万件データをロードする $ sysbench /usr/share/sysbench/oltp_read_write.lua \ --db-driver=mysql \ --table-size=10000000 \ --mysql-host=aurora01.******.ap-northeast-1.rds.amazonaws.com \ --mysql-user=awsuser \ --mysq…

MySQL の InnoDB テーブルの統計情報を確認する

MySQL の InnoDB テーブルにどんな統計情報があるのか調べてみた。MySQL 5.6 にはテーブル統計とインデックス統計だけで、MySQL 8.0 からヒストグラム*1が入るらしい。 テーブル定義 mysql> desc mydb.sbtest1; +-------+-----------+------+-----+---------…

MySQL の InnoDB テーブルの断片化状況を確認する

MySQL の InnoDB テーブルの空き領域は INFORMATION_SCHEMA.TABLES の DATA_FREE カラムで確認でき、ALTER TABLE ENGINE INNODB で断片化(フラグメンテーション)を解消することができる。なお、テーブルの断片化でI/O量が増えて性能劣化するのはフルテーブ…

Aurora MySQL で DDL を実行してみる

準備 データをロードする $ sysbench /usr/share/sysbench/oltp_read_write.lua \ --db-driver=mysql \ --table-size=500000 \ --mysql-host=aurora01.*********.ap-northeast-1.rds.amazonaws.com \ --mysql-user=awsuser \ --mysql-password=********* \ -…

MySQL の slow query log を Percona Toolkit の pt-query-digest で整形する

環境 macOS Sierra 10.12.6 インストール % brew install percona-toolkit 使ってみる pt-query-digest で slow query log を集計する。 % pt-query-digest mysql-slowquery.log.2018-04-27.09 > mysql-slowquery.log.2018-04-27.09-pt.txt mysql-slowquery.…

MySQL でスリープする

MySQL で Orcale Database の dbms_lock.sleep(秒数) のように sleep させたい場合は、select sleep(秒数) でできる。 5.6.10-log awsuser: [mydb] 15:26> select sleep(5); +----------+ | sleep(5) | +----------+ | 0 | +----------+ 1 row in set (5.24 …

Oracle Database の DBMS_RANDOM.VALUE を MySQL 向けに書き換える

Oracle Database の以下の PL/SQL コードを standard_price := DBMS_RANDOM.VALUE(30,50); MySQL ではこう書き換えると同じことができる。 select round( rand() * 20 + 30 ) into var_standard_price; 実際にプロシージャを作成して実行してみるとこんな感…

MySQL のストレージエンジンとのインタフェース

どの当たりのコードか当たりをつけ中。 sql/handler.h sql/handler.cc sql/sql_table.cc Understanding MySQL Internals: Discovering and Improving a Great Database (English Edition)作者: Sasha Pachev出版社/メーカー: O'Reilly Media発売日: 2009/02/…

MySQL InnoDB で大きなトランザクションを見つける

SHOW ENGINE INNODB STATUS の History list length が MySQL インスタンス全体の UNDO ページ数 undo log entries がトランザクション毎のUNDOレコード数 で、History list length が大きいとMySQLインスタンス全体での UNDO のサイズが大きくなりロールバ…

MySQL から ROW 形式のバイナリログをダウンロードして中身を確認する

バイナリログを一覧表示する % mysql -h aurora01.******.ap-northeast-1.rds.amazonaws.com -u awsuser -p 5.6.10-log awsuser: [mydb] 01:27> show binary logs; +----------------------------+------------+ | Log_name | File_size | +----------------…

sysbench で MySQL のベンチマークをとる

sysbench をインストールして MySQL のベンチマークをとる手順をメモ。 インストール $ curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash $ sudo yum -y install sysbench mysql ベンチマーク 初期データ…

MySQL のバイナリログとInnoDB ログ

MySQLのバイナリログはメディアリカバリに使うもので、ディスク障害などの際に mysqldump でエクスポートしておいたデータをインポートしてバイナリログでロールフォーワードする。Oracle Database で言うと、 インポートがリストアで、バイナリログでのロー…

SHOW ENGINE INNODB STATUS の History list length

SHOW ENGINE INNODB STATUS の History list length の見方をメモ。 mysql> show engine innodb status\G (中略) ------------ TRANSACTIONS ------------ Trx id counter 0 80157601 Purge done for trx's n:o <0 80154573 undo n:o <0 0 History list le…

MySQL クライアントのプロンプトを設定する

~/my.cnf [mysql] prompt='\\v \\u: [\\d] \\R:\\m> ' 接続してみる % mysql -h aurora01.*********.ap-northeast-1.rds.amazonaws.com -u awsuser -p Enter password: (中略) 5.6.10-log awsuser: [(none)] 04:39> use mydb; 5.6.10-log awsuser: [mydb] …

Amazon Linux で MySQL 5.6.10 をデバッグモードでビルドする手順

Amazon Linux に MySQL 5.6.10 をデバッグモードでビルドした手順をメモ。 ダウンロード MySQL :: Download MySQL Community Server (Archived Versions) で以下の通り選択し、"Generic Linux (Architecture Independent), Compressed TAR Archive" をダウン…

MySQL に gdb でアタッチする

インストール gdb をインストールする sudo yum -y install gdb gdb で mysql にアタッチする ps -elf|grep mysql gdb -p <PID> 参考 MySQLにgdbアタッチするメモ - kenken0807_DBメモ gdb Debugging Full Example (Tutorial): ncurses 詳解 MySQL作者: Sasha Pac</pid>…

MySQL Connector/J(JDBC Driver) で接続時に任意の collation_connection をセットする

MySQL Connector/J(JDBC Driver) で接続時に任意の collation_connection をセットする には以下の用に JDBC URL に「connectionCollation=utf8mb4_bin」のように設定すれば良い。 jdbc:mysql://aurora01.cluster-*******.ap-northeast-1.rds.amazonaws.com:…

MySQL でオプティマイザトレースを取得する

MySQL でオプティマイザトレース(Oracle Database でいう 10053 トレース)を取得する方法。 mysql> SET optimizer_trace="enabled=on"; mysql> SET optimizer_trace_max_mem_size = 1048576; mysql> select 1; mysql> select * from information_schema.op…

MariaDB Connector/J で MySQL に接続する Java プログラム

MariaDB Connector/J で MySQL に接続する Java プログラム。 ソースコード ほぼ MariaDB Connector/J で MariaDB 10.3 に接続する - Qiita のまま。パッケージ名を削除して、接続情報を変更しただけ。 JdbcTest.java import java.sql.*; public class JdbcT…

LOAD DATA ステートメントで "Row X was truncated; it contained more data than there were input columns" が発生する

事象 LOAD DATA ステートメントで CSV ファイルをロードすると "Row X was truncated; it contained more data than there were input columns" というワーニングが発生し、全ての行がロードされていない。 mysql> LOAD DATA LOCAL INFILE 'test.csv' INTO T…