搜档网
当前位置:搜档网 › 查看mysql锁

查看mysql锁

查看mysql锁
查看mysql锁

mysql 查看binlog,slowlog,查看锁表情况

shell> mysqlbinlog log-file

使用mysqldumpslow命令获得日志中显示的查询摘要来处理慢查询日志,例如:[zzx@bj37 data]$ mysqldumpslow bj37-slow.log

一.1 获取锁等待情况可以通过检查 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选项来启动服务器以关闭写日志文件。

如果是root帐号,你能看到所有用户的当前连接。如果是其它普通帐号,只能看到自己占用的连接。

show processlist;只列出前100条,如果想全列出请使用show full processlist;

mysql> show processlist;(非常管用哦)

查看mysql锁

博客分类:

数据库(oracle,mysql..)

MySQLSQL数据结构.net

1. 进入mysql/bin目录下输入mysqladmin processlist;

2. 启动mysql,输入show processlist;

如果有SUPER权限,则可以看到全部的线程,否则,只能看到自己发起的线程(这是指,当前对应的MySQL帐户运行的线程)。

得到数据形式如下(只截取了三条):

mysql> show processlist;

+-----+-------------+--------------------+-------+---------+-------+----------------------------------+----------

| Id | User | Host | db | Command | Time| State | Info

+-----+-------------+--------------------+-------+---------+-------+----------------------------------+----------

|207|root |192.168.0.20:51718 |mytest | Sleep | 5 | | NULL

|208|root |192.168.0.20:51719 |mytest | Sleep | 5 | | NULL

|220|root |192.168.0.20:51731 |mytest |Query | 84 | Locked |

select bookname,culture,value,type from book where id=001

先简单说一下各列的含义和用途,第一列,id,不用说了吧,一个标识,你要kill一个语句的时候很有用。user列,显示单前用户,如果不是root,这个命令就只显示你权限范围内的sql语句。host列,显示这个语句是从哪个ip的哪个端口上发出的。呵呵,可以用来追踪出问题语句的用户。db列,显示这个进程目前连接的是哪个数据库。command列,显示当前连接的执行的命令,一般就是休眠(sleep),查询(query),连接(connect)。time列,此这个状态持续的时间,单位是秒。state列,显示使用当前连接的sql语句的状态,很重要的列,后续会有所有的状态的描述,请注意,state只是语句执行中的某一个状态,一个sql语句,已查询为例,可能需要经过copying to tmp table,Sorting result,Sending data等状态才可以完成,info列,显示这个sql语句,因为

长度有限,所以长的sql语句就显示不全,但是一个判断问题语句的重要依据。

这个命令中最关键的就是state列,mysql列出的状态主要有以下几种:

Checking table

正在检查数据表(这是自动的)。

Closing tables

正在将表中修改的数据刷新到磁盘中,同时正在关闭已经用完的表。这是一个很快的操作,如果不是这样的话,就应该确认磁盘空间是否已经满了或者磁盘是否正处于重负中。

Connect Out

复制从服务器正在连接主服务器。

Copying to tmp table on disk

由于临时结果集大于tmp_table_size,正在将临时表从内存存储转为磁盘存储以此节省内存。

Creating tmp table

正在创建临时表以存放部分查询结果。

deleting from main table

服务器正在执行多表删除中的第一部分,刚删除第一个表。

deleting from reference tables

服务器正在执行多表删除中的第二部分,正在删除其他表的记录。

Flushing tables

正在执行FLUSH TABLES,等待其他线程关闭数据表。

Killed

发送了一个kill请求给某线程,那么这个线程将会检查kill标志位,同时会放弃下一个kill请求。MySQL会在每次的主循环中检查kill标志位,不过有些情况下该线程可能会过一小段才能死掉。如果该线程程被其他线程锁住了,那么kill请求会在锁释放时马上生效。

Locked

被其他查询锁住了。

Sending data

正在处理Select查询的记录,同时正在把结果发送给客户端。

Sorting for group

正在为GROUP BY做排序。

Sorting for order

正在为ORDER BY做排序。

Opening tables

这个过程应该会很快,除非受到其他因素的干扰。例如,在执Alter TABLE

或LOCK TABLE语句行完以前,数据表无法被其他线程打开。正尝试打开一个表。Removing duplicates

正在执行一个Select DISTINCT方式的查询,但是MySQL无法在前一个阶段优化掉那些重复的记录。因此,MySQL需要再次去掉重复的记录,然后再把结果发送给客户端。

Reopen table

获得了对一个表的锁,但是必须在表结构修改之后才能获得这个锁。已经释放锁,关闭数据表,正尝试重新打开数据表。

Repair by sorting

修复指令正在排序以创建索引。

Repair with keycache

修复指令正在利用索引缓存一个一个地创建新索引。它会比Repair by sorting慢些。

Searching rows for update

正在讲符合条件的记录找出来以备更新。它必须在Update要修改相关的记录之前就完成了。

Sleeping

正在等待客户端发送新请求.

System lock

正在等待取得一个外部的系统锁。如果当前没有运行多个mysqld服务器同时请求同一个表,那么可以通过增加--skip-external-locking参数来禁止外部系统锁。

Upgrading lock

Insert DELAYED正在尝试取得一个锁表以插入新记录。

Updating

正在搜索匹配的记录,并且修改它们。

User Lock

正在等待GET_LOCK()。

Waiting for tables

该线程得到通知,数据表结构已经被修改了,需要重新打开数据表以取得新的结构。然后,为了能的重新打开数据表,必须等到所有其他线程关闭这个表。以下几种情况下会产生这个通知:FLUSH TABLES tbl_name, Alter TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE,或OPTIMIZE TABLE。

waiting for handler insert

Insert DELAYED已经处理完了所有待处理的插入操作,正在等待新的请求。大部分状态对应很快的操作,只要有一个线程保持同一个状态好几秒钟,那么可能是有问题发生了,需要检查一下。

还有其他的状态没在上面中列出来,不过它们大部分只是在查看服务器是否有存在错误是才用得着

详细出处参考:https://www.sodocs.net/doc/039937713.html,/article/22409.htm

mysql面试大全精心整理

Mysl面试大全 1.Mysql中有哪几种锁? 1.表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 2.行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 3. 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。 2.Mysql中有哪些不同的表格? 共有5种类型的表格: MyISAM Heap Merge INNODB ISAM 3.简述在MySQL数据库中MyISAM和InnoDB的区别 MyISAM: 不支持事务,但是每次查询都是原子的; 支持表级锁,即每次操作是对整个表加锁; 存储表的总行数; 一个MYISAM表有三个文件:索引文件、表结构文件、数据文件; 采用菲聚集索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致,但是辅索引不用保证唯一性。 InnoDb: 支持ACID的事务,支持事务的四种隔离级别; 支持行级锁及外键约束:因此可以支持写并发; 不存储总行数; 一个InnoDb引擎存储在一个文件空间(共享表空间,表大小不受操作系统控制,一个表可能分布在多个文件里),也有可能为多个(设置为独立表空,表大小受操作系统文件大小限制,一般为2G),受操作系统文件大小的限制; 主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值;因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问辅索引;最好使用自增主键,防止插入数据时,为维持B+树结构,文件的大调整。 4.Mysql中InnoDB支持的四种事务隔离级别名称,以及逐级之间的区别? SQL标准定义的四个隔离级别为: read uncommited :读到未提交数据 read committed:脏读,不可重复读 repeatable read:可重读 serializable :串行事物

ACCESS数据库锁定问题

ACCESS数据库锁定问题 问题1 单位网站突然有的时候不能打开网页。重启电脑后问题解决。说是CONN.ASP第6行错误。同时生成一个.LDB文件。在网上查了下说是数据库没有关闭或锁定了。请问如何关闭啊,下边是CONN.ASP代码: <% starttime=timer() StrSQL="DBQ="+server.mappath("admin/data/news30000.mdb")+";DRIVER={Microsoft Access Driver (*.mdb)};" 'connstr="driver={SQL Server};server=(local);database=master;uid=sa;pwd=;" set conn=server.createobject("ADODB.CONNECTION") conn.open StrSQL(第6行) %> 答: 如果是ACCESS数据库,应该是并发访问造成的问题。因为ACCESS没有行锁。所以你有个一个用户在网上改一条数据,另外一个用户再上来访问相同一条数据时就给锁了。重启动后所有的连接全断开了,所以就没问题了。如果有可能最好不用ACCESS做后台数据库。 ---------------------------------- 问题2 我的数据库老是被锁住,网页打不开,请高手帮忙!!我的conn.asp是:<% scadb=mydata&"datahotel/#@@##feel.mdb" 'mydata 为各文件中设置的路径,请不要改动 connstr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath(""&scadb&"") On Error Resume Next Set conn = Server.CreateObject("ADODB.Connection") conn.open connstr If Err Then err.Clear Set Conn = Nothing Response.Write "




数据库连接出错!!!请检查数据库连接指向^--^
" Response.End End If%> 答: 你的数据库连接写法是正确的,是不是数据库太大,几百M的话容易出现这个问题,建议换sql数据库。不想换的话可以把数据库下载到本地压缩修复一下再传上去。 ------------------------- 问题3

数据库锁表与解锁

数据库锁表与解锁 一、mysql 锁定表:LOCK TABLES tbl_name {READ | WRITE},[ tbl_name {READ | WRITE},…] 解锁表:UNLOCK TABLES 例子: LOCK TABLES table1 WRITE ,table2 READ 、、、更多表枷锁; 说明:1、READ 锁代表其她用户只能读不能其她操作 2、WRITE锁代表:其她用户不能任何操作(包括读) 查瞧那些表被锁:show OPEN TABLES where In_use > 0; 全局加锁:FLUSH TABLES WITH READ LOCK(这个命令就是全局读锁定,执行了命令之后所有库所有表都被锁定只读。解锁也就是:UNLOCK TABLES ) 二、oracle --行级锁定(同样对 mysql起作用) 通过 :select * from tableName t for update 或 select * from tableName t where id =1 for update 前者锁定整个表,后者多顶 id=1的一行数据(有主键,并且指定主键=值的只 锁定指定行) 说明:通过 select 、、、 for update 后其她用户只能读不能其她操作,锁定者通过 commit或 rollback命令自动解锁,或使用本文的解锁方式

(will)! --表级锁定 lock table in mode [nowait] 其中: lock_mode 就是锁定模式 nowait关键字用于防止无限期的等待其她用户释放锁 五种模式如下(1到5 级别越来越高,限制越来越大): 1、行共享(row share,rs):允许其她用户访问与锁定该表,但就是禁止排她锁定 整个表 2、排她锁(row exclusive ,rx):与行共享模式相同,同时禁止其她用户在此表上使用共享锁。使用select 、、、 for update语句会在表上自动应用行排她锁 3、共享(share ,s):共享锁将锁定表,仅允许其她用户查询表中的行,但不允许插入、更新、删除行。多个用户可以在同一表中放置共享锁,即允许资源共享,,因此得名“共享锁”。例如:如果用户每天都需要在结账时更新日销售额表,则可以在更新该表时使用共享锁以确保数据的一致性。 4、共享排她锁(share row exclusive,srx):执行比共享锁更多的限制。防止其 她事务在表上应用共享锁,、共享排她锁以及排她锁。 5、排她(exclusive,x):对表执行最大的限制。除了允许其她用户查询该表记录, 排她锁防止其她事务对表做任何更改或在表上应用任何类型的锁。 实例: lock table table_Name in exclusive mode; 要解锁需要锁定人执行 commit 或 rollback 或者用本文的解锁方式 (will)! --查询锁表 SELECT /*+ rule */ S、USERNAME, DECODE(L、TYPE, 'TM', 'TABLE LOCK', 'TX', 'ROW LOCK', NULL) LOCK_LEVEL,

MySQL练习题及答案

答案见参考下列黄色标记 一、下面所有题目中包括单选或多选 1.若MySQL Server运行在Linux系统上,那访问MySQL服务器的客 户端程序也必须运行在Linux系统吗? A.是 B. 否 2.MySQL与其他关系型数据库(SQL Server/Oracle)架构上最大的区别 是? A.连接层 B. SQL层 C.存储引擎层 3.MySQL使用磁盘空间来存储下面哪些信息? A.server和client程序、其他lib库文件 B.日志文件和状态文件 C.数据库 D.表格式(.frm)文件、数据文件、索引文件 E.当内部临时表超过控制设置时,由内存表形式转化为磁盘形式存储 F.上面所有 4.下面哪四种是mysql客户端程序的功能? A.创建、删除数据库 B.创建、删除、修改表和索引

C.使用shutdown命令关闭服务器 D.创建、管理用户 E.显示replication状态信息 F.使用start backup命令来进行数据库二进制备份 5.在MySQL内部有4种常见日志,哪种日志是不能直接cat或more 文本查阅日志内容? A.错误日志(error-log) B.二进制日志(bin-log) C.查询日志(query-log) D.慢查询日志(slow-log) 6.下面哪三种方式可以查看Country表的存储引擎? A.SHOW CREATE TABLE Country; B.SHOW ENGINE Country STATUS;; C.SHOW TABLE STATUS LIKE ‘Country’; D.SELECT ENGINE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME=’Country’; E.SELECT ENGINE FROM INFORMATION_SCHEMA.ENGINES WHERE TABLE_NAME =’County’; 7.在高并发、事务等场景下,MySQL5.6数据库默认使用哪种存储引

MySQL面试题 40道

1、MySQL 中有哪几种锁? 1、表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 2、行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 3、页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。 2、MySQL 中有哪些不同的表格? 共有 5 种类型的表格: 1、MyISAM2、Heap 3、Merge 4、INNODB 5、MISAM 3、简述在MySQL 数据库中 MyISAM 和InnoDB 的区别 MyISAM: 不支持事务,但是每次查询都是原子的;支持表级锁,即每次操作是对整个表加锁;存储表的总行数; 一个 MYISAM 表有三个文件:索引文件、表结构文件、数据文件; 采用菲聚集索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致,但是辅索引不用保证唯一性。 InnoDb: 支持 ACID 的事务,支持事务的四种隔离级别;支持行级锁及外键约束:因此可以支持写并发;不存储总行数: 一个 InnoDb 引擎存储在一个文件空间(共享表空间,表大小不受操作系统控制, 一个表可能分布在多个文件里),也有可能为多个(设置为独立表空,表大小受操作系统文件大小限制,一般为 2G),受操作系统文件大小的限制;

主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值;因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问辅索引;最好使用自增主键,防止插入数据时,为维持 B+树结构,文件的大调整。 4、MySQL 中InnoDB 支持的四种事务隔离级别名称,以及逐 级之间的区别?SQL 标准定义的四个隔离级别为: 1、read uncommited :读到未提交数据 2、read committed:脏读,不可重复读 3、repeatable read:可重读 4、serializable :串行事物 5、CHAR 和VARCHAR 的区别? 1、CHAR 和 VARCHAR 类型在存储和检索方面有所不同 2、CHAR 列长度固定为创建表时声明的长度,长度值范围是 1 到 255 当 CHAR 值被存储时,它们被用空格填充到特定长度,检索 CHAR 值时需删除尾随空格。 6、主键和候选键有什么区别? 表格的每一行都由主键唯一标识,一个表只有一个主键。 主键也是候选键。按照惯例,候选键可以被指定为主键,并且可以用于任何外键引用。 7、myisamchk 是用来做什么的? 它用来压缩 MyISAM 表,这减少了磁盘或内存使用。 MyISAM Static 和 MyISAM Dynamic 有什么区别? 在 MyISAM Static 上的所有字段有固定宽度。动态 MyISAM 表将具有像 TEXT, BLOB 等字段,以适应不同长度的数据类型。 MyISAM Static 在受损情况下更容易恢复。 8、如果一个表有一列定义为TIMESTAMP,将发生什么? 每当行被更改时,时间戳字段将获取当前时间戳。列设置为 AUTO INCREMENT 时,如果在表中达到最大值,会发生什么情况?它会停止递增,任何进一步的插入都将产生错误,因为密钥已被使用。怎样才能找出最后一次插入时分配了哪个自动增量?LAST_INSERT_ID 将返回由 Auto_increment 分配的最后一个值,并且不需要指定表名称。 9、你怎么看到为表格定义的所有索引? 索引是通过以下方式为表格定义的: SHOW INDEX FROM ; 10、LIKE 声明中的%和是什么意思?%对应于 0 个或更多字符,只是 LIKE 语句中的一个字符。 如何在 Unix 和 MySQL 时间戳之间进行转换?UNIX_TIMESTAMP 是从 MySQL 时间戳转换为 Unix 时间戳的命令FROM_UNIXTIME 是从 Unix 时间戳转换为 MySQL 时间戳的命令 11、列对比运算符是什么?

Oracle查看被锁定的表和行的SQL

我们在操作数据库的时候,有时候会由于操作不当引起数据库表被锁定,这么我们经常不知所措,不知怎么给这些表解锁,在pl/sql Developer工具的的菜单“tools”里面的“sessions”可以查询现在存在的会话,但是我们很难找到那个会话被锁定了,想找到所以被锁的会话就 更难了,下面这叫查询语句可以查询出所以被锁的会话。如下: SELECT https://www.sodocs.net/doc/039937713.html,ername, m.SID,sn.SERIAL#, m.TYPE, DECODE (m.lmode, 0, 'None', 1, 'Null', 2, 'Row Share', 3, 'Row Excl.', 4, 'Share', 5, 'S/Row Excl.', 6, 'Exclusive', lmode, LTRIM (TO_CHAR (lmode, '990')) ) lmode, DECODE (m.request, 0, 'None', 1, 'Null', 2, 'Row Share', 3, 'Row Excl.', 4, 'Share', 5, 'S/Row Excl.',

6, 'Exclusive', request, LTRIM (TO_CHAR (m.request, '990')) ) request, m.id1, m.id2 FROM v$session sn, v$lock m WHERE (sn.SID = m.SID AND m.request != 0) OR ( sn.SID = m.SID AND m.request = 0 AND lmode != 4 AND (id1, id2) IN ( SELECT s.id1, s.id2 FROM v$lock s WHERE request != 0 AND s.id1 = m.id1 AND s.id2 = m.id2) )ORDER BY id1, id2, m.request; 通过以上查询知道了sid和SERIAL#就可以开杀了 alter system kill session 'sid,SERIAL#';

如何对行 表 数据库加锁

如何对行表数据库加锁 1如何锁一个表的某一行 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SELECT*FROM table ROWLOCK WHERE id =1 2锁定数据库的一个表 SELECT*FROM table WITH (HOLDLOCK) 加锁语句: sybase: update表set col1=col1 where1=0 ; MSSQL: select col1 from表(tablockx) where1=0 ; oracle: LOCK TABLE表IN EXCLUSIVE MODE ; 加锁后其它人不可操作,直到加锁用户解锁,用commit或rollback解锁 几个例子帮助大家加深印象 设table1(A,B,C) A B C a1 b1 c1 a2 b2 c2 a3 b3 c3 1)排它锁 新建两个连接 在第一个连接中执行以下语句 begin tran update table1 set A='aa' where B='b2' waitfor delay '00:00:30'--等待30秒 commit tran 在第二个连接中执行以下语句 begin tran select*from table1 where B='b2' commit tran

若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行即要等待30秒 2)共享锁 在第一个连接中执行以下语句 begin tran select*from table1 holdlock-holdlock人为加锁 where B='b2' waitfor delay '00:00:30'--等待30秒 commit tran 在第二个连接中执行以下语句 begin tran select A,C from table1 where B='b2' update table1 set A='aa' where B='b2' commit tran 若同时执行上述两个语句,则第二个连接中的select查询可以执行 而update必须等待第一个事务释放共享锁转为排它锁后才能执行即要等待30秒 3)死锁 增设table2(D,E) D E d1 e1 d2 e2 在第一个连接中执行以下语句 begin tran update table1 set A='aa' where B='b2' waitfor delay '00:00:30' update table2 set D='d5' where E='e1' commit tran 在第二个连接中执行以下语句 begin tran update table2 set D='d5' where E='e1'

MySQL个常用面习题需要找工作的一定要看

1、MySQL的复制原理以及流程 基本原理流程,3个线程以及之间的关联; 1.主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中; 2.从:io线程——在使用startslave之后,负责从master上拉取binlog内容,放进自己的relaylog中; 3.从:sql执行线程——执行relaylog中的语句; 2、MySQL中myisam与innodb的区别,至少5点 (1)、问5点不同; 1>.InnoDB支持事物,而MyISAM不支持事物 2>.InnoDB支持行级锁,而MyISAM支持表级锁 3>.InnoDB支持MVCC,而MyISAM不支持 4>.InnoDB支持外键,而MyISAM不支持 5>.InnoDB不支持全文索引,而MyISAM支持。 (2)、innodb引擎的4大特性 插入缓冲(insertbuffer),二次写(doublewrite),自适应哈希索引(ahi),预读(readahead) (3)、2者selectcount(*)哪个更快,为什么 myisam更快,因为myisam内部维护了一个计数器,可以直接调取。 3、MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义 (1)、varchar与char的区别 char是一种固定长度的类型,varchar则是一种可变长度的类型

(2)、varchar(50)中50的涵义 最多存放50个字符,varchar(50)和(200)存储hello所占空间一样,但后者在排序时会消耗更多内存,因为orderbycol采用fixed_length计算col长度(memory引擎也一样) (3)、int(20)中20的涵义 是指显示字符的长度 但要加参数的,最大为255,比如它是记录行数的id,插入10笔资料,它就显示00000000001~~~00000000010,当字符的位数超过11,它也只显示11位,如果你没有加那个让它未满11位就前面加0的参数,它不会在前面加0 20表示最大显示宽度为20,但仍占4字节存储,存储范围不变; (4)、mysql为什么这么设计 对大多数应用没有意义,只是规定一些工具用来显示字符的个数;int(1)和int(20)存储和计算均一样; 4、问了innodb的事务与日志的实现方式 (1)、有多少种日志; 错误日志:记录出错信息,也记录一些警告信息或者正确的信息。 查询日志:记录所有对数据库请求的信息,不论这些请求是否得到了正确的执行。慢查询日志:设置一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询的日志文件中。 二进制日志:记录对数据库执行更改的所有操作。 中继日志: 事务日志:

mysql锁表和解锁语句

mysql锁表和解锁语句 对于MySQL来说,有三种锁的级别:页级、表级、行级 页级的典型代表引擎为BDB。 表级的典型代表引擎为MyISAM,MEMORY以及很久以前的ISAM。 行级的典型代表引擎为INNODB。 -我们实际应用中用的最多的就是行锁。 行级锁的优点如下: 1)、当很多连接分别进行不同的查询时减小LOCK状态。 2)、如果出现异常,可以减少数据的丢失。因为一次可以只回滚一行或者几行少量的数据。行级锁的缺点如下: 1)、比页级锁和表级锁要占用更多的内存。 2)、进行查询时比页级锁和表级锁需要的I/O要多,所以我们经常把行级锁用在写操作而不是读操作。 3)、容易出现死锁。 对于写锁定如下: 1)、如果表没有加锁,那么对其加写锁定。 2)、否则,那么把请求放入写锁队列中。 对于读锁定如下: 1)、如果表没有加写锁,那么加一个读锁。

2)、否则,那么把请求放到读锁队列中。 当然我们可以分别用low_priority 以及high_priority在写和读操作上来改变这些行为。 如果想要在一个表上做大量的INSERT 和SELECT 操作,但是并行的插入却不可能时,可以将记录插入到临时表中,然后定期将临时表中的数据更新到实际的表里。可以用以下命令实现: mysql> LOCK TABLES real_table WRITE, insert_table WRITE; mysql> INSERT INTO real_table SELECT * FROM insert_table; mysql> TRUNCATE TABLE insert_table; mysql> UNLOCK TABLES; InnoDB 使用行级锁,BDB 使用页级锁。对于InnoDB 和BDB 存储引擎来说,是可能产生死锁的。这是因为InnoDB 会自动捕获行锁,BDB 会在执行SQL 语句时捕获页锁的,而不是在事务的开始就这么做。 行级锁的优点有: 在很多线程请求不同记录时减少冲突锁。 事务回滚时减少改变数据。 使长时间对单独的一行记录加锁成为可能。 行级锁的缺点有:

数据库原理及应用习题集参考答案

《数据库原理及应用》习题集参考答案 一、简答题 1、什么是数据库管理系统? 一种负责数据库的建立、操作、管理和维护的软件系统。 2、数据库系统有哪几种模式?分别用来描述什么? (1)外模式 是用户的数据视图,用来描述数据的局部逻辑结构,是模式的子集。(2)模式 是所有用户的公共数据视图,用来描述数据库中全体数据的全局逻辑结构和特征。 (3)内模式 又称存储模式,描述数据的物理结构及存储方式 3、什么是事务?事务有哪些特征? 答:所谓事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。 事务的特征:原子性、一致性、隔离性、持续性。 4、POWER BUILDER中事务对象有何作用? 答:PowerBuider的事务对象是应用程序与数据库之间进行通信的桥梁,在应用程序初启时,系统自动创一个为SQLCA(SQL Communication Area, SQL通讯区)的全局事务对象,该对象在应用程序的任何地方都可以访问 应用程序与数据库的所有通信都需要通过事务对象来完成,除了直接使用系统的缺省事务对SQLCA外,开发人员也可以创建自己的事务对象。 5、SQL SERVER中INSERTED表和DELETED表有何用? 答:触发器中用到两种特殊的表:删除表和插入表触发器中使用名为“deleted"和“inserted"来参照这些表;删除表存储受DELTE和UPDATE语句影响的行的副本当执行DELETE或UPDATE语句时,行从触发器表中删除并传递到删除表中。删除表和触发器表通常没有共有的行。 插入表存储受INSERT和UPDA TE语句影响的行的副本当执行一NSERT 或UPDA T语句时,新行同时增加到插入表和触发器表中。插入表中的行是触发器表中新行的副本可使用删除表和插入表中的行来参照相关表中的行,或测试被删除或插入行中的值。

mysql中myisam锁

mysql中myisam锁问题: 1.myisam表锁状态参数 mysql> show status like "table%"; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | Table_locks_immediate | 249 | | Table_locks_waited | 0 | +-----------------------+-------+ 2 rows in set (0.01 sec) #如果table_locks_waited的值比较高,则说明存在着较为严重的表级锁争用情况. 2.mysql锁分为两种模式: 1)table read lock 表共享读锁 2)table write lock 表独占写锁 可见,对myisam表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同表的写请求,对myisam表的写操作,则会阻塞其他用户对同一表的读和写操作;myisam表的读操作和写操作之间,以及写操作之间是串行的 3.表锁测试 首先测试读锁: 1) mysql> show create table t2; +-------+--------------------------------------------------------------------------------------+ | Table | Create Table | +-------+--------------------------------------------------------------------------------------+ | t2 | CREATE TABLE `t2` ( `id` int(11) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 | +-------+--------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) 2) mysql> lock table t2 read; Query OK, 0 rows affected (0.00 sec) 3) mysql> select * from t2; +------+ | id | +------+ | 1 | | 2 | | 3 | | 5 |

mysql锁解决并发问题

mysql锁解决并发问题 文章分为以下几个要点 1.问题描述以及解决过程 2.MySQL锁机制 3.数据库加锁分析 下面讨论的都是基于MySQL的InnoDB。 0. 问题描述以及解决过程 因为涉及到公司利益问题,所以下面很多代码和数据库信息,进行了缩减和修改,望见谅。 业务场景是优惠券系统规则规定了一个优惠券活动最多可发行多少张优惠券和每个用户最多可领取优惠券数量。下面列出两张表的结构。 活动表 CREATE TABLE`coupon_detail`( `coup_id`int(11) NOT NULL AUTO_INCREMENT, `act_code`char(6) NOT NULL DEFAULT''COMMENT '活动编号', `coup_code`char(6) NOT NULL DEFAULT''COMMENT '优惠券编码', `coup_user_id`int(11) NOT NULL DEFAULT'0'COMMENT '领取券用户id', PRIMARY KEY(`coup_id`), UNIQUE KEY`coup_code_idx`(`coup_code`) USING BTREE COMMENT '优惠券编码唯一索引', KEY`coup_user_idx`(`coup_user_id`) USING BTREE COMMENT '用户id普通索引', KEY`act_code_idx`(`act_code`) USING BTREE COMMENT '活动编码普通索引' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='优惠券明细表'; 假设一个优惠券活动设置的最大发行量为1000张优惠券,单个用户最多可领取1张优惠券。如下 insert into coupon_activity values(1,'000000',1000,1,0);

MySQL 数据库锁定机制

MySQL 数据库锁定机制 MySQL 数据库锁定机制简介 ●行级锁定(row-level) 行级锁定最大的特点就是锁定对象的颗粒度很小,也是目前各大数据库管理软件所实现的锁定颗粒度最小的。由于锁定颗粒度很小,所以发生锁定资源争用的概率也最小,能够给予应用程序尽可能大的并发处理能力而提高一些需要高并发应用系统的整体性能。 虽然能够在并发处理能力上面有较大的优势,但是行级锁定也因此带来了不少弊端。由于锁定资源的颗粒度很小,所以每次获取锁和释放锁需要做的事情也更多,带来的消耗自然也就更大了。此外,行级锁定也最容易发生死锁。 ●表级锁定(table-level) 和行级锁定相反,表级别的锁定是MySQL 各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑非常简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好的避免困扰我们的死锁问题。当然,锁定颗粒度大所带来最大的负面影响就是出现

锁定资源争用的概率也会最高,致使并大度大打折扣。 ●页级锁定(page-level) 页级锁定是MySQL 中比较独特的一种锁定级别,在其他数据库管理软件中也并不是太常见。页级锁定的特点是锁定颗粒度介于行级锁定与表级锁之间,所以获取锁定所需要的资源开销,以及所能提供的并发处理能力也同样是介于上面二者之间。另外,页级锁定和行级锁定一样,会发生死锁。 在数据库实现资源锁定的过程中,随着锁定资源颗粒度的减小,锁定相同数据量的数据所需要消耗的内存数量是越来越多的,实现算法也会越来越复杂。不过,随着锁定资源颗粒度的减小,应用程序的访问请求遇到锁等待的可能性也会随之降低,系统整体并发度也随之提升。 在MySQL 数据库中,使用表级锁定的主要是MyISAM,Memory,CSV 等一些非事务性存储引擎,而使用行级锁定的主要是Innodb 存储引擎和NDB Cluster 存储引擎,页级锁定主要是BerkeleyDB 存储引擎的锁定方式。MySQL 的如此的锁定机制主要是由于其最初的历史所决定的。在最初,MySQL 希望设计一种完全独立于各种存储引擎的锁定机制,而且在早期的MySQL 数

数据库中的锁

数据库锁的基本概念 为了确保并发用户在存取同一数据库对象时的正确性(即无丢失修改、可重复读、不读“脏”数据),数据库中引入了锁机制。基本的锁类型有两种:排它锁(Exclusive locks记为X锁)和共享锁(Share locks记为S锁)。 排它锁:若事务T对数据D加X锁,则其它任何事务都不能再对D加任何类型的锁,直至T释放D上的X锁;一般要求在修改数据前要向该数据加排它锁,所以排它锁又称为写锁。共享锁:若事务T对数据D加S锁,则其它事务只能对D加S锁,而不能加X锁,直至T 释放D上的S锁;一般要求在读取数据前要向该数据加共享锁,所以共享锁又称为读锁。 2 Oracle 多粒度封锁机制介绍 根据保护对象的不同,Oracle数据库锁可以分为以下几大类: (1) DML lock(data locks,数据锁):用于保护数据的完整性; (2) DDL lock(dictionary locks,字典锁):用于保护数据库对象的结构(例如表、视图、索引的结构定义); (3) internal locks 和l a t c h es(内部锁与闩):保护内部数据库结构; (4) distributed locks(分布式锁):用于OPS(并行服务器)中; (5) PCM locks(并行高速缓存管理锁):用于OPS(并行服务器)中。 本文主要讨论DML(也可称为data locks,数据锁)锁。从封锁粒度(封锁对象的大小)的角度看,Oracle DML锁共有两个层次,即行级锁和表级锁。 2.1 Oracle的TX锁(行级锁、事务锁) 许多对Oracle不太了解的技术人员可能会以为每一个TX锁代表一条被封锁的数据行,其实不然。TX的本义是Transaction(事务),当一个事务第一次执行数据更改(Insert、Update、Delete)或使用SELECT… FOR UPDATE语句进行查询时,它即获得一个TX(事务)锁,直至该事务结束(执行COMMIT或ROLLBACK操作)时,该锁才被释放。所以,一个TX锁,可以对应多个被该事务锁定的数据行。 在Oracle的每行数据上,都有一个标志位来表示该行数据是否被锁定。Oracle不象其它一些DBMS(数据库管理系统)那样,建立一个链表来维护每一行被加锁的数据,这样就大大减小了行级锁的维护开销,也在很大程度上避免了其它数据库系统使用行级封锁时经常发生的锁数量不够的情况。数据行上的锁标志一旦被置位,就表明该行数据被加X锁,Oracle在数据行上没有S锁。 2.2 TM锁(表级锁) 2.2.1 意向锁的引出 表是由行组成的,当我们向某个表加锁时,一方面需要检查该锁的申请是否与原有的表级锁相容;另一方面,还要检查该锁是否与表中的每一行上的锁相容。比如一个事务要在一个表上加S锁,如果表中的一行已被另外的事务加了X锁,那么该锁的申请也应被阻塞。如果表中的数据很多,逐行检查锁标志的开销将很大,系统的性能将会受到影响。为了解决这个问题,可以在表级引入新的锁类型来表示其所属行的加锁情况,这就引出了“意向锁”的概念。意向锁的含义是如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁;对任一结点加锁时,必须先对它的上层结点加意向锁。如:对表中的任一行加锁时,必须先对它所在的表加意向锁,然后再对该行加锁。这样一来,事务对表加锁时,就不再需要检查表中每行记录的锁标志位了,系统效率得以大大提高。 2.2.2 意向锁的类型 由两种基本的锁类型(S锁、X锁),可以自然地派生出两种意向锁: 意向共享锁(Intent Share Lock,简称IS锁):如果要对一个数据库对象加S锁,首先要对其上级结点加IS锁,表示它的后裔结点拟(意向)加S锁;

Mysql管理员岗位职责范本

岗位说明书系列 Mysql管理员岗位职责(标准、完整、实用、可修改)

编号:FS-QG-31911 Mysql管理员岗位职责 Mysql administrator job duties 说明:为规划化、统一化进行岗位管理,使岗位管理人员有章可循,提高工作效率与明确责任制,特此编写。 mysql数据库管理员职位描述: 岗位职责: 1.负责MySQL数据库的日常管理、监控与维护、发版、变更等其他日常的例行维护管理工作; 2.负责制定数据库监控策略,备份策略,容灾策略; 3.负责分析跟踪系统潜在的问题和可能的性能瓶颈并进行优化; 4.负责对开发人员提交的SQL进行审核及PerformanceTuning; 5.负责制定数据库技术方案、数据迁移方案; 6.负责数据库的容量规划、架构设计,提高业务高可用性和容灾能力; 7.对MySQL数据库故障进行7*24小时应急响应和技术

支持; 8.负责高级MySQL数据库特性测试,优化与实践; 任职要求: 1.熟悉MySQL数据库原理知识,事务、锁、缓存机制等; 2.具备MySQL架构规划、高可用、主从复制、读写分离、负载均衡实施等能力; 3.有MHA、OneProxy等高可用及分库分表负载架构的使用与维护的经验; 4.有Python、Shell、Perl等脚本编程的能力; 6.熟悉Linux、Unix等主流操作系统; 7.本科及以上学历,3年以上专职MySQLDBA经验,; 8.有LVS、Keepalived、ApacheTomcat等使用经验者优先考虑; 9.有金融行业系统运维经验者优先考虑。职位描述: 岗位职责: 1.负责MySQL数据库的日常管理、监控与维护、发版、变更等其他日常的例行维护管理工作; 2.负责制定数据库监控策略,备份策略,容灾策略;

mysql锁表机制

mysql查询更新时的锁表机制分析 创建时间:2010-05-25 文章类别:服务器端 文章大小:4431 Bytes 转载: MySQL 5.1支持对MyISAM和MEMORY表进行表级锁定,对BDB表进行页级锁定,对InnoDB表进行行级锁定。 在许多情况下,可以根据培训猜测应用程序使用哪类锁定类型最好,但一般很难说出某个给出的锁类型就比另一个好。一切取决于应用程序,应用程序的不同部分可能需要不同的锁类型。 为了确定是否想要使用行级锁定的存储引擎,应看看应用程序做什么并且混合使用什么样的选择和更新语句。例如,大多数Web应用程序执行许多选择,而很少进行删除,只对关键字的值进行更新,并且只插入少量具体的表。基本MySQL MyISAM设置已经调节得很好。 在MySQL中对于使用表级锁定的存储引擎,表锁定时不会死锁的。这通过总是在一个查询开始时立即请求所有必要的锁定并且总是以同样的顺序锁定表来管理。 对WRITE,MySQL使用的表锁定方法原理如下: 如果在表上没有锁,在它上面放一个写锁。 否则,把锁定请求放在写锁定队列中。 对READ,MySQL使用的锁定方法原理如下: 如果在表上没有写锁定,把一个读锁定放在它上面。 否则,把锁请求放在读锁定队列中。 当一个锁定被释放时,锁定可被写锁定队列中的线程得到,然后是读锁定队列中的线程。 这意味着,如果你在一个表上有许多更新,SELECT语句将等待直到没有更多的更新。 可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定争夺: mysql> SHOW STATUS LIKE 'Table%'; +-----------------------+---------+ | Variable_name | Value |

Mysql 配置参数详解以及优化配置

mysql有以下几种日志: 错误日志:log-err 查询日志:log 慢查询日志: log-slow-queries 更新日志: log-update 二进制日志:log-bin 要把日志生成在/var/log 目录下(是系统日志存放的地方,只有root 账号有写权限),需要MySQL 进程对这个目录有读写权限,一般是不这么做的,也考虑到安全问题,包括MySQL 本身的数据安全,因为对MySQL 的所有操作,都会记录到常规查询日志。MySQL 的日志就不要用/var/log/ 目录下。 ---------------------------------------------------------------------2 https://www.sodocs.net/doc/039937713.html,f default-character-set = utf8 port = 3306 socket = /tmp/mysql.sock no-auto-rehash #default-character-set = utf8 user = mysql port = 3306 socket = /tmp/mysql.sock basedir = /usr/local/webserver/mysql datadir = /data0/mysql/3306/data open_files_limit = 10240 back_log = 600 max_connections = 3000 实际MySQL服务器允许的最大连接数16384; max_connect_errors = 6000 可以允许多少个错误连接 table_cache = 1024 高速缓存的大小.table_cache的值在2G内存以下的机器中的值默认时256到512,如果机器有4G内存,则默认这个值是2048,但这决意味着机器内存越大,这个值应该越大,因为table_cache加大后,使得mysql对SQL 响应的速度更快了,不可避免的会产生更多的死锁(dead lock),这样反而使得数据库整个一套操作慢了下来,严重影响性能。 external-locking = FALSE max_allowed_packet = 32M sort_buffer_size = 2M 是一个connection级参数,在每个connection第一次需要使用这个buffer的时候,一次性分配设置的内存.并不是越大越好,由于是connection级的参数,过大的设置+高并发可能会耗尽系统内存资源。 join_buffer_size = 2M thread_cache_size = 64 重新利用保存在缓存中线程的数量,当断开连接时如果缓存中还有空间,那么客户端的线程将被放到缓存中,如果线程重新被请求,那么请

深入浅出INNODB MVCC机制与原理

摘要: 1、基础知识 2、MVCC实现原理以及视图化理解(包含些测试以便理解) 3、深MVCC实现机制 一、基础知识 事务: 事务是一组原子性sql查询语句,被当作一个工作单元。若mysql对改事务单元内的所有sql语句都正常的执行完,则事务操作视为成功,所有的sql语句才对数据生效,若sql中任意不能执行或出错则事务操作失败,所有对数据的操作则无效(通过回滚恢复数据)。事务有四个属性: 1、原子性:事务被认为不可分的一个工作单元,要么全部正常执行,要么全部不执行。 2、一致性:事务操作对数据库总是从一种一致性的状态转换成另外一种一致性状态。 3、隔离性:一个事务的操作结果在内部一致,可见,而对除自己以外的事务是不可见的。 4、永久性:事务在未提交前数据一般情况下可以回滚恢复数据,一旦提交(commit)数据的改变则变成永久(当然用update肯定还能修改)。 ps:MYSAM 引擎的数据库不支持事务,所以事务最好不要对混合引擎(如INNODB 、MYISAM)操作,若能正常运行且是你想要的最好,否则事务中对非支持事务表的操作 是不能回滚恢复的。 读锁: 也叫共享锁、S锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S 锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。 写锁: 又称排他锁、X锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,

其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A 上的锁之前不能再读取和修改A。 表锁:操作对象是数据表。Mysql大多数锁策略都支持(常见mysql innodb),是系统开销最低但并发性最低的一个锁策略。事务t对整个表加读锁,则其他事务可读不可写,若加写锁,则其他事务增删改都不行。 行级锁:操作对象是数据表中的一行。是MVCC技术用的比较多的,但在MYISAM用不了,行级锁用mysql的储存引擎实现而不是mysql服务器。但行级锁对系统开销较大,处理高并发较好。 MVCC:多版本并发控制(MVCC,Multiversion Currency Control)。一般情况下,事务性储存引擎不是只使用表锁,行加锁的处理数据,而是结合了MVCC机制,以处理更多的并发问题。Mvcc处理高并发能力最强,但系统开销比最大(较表锁、行级锁),这是最求高并发付出的代价。 Autocommit:是mysql一个系统变量,默认情况下autocommit=1表示mysql把没一条sql语句自动的提交,而不用commit语句。所以,当要开启事务操作时,要把autocommit设为0,可以通过“set session autocommit=0; ”来设置 二、MVCC实现原理以及例化理解(包含些测试以便理解) 第一:先看看网络上几乎全部一样的理解,包括《高性能mysql第二版(中文版)》也如此说明,这样是很容易理解。但笔者觉得2个地方不妥,先看内容,在后面笔者会给出不妥地方用(1、2…)加粗标志出来,且给出测试证明。 Ps:这些只是外部看来的理解层面,深层次在第三点讲解 ------------------------------------------ InnoDB实现MVCC的方法是,它存储了每一行的两个(1)额外的隐藏字段,这两个隐 藏字段分别记录了行的创建的时间和删除的时间。在每个事件发生的时候,每行存储版本号,而不是存储事件实际发生的时间。每次事物的开始这个版本号都会增加。自记录

相关主题