深入浅出MySQL数据库开发、优化与管理维护(第2版)
人民邮电出版社
北京
MySQL是由David Axmark、Allan Larsson和Michael Widenius 3个瑞典人于 20世纪 90年代开发的一个关系型数据库。最初,他们的目的是用自己的 ISAM(Indexed Sequential Access Method,索引顺序存取方法)和mSQL(Mini SQL,一种轻量级SQL数据库引擎技术)来连接访问表格,但后来发现mSQL的速度和灵活性不能满足需求,于是他们开发了几乎与mSQL API接口相同的数据库引擎,并用创始人之一Michael Widenius女儿My的名字命名,这就是MySQL的来由。
说到MySQL就不得不提到开源软件。在MySQL设计之初,就考虑了以后引入第三方代码的方便性,并于 2000年开始采用GPL(GNU General Public License)许可协议,使自己成了开源软件的一分子。开源战略对MySQL的发展和广泛应用,可以说起到了至关重要的作用。从MySQL的历史就可以看出,它最早起源于开源软件mSQL,并从中借鉴了许多东西。不仅开发MySQL用到了许多开源工具,而且MySQL的许多重要组件都直接来自其他第三方的贡献,如BDB存储引擎来自Berkeley DB,其具有里程碑意义的 Innodb数据库存储引擎也是来自芬兰 Innobase OY公司的贡献。
进入21世纪,MySQL的发展步入了快车道。MySQL自2001年开始引入InnoDB存储引擎,并于2002年正式宣布MySQL全面支持事务,满足事务ACID属性(Atomicity,原子性;Consistent,一致性;Isolation,隔离性;Durable,持久性),并支持外键约束,使MySQL具备了支持关键应用的最基本特性。2003年,MySQL 4.0发布,开始支持集合操作UNION。2004年,MySQL 4.1发布,增加了对子查询的支持。2005年,MySQL 5.0发布,增加了对视图(View)、数据库存储过程(Stored Procedure)、触发器(Trigger)、服务器端游标(Cursor),以及分布式事务协议XA等高级特性的支持。再加上从3.23.15就开始支持的复制特性,至此,MySQL从功能上已经具备了支持企业级应用的主要特性。在实际应用方面,LAMP(Linux + Apache + MySQL + Perl/PHP/Python)也逐渐成了 IT业广泛使用的Web应用架构。
大家知道ANSI/ISO SQL是公认的关系数据库标准。从SQL标准的符合性来说,MySQL不仅无法跟成熟的商业数据库相比,在开源数据库中也远不是最好的,比如 PostgreSQL 就是业界公认的ANSI/ISO SQL标准符合性最好的开源数据库,MySQL直到 5.0版本才支持的一些特性,PostgreSQL早都实现了。既然如此,为什么MySQL却在开源数据库中独占鳌头呢?根本的原因就是性能!
有专门机构的调查研究显示,许多数据库提供的功能特性,只有40%被用户经常使用,而一些复杂的高级功能特性不仅会增加系统的复杂性,而且往往还会引起性能问题。PostgreSQL是加州大学伯克利分校以教学为目的开发的数据库系统,以追求功能实现的“完美”为首要目标,虽然在标准的遵从性上比MySQL领先,但性能一直是其短板,很难支持较大的应用。而MySQL 的开发者,在性能与标准的取舍上,一直坚持性能优先的原则,从不为追求标准的符合性而牺牲性能。SQL标准符合性差是MySQL的弱点,但通过上述策略保证了MySQL在性能方面的优势。这就是MySQL在互联网行业非常流行的另一个重要原因,因为Web应用往往需要支持大量的数据和并发请求,性能常常是首要因素。
随着MySQL功能不断完善,性能不断提高,可靠性不断增强,从2005年开始,我们陆续将一些重要数据库迁移到MySQL。虽然相对于Oracle来说,MySQL比较简单,管理维护相对容易(这也是MySQL的另外一个优势),但在迁移及其后的管理维护过程中,我们也经常遇到一些问题,例如,MySQL 提供了许多存储引擎,这些存储引擎各有特点,在实际应用中应该怎样来选择?MySQL 出现了性能问题,应该如何来诊断和优化?在数据安全方面,究竟需要注意些什么?MySQL的锁机制有什么特点,如何减少锁冲突,提高并发度?
遇到诸如此类的问题,自然会想到查阅 MySQL 文档、上网搜索、到论坛找类似问题的答案或寻求帮助等。通过上述途径当然可以解决许多问题,但却需要花费大量的精力和时间,效率很低。因为,我们发现MySQL的文档很“精练”,也很零碎,远没有Oracle的文档那么详细系统;网上一搜,结果可能数以万计,面对浩如烟海的网页,要找出真正有用的信息决非易事(搜索引擎还有许多改进的余地);至于论坛上的答案,又往往是五花八门,让人无所适从。我们作为专职 DBA 尚且如此,其他开发、维护人员可能就感到更困难了。而且,不同的 DBA 或开发人员遇到同一个问题,可能还要再次去寻求解决方案,造成不必要的重复劳动。
为改变这种状况,我们决定将 DBA 平时使用 MySQL 积累的经验,解决问题的方法和思路,以及我们对MySQL的认识等整理出来,编写了一本《MySQL实用手册》,供DBA组及公司其他同事参考。
在编写过程中,我们根据自己的经验列出了MySQL开发、管理过程中可能遇到的一些问题,收集了以前解决MySQL问题的方法,形成了实用手册的基本内容框架。在此基础上,我们又研究了MySQL官方手册,筛选比较重要、实用但MySQL手册讲得不够详细或内容过于零散的部分作为补充。为力求准确,我们还专门做了许多测试,比如有关MySQL锁的测试、事务完整性的测试等。基于实用为主的原则,《MySQL实用手册》的第一稿篇幅不多,包括“开发篇”、“优化篇”和“管理篇”3个部分。“开发篇”主要介绍了与MySQL数据库开发设计相关的一些问题,包括存储引擎选择原则,如何选择合适的数据类型,不同字符集的特点及设置,索引的设计原则,以及SQL注入的类型,程序设计实现中如何防范SQL注入类安全漏洞等。“优化篇”首先介绍了MySQL数据库优化调整的一般步骤和方法,随后分别就索引问题、SQL优化、数据库对象调整、锁问题、MySQL关键性能参数设置、I/O优化、应用程序优化等作了讨论,并介绍了两个简单实用的优化命令,特别对锁问题做了比较系统、详细的介绍和讨论。“管理篇”除备份恢复等基本内容外,还介绍了MySQL安全配置管理应注意的各个方面,以及管理维护中一些常用的命令和小技巧。
《MySQL实用手册》第一稿出来后,我们发给了一些公司的同事,大家反馈内容很实用,对MySQL的开发管理很有帮助。得到这个评价,我们心里已经很是欣慰了,当有同事建议我们将其出版时,更是超出了我们的预期,开始只是随口答应了一下,并没敢当真。后来,热心的同事替我们与出版社取得了联系,出版社看过内容介绍和提纲后,觉得内容不错,做一些补充和修改就可以出版。
得到这个回复,我们非常高兴。但高兴之余,心里也很忐忑。在我们的概念中,出书都是作家、专家,及各类名人的“专利”,我们这些无名之辈,有这个资格吗?此时,上级领导的支持、同事的不断鼓励,给了我们信心。虽然我们不是什么专家,写不出多么高深的东西,但作为工作在数据库开发管理第一线的工程师,遇到的实际问题可能更多、更具体,写出的东西也许更实用。MySQL 是一个开源数据库,开源的精神就是分享和交流,基于这一点,我们的顾虑就少了,也更加坦然了。在《MySQL实用手册》第一稿的基础上,根据同事和出版社的建议,对内容做了一些补充和修订,增加了“基础篇”,以利于初次接触MySQL的读者阅读;在“管理篇”中补充了有关复制、日志管理和MySQL集群的介绍,使本书的内容更加丰富,更加完善。在内容编排上,我们基本遵循由易到难、循序渐进的原则,最后就形成了《深入浅出MySQL:数据库开发、优化与管理维护》一书。
本书第1版出版后,得到了不少同学的支持和肯定,这给了我们极大的鼓舞。随着MySQL新版本的不断推出,书中的一些内容已经过时,于是出版社的编辑建议我们对此书进行修订和升级。在编辑的支持和鼓励下,根据MySQL 5.5的新特性和近两年的应用实践,我们对本书内容进行了大量的修订,不但调整了本书的结构,还重新撰写了部分内容,并增加了分区、高可用架构、数据库监控等新内容,使本书的品质得到了进一步的提升。
对这本书的编写和改编过程,也是我们对MySQL再学习、再认识的过程。MySQL有许多优势,当然也还存在许多不足,但现在的 MySQL 应该说是值得信赖的,伴随着开源软件的发展,相信MySQL的未来也是值得期待的。这也正是我们把MySQL介绍给大家的原因,希望能对您有所帮助。由于我们的水平所限,书中谬误和不足可能难免,敬请广大同行批评指正!
网易公司技术部DBA组
2013年11月于北京
序
互联网的快速发展离不开各种技术和软件的普及与应用。作为开源软件的代表,MySQL数据库随着其功能的日益完善和可靠性的不断提高,已经成为互联网平台上应用广泛的数据库软件。网易公司成立十几年来,推出了众多网民所喜爱的产品与服务,其中MySQL数据库在后台也扮演了重要的角色。在应用MySQL的过程中,我们的工程师曾遇到了形形色色的问题,从开发技巧到管理维护,从性能问题到安全问题。本着交流和分享的精神,他们将多年实践中积累的经验和心得整理出来,编写了《MySQL实用手册》,在网易公司内部进行了交流,受到很大欢迎。在此基础上,他们联系出版机构将实用手册完善后出版,希望和国内更多的MySQL用户分享与交流。
这本书从应用开发、管理优化、系统维护3个角度,由浅入深地介绍了MySQL数据库各方面的知识,还从应用的角度总结了网易工程师遇到的各种问题以及解决方法,对实际工作者具有一定的实践指导意义。值此新书即将出版之际,谨向此书的作者团队表示祝贺,也真诚地期待读者朋友们提出宝贵意见。我们希望“网聚人的力量”,共同为互联网的技术和应用的发展不懈努力。
网易公司总裁
写作背景
最近几年,随着 IT 技术的发展,开源数据库逐渐流行起来。和传统的商业数据库相比,开源数据库具有完全免费、源码公开、随意下载等特点,可以用于各种商业目的。这使得开源数据库被广泛应用在各个行业中,大大降低了企业的开发运营成本。因此,开源数据库对传统商业数据库的市场造成了极大的冲击,使得传统商业数据库提供商不得不提供相应数据库的免费版本(并非开源),但是这些免费版本一般都具有很多的功能限制,和开源数据库相比,还是有不小的差距。MySQL 正是这些开源数据库中的杰出代表。
在此背景下,为了帮助广大MySQL爱好者快速掌握和使用MySQL,我们编写了本书的第一版,全书章节按照一个 DBA 需要具备的从业素质进行布局,内容循序渐进,既可以引导初学者入门,又可以帮助具备一定基础的数据库从业人员进阶。第 1版出版后我们收到了很多读者的反馈,既有肯定也有很多中肯的建议,这里一并进行感谢。
随着近几年MySQL进一步的发展,《深入浅出MySQL:数据库开发、优化与管理维护》第1版中的很多内容都已经过时,于是出版社的编辑建议我们对此书进行升级改版,加入一些新内容,淘汰一些旧内容,以便分享我们最新的实战总结和经验教训。经过大家讨论,决定进行改版。新版的内容主要基于MySQL 5.5,在保留第 1版部分内容的基础上,增加了分区、监控、高可用架构等新内容,并对原有章节结构进行了较大的调整,全书内容也重新划分,增加了架构篇。由于时间关系,部分内容和例子还是基于MySQL 5.0的,但与MySQL 5.5差别很小,这部分内容没有做改动,希望大家谅解。希望新的结构能让大家有更多的收获。
本书特点
本书作者均为国内著名门户网站网易(http://www.163.com)技术部的DBA组成员,具有丰富的数据库开发、优化和管理维护经验。本书是作者多年工作实践的积累和总结,针对 DBA在工作中的必备知识与技能,作者精心安排了本书的篇章结构。本书从基础入手,面向实际应用,力图让读者从多个角度对MySQL有深入的认识和理解。
本书最大的特点就是实战性强,通过循序渐进的内容组织,配以深入浅出的文字论述和丰富的实例对MySQL进行了系统、详细的介绍。从内容上来看,本书系统全面,涵盖了MySQL开发、优化和管理维护的方方面面;从写作风格上来看,本书不过多讨论抽象的理论,而是通过丰富的实例来帮助读者理解应用MySQL数据库时遇到的各种问题及其解决办法,读者不但能够很容易地部署自己的测试环境,还能掌握应用MySQL数据库的各种技巧。
本书结构
本书分为基础篇、开发篇、优化篇、管理维护篇、架构篇5个部分,共33章。全书的具体章节安排如下。
第一部分 基础篇(第1章~第6章):主要面向MySQL的初学者,包括MySQL的安装与配置、SQL基础、MySQL支持的数据类型、MySQL中的运算符、常用函数、图形化工具的使用等内容。通过这部分内容的学习,读者可以熟悉MySQL基本的安装和相关使用方法。
第二部分 开发篇(第7章~第17章):主要面向MySQL的设计和开发人员,包括表类型(存储引擎)的选择、选择合适的数据类型、字符集、索引的设计和使用、视图、存储过程和函数、触发器、事务控制和锁定语句、SQL中的安全问题、SQL Mode及相关问题、分区等内容。通过这部分内容的学习,读者可以了解MySQL设计和开发中需要关注的问题。
第三部分 优化篇(第18章~第23章):主要面向开发人员和数据库管理员,包括SQL优化、优化数据库对象、锁问题、优化MySQL Server、磁盘 I/O问题、应用优化等内容。通过这部分内容的学习,读者可以了解MySQL中需要优化的对象和常用的优化方法。
第四部分 管理维护篇(第 24 章~第 30 章):主要面向数据库管理员,包括MySQL高级安装和升级、MySQL中的常用工具、MySQL日志、备份与恢复、MySQL权限与安全、MySQL监控、MySQL常见问题和应用技巧等内容。通过这部分内容的学习,读者可以了解在MySQL中常用的管理维护方法。
第五部分 架构篇(第 31 章~第 33 章):主要面向高级数据库管理人员和数据库架构设计师,包括MySQL复制、MySQL Cluster、高可用架构等内容。通过这部分内容的学习,读者可以了解MySQL的一些高级应用。
本书的组织架构由唐汉明和翟振兴设计。参与本书编写的主要人员有唐汉明、翟振兴、关宝军、王洪权和黄潇。全书由翟振兴进行统一审稿和修改。
本书适用读者
本书适用于MySQL的初学者,也适用于具备一定数据库基础并打算继续深入学习MySQL技术的数据库从业人员,更适合于专业的MySQL数据库管理员(DBA)。
本书可以作为大中专院校相关专业师生的参考用书,也可以作为相关培训机构的培训教程。
近几年,开源数据库逐渐流行起来。由于具有免费使用、配置简单、稳定性好、性能优良等优点,开源数据库在中低端应用中占据了很大的市场份额,而MySQL正是开源数据库中的杰出代表。
MySQL 数据库隶属于 MySQL AB 公司,总部位于瑞典。公司名中的“AB”是瑞典语“aktiebolag”或“股份公司”的首字母缩写。MySQL支持几乎所有的操作系统,并且支持很大的表(MyISAM存储引擎支持的最大表尺寸为65536TB),这些特性使得MySQL的发展非常迅猛,目前已经广泛应用在各个行业中。
用户通常可以到官方网站www.mysql.com下载最新版本的MySQL数据库。按照用户群分类,MySQL数据库目前分为社区版(Community Server)和企业版(Enterprise),它们最重要的区别在于:社区版是自由下载而且完全免费的,但是官方不提供任何技术支持,适用于大多数普通用户;企业版是收费的,不能在线下载,相应地,它提供了更多的功能和更完备的技术支持,更适合于对数据库的功能和可靠性要求较高的企业客户。
MySQL的版本更新很快,目前可以下载的版本包括4.1、5.0、5.1和6.0。其中4.1和5.0是发行版,5.1和6.0都还是测试版。这些不同版本之间的主要区别如表1-1所示。
表1-1 MySQL不同版本的重要改进
针对每个版本,还分为3个类型。
Standard:推荐大多数用户下载。
Max:除Standard的所有内容外,还有一些附加的新特性,这些特性还没有通过正式的测试发布,主要用于提升用户的认识和体验。
Debug:和Standard类似,但是包括了一些调试信息,会影响系统性能,所以不推荐用户下载。
对于不同的操作系统平台,MySQL提供了相应的版本。本章将以Windows平台下的noinstall包和图形化安装包以及Linux平台下的RPM包为例,说明MySQL的下载、安装、配置、启动和关闭过程。本章的测试环境分别是32位的Windows XP和x86平台上的RedHat Linux AS3。
打开浏览器,在地址栏中输入 http://dev.mysql.com/downloads/mysql/5.0.html#linux,打开MySQL下载页面,单击“Windows downloads”下“Without installer(unzip in C:\)”后面的“Download”或者“Pick a mirror”链接来选择一个镜像站点进行下载,如图 1-1所示。
图1-1 下载Without installer(unzip in C:\)
在Linux平台下,要下载MySQL可以采用以下两种方法。
1.通过网页直接下载
(1)打开浏览器,在地址栏中输入http://dev.mysql.com/downloads/mysql/5.0.html#linux,打开MySQL下载页面,单击“Red Hat Enterprise Linux 3 RPM (x86) downloads”下的“Server”和“Client”后面的“Download”或者“Pick a mirror”链接来选择一个镜像站点进行下载,如图1-2所示。
(2)将下载后的文件用FTP等工具传送到Linux服务器上。
2.通过命令行方式下载
(1)首先得到下载地址的URL(用鼠标右键单击“Download”或者镜像地址的链接,“属性”对话框中显示的“地址”信息即是URL),如图1-3所示。
图1-2 下载Server和Client
在图1-3中,本例显示的URL是:
http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-noinstall-5.0.45-win32.zip/from/ht tp://mysql.cdpa.nsysu.edu.tw/
(2)然后使用wget命令在Linux服务器上直接下载Server和Client软件包。
图1-3 下载地址的URL
在本例中,下载Server软件包的具体命令如下:
[zzx@localhost ~]$ wget http://dev.mysql.com/get/Downloads/MySQL-5.0/MySQL- server-community-5.0.45-0.rhel3.i386.rpm/from/http://mysyl.cdpa.nsysu.edu.tw/w/
--10:42:38-- http://dev.mysql.com/get/Downloads/MySQL-5.0/MySQL-server- community-5. 0.45-0.rhel3.i386.rpm/from/http://mysql.cdpa.nsysu.edu.tw/
=> 'index.html'
Resolving dev.mysql.com... 213.136.52.29
Connecting to dev.mysql.com|213.136.52.29|:80... connected.
HTTP request sent, awaiting response... 302 Found
Location: http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-5.0/MySQL-server- community-5. 0.45-0.rhel3.i386.rpm [following]
--10:42:39-- http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-5.0/MySQL-server-community -5.0.45-0.rhel3.i386.rpm
=> 'MySQL-server-community-5.0.45-0.rhel3.i386.rpm.1'
Resolving mysql.cdpa.nsysu.edu.tw... 140.110.123.9
Connecting to mysql.cdpa.nsysu.edu.tw|140.110.123.9|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 18,092,605 (17M) [text/plain]
100%[==================================================================>] 18,092,605 2.00M/s ETA 00:00
10:42:57 (1.11 MB/s) - 'MySQL-server-community-5.0.45-0.rhel3.i386.rpm.1' saved [18092605/18092605]wget http://dev.mysql.com/get/Downloads/MySQL-5.0/ MySQL-client-community-5.0.45-0.rhel3.i386.rpm/from/http://mysql.cdpa.nsysu.edu.tw/
在本例中,下载Client软件包的具体命令如下:
[zzx@localhost ~]$ wget http://dev.mysql.com/get/Downloads/MySQL-5.0/MySQL- client-community-5.0.45-0.rhel3.i386.rpm/from/http://mysql.cdpa.nsysu.edu.tw/
--10:47:55-- http://dev.mysql.com/get/Downloads/MySQL-5.0/MySQL-client- community-5.0.45-0.rhel3.i386.rpm/from/http://mysql.cdpa.nsysu.edu.tw/
=> 'index.html'
Resolving dev.mysql.com... 213.136.52.29
Connecting to dev.mysql.com|213.136.52.29|:80... connected.
HTTP request sent, awaiting response... 302 Found
Location: http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-5.0/MySQL-client- community-5.0.45-0.rhel3.i386.rpm [following]
--10:47:56-- http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-5.0/MySQL-client- community-5.0.45-0.rhel3.i386.rpm
=> 'MySQL-client-community-5.0.45-0.rhel3.i386.rpm.1'
Resolving mysql.cdpa.nsysu.edu.tw... 140.110.123.9
Connecting to mysql.cdpa.nsysu.edu.tw|140.110.123.9|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 6,257,771 (6.0M) [text/plain]
100%[==================================================================>] 6,257,771 1.14M/s ETA 00:00
10:48:05 (838.78 KB/s) - 'MySQL-client-community-5.0.45-0.rhel3.i386.rpm.1' saved [6257771/6257771]
MySQL的安装分很多种情况。下面将以Windows平台和Linux平台为例,介绍 MySQL在不同操作系统平台上的安装方法。
Windows平台下的安装包主要有两种,一种是noinstall包,顾名思义,不需要安装就可以直接使用;另一种是.zip 安装包,可以通过图形化界面进行安装。下面分别就两种安装方式进行介绍。
1.noinstall安装
在Windows平台下安装MySQL,其安装步骤非常简单,只要将下载的文件mysql-noinstall-5.0.45-win32.zip 放到自定义安装目录下,再用 WinRAR 等压缩工具解压即可。本例中解压到C:\目录下,如图1-4所示。
图1-4 用WinRAR解压noinstal 包到C:\下
2.图形化方式安装
在Windows平台下,采用图形化方式安装的操作步骤如下。
(1)将压缩文件mysql-5.0.45-win32.zip解压到自定义的一个目录下,在本例中解压到C:\。
(2)双击位于C:\下的setup.exe文件,进入MySQL欢迎安装界面,如图1-5所示。
图1-5 MySQL安装欢迎界面
(3)单击“Next”按钮,进入“Setup Type”界面,选择MySQL安装类型,如图 1-6所示。
图1-6 选择MySQL安装类型
这3种安装类型分别对应着不同的安装组件,其含义如下。
Typical 表示一般常用的组件都会被安装,默认情况下安装到 C:\Program Files\MySQL\MySQL Server5.0下。建议大多数情况下选择此安装套件。
Complete表示会安装所有的组件。此套件会占用较大的磁盘空间,一般情况下不要选。
Custom 表示用户可以选择要安装的组件,可以更改默认的安装路径。这种安装类型最灵活,适用于高级用户。
在这里选择Typical类型。
(4)单击“Next”按钮,进入“Ready to Install Program”界面,如图 1-7所示。
图1-7 MySQL安装前的确认界面
此界面给出了安装前的提示,确认安装类型和安装路径。如果想修改,可以单击“Back”按钮返回修改。
(5)单击“Install”按钮,开始安装过程,如图1-8所示。安装完毕前,系统会显示MySQL Enterprise版(企业版)的一些功能介绍界面,如图1-9所示,可以单击“Next”按钮继续查看,也可以单击右上角的关闭按钮跳过。
图1-8 MySQL安装进度
图1-9 MySQL Enterprise版的功能介绍
(6)最后,系统显示安装完毕,如图1-10所示。
图1-10 MySQL安装完成
(7)单击“Finish”按钮完成安装过程。如果想马上配置数据库连接,选中“Configure the MySQL Server now”复选框;如果想以后再配置,取消复选框的选中状态。这里取消选中状态,后面再进行配置的介绍。至此,MySQL 安装完毕,Windows 的“所有程序”菜单中已经多了“MySQL”一项,如图1-11所示。
图1-11 MySQL安装后的程序项
在Linux平台下安装和在Windows平台下安装有所不同,不能用图形化的方式来安装,并且在Linux下支持RPM包、二进制包、源码包3种安装方式。下面以RPM包为例来介绍如何在Linux平台下进行MySQL的安装,其他安装方式还会在本书的第24章中详细介绍。
RPM是Redhat Package Manage的缩写。透过RPM的管理,使用者可以把Source Code包装成一种Source和Binary的档案形式,更加便于安装。MySQL的RPM包包括很多套件,一般只安装Server和Client就可以了。其中Server包是MySQL服务端套件,为用户提供核心的MySQL服务;Client包是连接MySQL服务的客户端工具,方便管理员和开发人员在服务器上进行各种管理工作。
安装RPM包的具体操作步骤如下。
(1)切换到root下(只有root才可以执行RPM包):
[zzx@bj52 zzx]$ su
Password:
[root@bj52 zzx]#
(2)安装MySQL Server包:
[root@localhost zzx]# rpm -ivh MySQL-server-community-5.0.45-0.rhel3.i386. rpm
warning: MySQL-server-community-5.0.45-0.rhel3.i386.rpm: V3 DSA signature: NOKEY, key ID 5072e1f5
Preparing... ########################################### [100%]
1:MySQL-server-community######################################### [100%]
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
/usr/bin/mysqladmin -u root password 'new-password'
/usr/bin/mysqladmin -u root -h localhost.localdomain password 'new-password'
See the manual for more instructions.
Please report any problems with the /usr/bin/mysqlbug script!
The latest information about MySQL is available on the web at
http://www.mysql.com
Support MySQL by buying support/licenses at http://shop.mysql.com
Starting MySQL[ OK ]
(3)安装MySQL Client包:
[root@localhost zzx]# rpm -ivh MySQL-client-community-5.0.45-0.rhel3.i386. rpm
warning: MySQL-client-community-5.0.45-0.rhel3.i386.rpm: V3 DSA signature: NOKEY, key ID 5072e1f5
Preparing... ######################################### [100%]
1:MySQL-client-community ######################################## [100%]
(4)最后运行MySQL:
[root@localhost zzx]# mysql -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.0.45-community MySQL Community Edition (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
至此,MySQL安装完毕。
注意:在Server安装过程中,有时候会提示缺少perl-DBI-1.40-8.i386.rpm,这时就需要先下载一个安装包,下载地址为ftp://ftp.chg.ru/pub/Linux/scientific/43/i386/SL/RPMS/perl-DBI-1.40-8.i386.rpm。
MySQL安装完毕后,大多数情况下都可以直接启动MySQL服务,而不需要设置参数。因为系统对所有的参数都有一个默认值。如果要修改默认值,则必须要配置参数文件。下面就Windows和Linux两种平台下的配置方法进行介绍。
对于 noinstall 方式安装的 MySQL,系统的参数配置、服务的启动和关闭都需要手工在命令窗口中完成。参数文件可以在多个位置进行设置,这里用一个 C:\my.cnf 来进行操作,其他更详细的参数位置可以参考第24章中的介绍。
对于初学者来说,my.cnf 并不知道该怎样配置。MySQL 为用户提供了几个样例文件,位于解压后的目录下,文件名类似于my-***.ini,其中“***”分别代表了不同的环境特点,例如my-small.ini、my-large.ini 分别代表了此文件适合于小型数据库和大型数据库。下面是一个my-small.ini的部分内容:
# Example MySQL config file for small systems.
#
# This is for a system with little memory (<= 64M) where MySQL is only used
# from time to time and it's important that the mysqld daemon
# doesn't use much resources.
…
# The following options will be passed to all MySQL clients
[client]
#password = your_password
port =3306
socket =/tmp/mysql.sock
# Here follows entries for some specific programs
# The MySQL server
[mysqld]
port =3306
socket =/tmp/mysql.sock
skip-locking
key_buffer = 16K
max_allowed_packet = 1M
table_cache = 4
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 64K
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[isamchk]
key_buffer = 8M
sort_buffer_size = 8M
[myisamchk]
key_buffer = 8M
sort_buffer_size = 8M
[mysqlhotcopy]
interactive-timeout
上面样例中的粗体代表了不同方面的参数,通常我们配置最多的是[mysqld],也就是mysql服务器参数。如果将选择的my-***.ini文件另存为C:\my.cnf文件,则MySQL实例启动的时候就会读取此配置文件。
对于图形化的安装方式,MySQL 提供了一个图形化的实例配置向导,可以引导用户逐步进行实例参数的设置,具体操作步骤如下。
(1)单击“开始”Æ“所有程序”Æ“MySQL”Æ“MySQL Server 5.0”Æ“MySQL Server Instance Configuration Wizard”菜单,进入欢迎界面,如图 1-12所示。
图1-12 MySQL实例配置欢迎界面
(2)单击“Next”按钮,进入选择配置类型界面,如图1-13所示。
界面中显示了 MySQL 提供的详细配置(Detailed Configuration)和标准配置(Standard Configuration)两种配置类型。它们的区别在于详细配置列出了更详细的个性化配置向导,配置过程相对复杂而且较慢;标准配置是一个通用的配置,配置过程简单快速。这里用详细配置为例来进行介绍。
图1-13 MySQL实例配置类型选择界面
(3)选择“Detailed Configuration”单选按钮,单击“Next”按钮,进入如图 1-14所示的界面。
图1-14 MySQL应用类型选择界面
此界面中列出了MySQL的3种应用方式。
Developer Machine(开发机),使用最小数量的内存。
Server Machine(服务器),使用中等大小的内存。
Dedicated MySQL Server Machine(专用服务器),使用当前可用的最大内存。
(4)这里选择“Developer Machine”单选按钮,单击“Next”按钮,进入数据库用途选择界面,如图1-15所示。
图1-15 MySQL数据库用途选择界面
该界面中列出了3种数据库用途选项。
Multifunctional Database(多功能数据库),此选项对事务性存储引擎(InnoDB)和非事务性(MyISAM)存储引擎的存取速度都很快。
Transactional Database Only(事务性数据库),此选项主要优化了事务性(InnoDB)存储引擎,但是非事务性存储引擎(MyISAM)也可以使用。
Non-Transactional Database Only(非事务型数据库),此选项主要优化了非事务性(MyISAM)存储引擎,注意事务性存储引擎(InnoDB)不能使用。
存储引擎在后面的章节中将会专门介绍,读者可以理解为不同的表类型。
(5)这里选择“Multifunctional Database”单选按钮。单击“Next”按钮,进入 InnoDB数据文件目录配置界面,如图1-16所示。
InnoDB 的数据文件会在数据库第一次启动的时候创建,默认会创建在 MySQL 的安装目录下。用户可以根据实际的空间状况进行路径的选择。这里保留默认值。
(6)单击“Next”按钮,进入并发连接设置界面,如图1-17所示,其中有3个选项,其含义分别如下。
Decision Support(DSS)/OLAP(决策支持系统),设置连接数为 20。
Online Transaction Processing(OLTP)(在线事务系统),设置连接数为 500。
Manual Setting(手工设置),手工输入并发连接数。
图1-16 MySQL InnoDB数据文件路径选择界面
图1-17 MySQL并发连接设置界面
(7)选择“Decision Support(DSS)/OLAP”单选按钮后,单击“Next”按钮,进入网络选项设置,如果1-18所示。
本界面中主要设置MySQL服务的端口号,选项“Enable TCP/IP Networking”表示是否运行TCP/IP连接,而选项“Enable Strict Mode”表示是否采用严格模式来启动服务。至于什么是MySQL的模式,将在本书的第16章中详细介绍。
图1-18 MySQL并发连接设置界面
(8)选择“Enable TCP/IP Networking”和“Enable Strict Mode”复选框后,单击“Next”按钮,进入默认字符集选择界面,如图1-19所示。
图1-19 MySQL实例默认字符集选择界面
该界面上的3种选项分别表示如下。
Standard Character Set(标准字符集),默认是Latin1。
Best Support For Multilingualism(对多语言支持最好的字符集),是指UTF-8。
Manual Selected Default Character Set/Collation(手工选择字符集)。
字符集将会在第9章中详细介绍。
(9)选择“Standard Character Set”单选按钮后,单击“Next”按钮,进入Windows选项设置界面,如图1-20所示。
图1-20 MySQL相关的Windows选项设置
这个界面上部是设置MySQL是否作为Windows的一个服务,如果是,设置一个服务名称并设置是否Windows重启的时候自动装载。这里保留默认选项,将服务名称改为“MySQL5”。下面的“Include Bin Directory in Windows PATH”复选框表示MySQL的 Bin目录是否写入Windows的PATH中,这里选中该复选框。
(10)单击“Next”按钮,进入MySQL的安全选项配置界面,如图1-21所示。
图1-21 MySQL的安全设置
图 1-21中显示了MySQL的两个安全设置复选框,“Modify Security Settings”复选框确定是否修改默认 root密码,因为默认的 root密码是空,所以建议用户一定要修改;“Create An Anonymous Account”复选框确定是否创建一个匿名用户,建议用户不要创建,因为这样会给系统带来安全漏洞。这里为了简便起见,将root口令改为123(正式的生产环境中一定要采用更为复杂的密码)。
(11)单击“Next”按钮,进入准备执行界面,如图1-22所示。
图1-22 准备执行配置界面
(12)确认设置没有问题后,单击“Execute”按钮,开始执行。执行成功后的界面如图1-23所示。
图1-23 MySQL配置执行成功界面
单击“Finish”按钮后,安装过程全部完成。这时可以发现,Windows的服务列表中已经增加了“MySQL5”这一项,如图1-24所示,可以通过启动、停止这个服务来启动和关闭MySQL。
图1-24 Window服务列表中的“MySQL5”
在Linux下配置MySQL和在Windows下以noinstall方式配置非常类似,区别在于参数文件的位置和文件名不同。Linux 下也可以在多个位置部署配置文件,大多数情况下都放在/etc下,文件名称只能是my.cnf(在Windows下文件名称可以是my.ini)。
对于初学者来说,和Windows下类似,还是建议用MySQL自带的多个样例参数文件来代替实际的参数文件。在 Linux 下,如果安装方式是 RPM 包,则自带的参数文件会放到/usr/share/mysql下,如下所示:
[root@localhost mysql]# pwd
/usr/share/mysql
[root@localhost mysql]# ls *.cnf
my-huge.cnf my-innodb-heavy-4G.cnf my-large.cnf my-medium.cnf my-small.cnf
用户可以根据实际需求选择不同的配置文件复制到/etc下,改名为my.cnf,并根据实际需要做一些配置的改动。MySQL启动的时候会读取此文件中的配置选项。
安装配置完毕MySQL后,接下来就该启动MySQL服务了。这里强调一下,MySQL服务和MySQL数据库不同,MySQL服务是一系列后台进程,而MySQL数据库则是一系列的数据目录和数据文件;MySQL 数据库必须在 MySQL 服务启动之后才可以进行访问。下面就针对Windows和Linux两种平台,介绍一下MySQL服务的启动和关闭方法。
对于noinstall安装的MySQL,可以在DOS窗口下通过命令行方式启动和关闭MySQL服务。
(1)启动服务:
cd C:\mysql-5.0.45-win32\bin
C:\mysql-5.0.45-win32\bin>mysqld --console
070703 17:19:10 InnoDB: Started; log sequence number 0 43655
070703 17:19:10 [Note] mysqld: ready for connections.
Version: '5.0.45-community-nt' socket: '' port: 3306 MySQL Community Edition
(GPL)
(2)关闭服务:
C:\mysql-5.0.45-win32\bin>mysqladmin -uroot shutdown
此时,控制台输出:
070703 17:21:13 [Note] mysqld: Normal shutdown
070703 17:21:13 InnoDB: Starting shutdown...
070703 17:21:16 InnoDB: Shutdown completed; log sequence number 0 43655 070703 17:21:16 [Note] mysqld: Shutdown complete
Error in my_thread_global_end(): 1 threads didn't exit
对于采用图形化方式安装的MySQL,可以直接通过Windows的“开始”菜单(单击“开始”Æ“控制面板”Æ“管理工具”Æ“服务”菜单)启动和关闭MySQL,如图1-25所示。
图1-25 服务列表中启动和关闭MySQL5
用户也可以在命令行中手工启动和关闭MySQL服务,如下所示。
(1)启动服务:
C:\Program Files\MySQL\MySQL Server 5.0\bin>net start mysql5
MySQL5 服务正在启动.
MySQL5 服务已经启动成功.
(2)关闭服务:
C:\Program Files\MySQL\MySQL Server 5.0\bin>net stop mysql5
MySQL5 服务正在停止.
MySQL5 服务已成功停止.
在Linux平台下,可以采用如下命令查看MySQL服务的状态:
[root@localhost bin]# netstat -nlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 3168/mysqld
tcp 0 0:::9922 :::* LISTEN 1864/sshd
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] STREAM LISTENING 16537243 3168/mysqld /var/lib/mysql/ mysql.sock
unix 2 [ ACC ] STREAM LISTENING 4875 1915/xfs /tmp/.font-unix/fs7100
其中3306端口是MySQL服务器监听端口。
与在Windows平台上类似,在Linux平台上启动和关闭MySQL也有两种方法,一种是通过命令行方式启动和关闭,另一种是通过服务的方式启动和关闭(适用于RPM包安装方式)。下面将分别对这两种方法进行介绍。
1.命令行方式
在命令行方式下,启动和关闭MySQL服务命令如下所示。
(1)启动服务:
[root@localhost bin]# cd /usr/bin
[root@localhost bin]# ./mysqld_safe &
[1] 23013
[root@localhost bin]# Starting mysqld daemon with databases from /var/lib/mysql
(2)关闭服务:
[root@localhost bin]# mysqladmin -uroot shutdown
STOPPING server from pid file /var/lib/mysql/localhost.localdomain.pid
070820 04:36:30 mysqld ended
[1]+ Done ./mysqld_safe
2.服务的方式
如果MySQL是用RPM包安装的,则启动和关闭MySQL服务过程如下所示。
(1)启动服务:
[root@localhost zzx]# service mysql start
Starting MySQL[ OK ]
如果在启动状态,需要重启服务,可以用以下命令直接重启,而不需要先关闭再启动:
[root@localhost mysql]# service mysql restart
Shutting down MySQL..[ OK ]
Starting MySQL[ O K ]
(2)关闭服务:
[root@localhost bin]# service mysql stop
Shutting down MySQL.STOPPING server from pid file /var/lib/mysql/localhost. localdomain.pid
070727 06:30:31 mysqld ended
[ OK ]
[1]+ Done mysqld_safe
注意:在命令行启动MySQL时,如果不加“--console”,启动关闭信息将不会在界面中显示,而是记录在安装目录下的 data 目录里面,文件名字一般是 hostname.err,可以通过此文件查看MySQL的控制台信息。
本章以Windows平台和Linux平台为例,讲述了MySQL在不同操作系统平台下的下载、安装、配置、启动和关闭的过程。其中在Windows平台下介绍了主要的两种安装包──noinstall包和图形化安装包;在Linux平台下只介绍了RPM包,而没有介绍二进制包和源码包。之所以选择这几种包进行介绍,主要是因为它们比较简单,适合初学者快速入门。在本书的第 24章中,将会对Linux下的二进制包和源码包进行详细的介绍。
图书在版编目(CIP)数据
深入浅出MySQL:数据库开发、优化与管理维护/唐汉明等著.--2版.--北京:人民邮电出版社,2014.1
ISBN 978-7-115-33549-4
Ⅰ.①深… Ⅱ.①唐… Ⅲ.①关系数据库系统 Ⅳ.①TP311.138
中国版本图书馆CIP数据核字(2013)第258769号
内容提要
本书从数据库的基础、开发、优化、管理维护和架构5个方面对MySQL进行了详细的介绍,每一部分都独立成篇。
基础篇主要适合于MySQL的初学者阅读,包括MySQL的安装与配置、SQL基础、MySQL支持的数据类型、MySQL中的运算符、常用函数、图形化工具的使用等内容。
开发篇主要适合于MySQL的设计和开发人员阅读,内容包括表类型(存储引擎)的选择、选择合适的数据类型、字符集、索引的设计和使用、视图、存储过程和函数、触发器、事务控制和锁定语句、SQL 中的安全问题、SQL Mode及相关问题、分区等。
优化篇主要适合于开发人员和数据库管理员阅读,内容包括SQL优化、优化数据库对象、锁问题、优化MySQL Server、磁盘 I/O问题、应用优化等。
管理维护篇主要适合于数据库管理员阅读,内容包括MySQL高级安装和升级、MySQL中的常用工具、MySQL日志、备份与恢复、MySQL权限与安全、MySQL监控、MySQL常见问题和应用技巧等。
架构篇主要适合高级数据库管理人员和数据库架构设计师阅读,包括MySQL复制、MySQL Cluster、高可用架构等内容。
本书的作者都是MySQL方面的资深DBA。本书不但融入了他们丰富的工作经验和多年的使用心得,还提供了大量来自工作现场的实例,具有很强的实战性和可操作性。
本书内容实用,覆盖广泛,讲解由浅入深,适合数据库管理人员、数据库开发人员、系统维护人员、数据库初学者及其他数据库从业人员阅读,也适合用作大中专院校相关专业师生的参考用书和相关培训机构的培训教材。
◆著 唐汉明 翟振兴 关宝军 王洪权 黄潇
责任编辑 杜洁
责任印制 程彦红 杨林杰
◆人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http:/www.ptpress.com.cn
北京艺辉印刷有限公司印刷
◆开本:800×1000 1/16
印张:41
字数:893千字 2014年1月第2版
印数:11346-14845册 2014年1月北京第1次印刷
定价:99.00元
读者服务热线:(010)81055410 印装质量热线:(010)81055316
反盗版热线:(010)81055315
广告经营许可证:京崇工商广字第0021号