2014/01/22

レース・コンディション race condition

複数のプロセスが共有リソースに対して何かを行う場合,プロセスの実行順序に依存して結果が異なる状況をレース・コンディションと呼ぶ。デッド・ロックや レース・コンディションの可能性を検出するためのツールも提供されている。レース・コンディションを悪用する攻撃プログラムも存在する。例え ば,util-linux packageのsetpwnam.cが/etc/passwdファイルに変更を加えるときに使用するテンポラリ・ファイルを不適当にロックする。これを 突いてシステム上の特権を上げるためのレース・コンディションを誘発する問題が発見された。


-->いわゆるマジックだね。。。(千変万化の実行結果)

2014/01/20

tomcat app class ロード順

決まり事である。
ーーーーー>
クラスやリソースのロードの際のリポジトリのチェックは、 Webアプリケーションから見ると以下の順序になります。
  • JVM のブートストラップクラス
  • System クラスローダの各クラス (上述)
  • Webアプリケーションの /WEB-INF/classes
  • Webアプリケーションの /WEB-INF/lib/*.jar
  • $CATALINA_HOME/common/classes
  • $CATALINA_HOME/common/endorsed/*.jar
  • $CATALINA_HOME/common/lib/*.jar
  • $CATALINA_HOME/shared/classes
  • $CATALINA_HOME/shared/lib/*.jar

mysql slow qurey

  • Q:mysql slow qurey :
    sending Data->Page_faults_minor:8 のせいで検索は時間かかるみたい。。。
    Page_faults_minorを発生させないためには?(to edit mysql caching parameter?
     
    A: tmpTableSize,openFile,openTable,tableCache辺の設定かな。。確認する
     
     

2014/01/17

mysql SlowLog  見方 slow sql 分析


# Time: 040624  1:25:24 
# User@Host: [ODBC] @ localhost [127.0.0.1]
# Query_time: 5  Lock_time: 0  Rows_sent: 30670  Rows_examined: 38828
select * from city 、country 、language where country.code=city.country
 and city.country=language.country;
1行目 記録日時
 2行目 ユーザーIDとリクエストした端末
 3行目 Query_time(実行時間) Lock_time(ロック時間) Rows_sent(送信行数) Rows_examined(処理対象となった行数)
 4行目 SQL文

・queries that do not use indexes for lookups are not logged
 if you want log_queries_not_using_indexes,
・change log file :  Set slow_query_log_file 


mysql explain
mysql> explain select * from city \G;
*************************** 1. row ***************************
        table: city               対象テーブル名
         type: ALL                テーブル内のすべてのレコードを処理対処とする
possible_keys: NULL               使用可能なインデックスを表す
          key: NULL               実際に使用したインデックスを表す
      key_len: NULL               実際に使用したインデックス長を表す
          ref: NULL               行の特定方法を表す
         rows: 4079               結果として返したレコード数を表す
        Extra:                    クエリーに関する追加情報を表す
1 row in set (0.00 sec)
EXPLAINコマンドはどのようにクエリを書き換えればいいかについては何も教えてくれない
そのSQLはどこで時間を掛かった?
ぜんぜんわからない。
 EXPLAIN SELECT でどんな風に検索されているか確認だけかな。。。。。
★TYPE
Const     一意にレコードを選択できる(UNIQUE や PRIMARY KEYを使用)
eq_ref     複数のテーブルごとに一意にレコードを選択できる
ref     インデックスを使用してレコードを選択できる(UNIQUE や PRIMARY KEYではないインデックス)
range     インデックスを使用して範囲に該当するレコードを選択できる
ALL     テーブル内の全てのレコードを検査する



mysql> show table status like 'city' \G;
*************************** 1. row ***************************
           Name: city                    テーブル名
           Type: MyISAM                  テーブル・タイプ
     Row_format: Fixed                   レコードの長さを表す
           Rows: 4079                    格納されている行数
 Avg_row_length: 67                      平均レコード長
    Data_length: 273293                  使用容量
Max_data_length: 287762808831            最大レコード数(最大格納容量)
   Index_length: 83968                   インデックス・ファイル容量
      Data_free: 0                       開放可能な容量
 Auto_increment: 4080                    次に使用する連番
    Create_time: 2004-06-23 22:56:37     テーブル作成日時
    Update_time: 2004-06-23 22:56:38     テーブル更新日時
     Check_time: 2004-06-23 22:56:38     テーブル検査日時
 Create_options:                         テーブル作成時のオプション
        Comment:                         コメント
1 row in set (0.00 sec)
ーーーーーーーーーーーーー


・そのSQLはどこで時間を掛かった?
set profiling=1;
 sqlを実行する
 SHOW PROFILE;
 
 mysql> SHOW PROFILE;
+---------------------------+----------+
| Status                    | Duration |
+---------------------------+----------+
| starting                  | 0.000089 |
| Opening tables            | 0.000237 |
| System lock               | 0.000005 |
| Table lock                | 0.000009 |
| init                      | 0.000009 |
| optimizing                | 0.000005 |
| statistics                | 0.000009 |
| preparing                 | 0.000009 |
| executing                 | 0.001803 |
| converting HEAP to MyISAM | 0.003110 |
| executing                 | 0.982382 |
| Sending data              | 0.031821 |
| end                       | 0.000017 |
| query end                 | 0.000006 |
| freeing items             | 0.000080 |
| removing tmp table        | 0.020215 |
| closing tables            | 0.000021 |
| logging slow query        | 0.000007 |
| cleaning up               | 0.000009 |
+---------------------------+----------+
19 rows in set (0.00 sec)

 SHOW PROFILEは、デフォルトではStatusとDurationを表示する。StatusはSHOW PROCESSLISTで表示されるステータスと同じだ。Durationは経過時間である。つまり、どの段階の処理にどのぐらい時間がかかったのかが一目で分かるのである
 
オプション: 
    ALL・・・すべての情報を表示。
    BLOCK IO・・・ディスクへのBlock I/Oの回数。
    CONTEXT SWITCHES・・・コンテキストスイッチの回数。
    CPU・・・CPUの使用時間。(システム、ユーザの内訳など。)
    IPC・・・メッセージ送受信。
    MEMORY・・・未実装。(これは待望の機能である!!)
    PAGE FAULTS・・・ページフォルト回数。
    SWAPS・・・スワップアウトの回数。


ysql> SHOW PROFILES;
+----------+------------+-------------------------------+
| Query_ID | Duration   | Query                         |
+----------+------------+-------------------------------+
|        1 | 1.03984300 | SHOW LOCAL STATUS             |
|        2 | 0.69961500 | SHOW GLOBAL STATUS            |
|        3 | 0.00078000 | SHOW DATABASES                |
|        4 | 0.00022000 | SELECT DATABASE()             |
|        5 | 0.00059500 | show databases                |
|        6 | 0.54332000 | show tables                   |
|        7 | 0.00092800 | SHOW TABLES                   |
|        8 | 0.00031400 | SELECT * FROM ptest LIMIT 100 |
+----------+------------+-------------------------------+
8 rows in set (0.00 sec)

特定のクエリの情報を見たい場合には次のコマンドを実行する。
profiling_history_sizeのデフォルト値は15、最大値は100

1
mysql> SHOW PROFILE SOURCE FOR QUERY 1;

select count(userinfovi0_.user_id) as col_0_0_ from userinfo_view userinfovi0_ limit 2;
ーーーー>
*************************** 11. row ***************************
             Status: Sending data
           Duration: 0.670087       Sending dataは一番時間掛かった。
           CPU_user: 2.424631
         CPU_system: 0.378942
  Context_voluntary: 9806
Context_involuntary: 182
       Block_ops_in: 0
      Block_ops_out: 4168
      Messages_sent: 0
  Messages_received: 0
  Page_faults_major: 0
  Page_faults_minor: 8
              Swaps: 0
    Source_function: exec
        Source_file: sql_executor.cc
        Source_line: 187
ーーーーーーー>       
Sending dataは、読み込みと絞りこみに掛かってる時間       
This is quite a misleading status. It should be called "reading and filtering data".
This means that MySQL has some data stored on the disk (or in memory) which is yet to be read and sent over. It may be the table itself, an index, a temporary table, a sorted output etc
この辺でMySQLのファイルが上手くキャッシュメモリに乗っていないのではないか? という疑惑が
MySQLのtable_cacheは、テーブルそのもののキャッシュではなく、テーブルに必要なファイルのハンドラをキャッシュする領域
テーブルそのもののキャッシュと勘違い

Page_faults_major: 0ーー>メモリー上はない、コスト高い
Page_faults_minor: 8ーー>メモリー上はある。登録されいていない。

数据跨页,IO 大,explain显示下查询计划,还有表结构     
ページフォールト (page fault) とは、プログラムが物理メモリがマップされていない仮想アドレス空間上のページにアクセスしたときにハードウェアが発生する割り込み(または例外)である
ーーー>DISKに取りに行くのこと


2014/01/16

Mysql的锁机制解读 lock ロック 

从基本概念开始:
共享锁
共享锁的代号是S,是Share的缩写,共享锁的锁粒度是行或者元组(多个行)。一个事务获取了共享锁之后,可以对锁定范围内的数据执行读操作。

排它锁
排它锁的代号是X,是eXclusive的缩写,排它锁的粒度与共享锁相同,也是行或者元组。一个事务获取了排它锁之后,可以对锁定范围内的数据执行写操作。

假设有两个事务t1和t2
如果事务t1获取了一个元组的共享锁,事务t2还可以立即获取这个元组的共享锁,但不能立即获取这个元组的排它锁(必须等到t1释放共享锁之后)。
如果事务t1获取了一个元组的排它锁,事务t2不能立即获取这个元组的排共享锁,也不能立即获取这个元组的排它锁(必须等到t1释放排它锁之后)。

意向锁
意 向锁是一种表锁,锁定的粒度是整张表,分为意向共享锁(IS)和意向排它锁(IX)两类。意向共享锁表示一个事务有意对数据上共享锁或者排它锁。“有意” 这两个字表达的意思比较微妙,说的明白点就是指事务想干这个事但还没真去干。举例说明下意向共享锁,比如一个事务t执行了这样一个语句:select * from table lock in share model ,如果这个语句执行成功,就对表table上了一个意向共享锁。lock in share model就是说事务t1在接下来要执行的语句中要获取S锁。如果t1的select * from table lock in share model执行成功,那么接下来t1应该可以畅通无阻的去执行只需要共享锁的语句了。意向排它锁的含义同理可知,上例中要获取意向排它锁,可以使用select * from table for update 。

lock in share model 和 for update这两个东西在数据率理论中还有个学名叫悲观锁,与悲观锁相对的当然还有乐观锁。大家可以看到各种锁都是成双成对出现的。关于悲观锁和乐观锁的问题暂且不表,下文再来详述。

锁的互斥与兼容关系
锁和锁之间的关系,要么是相容的,要么是互斥的。
锁a和锁b相容是指:操作同样一组数据时,如果事务t1获取了锁a,另一个事务t2还可以获取锁b;
锁a和锁b互斥是指:操作同样一组数据时,如果事务t1获取了锁a,另一个事务t2在t1释放锁a之前无法获取锁b。

上面提到的共享锁、排它锁、意向共享锁、意向排它锁相互之前都是有兼容/互斥关系的,可以用一个兼容性矩阵表示(y表示兼容,n表示不兼容):
    X    S    IX    IS
X  n     n    n     n
S  n     y    n     y
IX n     n    y     y
IS n     y    y     y 

兼容性矩阵为什么是这个样子的?
X和S的相互关系在上文中解释过了,IX和IS的相互关系全部是兼容,这也很好理解,因为它们都只是“有意”,还处于YY阶段,没有真干,所以是可以兼容的;
剩下的就是X和IX,X和IS, S和IX, S和IS的关系了,我们可以由X和S的关系推导出这四组关系。
简 单的说:X和IX的=X和X的关系。为什么呢?因为事务在获取IX锁后,接下来就有权利获取X锁。如果X和IX兼容的话,就会出现两个事务都获取了X锁的 情况,这与我们已知的X与X互斥是矛盾的,所以X与IX只能是互斥关系。其余的三组关系同理,可用同样的方式推导出来。

一致性非阻塞读

select... lock in share mode和select ... for update的区别

索引记录锁
间隙锁
后码锁

各种语句对应的锁类型
在有索引的情况下是以后码锁为基础的行级锁,在固定索引键查找的情况下是索引记录锁,在没有可用索引的情况下上升到表锁
有索引的情况:
select ... from 一致性非阻塞读,不上锁。在serializable隔离级别下例外,在这个隔离级别下上共享后码锁
select ... from ... lock in share mode  共享后码锁
select ... from ... for update 排它后码锁
update .... where  排它后码锁
delete from .... where 排它后码锁
insert ... 排它索引记录锁,如果发生键值唯一性冲突则转成共享锁
insert ... on duplicate key update ,一直都是排它锁
replace ... 一直都是排它锁


死锁情境分析(Innodb)
・更新対象の行が異なればロック待ちの必要はない
・クエリーの書き方より、テーブル全体をロックしてしまう場合がある
 ・テーブルロックさせないためには、インデックスのあるカラムで条件指定する




MVCC的理论与实现

mysql 調整 視点

★大体の流れ。
    ・問題の場所にハードウェアを投入する
    ==>だから、リソースがたりないよ。。。。増やしてください。
    ===>はい、CPUを2倍に、MEMを4倍に、SSDにした。
    ・MySQL プロセスの設定を調整する
    ==>だから、MySQLの設定の問題だよ。。。適切に設定されていないでしょうか?
    ===>既に調整しました、今のこんなレポートがあり、見てください。
    =====>あ。。ちょっとプログラムを調査します。
    ・クエリーを最適化する

プロセスを調整するということは、メモリーを適切な場所に割り当て、そしてどんな種類の負荷を想定するかを mysqld に伝えるということです。ディスクを高速にするよりも、必要なディスク・アクセス数を減らした方が効果的です。同様に、MySQL プロセスが適切に動作している状態を確実にするということは、MySQL プロセスが、クエリーの処理にたくさんの時間を費やすことができ、一時ディスク・テーブルを扱うようなバックグラウンド・タスクの処理や、ファイルを開いたり閉じたりといった処理には、あまり時間を使わずに済むということです。


★★スロー・クエリーのログを取る
SQL サーバーでは、データ・テーブルはディスク上にあります。サーバーは索引によって、テーブル全体を検索することなく、テーブル内の特定のデータ行を見つけることができます。テーブル全体の検索が必要な場合、その検索はテーブル・スキャンと呼ばれます。ほとんどの場合、必要なものはテーブルの中のデータの、ごく小さなサブセットのみであるため、完全なテーブル・スキャンは大量のディスク I/O を浪費し、従って時間を浪費します。この問題は、データの連結が必要な場合にはさらに悪化します。連結されるデータ同士の間で、さらに多くの行を比較しなければならないからです。

slow_query_log     スロークエリログの有効/無効を設定 0(または OFF)で無効、1(または ON)が有効
log-output     出力対象を設定 ファイル(FILE)、テーブル(TABLE)または両方を指定可能
slow_query_log_file     ログ出力先ファイル名(絶対パス/想定パス指定可)
long_query_tim     指定した時間(sec)以上かかったクエリを記録(デフォルト10秒)
----->The time to acquire the initial locks is not counted as execution time.
log_queries_not_using_indexes     インデックスを使用しないクエリを記録=====>これは良さそう。。。
min_examined_row_limit     指定数以上のレコードを読み込んだ場合にクエリを記録


★★クエリーをキャッシュする
多くの LAMP アプリケーションはデータベースに大きく依存していますが、同じクエリーを何度も繰り返し行います。クエリーが実行されるたびに、データベースは同じ作業を行わなければなりません (つまりクエリーを解析し、その実行方法を決定し、ディスクから情報をロードし、その情報をクライアントに返します)。MySQL にはクエリー・キャッシュと呼ばれる機能があり、クエリーの結果が再度必要な時のために、その結果をメモリーに保存します。多くの場合、これによってパフォーマンスを劇的に向上させることができます。ただし注意する点として、クエリー・キャッシュはデフォルトで無効になっています。

mysql> SHOW STATUS LIKE 'qcache%';
+-------------------------+------------+
| Variable_name           | Value      |
+-------------------------+------------+
| Qcache_free_blocks      | 5216       |
| Qcache_free_memory      | 14640664   |
| Qcache_hits             | 2581646882 |
| Qcache_inserts          | 360210964  |
| Qcache_lowmem_prunes    | 281680433  |
| Qcache_not_cached       | 79740667   |
| Qcache_queries_in_cache | 16927      |
| Qcache_total_blocks     | 47042      |
+-------------------------+------------+

★★制限を設定する
リスト 3. MySQL のリソース設定

set-variable=max_connections=500
set-variable=wait_timeout=10
max_connect_errors = 100

1 行目では最大接続数が指定されています。Apache の MaxClients の場合と同様、最大接続数の考え方は、処理することが可能な接続数の範囲でのみ接続を許可することです。これまでサーバーで観察された最大接続数の情報を得るためには、SHOW STATUS LIKE 'max_used_connections' を実行します。
Connections--->起動してから、成否かかわず接続試行の回数
max_used_connections-->同時に接続の最大数

show variables like '%timeout%'
-----------------------------+----------+
| Variable_name               | Value    |
+-----------------------------+----------+
| connect_timeout             | 10       |
| delayed_insert_timeout      | 300      |
| innodb_flush_log_at_timeout | 1        |
| innodb_lock_wait_timeout    | 50       |
| innodb_rollback_on_timeout  | OFF      |
| interactive_timeout         | 28800    |
| lock_wait_timeout           | 31536000 |
| net_read_timeout            | 30       |
| net_write_timeout           | 60       |
| rpl_stop_slave_timeout      | 31536000 |
| slave_net_timeout           | 3600     |
| wait_timeout                | 28800    |->単位は秒、8時間である
+-----------------------------+----------+


A large or growing Table_locks_waited value is the sign of a serious concurrency bottleneck.
Any long running select will block an insert or update from happening. That will in turn prevent any further selects from occurring until after the queued insert or update is complete. Your computer — with all its wonderful parallelism — will suddenly begin working in serial, at least with respect to MySQL. It doesn't matter how many CPUs you throw at it, only one will be used. A performance nightmare.

2 行目は、10 秒以上アイドル状態であったすべての接続を終了するように mysqld に指示されます。通常、LAMP アプリケーションでのデータベースへの接続は、Web サーバーがリクエストを処理するために必要な期間にのみ存在します。場合によると、負荷のある状態で接続が継続し、接続テーブルのスペースを占有してしまうことがあります。対話型のユーザーが多い場合、あるいはデータベースに対して永続的な接続を使用する場合には、この値を低く設定することは賢明ではありません。

最後の行は安全策です。もしホストとサーバーとの接続に問題があり、ホストがリクエストの処理をアボートする回数が多すぎる場合には、FLUSH HOSTS が実行されるまでホストはロックされます。デフォルトでは、10 回も失敗すればブロックされる条件としては十分です。この値を 100 に変更すると、サーバーにはどのような問題からも回復できるだけの十分な時間が与えられます。この値を大きくしても、あまり効果はありません。もしサーバーが 100 回試行しても 1 度も接続できないのであれば、まったく接続できない可能性が高いからです。


★★バッファーとキャッシュ
MySQL には、100 項目をはるかに超える調整可能な設定があります。しかし幸いなことに、そのごく一部をマスターすれば、必要なことのほとんどに対応することができます。こうした設定の適切な値を見つけるためには、SHOW STATUS コマンドを使ってステータス変数を調べ、その結果を基に、mysqld が期待どおり動作しているかどうかを判断します。

mysql> SHOW STATUS LIKE 'open%tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_tables   | 5000  |
| Opened_tables | 195   |
+---------------+-------+
2 rows in set (0.00 sec)

-----症状例ーーーーー
Open_tables 512--->table_open_cacheに合う。
Opend_tablesーー>開けたテーブル!
 The number of tables that have been opened. If Opened_tables is big, your table_open_cache value is probably too small.

MySQL is MySQL はマルチスレッド化されているため、多数のクライアントが同時に同じものに対してクエリを使用することがあります。2 つのクライアントスレッドで 1 つのファイルに異なるステータスが発生する問題を最小にするため、同時に実行しているスレッドがそれぞれで無関係にテーブルを開きます。これはメモリの消費を増やしますが、一般にパフォーマンスは向上します。

table_open_cache is related to max_connections. For example, for 200 concurrent running connections, specify a table cache size of at least 200 * N, where N is the maximum number of tables per join in any of the queries which you execute. You must also reserve some extra file descriptors for temporary tables and files


リスト 5. は、十分な数のスレッドがキャッシュされているかどうかを調べる方法を示しています。
リスト 5. スレッド使用状況の統計を示す

・mysql> SHOW STATUS LIKE 'threads%';
+-------------------+--------+
| Variable_name     | Value  |
+-------------------+--------+
| Threads_cached    | 27     |
| Threads_connected | 15     |
| Threads_created   | 838610 |
| Threads_running   | 3      |
+-------------------+--------+
4 rows in set (0.00 sec)

ここで重要な値は Threads_created です。この値は、mysqld が新しいスレッドを作成する必要が生じるたびにインクリメントされます。もし SHOW STATUS コマンドを継続して実行している間にこの数字が急激に増加するようであれば、スレッド・キャッシュを増加することを検討する必要があります。そのためには、my.cnf の中で、例えば thread_cache = 40 のようにします。

・
リスト 6. キーの効率を調べる

mysql> show status like '%key_read%';
+-------------------+-----------+
| Variable_name     | Value     |
+-------------------+-----------+
| Key_read_requests | 163554268 |
| Key_reads         | 98247     |
+-------------------+-----------+

show status like '%key%';
+------------------------+--------+
| Variable_name          | Value  |
+------------------------+--------+
| Com_assign_to_keycache | 0      |
| Com_preload_keys       | 0      |
| Com_show_keys          | 0      |
| Handler_read_key       | 0      |
| Key_blocks_not_flushed | 0      |
| Key_blocks_unused      | 319666 |ーー>数であり、一個は1K
| Key_blocks_used        | 0      |
| Key_read_requests      | 0      |
| Key_reads              | 0      |
| Key_write_requests     | 0      |
| Key_writes             | 0      |
+------------------------+--------+

Key_reads はディスクへのアクセスが行われた要求の数を表し、Key_read_requests は要求の合計数を表します。Key_reads を Key_read_requests で割ると、ミス・レートが得られます。この場合では 1,000 回の要求に対して 0.6 回のミスです。もし 1,000 回の要求に対して 1 回を超えるミスが起きている場合には、キー・バッファーを増加することを検討する必要があります。例えば key_buffer = 384M とするとバッファーは 384MB に設定されます。

The Key_reads/Key_read_requests ratio should normally be less than 0.01. The Key_writes/Key_write_requests ratio is usually near 1 if you are using mostly updates and deletes, but might be much smaller if you tend to do updates that affect many rows at the same time or if you are using the DELAY_KEY_WRITE table option.

information_shema,mysql下のtableはMyISAMを使っている。

・
一時テーブルは高度なクエリーに使われます (例えば GROUP BY 句の場合のように、さらに処理を行う前に一時的にデータを保存しなければならない場合など)。理想的には、そうしたテーブルをメモリー内に作成しますが、一時テーブルは大きくなりすぎすぎるとディスクに書き込まれます。リスト 7 は一時テーブルの作成に関連する統計を示しています。
リスト 7. 一時テーブルの使用状況を調べる

mysql> SHOW STATUS LIKE 'created_tmp%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 30660 |
| Created_tmp_files       | 2     |
| Created_tmp_tables      | 32912 |
+-------------------------+-------+
3 rows in set (0.00 sec)

一時テーブルが使われるごとに Created_tmp_tables が増加します。またディスク・ベースのテーブルが使われると Created_tmp_disk_tables がインクリメントされます。この比率はどのようなクエリーが行われるかに依存するため、この比率に関する確かなルールはありません。時間をかけて Created_tmp_disk_tables を観察すると、作成されたディスク・テーブルの割合を知ることができ、そこから設定の効果を判断することができます。tmp_table_size と max_heap_table_size はどちらも一時テーブルの最大サイズを制御します。そのため、この両方を my.cnf の中で設定する必要があります。

・lock
ここが行列になっているみたい。
show status like '%_row_lock_%';
+-------------------------------+----------+
| Variable_name                 | Value    |
+-------------------------------+----------+
| Innodb_row_lock_current_waits | 1        |
| Innodb_row_lock_time          | 28066933 |単位はmilisecond-->7.796時間、昨日再起動したばかりので、1/3の時間ロック待ち
| Innodb_row_lock_time_avg      | 1568     |待ち時間平均で1.5秒
| Innodb_row_lock_time_max      | 51960    |51秒のロック、すごい
| Innodb_row_lock_waits         | 17894    |ロック待ちのクエリ総数
+-------------------------------+----------+

・極端で理想の形が、slaveから読んで直接Masterを更新してどうかな?危険
・いろいろしてコミットしないの間もずっとロック持ちだ。。。。トランザクション
その意味で操作を細かくして、早いうちにコミットする

2014/01/14

mysql host cache

★The host_cache table provides access to the contents of the host cache, which contains client host name and IP address information and is used to avoid DNS lookups. (See Section 8.11.5.2, “DNS Lookup Optimization and the Host Cache”.) The host_cache table exposes the contents of the host cache so that it can be examined using SELECT statements. The Performance Schema must be enabled or this table is empty.
==>
The host_cache table was added in MySQL 5.6.5.

★
MySQLでのホストのキャッシュをクリアするコマンド
mysqladmin -u root flush-hosts

これは、IP からホスト名に逆引きしようとしたときに MySQL でエラーが発生したことを意味する。この場合、mysqladmin flush-hosts を実行して内部 DNS キャッシュをリセットすることができる

Difference between commit and flush in Hibernate

★★★Q:
Transaction t = session.beginTransaction();
session.update(item);
t.commit();
-------------------------------------------
session.update(item);
session.flush();

----------------------------------------------
i found out that they basically does the same thing

so what is Difference between commit and flush in Hibernate?

★★★A:
・Flushing is the process of synchronizing the underlying persistent store with persistable state held in memory
・The flush process synchronizes database state with session state by detecting state changes and executing SQL statemen

★★★テスト
//set the JDBC batch size (it is fine somewhere between 20-50) 
hibernate.jdbc.batch_size 30 
 
//disable second-lavel cache 
hibernate.cache.use_second_level_cache false 
 
//and now do your job like this 
Session S=SF.openSession(); //SF = SessionFactory object 
Transaction T=S.beginTransaction(); 
    
for (int i=0;i<200000;i++) 
{ 
   record r=new record(...); 
   S.save(record); 
   if(i % 30==0) 
   {     
      //30, same as the JDBC batch size 
      //flush a batch and release memory 
      session.flush(); // Line 1 
      session.clear(); 
   } 
}  
//clean   
T.commit(); // Line 2 
S.close(); 
==ー>
My test tells me the session.flush() does not make the data visible to other clients. It is available only after the commit.
And I also notice when I set the batch size from 10, 100, 1000, 10000, the performance is pretty much the same. 1%-2% difference with
each other.

bash 正規表現

.     改行文字以外の任意の1文字
*     直前の1文字の0回以上の繰り返しに一致。直前の文字は正規表現でも構わない
^     行の先頭
$     行の末尾
[ ]     かっこ内の任意の1文字に一致。ハイフン(-)で範囲指定もできる
[^ ]     かっこ内の任意の1文字に不一致。ハイフン(-)で範囲指定もできる
\+     直前の文字の1個以上の繰り返しに一致
\?     直前の文字の0または1文字に一致
\{n\}     直前の文字のn個の繰り返しに一致
\{n,\}     直前の文字のn個以上の繰り返しに一致
\{,m\}     直前の文字のm個以下の繰り返しに一致
\{n,m\}     直前の文字のn個以上、m個以下の繰り返しに一致
pattern1\|pattern2     pattern1またはpattern2のいずれかに一致
\(pattern\)     patternをグループ化する。マッチした内容は参照できる
\     正規表現に使われる記号を普通の文字として扱う