|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
关于这个理由我把它放在最后一位。在很多业界专家中有一个相当一致的观点:MySQL不能很好的扩展。关于这点可能有很大的分歧,争论的焦点主要集中于水平可扩展性和垂直可扩展性上。MySQL则更倾向于垂直可扩展性。假如你同时运转表的反省/修复程序时,你也许不想让MySQL服务器和有用程序同时会见一个表。假如两个程序都向表中写数据明显会形成很年夜的贫苦,乃至会成心外情形产生。假如表正由一个程序写进,同时举行读取的另外一个程序也会发生凌乱的了局。本文次要报告怎样对MySQL数据库表举行锁定。
锁定表的办法
避免客户机的哀求相互搅扰大概服务器与保护程序互相搅扰的办法次要有多种。假如你封闭数据库,就能够包管服务器和myisamchk和isamchk之间没有交互感化。可是中断服务器的运转并非一个好注重,由于如许做会使得没有妨碍的数据库和表也不成用。本节次要会商的历程,是制止服务器和myisamchk或isamchk之间的交互感化。完成这类功效的办法是对表举行锁定。
服务器由两种表的锁定办法:
1.外部锁定
外部锁定能够制止客户机的哀求互相搅扰――比方,制止客户机的SELECT查询被另外一个客户机的UPDATE查询所搅扰。也能够使用外部锁定机制避免服务器在使用myisamchk或isamchk反省或修复表时对表的会见。
语法:
锁定表:LOCKTABLEStbl_name{READ|WRITE},[tbl_name{READ|WRITE},…]
解锁表:UNLOCKTABLES
LOCKTABLES为以后线程锁定表。UNLOCKTABLES开释被以后线程持有的任何锁。当线程收回别的一个LOCKTABLES时,或当服务器的毗连被封闭时,以后线程锁定的一切表主动被解锁。
假如一个线程取得在一个表上的一个READ锁,该线程(和一切其他线程)只能从表中读。假如一个线程取得一个表上的一个WRITE锁,那末只要持锁的线程READ或WRITE表,其他线程被制止。
每一个线程守候(没有超时)直到它取得它哀求的一切锁。
WRITE锁一般比READ锁有更高的优先级,以确保变动尽快被处置。这意味着,假如一个线程取得READ锁,而且然后别的一个线程哀求一个WRITE锁,随后的READ锁哀求将守候直到WRITE线程失掉了锁而且开释了它。
明显关于反省,你只必要取得读锁。再者钟情跨下,只能读取表,但不克不及修正它,因而他也同意别的客户机读取表。关于修复,你必需取得些以是避免任何客户机在你对表举行操纵时修正它。
2.内部锁定
服务器还可使用内部锁定(文件级锁)来避免别的程序在服务器利用表时修正文件。一般,在表的反省操纵中服务器将内部锁定与myisamchk或isamchk作合利用。可是,内部锁定在某些体系中是禁用的,由于他不克不及牢靠的举行事情。对运转myisamchk或isamchk所选择的历程取决于服务器是不是能利用内部锁定。假如不利用,则?利用外部锁定协定。
假如服务器用--skip-locking选项运转,则内部锁定禁用。该选项在某些体系中是缺省的,如linux。能够经由过程运转mysqladminvariables命令断定服务器是不是可以利用内部锁定。反省skip_locking变量的值并按以下办法举行:
◆假如skip_locking为off,则内部锁定无效您能够持续并运转人和一个有用程序来反省表。服务器和有用程序将互助对表举行会见。可是,运转任何一个有用程序之前,应当利用mysqladminflush-tables。为了修复表,应当利用表的修复锁定协定。
◆假如skip_locaking为on,则禁用内部锁定,以是在myisamchk或isamchk反省修复暗示服务器其实不晓得,最好封闭服务器。假如保持是服务器坚持开启形态,月确保在您利用此暗示没有客户机来会见它。必需利用卡党的锁定协定告知服务器是该表不被其他客户机会见。
反省表的锁定协定
本节只先容假如利用表的外部锁定。关于反省表的锁定协定,此历程只针对表的反省,不针对表的修复。
1.挪用mysql公布以下语句:
$mysqlCurootCpdb_namemysql>LOCKTABLEtbl_nameREAD;mysql>FLUSHTABLES;
该锁避免别的客户机在反省时写进该表和修正该表。FLUSH语句招致服务器封闭表的文件,它将革新仍在告知缓存中的任作甚写进的改动。
2.实行反省历程
$myisamchktbl_name$isamchktbl_name
3.开释表锁
mysql>UNLOCKTABLES;
假如myisamchk或isamchk指动身现该表的成绩,将必要实行表的修复。
修复表的锁定协定
这里只先容假如利用表的外部锁定。修复表的锁定历程相似于反省表的锁定历程,但有两个区分。第一,你必需失掉写锁而非读锁。因为你必要修正表,因而基本不同意客户机对其举行会见。第二,必需在实行修复以后公布FLUSHTABLE语句,由于myisamchk和isamchk创建的新的索引文件,除非再次革新改表的高速缓存,不然服务器不会注重到这个改动。本例一样合适优化表的历程。
1.挪用mysql公布以下语句:
$mysqlCurootCpdb_namemysql>LOCKTABLEtbl_nameWRITE;mysql>FLUSHTABLES;
2.做数据表的拷贝,然后运转myisamchk和isamchk:
$cptbl_name.*/some/other/dir$myisamchk--recovertbl_name$isamchk--recovertbl_name
--recover选项只是针对安装而设置的。这些特别选项的选择将取决与你实行修复的范例。
3.再次革新高速缓存,并开释表锁:
mysql>FLUSHTABLES;mysql>UNLOCKTABLES;
不可否认,MySQL也是一个很好的关系型数据库,或许在技术上它与其他领先的关系数据库相差并不大,或不具有劣势。但是,对于一些企业环境来说,MySQL显然不具有优势。 |
|