・MultiVersion Concurrency Control
データベース管理システムの可用性を向上させる制御技術のひとつ。複数のユーザから同時に処理要求が行われた場合でも同時並行性を失わずに処理し、かつ情報の一貫性を保証する仕組みが提供される。
MVCCは、書き込み処理(トランザクション)が行われている最中に他のユーザによる読み取りアクセスがあった場合、書き込みの直前の状態(スナップショット)を処理結果として返す。つまり、書き込み中も読み取りができ、読み取り中でも書き込みができる。
MVCCにおいて可用性を達成するには、最低限、全ての処理が「どの順番で」行われたかを確実に記録する必要がある。そのため、タイムスタンプやトランザクションIDなどを用いて全ての更新処理が管理される。
★トランザクション分離レベル
あるデータに対する読み書きの処理を行う場合、わずかでも処理時間が発生する。処理が「複数同時に並行して」実行されようとした場合、感覚的にはどちらかの処理が先に行われ、残ったほうの処理が後に行われるであろう。この場合、後に行われた処理は先に行われた処理が完了するまでの間「待ち」の状態になってしまう。
データベース管理システムはこれらの「待ち」の状態を可能な限り防ぐため、複数の処理を並列で行っている間でもその他の処理を受け付けられる制御方法が確立された。このとき、1つのトランザクション処理が他の処理からどれだけ独立して行われるかが焦点になる、すなわち、「待ち時間を減らすためどれだけデータの一貫性を犠牲にして良いか」を定めたものが、トランザクション分離レベルである。
...
2014/01/31
ssh tunnel - bind: Cannot assign requested address
★ssh -v を付けて、デバッグ情報:OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 Mar 2010debug1: Reading configuration data /etc/ssh/ssh_configdebug1: Applying options for *....debug1: Authentication succeeded (password).debug1: Local connections to LOCALHOST:1080 forwarded to remote address socks:0debug1: Local forwarding listening on 127.0.0.1 port 1080.debug1: channel 0: new [port listener]debug1: Local forwarding listening on ::1 port 1080.bind: Cannot assign requested addressdebug1: channel 1: new [client-session]debug1: Entering interactive session.debug1: Sending...
2014/01/24
mysql日志设置优化
前言
在安装完MySQL之后,肯定是需要对MySQL的各种参数选项进行一些优化调整的。虽然MySQL系统的伸缩性很强,既可以在有很充足的硬件资源
环境下高效的运行,也可以在极少资源环境下很好的运行,但不管怎样,尽可能充足的硬件资源对MySQL的性能提升总是有帮助的。在这一节我们主要分析一下
MySQL的日志(主要是Binlog)对系统性能的影响,并根据日志的相关特性得出相应的优化思路。
日志产生的性能影响
由于日志的记录带来的直接性能损耗就是数据库系统中最为昂贵的IO资源。
在之前介绍MySQL物理架构的章节中,我们已经了解到了MySQL的日志包括错误日志(ErrorLog),更新日志(UpdateLog),二
进制日志(Binlog),查询日志(QueryLog),慢查询日志(SlowQueryLog)等。当然,更新日志是老版本的MySQL才有的,目前
已经被二进制日志替代。
在默认情况下,系统仅仅打开错误日志,关闭了其他所有日志,以达到尽可能减少IO损耗提高系统性能的目的。但是在一般稍微重要一点的实际应用场景
中,都至少需要打开二进制日志,因为这是MySQL很多存储引擎进行增量备份的基础,也是MySQL实现复制的基本条件。有时候为了进一步的性能优化,定
位执行较慢的SQL语句,很多系统也会打开慢查询日志来记录执行时间超过特定数值(由我们自行设置)的SQL语句。
一般情况下,在生产系统中很少有系统会打开查询日志。因为查询日志打开之后会将MySQL中执行的每一条Query都记录到日志中,会该系统带来比
较大的IO负担,而带来的实际效益却并不是非常大。一般只有在开发测试环境中,为了定位某些功能具体使用了哪些SQL语句的时候,才会在短时间段内打开该
日志来做相应的分析。所以,在MySQL系统中,会对性能产生影响的MySQL日志(不包括各存储引擎自己的日志)主要就是Binlog了。
Binlog...
MySQL的innodb_flush_log_at_trx_commit配置值的设定
我发现同事在项目做压力测试的时候,误解了innodb_flush_log_at_trx_commit的含义,认为配置为0是不写日志,所以性能高。
配置项说明
0
如
果innodb_flush_log_at_trx_commit的值为0,log
buffer每秒就会被刷写日志文件到磁盘,提交事务的时候不做任何操作。(执行是由mysql的master
thread线程来执行的。主线程中每秒会将重做日志缓冲写入磁盘的重做日志文件(REDO
LOG)中。不论事务是否已经提交。)默认的日志文件是ib_logfile0,ib_logfile1
1
当设为默认值1的时候,每次提交事务的时候,都会将log buffer刷写到日志。
2
如果设为2,每次提交事务都会写日志,但并不会执行刷的操作。每秒定时会刷到日志文件。要注意的是,并不能保证100%每秒一定都会刷到磁盘,这要取决于进程的调度。每次事务提交的时候将数据写入事务日志,而这里的写入仅是调用了文件系统的写入操作,而文件系统是有 缓存的,所以这个写入并不能保证数据已经写入到物理磁盘
默认值1是为了保证完整的ACID。
当然,你可以将这个配置项设为1以外的值来换取更高的性能,但是在系统崩溃的时候,你将会丢失1秒的数据。设为0的话,mysqld进程崩溃的时候,就会
丢失最后1秒的事务。设为2,只有在操作系统崩溃或者断电的时候才会丢失最后1秒的数据。InnoDB在做恢复的时候会忽略这个值。
刷写的概念
刷
写其实是两个操作,刷(flush)和写(write),区分这两个概念(两个系统调用)是很重要的。在大多数的操作系统中,把Innodb的log...
mysql: logs-slave-updates
--logs-slave-updates
通常情况,从服务器从主服务器接收到的更新不记入它的二进制日志。该选项告诉从服务器将其SQL线程执行的更新记入到从服务器自己的二进制日志。为
了使该选项生效,还必须用--logs-bin选项启动从服务器以启用二进制日志。如果想要应用链式复制服务器,应使用--logs-slave-
updates。例如,可能你想要这样设置:
A -> B -> C
也就是说,A为从服务器B的主服务器,B为从服务器C的主服务器。为了能工作,B必须既为主服务器又为从服务器。你必须用--logs-bin启动A和B以启用二进制日志,并且用--logs-slave-updates选项启动B。
以上是摘自mysql对于logs-slave-updates启动选项的描述。
当然logs-slave-upates也可以写入my.cnf :
//////////////////
log_slave_updates=1
//////////////////
当然在这种机制下可能有的同学会存在这么个问题:
如果a->b b->a 这样的双master架构下,a,b都打开log_slave_updates选项会不会出现无限循环的状态。
mysql已经考滤到了这个问题,每条bin-log都会记录执行语句的源server_id.当slave读到语句的server_id等于本身的ID的时候,不会忽略执行,所以我们不用担心a,b会不会无限循环下去。
基于以上这种情况,mysql的replication集群将更加灵活,你如果需要可以做成各种各样的链式复制。比如...
2014/01/23
Mysql索引覆盖covered index
什么是索引覆盖
就是select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖。
那么显然select * from ...是一种拙劣的查询,除非你建立了包含所有列的索引(这样建索引脑子进水)。
对 于索引覆盖查询(index-covered query),使用EXPLAIN时,可以在Extra一列中看到“Using index”。
使用索引覆盖
如果你想要通过索引覆盖select多列,那么需要给需要的列建立一个多列索引,当然如果带查询条件,where条件要求满足最左前缀原则。
Innodb的辅助索引叶子节点包含的是主键列,所以主键一定是被索引覆盖的。
(1)例如,在sakila的inventory表中,有一个组合索引(store_id,film_id),对于只需要访问这两列的查 询,MySQL就可以使用索引,如下: mysql> EXPLAIN SELECT store_id, film_id FROM sakila.inventory\G *************************** 1. row *************************** ...
mysql innodb 詳細
知识点一:在5.1中,innodb存储引擎的默认的行格式为compact(redundant为兼容以前的版本),对于
blob,text,varchar(8099)这样的大字段,innodb只会存放前768字节在数据页中,而剩余的数据则会存储在溢出段中(发生溢出
情况的时候适用);
知识点二:innodb的块大小默认为16kb,由于innodb存储引擎表为索引组织表,树底层的叶子节点为一双向链表,因此每个页中至少应该有两行记录,这就决定了innodb在存储一行数据的时候不能够超过8k(8098字节);
知识点三:使用了blob数据类型,是不是一定就会存放在溢出段中?通常我们认为blob,clob这类的大对象的存储会把数据存放在数据页之外,
其实不然,关键点还是要看一个page中到底能否存放两行数据,blob可以完全存放在数据页中(单行长度没有超过8098字节),而varchar类型
的也有可能存放在溢出页中(单行长度超过8098字节,前768字节存放在数据页中);
知识点四:5.1中的innodb_plugin引入了新的文件格式:barracuda(将compact和redundant合称为
antelope),该文件格式拥有新的两种行格式:compressed和dynamic,两种格式对blob字段采用完全溢出的方式,数据页中只存放
20字节,其余的都存放在溢出段中:
我们使用show...
mysql table engine 確認
user information_schema;show tables;中に名前は「tables」のがある。describe tables;select Table_name,engine,table_schema from tables where engine='MyISAM'; iNnoDB NULL---->なになにViewだよね。。 ーーーーーーーーーー...
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/*.ja...
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>...
2014/01/16
jcraft.jsch.JSchException: verify: false
ーー>jsch 0.1.50 has been released and it fixes this problem
ーー>あ、そうですか。私が悪...
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...
mysql 調整 視点
★大体の流れ。
・問題の場所にハードウェアを投入する
==>だから、リソースがたりないよ。。。。増やしてください。
===>はい、CPUを2倍に、MEMを4倍に、SSDにした。
・MySQL プロセスの設定を調整する
==>だから、MySQLの設定の問題だよ。。。適切に設定されていないでしょうか?
===>既に調整しました、今のこんなレポートがあり、見てください。
=====>あ。。ちょっとプログラムを調査します。
・クエリーを最適化する
プロセスを調整するということは、メモリーを適切な場所に割り当て、そしてどんな種類の負荷を想定するかを mysqld に伝えるということです。ディスクを高速にするよりも、必要なディスク・アクセス数を減らした方が効果的です。同様に、MySQL プロセスが適切に動作している状態を確実にするということは、MySQL プロセスが、クエリーの処理にたくさんの時間を費やすことができ、一時ディスク・テーブルを扱うようなバックグラウンド・タスクの処理や、ファイルを開いたり閉じたりといった処理には、あまり時間を使わずに済むということです。
★★スロー・クエリーのログを取る
SQL...
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...
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 thingso 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...
bash 正規表現
. 改行文字以外の任意の1文字* 直前の1文字の0回以上の繰り返しに一致。直前の文字は正規表現でも構わない^ 行の先頭$ 行の末尾[ ] かっこ内の任意の1文字に一致。ハイフン(-)で範囲指定もできる[^ ] かっこ内の任意の1文字に不一致。ハイフン(-)で範囲指定もできる\+ 直前の文字の1個以上の繰り返しに一致\? 直前の文字の0または1文字に一致\{n\} 直前の文字のn個の繰り返しに一致\{n,\} 直前の文字のn個以上の繰り返しに一致\{,m\} 直前の文字のm個以下の繰り返しに一致\{n,m\} 直前の文字のn個以上、m個以下の繰り返しに一致pattern1\|pattern2 pattern1またはpattern2のいずれかに一致\(pattern\)...