oinume journal

Scratchpad of what I learned

MySQLでbulk insertの途中でエラーになった場合の挙動

MySQL

 

insert into ... values (1, 'x'), (2, 'y');

 

のようにbulk insertした時に、途中でエラーになった場合にどういう挙動をするかを調べてみた。普通に考えれば「全てのレコードがinsertされてない」になるはずだと思ったんだけど一応。試したMySQLのバージョンは5.5.28。

 

結果からいうと想定通りで、「途中でエラーが起こると全てのレコードがinsertされてない」になった。

 

 

CREATE TABLE `t1` (

`id` int(11) NOT NULL DEFAULT '0',

`value` varchar(255) NOT NULL DEFAULT '',

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

 

mysql> insert into t1 (id, value) values (0, '0'), (0, '1');

ERROR 1062 (23000): Duplicate entry '0' for key 'PRIMARY'

 

mysql> select * from t1;

Empty set (0.00 sec)

 

 

[tmkm-amazon]4873115868[/tmkm-amazon]

MySQL 5.5をMac OSXにインストールする

公式のバイナリを落としてインストールするのが一番楽かなーと思っている。自動起動もできるし。

 

MySQL :: Download MySQL Community ServerからMac OS X ver. 10.6 (x86, 64-bit), DMG Archiveをダウンロード。DMGを開いて mysql-5.5.25a-osx10.6-x86_64.pkg をクリックしてインストール。/usr/local/mysql にインストールされる。

 

/etc/my.iniファイルを適当に作って([permalink id=471]参考[/permalink])、mysql_install_dbで起動に必要なmysqlデータベースを作る。

 

sudo -u mysql /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql

 

 

MySQLStartupItem.pkgをクリックしてインストールし、下記のコマンドでdaemonを起動。

 

sudo /Library/StartupItems/MySQLCOM/MySQLCOM start

 

 

MySQL.prefPaneをクリック。システム環境設定のパネルからMySQLが制御できるようになるし、OS起動時にMySQLを起動させることもできる。

mysql_panel

 

mysqlやmysqladminコマンドなどをPATHに追加したい場合は、下記の内容で /etc/paths.d/mysql というファイルを作っておくと自動的にPATHに追加される。

 

/usr/local/mysql/bin

 

 

各言語のMySQLドライバをインストールして、実行時に"Library not loaded: libmysqlclient.18.dylib"というエラーが出る場合は、/etc/profile あたりに下記を追記しておくとよい。

 

export DYLD_LIBRARY_PATH=/usr/local/mysql/lib

 

 

 

[tmkm-amazon]4774150207[/tmkm-amazon]

MySQLをインストールした後に設定する項目(5.5編)

[permalink id=174]このエントリ[/permalink]のMySQL 5.5版。大体本家のドキュメントのこことかにちゃんと説明項目が書いてあるので、詳しくはそっちを読むのがいいかと。

 

user = mysql

pid-file = /var/run/mysql/mysqld.pid

socket = /var/run/mysql/mysqld.sock

port = 3306

basedir = /usr

datadir = /var/lib/mysql

tmpdir = /tmp

language = /usr/share/mysql/english

skip-external-locking

# ここまではわりとお決まりの設定。環境によってファイルのパスは適宜変えます。

 

# サーバ側で使用する文字コードの設定

character-set-server = utf8

# クライアント/サーバ側での文字コード変換を行わない

skip-character-set-client-handshake

# CREATE TABLE する際に ENGINE=InnoDB の指定をしなくてもInnoDBにする

default-storage-engine = InnoDB

# クライアント/サーバがやり取りすることのできるパケットサイズを指定

# 巨大なデータをやり取りする場合は指定した方がよい

max_allowed_packet = 16M

 

# MyISAMで使用するINDEXのキャッシュサイズ

key_buffer = 64M

# スレッドのスタック領域のサイズ

thread_stack = 128K

# 生成されたコネクション用のスレッドをキャッシュしておく数

thread_cache_size = 16

# 最大同時接続数。メモリ搭載量にもよるが100〜300ぐらいが良いらしい

max_connections = 150

# MyISAMで一度開いたテーブルをキャッシュしておく数

table_cache = 128

# 同時に実行できるスレッド数。CPUのコア数の2倍を設定

thread_concurrency = 2

 

# query cacheの設定

# 0:OFF, 1:ON, 2:DEMAND

query_cache_type = 1

# キャッシュするクエリ結果の最大サイズ

query_cache_limit = 1M

# クエリキャッシュに割り当てるメモリ量

query_cache_size = 16M

 

# slow query log の設定

slow_query_log = 1

slow_query_log_file=file_name = /var/log/mysql/mysql-slow.log

# 3秒以上かかったクエリは上記ログファイルに出力

long_query_time = 3

 

# ここからレプリケーションの設定

# MySQLサーバごとに固有のID

server-id = 1

# バイナリログ出力先

log_bin = /var/log/mysql/mysql-bin.log

# データ書き込み(トランザクションのコミット)を何回行ったらバイナリログを

# フラッシュするかの回数。0の場合はデータ書き込みがあってもバイナリログをフラッシュしない

sync_binlog = 0

# バイナリログを保持しておく日数

expire_logs_days = 60

# バイナリログの1ファイルあたりの最大サイズ

max_binlog_size = 1024M

# バイナリログを出力する対象のDB

binlog_do_db = hoge

# バイナリログの出力対象外とするDB

binlog_ignore_db = mysql information_schema

# バイナリログフォーマット

# ROW:ROWベース, STATEMENT:5.0以下のフォーマット, MIXED:ROWとSTATEMENTが混在

binlog_format           = ROW

 

# Berkley DBは使わない

skip-bdb

 

# InnoDBのデータファイルの名前とどのぐらいで自動拡張するか

innodb_data_file_path = ibdata1:128M:autoextend

# テーブルごとに.ibdのデータファイルを作成するかどうか

innodb_file_per_table = 1

# InnoDBの内部データなどを保持するための領域

innodb_additional_mem_pool_size = 20M

# InnoDBのデータやインデックスをキャッシュするためのメモリ上の領域

# DBサーバ専用のマシンの場合はメモリの50%-80%を指定

innodb_buffer_pool_size = 256M

# InnoDBの更新ログを記録するメモリ上の領域

innodb_log_buffer_size = 8M

# InnoDBの更新ログを記録するディスク上のファイルのサイズ

# 大きくするとパフォーマンスはあがるがクラッシュ時のリカバリに時間がかかるようになる

innodb_log_file_size = 64M

# データをファイルに書き込む際のメソッド

# Linuxの場合は O_DIRECTがパフォーマンス的にはよい

innodb_flush_method = O_DIRECT

# InnoDBのログバッファをInnoDBログファイルに書き込むタイミングを決める

# 基本的には1

innodb_flush_log_at_trx_commit = 1

# 2相コミットを行うかどうか

innodb_support_xa = OFF

# クラッシュ対策としてデータの二重書き込みを無効にする

skip-innodb_doublewrite

# InnoDBのデータ読み込みスレッドの数。デフォルト4

innodb_read_io_threads = 4

# InnoDBのデータ書き込みスレッドの数。デフォルト4

innodb_write_io_threads = 4

 

[tmkm-amazon]4774150207[/tmkm-amazon]

rlwrapを使ってmysqlコマンドのプロンプトに色をつける

どうもこんにちは。北海道に旅行中でこの記事は札幌のホテルから書いている oinume です。MySQL Casual Advent Calendarも11日目になりました。「MySQL Casualが全然カジュアルじゃない!」という意見をよく耳にするので、今日はウルトラカジュアルなエントリーを書こうと思います。

 

はじめに

MySQLを使って開発をしていると、本番と開発用サーバの見分けがつかずに、間違って本番で重いクエリを発行しちゃったりします。そういうオペミスを少しでも防ぐために「本番環境ではmysqlコマンドのプロンプトの色を変える」という技を紹介したいと思います。

 

rlwrap

紹介といってもやり方は非常に簡単で、下記のように rlwrap というコマンドを使って mysql コマンドを実行します。

 

rlwrap -a -pRED mysql -uroot

 

 

するとあら不思議!MySQLのプロンプトが下記のように赤くなりました!

rlwrapでmysqlプロンプトに色をつけてみる

 

というわけで、rlwrapがインストールされているマシンであれば、下記のように .bashrc 的なファイルに書いておくことでmysqlのプロンプトを常に赤くすることができてオペミスも減らせますね!

 

if [ -x /usr/bin/rlwrap ]; then

alias mysql='/usr/bin/rlwrap -a -pRED mysql'

fi

 

 

ちなみに rlwrap は Debian(Ubuntu) であれば apt でインストールできます。

 

sudo aptitude install rlwrap

 

 

CentOSの場合はepelリポジトリが追加されていれば yum でインストールできます。

 

sudo yum install rlwrap

 

 

さいごに

このウルトラカジュアルっぷりいかがでしたでしょうか。Advent Calendar 12日目は ikasam_a さんです。よろしくお願いします!