1. 恢复和复制的需要,对innodb锁机制的影响

获取锁等待情况
可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定争夺:mysql>
show status like ‘Table%’;+—————————-+———-+|
Variable_name | Value |+—————————-+———-+|
Table_locks_immediate | 105 || Table_locks_waited | 3
|+—————————-+———-+2 rows in set (0.00 sec)
可以通过检查Innodb_row_lock状态变量来分析系统上的行锁的争夺情况:mysql>
show status like
‘innodb_row_lock%’;+—————————————-+———-+|
Variable_name | Value
|+—————————————-+———-+|
Innodb_row_lock_current_waits | 0 || Innodb_row_lock_time | 2001
|| Innodb_row_lock_time_avg | 667 || Innodb_row_lock_time_max |
845 || Innodb_row_lock_waits | 3
|+—————————————-+———-+5 rows in set
(0.00 sec)
另外,针对Innodb类型的表,如果需要察看当前的锁等待情况,可以设置InnoDB
Monitors,然后通过Show innodb status察看,设置的方式是: CREATE TABLE
innodb_monitor(a INT)
ENGINE=INNODB;监视器可以通过发出下列语句来被停止: DROP TABLE
innodb_monitor;设置监视器后,在show innodb
status的显示内容中,会有详细的当前锁等待的信息,包括表名、锁类型、锁定记录的情况等等,便于进行进一步的分析和问题的确定。打开监视器以后,默认情况下每15秒会向日志中记录监控的内容,如果长时间打开会导致.err文件变得非常的巨大,所以我们在确认问题原因之后,要记得删除监控表以关闭监视器。或者通过使用–console选项来启动服务器以关闭写日志文件。什么情况下使用表锁
表级锁在下列几种情况下比行级锁更优越:很多操作都是读表。
在严格条件的索引上读取和更新,当更新或者删除可以用单独的索引来读取得到时:
UPDATE tbl_name SET column=value WHERE unique_key_col=key_value;
DELETE FROM tbl_name WHERE unique_key_col=key_value;
SELECT 和 INSERT 语句并发的执行,但是只有很少的 UPDATE 和 DELETE
语句。
很多的扫描表和对全表的 GROUP BY 操作,但是没有任何写表。

  mysql
通过binlog文件对增删除改等更新数据的sql语句,实现数据库的恢复和主从复制。mysql的恢复机制(复制其实就是在slave
mysql不断做基于binglog的恢复)特点有如下:
  (1) mysql 的恢复是sql语句级的,也就是重新执行binlog中的sql语句,
oracle数据库则是基于数据库文件块的。
  (2) mysql
的binlog是按照事务提交的先后顺序记录的,恢复也是按这个顺序进行的。这也与oracle不同,oracle是按照系统更新号(SCN)来恢复数据的。

什么情况下使用行锁
行级锁定的优点:当在许多线程中访问不同的行时只存在少量锁定冲突。
回滚时只有少量的更改。
可以长时间锁定单一的行。

2.  insert into 和create table对于原表也会加共享锁
 
 下面演示原表加锁的例子:

行级锁定的缺点:比页级或表级锁定占用更多的内存。
当在表的大部分中使用时,比页级或表级锁定速度慢,因为你必须获取更多的锁。
如果你在大部分数据上经常进行GROUP
BY操作或者必须经常扫描整个表,比其它锁定明显慢很多。
用高级别锁定,通过支持不同的类型锁定,你也可以很容易地调节应用程序,因为其锁成本小于行级锁定。

网站地图xml地图