ablog

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

MySQL

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> ' 接続してみる azekyohe% 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:…

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…

LOAD DATA ステートメントで発生したワーニングの内容を表示する

LOAD DATA で "Warnings: 48" のようにワーニングが発生した場合に、その内容を見たい場合は、 % mysql --local-infile -h aurora01.cluster-******.ap-northeast-1.rds.amazonaws.com -u awsuser -p mysql> LOAD DATA LOCAL INFILE 'test.csv' INTO TABLE T…

Aurora MySQL互換に LOAD コマンドで CSV ファイルをロードしようとすると "ERROR 1148 (42000)" で失敗する

Aurora MySQL互換というより MySQL の話です。 事象 mysql クライアントで接続して、LOAD DATA ステートメントで CSV ファイルをロードしようとすると、"ERROR 1148 (42000): The used command is not allowed with this MySQL version" と怒られる。 % mysq…

DMS Full Load 検証メモ

AWS Database Migration Service (DMS) の Full Load (Oracle Database -> MySQL) の検証メモ。 Oracle Database(ソース) の TIMESTAMP WITH TIME ZONE 型の列は DMS で MySQL(ターゲット) にロードすると varchar(37) 型の列に変換される*1。 ソースが TIME…

sysbench の OLTP test statistics の write は DML 発行回数

sysbench で MySQL や PostgreSQL のベンチマークを取得することができるが、OLTP test statistics の write がDML発行回数かI/Oシステムコール発行回数のどちらか気になった。SQLインタフェースでアクセスしているので、DML発行回数だと想定していたが、sys…

Oracle Database から MySQL(Aurora MySQL互換含む) に移行する際に留意すべきこと

パラメータ SQL_MODE ルーク!MySQLではkamipo TRADITIONALを使え! | おそらくはそれさえも平凡な日々 MySQL で NOT NULL 制約のある列に複数行インサートするとその型のデフォルト値が入る - ablog TX_ISOLATION トランザクション分離レベルは Oracle のデ…

Oracle Database から Aurora MySQL互換 に DMS でデータをロードする

Oracle Database から Aurora with MySQL Compatibility にテーブルのデータを AWS Database Migration Service (DMS) でフルロードしてみたメモ。 ロード後のソースDBとターゲットDBのデータ比較 ソースDB(Oracle Database) SQL> select * from test_time…

MySQL のリストパーティションにDEFAULTキーワードはない

MySQL のリストパーティションにDEFAULTキーワードはない模様。 list_partitionslist_partitions句を使用すると、columnのリテラル値のリストで表をパーティション化できます。リスト・パーティション化は、個々の行が固有のパーティションにマップする方法…

MySQL で NOT NULL 制約のある列に複数行インサートするとその型のデフォルト値が入る

MySQL で SQL モードが STRICT モードでない場合、NOT NULL 制約のある列に複数行インサートするとその型のデフォルト値(0とか空文字)が入る(1行インサートだとエラーで入らない)。 検証結果 Amazon Aurora with MySQL Compatibility に接続する $ mysql…