MySQL各种理论力学问题求解器解

比特客户端
您的位置:
详解大数据
详解大数据
详解大数据
详解大数据
MySQL死锁问题实例分析及解决方法
  死锁问题的相关知识是本文我们主要要介绍的内容,接下来我们就来一一介绍这部分内容,希望能够对您有所帮助。
  1、MySQL常用引擎的锁机制
  MyISAM和MEMORY采用表级锁(table-level locking)
  BDB采用页面锁(page-level locking)或表级锁,默认为页面锁
  InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁
  2、各种锁特点
  表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低
  行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高
  页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
  3、各种锁的适用场景
  表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用
  行级锁则更适合于有大量按索引条件并发更新数据,同时又有并发查询的应用,如一些在线事务处理系统
  4、死锁
  是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
  表级锁不会产生死锁.所以解决死锁主要还是针对于最常用的InnoDB.
  5、死锁举例分析
  在MySQL中,行级锁并不是直接锁记录,而是锁索引。索引分为主键索引和非主键索引两种,如果sql语句操作了主键索引,MySQL就会锁定这条主键索引;如果一条语句操作了非主键索引,MySQL会先锁定该非主键索引,再锁定相关的主键索引。
  在UPDATE、DELETE操作时,MySQL不仅锁定WHERE条件扫描过的所有索引记录,而且会锁定相邻的键值,即所谓的next-key locking。
  例如,一个表db.tab_test,结构如下:
  id:主键;
  state:状态;
  time:时间;
  索引:idx_1 (state, time)
  出现死锁日志如下:
  ***(1) TRANSACTION: TRANSACTION 0 , ACTIVE 0 sec, process no 11393, thread id 278546 starting index read mysql tables in use 1, locked 1 LOCK WAIT 3 lock struct(s), heap size 320 MySQL thread id 83, query id
dcnet03 dcnet Searching rows for update update tab_test set state=1064,time=now() where state=1061 and time & date_sub(now(), INTERVAL 30 minute) (任务1的sql语句) ***(1) WAITING FOR THIS LOCK TO BE GRANTED: (任务1等待的索引记录) RECORD LOCKS space id 0 page no 849384 n bits 208 index `PRIMARY` of table `db/tab_test` trx id 0
_mode X locks rec but not gap waiting Record lock, heap no 92 PHYSICAL RECORD: n_fields 11; info bits 0 0: len 8; hex 629c;; 1: len 6; hex
asc (; 2: len 7; hex 10; asc @ ;; 3: len 8; hex 50b2; asc P ;; 4: len 8; hex 502a; asc P*;; 5: len 8; hex 5426; asc T&;; 6: len 8; hex d29c; asc A,; 7: len 23; hex e636f6d2f6 870; /;; 8: len 8; hex 042b; asc +;; 9: len 4; hex 474bfa2b; asc GK +;; 10: len 8; hex 4e24; asc N$;; *** (2) TRANSACTION: TRANSACTION 0 , ACTIVE 0 sec, process no 11397, OS thread id 344086 updating or deleting, thread declared inside InnoDB 499 mysql tables in use 1, locked 1 3 lock struct(s), heap size 320, undo log entries 1 MySQL thread id 84, query id
dcnet03 dcnet Updating update tab_test set state=1067,time=now () where id in (9921180) (任务2的sql语句) *** (2) HOLDS THE LOCK(S): (任务2已获得的锁) RECORD LOCKS space id 0 page no 849384 n bits 208 index `PRIMARY` of table `db/tab_test` trx id 0
lock_mode X locks rec but not gap Record lock, heap no 92 PHYSICAL RECORD: n_fields 11; info bits 0 0: len 8; hex 629c;; 1: len 6; hex
asc (; 2: len 7; hex 10; asc @ ;; 3: len 8; hex 50b2; asc P ;; 4: len 8; hex 502a; asc P*;; 5: len 8; hex 5426; asc T&;; 6: len 8; hex d29c; asc A,; 7: len 23; hex e636f6d2f6 870; /hand.; 8: len 8; hex 042b; asc +;; 9: len 4; hex 474bfa2b; asc GK +;; 10: len 8; hex 4e24; asc N$;; *** (2) WAITING FOR THIS LOCK TO BE GRANTED: (任务2等待的锁) RECORD LOCKS space id 0 page no 843102 n bits 600 index `idx_1` of table `db/tab_test` trx id 0
lock_mode X locks rec but not gap waiting Record lock, heap no 395 PHYSICAL RECORD: n_fields 3; info bits 0 0: len 8; hex 0425; asc %;; 1: len 8; hex d29c; asc A,; 2: len 8; hex 629c;; *** WE ROLL BACK TRANSACTION (1) (回滚了任务1,以解除死锁)
  原因分析:
  当“update tab_test set state=1064,time=now() where state=1061 and time & date_sub(now(), INTERVAL 30 minute)”执行时,MySQL会使用idx_1索引,因此首先锁定相关的索引记录,因为idx_1是非主键索引,为执行该语句,MySQL还会锁定主键索引。
  假设“update tab_test set state=1067,time=now () where id in (9921180)”几乎同时执行时,本语句首先锁定主键索引,由于需要更新state的值,所以还需要锁定idx_1的某些索引记录。
  这样第一条语句锁定了idx_1的记录,等待主键索引,而第二条语句则锁定了主键索引记录,而等待idx_1的记录,这样死锁就产生了。
  6、解决办法
  拆分第一条sql,先查出符合条件的主键值,再按照主键更新记录:
  select id from tab_test where state=1061 and time & date_sub(now(), INTERVAL 30 minute); update tab_test state=1064,time=now() where id in(......);
  关于MySQL死锁问题的实例分析及解决方法就介绍到这里了,希望本次的介绍能够对您有所收获!
[ 责任编辑:之极 ]
本届云博会的主要内容包括展览展…
甲骨文的云战略已经完成第一阶段…
软件信息化周刊
比特软件信息化周刊提供以数据库、操作系统和管理软件为重点的全面软件信息化产业热点、应用方案推荐、实用技巧分享等。以最新的软件资讯,最新的软件技巧,最新的软件与服务业内动态来为IT用户找到软捷径。
商务办公周刊
比特商务周刊是一个及行业资讯、深度分析、企业导购等为一体的综合性周刊。其中,与中国计量科学研究院合力打造的比特实验室可以为商业用户提供最权威的采购指南。是企业用户不可缺少的智选周刊!
比特网络周刊向企业网管员以及网络技术和产品使用者提供关于网络产业动态、技术热点、组网、建网、网络管理、网络运维等最新技术和实用技巧,帮助网管答疑解惑,成为网管好帮手。
服务器周刊
比特服务器周刊作为比特网的重点频道之一,主要关注x86服务器,RISC架构服务器以及高性能计算机行业的产品及发展动态。通过最独到的编辑观点和业界动态分析,让您第一时间了解服务器行业的趋势。
比特存储周刊长期以来,为读者提供企业存储领域高质量的原创内容,及时、全面的资讯、技术、方案以及案例文章,力求成为业界领先的存储媒体。比特存储周刊始终致力于用户的企业信息化建设、存储业务、数据保护与容灾构建以及数据管理部署等方面服务。
比特安全周刊通过专业的信息安全内容建设,为企业级用户打造最具商业价值的信息沟通平台,并为安全厂商提供多层面、多维度的媒体宣传手段。与其他同类网站信息安全内容相比,比特安全周刊运作模式更加独立,对信息安全界的动态新闻更新更快。
新闻中心热点推荐
新闻中心以独特视角精选一周内最具影响力的行业重大事件或圈内精彩故事,为企业级用户打造重点突出,可读性强,商业价值高的信息共享平台;同时为互联网、IT业界及通信厂商提供一条精准快捷,渗透力强,覆盖面广的媒体传播途径。
云计算周刊
比特云计算周刊关注云计算产业热点技术应用与趋势发展,全方位报道云计算领域最新动态。为用户与企业架设起沟通交流平台。包括IaaS、PaaS、SaaS各种不同的服务类型以及相关的安全与管理内容介绍。
CIO俱乐部周刊
比特CIO俱乐部周刊以大量高端CIO沙龙或专题研讨会以及对明星CIO的深入采访为依托,汇聚中国500强CIO的集体智慧。旨为中国杰出的CIO提供一个良好的互融互通 、促进交流的平台,并持续提供丰富的资讯和服务,探讨信息化建设,推动中国信息化发展引领CIO未来职业发展。
IT专家新闻邮件长期以来,以定向、分众、整合的商业模式,为企业IT专业人士以及IT系统采购决策者提供高质量的原创内容,包括IT新闻、评论、专家答疑、技巧和白皮书。此外,IT专家网还为读者提供包括咨询、社区、论坛、线下会议、读者沙龙等多种服务。
X周刊是一份IT人的技术娱乐周刊,给用户实时传递I最新T资讯、IT段子、技术技巧、畅销书籍,同时用户还能参与我们推荐的互动游戏,给广大的IT技术人士忙碌工作之余带来轻松休闲一刻。
微信扫一扫
关注Chinabyte页面导航:
→ 正文内容 mysql常见的错误提示问题处理小结
mysql常见的错误提示问题处理小结
本文总结了在使用mysql过程中经常遇到的3种错误提示(error1067,error1061,error1045)的问题的处理方法,都是本人在实际应用中处理检验过的,希望对大家有所帮助
1.mysql服务无法启动,报1067错误
解决方案:
1).把mysql服务端解压目录新加一个my.ini文件,内容如下
# set basedir to installation path, e.g., c:/mysql
# 设置为MYSQL的安装目录
basedir=c:/tool/mysql5617win32
# set datadir to location of data directory,
# e.g., c:/mysql/data or d:/mydata/data
# 设置为MYSQL的数据目录
datadir=c:/tool/mysql5617win32/data
character_set_server = utf8
character_set_client = utf8
[WinMySQLadmin]
Server=c:/tool/mysql5617win32/bin/mysqld.exe
#这里感觉没有用
password=123456
#这里感觉没有用
#以上是设置WinMySQLadmin的配置
user=root #这里感觉没有用
password=123456 #这里感觉没有用
2).dos下面输入:sc delete mysql
3).重启电脑
4).mysqld install MySQL --defaults-file="你的解压根目录\my.ini",提示:Service successfully installed.
5).net start mysql
6).提示启动成功
2.修改root密码提示10061
1).10061一般是mysql服务没有启动造成的,去服务里面看下是否已启动
2).如果启动了还是报这个错误那就去关闭防火墙(远程服务器才需要)
3).这时应该不会出现10061了
3.修改root密码提示10045
1).cmd进入mysql解压目录的bin下,类似:cd c:/tool/mysql5617win32/bin
2).输入:mysql -u root -p
3).出现了enter password: 不用管直接回车(因为刚开始是没有密码的)
4).&& 大概会出现:changed table success;
5).update user set password=PASSWORD("123465") where user='root';& 大概会出现changed 3;updated 3
7)然后打开客户端输入你上面的123456就可以连接成功了
您可能感兴趣的文章:
上一篇:下一篇:
最 近 更 新
热 点 排 行
12345678910MySQL中文参考手册- 19 用MySQL解决一些常见问题
MySQL中文参考手册
翻译:(yanzi)
&&&&& 主页:
一方面复制可以用来增加健壮性和速度。对健壮性,你有2个系统,而如果你出了问题,切换到备份即可。额外的速度通过把非更新查询的一部分送到复制服务器来达到。当然,这只在非更新查询为主时有用,但是这正是一般的情形。
一方面复制计划在不久的未来实现。这将被实现,使得从服务器将以较低优先级的更新和延迟插入被同步到最新数据(这将给读者以比写者更高的优先级)。
MySQL(至今)没有数据库复制,但是有一些如何实现的信息。
复制一个数据库最一般的方法是使用更新日志。见。这要求充当一个主数据库(进行数据改变的)并且另一个或多个充当从数据库。要更新一个从数据库,只要运行mysql
& update_log。提供对于从数据库适当的主机、用户和口令选项,并且将主数据库的更新日志作为输入。
如果你从未从一张表中删除任何东西,你可以使用一个TIMESTAMP列找出自上一次复制以来(通过比较作你上次做复制的时间)表中哪个行被插入和被改变,且仅拷贝这些行到镜像中。
有可能使用更新日志(对删除)和时间戳记(在两端)做成一个双向更新系统统,但是在这种情况下,当同一数据在两端被改变时,你必须能处理冲突。你可能想保持旧版本以帮助决定什么被更新了。
因为在这种情况中复制用SQL语句进行,你不应该在更新数据库的语句中使用下列函数;他们不能返回与原数据库相同的值:
DATABASE()
GET_LOCK()和RELEASE_LOCK()
USER(), SYSTEM_USER()或SESSION_USER()
所有的时间函数可安全地使用,比如如果需要,时间戳记被送到镜像。LAST_INSERT_ID()也可安全地使用。
因为MySQL表作为文件存储,做一个备份是容易的。为了得到一个一致的备份,在相关的表上做一个LOCK
TABLES。见。你只需一个读锁定;当你在数据库目录中做文件的一个拷贝时,这允许其他线程继续查询该表。如果你想要做一个SQL级的备份,你可以SELECT
INTO OUTFILE。
备份一个数据库的另一个方法是使用mysqldump程序:
为你的数据库做一个完整的备份:shell& mysqldump --tab=/path/to/some/dir --opt --full
你也可以简单地拷贝所有的表文件(“*.frm”、“*.MYD”和“*.MYI”文件),只要服务器不在更新任何东西。
停止mysqld如果它正在运行,然后以--log-update选项启动它。你将得到一个名为“hostname.n”形式的日志文件,
这里n是随着你每次执行mysqladmin refresh或mysqladmin
flush-logs、FLUSH LOGS语句、或重启服务器而递增的一个数字。这些日志文件向你提供了在你执行mysqldump处后面进行的复制数据库改变的所需信息。
如果你必须恢复一些东西,尝试首先用myisamchk -r恢复你的表。这应该处理所有情况的99.9%。如果myisamchk失败,尝试下列过程:
恢复原来的mysqldump备份。
执行下列命令以再次运行更新日志中的更改: shell& ls -1 -t -r hostname.[0-9]* | xargs cat | mysql
ls被用来以正确的顺序得到所有的日志文件。
你也可以与SELECT * INTO OUTFILE 'file_name' FROM tbl_name做有选择的备份并且用LOAD
DATA INFILE 'file_name' REPLACE ...恢复。为了避免重复记录,在表中你需要一个PRIMARY
KEY或UNIQUE键。当在唯一键值上一个新记录与一个老记录重复时,REPLACE关键词使得老记录用一个新记录替代。
有些情况下你可能想要在同一台机器上运行多个服务器。例如,你可能想要测试一个新的MySQL版本而让你现有生产系统的设置不受到干扰,或你可能是想要为不同的客户提供独立的MySQL安装一个因特网服务供应商。
如果你想要运行多个服务器,最容易的方法是用不同的TCP/IP端口和套接字文件重新编译服务器,因此他们不是侦听同一个TCP/IP端口或套接字。
假设一个现存服务器配置为缺省端口号和套接字文件,那么用一个这样的configure命令行设置新的服务器:
shell& ./configure
--with-tcp-port=port_number \
--with-unix-socket=file_name \
--prefix=/usr/local/mysql-3.22.9
这里port_number和file_name应该不同于缺省端口号和套接字文件路径名,而且--prefix值应该指定一个不同于现存的MySQL安装所在的安装目录。
你可以用这个命令检查由任何当前执行的MySQL所使用的套接字和端口:
shell& mysqladmin -h hostname --port=port_number variables
如果你有一个MySQL服务器正运行在你使用了的端口上,你将得到MySQL的一些最重要的可配置变量的一张表,包括套接字名等。
你也应该编辑你机器的初始化脚本(可能是“mysql.server”)来启动并杀死多个mysqld服务器。
你不必重新编译一个新MySQL服务器,只要以一个不同的端口和套接字启动即可。你可以通过指定在运行时safe_mysqld使用的选项来改变端口和套接字:
shell& /path/to/safe_mysqld --socket=file_name --port=port_number
如果你在与开启日志的另一个服务器相同的一个数据库目录下运行新服务器,你也应该用safe_mysqld的--log和--log-update选项来指定日志文件的名字,否则,两个服务器可能正在试图写入同一个日志文件。
警告:通常你决不应该有在同一个数据库中更新数据的2个服务器!如果你的OS不支持无故障(fault-free)的系统锁定,这可能导致令人惊讶的事情发生!
如果你想要为第二个服务器使用另一个数据库目录,你可以使用safe_mysqld的--datadir=path选项。
当你想要连接一个正在运行的使用一个不同于编译进你的客户程序中端口的MySQL服务器时,你可以使用下列方法之一:
以--host 'hostname' --port=port_numer或[--host localhost]
--socket=file_name启动客户。
在你的C或Perl程序中,当连接MySQL服务器时,你可以给出端口和套接字参数。
在你启动客户程序之前,设置MYSQL_UNIX_PORT和MYSQL_TCP_PORT环境变量,指向Unix套接字和TCP/IP的端口。如果你通常使用一个特定的套接字或端口,你应该将设置这些环境变量的命令放进你的“.login”文件中。见。
在你的主目录下的“.my.cnf”文件中指定缺省套接字和TCP/IP端口。见。}

我要回帖

更多关于 理论力学问题求解器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信