MySQL OCP-02-体系结构

— MySQL体系结构;
1.MySQL安装必需的体系结构组件:MySQL服务器,客户机程序以及MySQL非客户机程序;中央程序充当服务器,客户机程序连接到该服务器以发出数据请求;
2.MySQL客户机/服务器通信并不仅限于所有计算机都运行同一操作系统的环境:
    1.客户机程序可以连接到在相同主机或不同主机上运行的服务器;
    2.客户机/服务器通信可以发生在计算机运行不同操作系统的环境中;
TIPS:在本课程中,都会使用在Linux中操作;
— 客户机程序;
1.mysql/mysqldump客户机程序是使用最多的一个客户段工具了;
2.MySQL Workbench是一款GUI工具,可以用来:
    1.为数据库建模;
    2.执行数据库查询;
    3.执行管理任务;
— 管理程序和实用程序;
1.这几款工具都是使用比较多的管理程序;
2.mysqldumpslow是Perl脚本;
TIPS:为了避免数据丢失或损坏,一些程序要求在执行之前关闭服务器和/或对当前表进行备份;
— MySQL服务器;
1.服务器和主机之间的概念差别:
    1.服务器:一个软件程序(mysqld),具有版本号和一系列功能;
    2.主机:服务器程序在其上运行的物理计算机,其中包含:硬件配置,操作系统,网络地址;
2.多个mysqld实例可同时在一台主机上运行;
— 服务器进程;
1.应用程序主要是mysqld进程来访问数据库服务器,由mysqld来操作不同的存储引擎(磁盘:InnoDB,MyISAM;内存:Memory;网络:NDB);
2.mysqld(服务器程序)进程可以划分为以下三个层:
    1.连接层:处理连接,此层存在于所有服务器软件(Web/邮件/LDAP服务器)上;
    2.SQL层:处理所连接的应用程序发送的SQL查询;
    3.存储层:处理数据存储,数据可以按不同格式和结构存储在不同物理介质上;
— 连接层;
1.连接层可通过多种通信协议接受来自应用程序的连接:
    1.TCP/IP;
    2.UNIX套接字;
    3.共享内存;
    4.命名管道;
2.其中TCP/IP适用于整个网络,也是最常用的连接方式;客户机和服务器在同一台计算机上运行时,上面列出的其他协议仅支持本地连接;
3.此层针对每个连接维护一个线程,此线程处理查询执行;在某个连接可以开始发送SQL查询之前,将会通过验证用户名+口令+客户机主机来对该连接进行验证;
— 通信协议;
1.TCP/IP(传输控制协议/Internet协议,Transmission Control Protocol/Internet Protocol):该通信协议套件用于连接Internet上的主机;在Linux操作系统中,TCP/IP是内置的,供 Internet使用,从而使其成为通过网络传输数据的标准;这也是适用于Windows的最佳连接类型;
2.UNIX套接字:一种进程间通信形式,用于在同一台计算机上的进程之间形成双向 通信链路的一端;套接字需要本地系统上的物理文件,这是适用于Linux的最佳连接类型;
3.共享内存:一种在程序之间传递数据的有效方式;一个程序创建其他进程(如果允许)可以访问的内存部分;此Windows显式“被动”模式仅适用于单台(Windows)计算机;默认情况下,共享内存处于禁用状态,要启用共享内存连接,必须使用–shared-memory选项启动服务器;
4.命名管道:命名管道的使用偏向于客户机/服务器通信,其工作方式与套接字非常相似;命名管道支持读/写操作,以及服务器应用程序的显式“被动”模式;此协议仅适用于单台(Windows)计算机;默认情况下,命名管道处于禁用状态,要启用命名管道连接,必须使用–enable-named-pipe选项启动服务器;
— SQL层;
1.解析器:解析器验证语法是否正确;
2.授权:验证是否允许所连接的用户运行特定查询;
3.优化器:创建每个查询的执行计划,这是有关如何以最优化的方式执行查询的分步指令集,确定要使用哪些索引以及采用何种顺序处理表是此步骤的最重要部分;
4.查询执行:完成每个查询的执行计划;
5.查询高速缓存:(可选)可配置的查询高速缓存,可用于存储(并立即返回)执行的查询和结果;
6.查询日志记录:可以启用以跟踪执行的查询;
— SQL语句处理;
第一次的选择主要是查看是否有配置开启[高速缓存查询]的特性;
— 存储层;
1.通过MySQL,可以使用称为“存储引擎”的不同类型的存储,数据可以存储在磁盘,内存和网络中;
2.数据库中的每个表可以使用任何可用的存储引擎,“磁盘”存储便宜且持久,而“内存”存储则要快得多;
3.InnoDB是默认存储引擎,它可提供事务,全文索引和外键约束,因此适用于各种混合查询;它具有多种用途,支持读密集型工作负荷,读/写工作负荷和事务工作负荷;
4.其他存储引擎包括:
    1.MyISAM:适用于频繁读取但很少更新的数据;
    2.MEMORY:在内存中存储所有数据;
    3.NDB:供MySQL Cluster用来为高可用性数据提供冗余的可伸缩拓扑;
注:存储引擎可扩展,超越存储层,而不只包含存储,它们还包括其他结构和实现机制;
— 存储引擎:概览;
1.客户机通过以SQL语句形式向服务器发送请求从表中检索数据或更改表中的数据;
2.服务器通过使用双层处理模型执行每条语句;
3.客户机通常不需要关心哪些引擎参与SQL语句处理,这种独立于引擎的SQL语句的一些例外情况包括:
    1.CREATE TABLE具有ENGINE选项,可基于每个表指定要使用的引擎;
    2.ALTER TABLE具有ENGINE选项,允许将表转换为使用不同的存储引擎;
    3.某些索引类型仅适用于特定存储引擎;例如,仅InnoDB和MyISAM引擎支持全文索引;
    4.COMMIT和ROLLBACK操作仅影响事务存储引擎(例如InnoDB和NDB)管理的表;
— 依赖于存储引擎的功能;
1.存储介质:表存储引擎可以在磁盘上,在内存中或通过网络存储数据;
2.事务功能:某些存储引擎支持全面的ACID事务功能,而其他存储引擎可能不具有事务支持;
3.锁定:存储引擎可能使用不同的锁定粒度(例如表级别锁定或行级别锁定)和机制来提供与并发事务的一致性;
4.备份和恢复:可能会受到存储引擎存储和操作数据的方式的影响;
5.优化:不同的索引实现可能会影响优化,存储引擎以不同的方式使用内部高速缓存,缓冲区和内存以优化性能;
6.特殊功能:某些引擎类型具有提供全文搜索和引用完整性的功能以及处理空间数据的能力;
TIPS:优化器可能需要根据存储引擎进行不同的选择,但这均是通过每种存储引擎支持的标准化接口(API)进行处理的;
— MySQL如何使用磁盘空间;
1.默认情况下,程序文件随数据目录一起存储在服务器安装目录下;执行各种客户机程序,管理程序和实用程序时将创建程序可执行文件和日志文件;
2.首要使用磁盘空间的是数据目录:
    1.服务器日志文件和状态文件包含有关服务器处理的语句的信息,日志可用于进行故障排除/监视/复制和恢复;
    2.InnoDB日志文件(适用于所有数据库)驻留在数据目录级别;
    3.InnoDB系统表空间包含数据字典,撤消日志和缓冲区;
    4.每个数据库在数据目录下均具有单一目录(无论在数据库中创建何种类型的表),数据库目录存储以下内容:
        1.数据文件:特定于存储引擎的数据文件,这些文件也可能包含元数据或索引信息,具体取决于所使用的存储引擎;
        2.格式文件(.frm):包含每个表和/或视图结构的说明,位于相应的数据库目录中;
        3.触发器:与某个表关联并在该表发生特定事件时激活的命名数据库对象;
    5.数据目录的位置取决于配置,操作系统,安装包和分发;典型位置是/var/lib/mysql;
    6.MySQL在磁盘上存储系统数据库(mysql),mysql包含诸如用户/特权/插件/帮助列表/事件/时区实现和存储例程之类的信息;
— MySQL如何使用内存;
1.内存分配可以划分为以下两种类别:
    1.全局(每实例内存):服务器启动时分配一次并在服务器关闭时释放,此内存在所有会话间共享;当所有物理内存用尽时,操作系统开始交换,这会对MySQL服务器性能具有不利影响,可能会导致服务器崩溃;
    2.会话(每会话内存):基于每个会话(有时称为“线程”)动态进行分配;此内存可在会话结束时或不再需要会话时释放,此内存多用于处理查询结果,所使用的缓冲区大小基于每个连接;例如,read_buffer为10MB且具有100个连接意味着可能总共有100*10MB同时用于所有读取缓冲区;
— 内存结构;
服务器在运行时会为许多种类的数据分配内存:
1.查询高速缓存还用于加速处理重复发出的查询;
2.线程高速缓存:在MySQL(和其他程序)中使用线程将应用程序执行划分为两个或更多个同时运行的任务,将会为连接到MySQL服务器的每个客户机创建单独的线程以处理该连接;
3.缓冲区和高速缓存:缓冲区和高速缓存提供数据管理子系统并支持快速访问项目,例如授权表缓冲区,存储引擎缓冲区(如InnoDB的日志缓冲区)和保存开放表说明符的表开放缓冲区;如果使用MEMORY存储引擎,MySQL将使用主内存作为主体数据存储,其他存储引擎也可能使用主内存进行数据存储,但MEMORY是唯一的,未设计为在磁盘上存储数据;
4.连接/会话:
    1.内部临时表:在某些查询执行情况下,MySQL会创建一个临时表来解析查询;可以在内存中或在磁盘上创建临时表,具体取决于其大小或内容或者查询语法;
    2.特定于客户机的缓冲区:专门设计为支持所连接的各个客户机;缓冲区示例包括:
        1.用于交换信息的通信缓冲区;
        2.排序操作:表读取缓冲区(包括支持联接的缓冲区);
— MySQL插件接口;
1.当前,插件API支持:
    1.可用于替换或扩充内置全文解析器的全文解析器插件;例如,某个插件可以使用不同于内置解析器所使用的规则将文本解析为字,要解析具有不同于内置解析器所预期的特征的文本,这很有用;
    2.向服务器提供低级别存储,检索和数据索引的存储引擎;
    3.信息模式插件;信息模式插件作为MySQL INFORMATION_SCHEMA数据库中的表出现,稍后将更详细地讨论INFORMATION_SCHEMA数据库;
    4.守护进程插件启动在服务器内运行的后台进程(例如,定期执行心跳处理);
2.插件接口需要mysql数据库中的PLUGINS表,此表是在MySQL安装过程中创建的;
— 小结;

MySQL OCP-01-MySQL简介

— 课程目标;
MySQL OCP主要是有以下7个方面的内容:
1.MySQL体系架构:
    1.使用MySQL客户端程序和MySQL服务端进行交互和批处理;
    2.描述MySQL如何使用磁盘和内存资源;
    3.描述MySQL标准存储引擎(InnoDB, NDB, MyISAM, MEMORY, FEDERATED等)的关键特征;
2.MySQL服务器的安装,配置和维护:
    1.使用合适的二进制包为Windows和Linux平台选择/部署/启动和关闭MySQL;
    2.使用配置文件,命令行选项和服务端变量来配置MySQL服务端;
    3.介绍MySQL的错误日志/二进制日志/一般日志和慢查询日志的作用/配置/位置和使用场景;
3.MySQL安全:
    1.描述如何在操作系统/文件系统和网络级别安全部署MySQL;
    2.使用合适的权限和配置创建和维护用户账户;
    3.部署和配置MySQL企业审计;
4.在MySQL中诊断数据和元数据:
    1.配置和使用PERFORMANCE_SCHEMA表来定位和诊断性能问题;
    2.从INFORMATION_SCHEMA表中获得MySQL元数据;
5.性能调优:
    1.展示诊断和优化低性能查询语句的能力;
    2.调整MySQL服务端的配置从而达到最大性能;
    3.使用最佳实践来优化对象;
    4.理解MySQL服务器和不同引擎中锁的概念;
    5.创建和使用表分区;
6.备份恢复:
    1.使用mysqldump创建和还原逻辑备份;
    2.创建和还原二进制备份;
    3.使用备份做数据恢复;
7.MySQL的高可用性技术:
    1.描述/配置/部署和排错MySQL复制;
    2.描述和对比常见的MySQL高可用解决方案(MySQL Cluster, DRBD, Windows Failover Clustering, Solaris Cluster, OVM Template for MySQL Enterprise);
— 课程表;
1.一共有19个章节,分5天讲完;
2.除了PPT上面的内容之外,还会有一些补充的习题和练习;
3.所以需要稍微记录一些笔记,然后把相关的内容课堂中和课后做反复练习;
— 简介;
每个人都介绍一下自己的[姓名, 公司, 职位, 学习MySQL的原因和之后的一个期望]吧;
— 到处可见的 MySQL;
1.全球最普及的开源数据库
    1.打开MySQL的官网(http://www.mysql.com/),上面就写到,这是世界上最流行的开源数据库;The world’s most popular open source database;
    2.与之对比的另外一款开源数据库pg,打开pg的官网(http://www.postgresql.org/),上面就写到,这是世界上最先进的开源数据库;The world’s most advanced open source database;
2.据估计有超过 1500 万次有效安装:现在会远远超过这个数字;
3.LAMP 组合中的 M:Linux, Apache/Nginx, MySQL, PHP/Python;
4.全球排名前 10 的 Web 站点中有 9 个使用该数据库:在官网下面有列举;
5.被超过3,000家ISV和OEM内嵌
    1.ISV(Independent Software Vendors,独立软件开发商):特指专门从事软件的开发/生产/销售和服务的企业,如微软,甲骨文,红帽等;
    2.OEM(Original Equipment Manufacturers,OEM生产):也称为定点生产,俗称代工,基本含义为品牌生产者不直接生产产品,而是利用自己掌握的关键的核心技术负责设计和开发新产品,控制销售渠道,具体的加工任务通过合同订购的方式委托同类产品的其他厂家生产;
6.领先的云数据库:基本所有的云服务商都会支持MySQL数据库;
7.在社交媒体(Facebook、Twitter 等)中极为流行
— MySQL 对于 Oracle 的意义;
1.MySQL代表了Oracle所提供的同类产品中最出色的,面向基于Web的应用程序的数据库解决方案,它也是嵌入式数据库的不错选择;因此,MySQL使Oracle的产品更为完整,是对Oracle DB的有力补充;Oracle大力投资MySQL的原因是为了提供可驱动下一代Web,移动和嵌入式应用程序的 MySQL解决方案;
2.几个重点:云数据库方面,Web和嵌入式方面的确是几乎垄断地位;
3.Oracle推动MySQL的创新:在某些程度上是对的,从不断的强调定制化到现在的回归社区,而Oracle也一直在把优秀的功能(google的半同步复制和GTID复制)加入到官方版本中;
— MySQL 正在推动世界;
主要是以下几类:
1.互联网公司:Alibaba,Google,Facebook,YouTube;
2.大型企业:at&t,日本新生银行(Shinsei Bank);
3.OEM和ISV;
4.云:AWS,GoDaddy,Google,阿里;
5.目前国内的银行,电信,券商还都是主流用Oracle;国外的一些公司在不考虑Oracle的前提下也在用pg;
— MySQL 数据库服务器版本;
1.MySQL经典版非常适合于嵌入式的读密集型非OLTP应用程序。
2.MySQL标准版和企业版非常适合于需要高性能,高可用性和一致的故障恢复的读密集型应用程序和OLTP 应用程序;
— MySQL 企业版;
1.MySQL企业版包括很多的高级功能,管理工具和技术支持从而实现最高级别的MySQL可伸缩性/安全性/可靠性和正常运行时间;
2.可以提供GPL版本和商业版本的MySQL Workbench;
3.课程所有的内容都是基于企业版讲的,所以之后会讲到这些高级特性;
— MySQL 连接器和 API;
1.MySQL连接器为客户机程序提供到MySQL服务器的连接;API提供对MySQL协议和MySQL资源的低级别访问;使用连接器和API可以从另一语言或环境连接到MySQL并执行MySQL语句;
2.MySQL支持的第三方连接器包括:
    1.PHP:mysqli,ext/mysqli,PDO_MYSQLND,PHP_MYSQLND;
    2.Perl:DBD::mysql;
    3.Python:MySQLdb;
    4.Ruby:DBD::MySQL,ruby-mysql;
3.还支持嵌入式MySQL服务器库(libmysqld),使用libmysqld可以在客户机应用程序中运行全功能的 MySQL服务器;其主要优点是对于嵌入式应用程序提高了速度并简化了管理;
4.相关地址;http://www.mysql.com/products/connector/;
— MySQL 服务;
— 社区支持;
1.http://lists.mysql.com/:关于服务端的,版本Bug的,参考文档的讨论;还有一些用户组的信息;
2.http://planet.mysql.com/:MySQL Team的一些人会发一些相关的文章;
— Oracle Premier Support for MySQL;
1.Oracle标准支持服务;
2.热修复(维护发行版,错误修复,修补程序和更新);
— MySQL 支持的操作系统;
http://www.mysql.com/support/supportedplatforms/database.html
MySQL.com->Services->Support;
— MySQL Web 站点;
— MySQL 课程覆盖内容;
1.ILT(Instructor-Led Training,由教师授课的培训):教师和学生同时坐在教室中授课;
2.LVC(Live Virtual Class,实时虚拟课堂):用实时视频和音频通过基于Web的交付系统(WebEx)进行授课,位于不同地理位置的教师和学生在虚拟课堂环境中参与课程并进行交互和协作;
3.TOD(Training On Demand,按需培训):对传统的教室培训(包括所有课堂内容,如讲义,白板和实验室视频等)进行先期录音,然后以视频的形式在线提供,以便用户可以在方便时开展定制培训;
— MySQL 认证;
— MySQL 联机文档;
— 示例数据库;
— 小结;

ACOUG Asia Tour – MySQL Taipei

Name of Event: ACOUG Asia Tour – MySQL Taipei
Date & Time: 5/9/2016 13:00-15:00 Asia/Taipei
Address of the Venue: Oracle Education Center, 35F, 66, Sec. 1, Chung Hsiao W. Rd., Taipei 10018, Taiwan, R.O.C
Language: Chinese
Type of the Event: Meeting
Url and other details:https://community.oracle.com/people/royalwzy/blog/2016/02/15/acoug-asia-tour-mysql
Contact:royalwzy, sonne.k.wang@gmail.com
Registration:https://jinshuju.net/f/dB1ZgE

ACOUG Asia Tour – MySQL Tokyo

Name of Event: ACOUG Asia Tour – MySQL Tokyo
Date & Time: 4/6/2016 15:00-17:00 Asia/Tokyo
Address of the Venue: Mitsui Garden Hotel Ginza Premier, 8-13-1 Ginza, Chuo-ku, Tokyo, 104-0061, Japan
Language: English
Type of the Event: Meeting
Url and other details:https://community.oracle.com/people/royalwzy/blog/2016/02/15/acoug-asia-tour-mysql
Contact:royalwzy, sonne.k.wang@gmail.com
Registration:https://jinshuju.net/f/0GZhsZ

ACOUG Asia Tour – MySQL Shanghai

Name of Event: ACOUG Asia Tour – MySQL Shanghai
Date & Time: 3/11/2016 15:00-17:00 Asia/Shanghai
Address of the Venue: Room404, Haitong Securities Tower, 689 Guangdong Road, Shanghai, 200001, P.R.China
Language: Chinese
Type of the Event: Meeting
Url and other details:https://community.oracle.com/people/royalwzy/blog/2016/02/15/acoug-asia-tour-mysql
Contact:royalwzy, sonne.k.wang@gmail.com
Registration:https://jinshuju.net/f/J3Pu6u

MySQL压力测试

主要内容:
1.MySQL压力测试基准值;
2.mysqlslap的介绍及使用;
3.sysbench的介绍及使用;
4.tpcc-mysql的介绍及使用;

MySQL压力测试基准值
1.压力测试的目的:
1.确认新的MySQL版本性能相比之前差异多大;比如从5.6变成5.7,或者从官方版本改成Percona分支版本;
2.确认新的服务器性能是否更高,能高多少;比如CPU升级了,阵列卡cache加大了,从机械盘换成SSD盘了;
3.确认一些新的参数调整后,对性能影响多少;比如innodb_flush_log_at_trx_commit,sync_binlog等参数;
4.确认即将上线的新业务对MySQL负载影响多少,是否能承载得住,是否需要对服务器进行扩容或升级配置;
2.针对不同的压测目的,相应的测试方法也有所不同:
1.先说第四种,需要和线上业务结合起来,这时候就需要自行开发测试工具,或者利用tcpcopy(https://github.com/session-replay-tools/tcpcopy)将线上实际用户请求导向测试环境,进行仿真模拟测试;
2.对于前三种,我们通常采用基准测试就可以;比较常用的MySQL基准压力测试工具有tpcc-mysql,sysbench,mysqlslap等几个;
3.如何避免压测时受到缓存的影响:
1.填充测试数据比物理内存还要大,至少超过innodb_buffer_pool_size值,不能将数据全部装载到内存中,除非你的本意就想测试全内存状态下的MySQL性能;
2.每轮测试完成后,都重启mysqld实例,并且用下面的方法删除系统cache,释放swap(如果用到了swap的话),甚至可以重启整个OS;
1.将脏数据刷新到磁盘:sync;
2.清除OS Cache:echo 3 > /proc/sys/vm/drop_caches
3.释放swap:swapoff -a && swapon -a;
4.如何尽可能体现线上业务真实特点:
1.其实上面已经说过了,就是自行开发测试工具或者利用tcpcopy(或类似交换机的mirror功能)将线上实际用户请求导向测试环境,进行仿真模拟测试;
2.利用http_load或siege工具模拟真实的用户请求URL进行压力测试;
5.压测结果如何解读:
1.压测结果除了tps/TpmC指标外,还应该关注压测期间的系统负载数据,尤其是iops,iowait,svctm,%util,每秒I/O字节数(I/O吞吐),事务响应时间(tpcc-mysql/sysbench打印的测试记录中均有);另外,如果I/O设备能提供设备级IOPS,读写延时数据的话,也应该一并关注;
2.假如两次测试的tps/TpmC结果一样的话,那么谁的事务响应时间,iowait,svctm,%util,读写延时更低,就表示那个测试模式有更高的性能提升空间;
6.如何加快tpcc_load加载数据的效率:
1.tpcc_load其实是可以并行加载的,一方面是可以区分ITEMS,WAREHOUSE,CUSTOMER,ORDERS四个维度的数据并行加载;
2.另外,比如最终想加载1000个warehouse的话,也可以分开成1000个并发并行加载的;
3.github上有并行加载的项目tpcc_load_parallel.sh,加载效率至少提升10倍以上;

mysqlslap的介绍及使用
1.mysqlslap简介:
1.它是MySQL从5.1.4版开始自带的一个基准测试工具,该工具可以模拟多个客户端同时并发的向服务器发出查询更新,给出了性能测试数据而且提供了多种引擎的性能比较;
2.mysqlslap为MySQL性能优化前后提供了直观的验证依据,从而帮助DBA准确的掌握线上数据库支撑的用户流量上限及其抗压性等问题;
3.查看帮助:mysqlslap –help
4.使用方法:mysqlslap [OPTIONS];
5.默认的读取配置文件的顺序:/etc/my.cnf,/etc/mysql/my.cnf,/usr/local/mysql/etc/my.cnf,~/.my.cnf;
2.参数说明:
–defaults-file:指定从配置文件中读取选项配置;
-?, –help:查看帮助;
-a, –auto-generate-sql:自动生成测试表和数据;
–auto-generate-sql-add-autoincrement:自动生成的表中添加自增列;
–auto-generate-sql-execute-number=#:自动生成的查询的个数;
–auto-generate-sql-guid-primary:自动在表上添加基于GUID的主键;
–auto-generate-sql-load-type=name:指定测试负载的类型,取值包括:mixed(默认,一半插入一半查询),update,write,key(读主键)和read;
–auto-generate-sql-secondary-indexes=#:在自动生成的表上添加第二索引的个数,默认0;
–auto-generate-sql-unique-query-number=#:生成基于唯一键查询的测试语句数量,默认10;
–auto-generate-sql-unique-write-number=#:生成基于唯一键写的测试语句数量,默认100;
–auto-generate-sql-write-number=#:每个线程执行插入的记录数量,默认100;
–commit=#:多少条DML后提交一次;
-C, –compress:如果服务器和客户端支持都压缩,则压缩信息传递;
-c, –concurrency=name:模拟查询的客户端并发数量,多个可以使用逗号分割;
–create=name:创建表的SQL语句或者文本文件;
–create-schema=name:指定测试的数据库,不指定就自动创建一个mysqlslap的schema;
–csv[=name]:生成CSV格式的结果,如果不指定名字就打印到标准输出,指定名字就打印到指定的文件中;
-#, –debug[=#]:指定debug模式;
–debug-check:退出时检查相关的内存和打开文件使用信息;
-T, –debug-info:额外输出CPU以及内存的相关信息;
–default-auth=name:默认的客户端插件验证文件;
-F, –delimiter=name:定义SQL使用的分隔符;
–detach=#:执行N条语句后断开重连;
–enable-cleartext-plugin:开启/禁用明文验证插件,具体查看MySQL几种身份验证方式;
-e, –engine=name:创建测试表使用的引擎,多个引擎用逗号分割;
-h, –host=name:连接到的服务器信息;
-i, –iterations=#:运行测试的次数;
–no-drop:在测试完成之后不删除测试表;
-x, –number-char-cols=name:测试表中VARCHAR类型列的个数,默认1个,仅当指定–auto-generate-sql参数时有效;
-y, –number-int-cols=name:测试表中VARCHAR类型列的个数,默认1个,仅当指定–auto-generate-sql参数时有效;
–number-of-queries=#:总的测试查询次数(并发客户数×每客户查询次数);
–only-print:不连接到数据库,只打印相应的SQL语句,即测试过程的SQL语句;
-p, –password[=name]:密码信息;
–plugin-dir=name:客户端插件目录;
-P, –port=#:连接的端口号;
–post-query=name:在测试脚本运行后执行的脚本,这个过程不影响时间计算;;
–post-system=name:在测试脚本运行后执行的系统命令;
–pre-query=name:在测试脚本运行前执行的脚本;
–pre-system=name:在测试脚本运行前执行的系统命令;
–protocol=name:用户连接时使用的协议,eg:tcp,socket,pipe,memory;
-q, –query=name:用自定义脚本执行测试
–secure-auth:安全验证,拒绝客户端使用旧的协议连接服务器,默认开启,但是可以指定–skip-secure-auth参数来关闭;
-s, –silent:静默模式下运行程序;
-S, –socket=name:连接时指定socket文件;
–ssl:连接时开启SSL;
-u, –user=name:用户名信息;
-v, –verbose:输出信息的详细的级别,eg:-vvv;
-V, –version:版本信息;
3.查看测试过程:mysqlslap -a –only-print;
4.测试实例(多线程测试):
mysqlslap -uroot -p –concurrency=100 –iterations=1 –auto-generate-sql –auto-generate-sql-load-type=mixed –auto-generate-sql-add-autoincrement –engine=InnoDB –number-of-queries=10 –debug-info
说明:测试100个并发线程;测试次数1次;自动生成SQL测试脚本;读,写,更新混合测试;自增长字段;测试引擎为InnoDB;共运行10次查询;输出CPU资源信息;
5.测试实例(迭代测试,多次测试得出平均值):
mysqlslap -uroot -p –concurrency=50,100,200 –iterations=20 –number-int-cols=4 –number-char-cols=35 –auto-generate-sql –auto-generate-sql-load-type=mixed –auto-generate-sql-add-autoincrement –engine=MyISAM,InnoDB –number-of-queries=200 –debug-info -v
说明:测试50,100,200个并发线程;测试次数20次;四个int列和35个varchar列;自动生成SQL测试脚本;读,写,更新混合测试;自增长字段;测试引擎为M有ISAM,InnoDB;共运行200次查询;输出CPU资源信息;想要输出所有信息加-vvv;
TIPS:并发数越多,执行完所有查询的时间越长,为了准确起见,可以多迭代测试几次;
6.总结:
1.无法规定表中测试数据的数量;
2.可以使用压力测试工具super-smack for MySQL,但是却一直没有人维护了;

— 补充:
MySQL的几种身份验证方式:MySQL主要是用自身的User Table作身份认证,但可以加入其它plugin authentication;
1.The Native Authentication Plugins;
2.The PAM Authentication Plugin;
3.The Windows Native Authentication Plugin;
4.The Clear-Text Client-Side Authentication Plugin:在客户端发送明文给服务端验证,http://dev.mysql.com/doc/refman/5.5/en/cleartext-authentication-plugin.html;
5.The Socket Peer-Credential Authentication Plugin;
6.The Test Authentication Plugin;

sysbench的介绍及使用
1.sysbench简介:
1.sysbench是一个模块化的,跨平台,多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况;
2.sysbench的目的是1)不需要设置复杂的数据库基准测试,2)甚至根本不需要安装一个数据库的情况下,可以快速了解系统性能状况;
3.目前sysbench代码托管在github上(https://github.com/akopytov/sysbench),在之前还经历了由sourceforge(http://sysbench.sourceforge.net)到launchpad(https://launchpad.net/sysbench)的迁移;
4.最新版本为0.5;
5.使用C语言写的一个工具;
2.sysbench支持以下几种测试模式:
1.CPU运算性能;
2.磁盘IO性能;
3.调度程序性能;
4.内存分配及传输速度;
5.POSIX线程性能;
6.数据库性能(OLTP基准测试),eg:MySQL,Drizzle(精简版的MySQL分支),PostgreSQL,Oracle等几种数据库;
3.安装sysbench:
1.安装依赖包:sysbench依赖automake和libtool两个包,yum -y install automake libtool;
2.解压缩:unzip sysbench-0.5.zip;
3.自动配置:./autogen.sh;
4.指定编译配置:./configure –prefix=/usr/local/sysbench –with-mysql-includes=/usr/local/mysql/include –with-mysql-libs=/usr/local/mysql/lib;默认支持MySQL,如果需要测试Oracle/PostgreSQL,则在configure时需要加上–with-oracle或者–with-pgsql参数;如果想要默认不支持MySQL,需要添加–without-mysql参数;
5.编译安装:make && make install;
6.修改PATH环境变量;
7.报错修复,[./sysbench: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory],是因为sysbench无法找到mysql的库文件,可能是环境变量LD_LIBRARY_PATH没有设置,export LD_LIBRARY_PATH=/usr/local/mysql/lib即可;
4.参数介绍:
1.使用方法:sysbench [general-options]… –test= [test-options]… command;
2.一般选项:
–num-threads=N:使用的测试线程数,默认为1;
–max-requests=N:最大请求数量,默认为1W,0表示不限制;
–max-time=N:最大执行时间,单位是s,默认0为不限制;与–max-requests二选一;
–forced-shutdown=STRING:超过–max-time指定时间后强制中断,默认为off;
–thread-stack-size=SIZE:每个线程使用的栈大小,默认是64K;
–tx-rate=N:target transaction rate (tps) [0];
–report-interval=N:阶段性的报告中间统计信息,单位为s,默认0为禁用此阶段性的报告;
–report-checkpoints=[LIST,…]:在指定的时间点,导出所有的统计信息,并且重置所有的计数器;可以指定用逗号分割的列表,单位是s,默认是关闭的;
–percentile=N:表示设定采样比例,默认是95%;可以设置99%即丢弃1%的长请求,在剩余的99%里取最大值;
–test=STRING:指定测试的项目;
–debug=[on|off]:是否打印调试信息,默认为off;
–validate=[on|off]:在可能的情况下执行验证检查,默认为off;
–help=[on|off]:查看帮助信息;
–version=[on|off]:打印版本信息;
–rand-init=[on|off]:测试开始时是否初始化随机数生成器,默认为off;
–rand-type=STRING:随机数分布模式,eg:uniform(固定),gaussian(高斯),special(特定的,默认),pareto(帕累托);
1.special表示存在热点数据;
2.uniform表示非热点数据模式;
–rand-spec-iter=N:数字生成器中使用迭代器的数量,默认是12;
–rand-spec-pct=N:special类型数据的比率,默认是1;
–rand-spec-res=N:special值使用的比率,默认是75;
–rand-seed=N:随机数生成器的种子,默认为0;
–rand-pareto-h=N:pareto数据分布模式下参数h的值,默认是0.2;
3.日志选项:
–verbosity=N:日志级别,5是debug级别,0是只打印严重错误信息,默认为3;
–percentile=N: percentile rank of query response times to count [95]
4.测试的项目:
1.fileio – File I/O test
2.cpu – CPU performance test
3.memory – Memory functions speed test
4.threads – Threads subsystem performance test
5.mutex – Mutex performance test
6.oltp – OLTP test,在0.5版本之前有,已被替换掉;
5.命令:
1.prepare:执行测试前的准备工作;比如fileio测试时在磁盘上创建必要的文件,或者在oltp测试时填充测试数据库;
2.run:执行真实的测试;
3.cleanup:测试后移除运行时产生的临时数据;
4.help:查看指定测试项目的帮助;eg:sysbench –test=cpu help;
5.CPU测试:
1.相关选项:
–cpu-max-prime=N:最大质数发生器数量,即产生N个素数,默认为10000;
2.测试计算产生2000个素数所需要的时间:sysbench –test=cpu –cpu-max-prime=2000 run;
3.查看CPU相关信息:less /proc/cpuinfo;
6.线程(threads)测试:
1.测试线程调度器的性能,对于高负载情况下测试线程调度器的行为非常有用;
2.相关选项:
–thread-yields=N:每个请求产生多少个线程,默认为1000;
–thread-locks=N:每个线程的锁的数量,默认为8;
3.使用64个线程,每个请求产生100个线程,线程锁数为2:sysbench –test=threads –num-threads=64 –thread-yields=100 –thread-locks=2 run;
7.文件IO性能测试:
1.相关选项:
–file-num=N:创建测试文件的数量,默认为128;
–file-block-size=N:测试时文件块的大小,默认是16384(16K);
–file-total-size=SIZE:测试文件的总大小,默认是2G;
–file-test-mode=STRING:文件测试模式,eg:seqwr(顺序写),seqrewr(顺序读写),seqrd(顺序读),rndrd(随机读),rndwr(随机写),rndrw(随机读写);
–file-io-mode=STRING:文件操作模式,eg:sync(同步,默认),async(异步),fastmmap(快速map映射),slowmmap(慢map映射);
–file-extra-flags=STRING:使用额外的标志来打开文件,eg:sync,dsync,direct;默认为空;
–file-fsync-freq=N:执行fsync()的频率,默认是100,0表示不使用fsync();
–file-fsync-all=[on|off]:每执行完一次写操作就执行一次fsync,默认是off;
–file-fsync-end=[on|off]:在测试结束时才执行fsync,默认是on;
–file-fsync-mode=STRING:使用哪种方法进行同步,eg:fsync(默认),fdatasync;
–file-merged-requests=N:如果可以,合并最多的IO请求数,默认是0表示不合并;
–file-rw-ratio=N:测试时的读写比例,默认是1.5;
2.测试:文件总大小为2G,20个并发线程,随机读写;
1.prepare阶段:sysbench –test=fileio –num-threads=20 –file-total-size=2G –file-test-mode=rndrw prepare
2.run阶段:sysbench –test=fileio –num-threads=20 –file-total-size=2G –file-test-mode=rndrw run
3.清理测试时生成的文件:sysbench –test=fileio –num-threads=20 –file-total-size=2G –file-test-mode=rndrw cleanup
8.互斥锁(Mutex)测试:
1.相关选项:
–mutex-num=N:数组互斥的总大小,默认是4096;
–mutex-locks=N:每个线程互斥锁的数量,默认是50000;
–mutex-loops=N:内部互斥锁的空循环数量,默认是10000;
2.测试互斥锁的性能,方式是模拟所有线程在同一时刻并发运行,并都短暂请求互斥锁:sysbench –-test=mutex –-num-threads=100 –-mutex-num=1000 –-mutex-locks=100000 –-mutex-loops=10000 run
9.内存测试:
1.相关选项:
–memory-block-size=SIZE:测试时内存块大小,默认是1K;
–memory-total-size=SIZE:传输数据的总大小,默认是100G;
–memory-scope=STRING:内存访问范围,eg:global(默认),local;
–memory-hugetlb=[on|off]:从HugeTLB池内存分配,默认是off;
–memory-oper=STRING: 内存操作类型,eg:read,write(默认),none;
–memory-access-mode=STRING:存储器存取方式,eg:seq(默认),rnd;
2.内存测试测试了内存的连续读写性能:sysbench –test=memory –memory-block-size=8k –memory-total-size=1G run
10.MySQL数据库测试:
1.sysbench v0.5通过一系列LUA脚本来替换之前的oltp,从而来模拟更接近真实的基准测试环境;
2.脚本在//sysbench-0.5/sysbench/tests/db/目录下,这些测试脚本包含:insert.lua,oltp.lua,parallel_prepare.lua,select_random_points.lua,update_index.lua,delete.lua,oltp_simple.lua,select.lua,select_random_ranges.lua,update_non_index.lua,脚本使用方式基本类似;
3.sysbench v0.5默认使用sbtest库,但是需要自己手工先创建好,也可以使用–mysql-db指定,其他非默认项指定选项:
–mysql-host=[LIST,…]:MySQL服务器地址,默认为localhost;
–mysql-port=N:MySQL服务器端口号,默认为3306;
–mysql-socket=STRING:MySQL socket;
–mysql-user=STRING:MySQL用户,默认为sbtest;
–mysql-password=STRING:MySQL密码;
–mysql-db=STRING:MySQL数据库名称,默认为dbtest;
–mysql-table-engine=STRING:使用的引擎,eg:myisam,innodb(默认),bdb,heap,ndbcluster,federated;
–mysql-engine-trx=STRING:存储引擎是否使用事务,eg:yes,no,auto(默认);
–mysql-ssl=[on|off]:是否使用ssl连接,默认为off;
–mysql-create-options=:创建脚本是否添加CREATE TABLE,默认为空;
4.准备阶段:生成表并插入数据,可使用parallel_prepare.lua脚本来并行准备数据;
–db-driver:服务器类型,eg:mysql(默认),drizzle;
–mysql-table-engine:表存数引擎;
–myisam-max-rowsMyISAM引擎表的最大记录数,默认为100W;
–oltp-table-count:生成表数量,名字为:sbtest1、sbtest2…;
–oltp-table-size:生成表的行数;
–oltp-secondary:ID列生成二级索引而不是主键;
–oltp-auto-inc=[on|off]:设置ID列是否自增,默认为on;
5.运行阶段:
–oltp-tables-count=N:表的数量;
–oltp-read-only=[on|off]:是否仅执行SELECT测试;默认为off,表示不要进行只读测试,也就是会采用读写混合模式测试;
–oltp-dist-type:随机数分布状态,eg:uniform(均匀分布),gauss(高斯分布),special(特殊分布);
–oltp-dist-pct:特殊分布的百分比值;
–oltp-dist-res:特殊分布的百分比;
–oltp-point-selects:单个事务中指定的selec查询个数;
–oltp-range-size:范围查询的范围大小,该值应比oltp-table-size小;
–oltp-simple-ranges:单个事务中指定的简单范围查询个数;
–oltp-sum-ranges:单个事务中指定的SUM范围查询个数;
–oltp-order-ranges:单个事务中指定的ORDER范围查询个数;
–oltp-distinct-ranges:单个事务中指定的DISTINCT范围查询个数;
–oltp-index-updates:单个事务中指定的使用索引更新的个数;
–oltp-non-index-updates:单个事务中指定的不使用索引更新的个数;
6.清理阶段;
7.测试:
1.准备(方法1):sysbench –mysql-db=test –mysql-user=root –mysql-password= –test=/tools/sysbench-0.5/sysbench/tests/db/oltp.lua –mysql-table-engine=innodb –oltp-table-size=100000 prepare
2.准备(方法2,准备数据后运行):也可使用parallel_prepare.lua脚本并行准备测试数据,线程数应该为运行表的倍数;sysbench –mysql-db=sbtest –mysql-user=root –mysql-password= –test=/tools/sysbench-0.5/sysbench/tests/db/parallel_prepare.lua –mysql-table-engine=innodb –oltp-table-size=100000 –num-threads=10 –oltp-tables-count=10 run
3.运行:sysbench –mysql-db=test –mysql-user=root –mysql-password= –test=/tools/sysbench-0.5/sysbench/tests/db/oltp.lua –num_threads=10 –oltp-tables-count=10 –oltp-table-size=100000 –num-threads=8 –report-interval=10 –rand-type=uniform –max-time=100 –percentile=99 run
4.清理:sysbench –mysql-db=test –mysql-user=root –mysql-password= –test=/tools/sysbench-0.5/sysbench/tests/db/oltp.lua –oltp-table-size=100000 –oltp-tables-count=10 cleanup
8.可以对数据库进行调优后,再使用sysbench对OLTP进行测试,看看TPS是不是会有所提高;
9.TIPS:
1.sysbench的测试只是基准测试,并不能代表实际企业环境下的性能指标;
2.真实测试场景中,数据表建议不低于10个,单表数据量不低于500万行,当然了,要视服务器硬件配置而定;如果是配备了SSD或者PCIE SSD这种高IOPS设备的话,则建议单表数据量最少不低于1亿行;
3.真实测试场景中,建议持续压测时长不小于30分钟,否则测试数据可能不具参考意义;
10.参考文档:https://www.percona.com/docs/wiki/benchmark:sysbench:olpt.lua

— 运行报告解读;
Threads started!
— 每10秒钟报告一次测试结果:tps,每秒读,每秒写,99%以上的响应时长统计;
[ 10s] threads: 8, tps: 1111.51, reads/s: 15568.42, writes/s: 4446.13, response time: 9.95ms (99%)
[ 20s] threads: 8, tps: 1121.90, reads/s: 15709.62, writes/s: 4487.80, response time: 9.78ms (99%)
[ 30s] threads: 8, tps: 1120.00, reads/s: 15679.10, writes/s: 4480.20, response time: 9.84ms (99%)
[ 40s] threads: 8, tps: 1114.20, reads/s: 15599.39, writes/s: 4456.30, response time: 9.90ms (99%)
[ 50s] threads: 8, tps: 1114.00, reads/s: 15593.60, writes/s: 4456.70, response time: 9.84ms (99%)
[ 60s] threads: 8, tps: 1119.30, reads/s: 15671.60, writes/s: 4476.50, response time: 9.99ms (99%)
OLTP test statistics:
queries performed:
read: 938224 — 读总数
write: 268064 — 写总数
other: 134032 — 其他操作总数(SELECT,INSERT,UPDATE,DELETE之外的操作,例如COMMIT等)
total: 1340320 — 全部总数
transactions: 67016 (1116.83 per sec.) — 总事务数(每秒事务数)
deadlocks: 0 (0.00 per sec.) — 发生死锁总数
read/write requests: 1206288 (20103.01 per sec.) — 读写总数(每秒读写次数)
other operations: 134032 (2233.67 per sec.) — 其他操作总数(每秒其他操作次数)

General statistics: — 一些统计结果
total time: 60.0053s — 总耗时
total number of events: 67016 — 共发生多少事务数
total time taken by event execution: 479.8171s — 所有事务耗时相加(不考虑并行因素)
response time: — 响应时长统计
min: 4.27ms — 最小耗时
avg: 7.16ms — 平均耗时
max: 13.80ms — 最长耗时
approx. 99 percentile: 9.88ms — 超过99%平均耗时

Threads fairness:
events (avg/stddev): 8377.0000/44.33
execution time (avg/stddev): 59.9771/0.00

tpcc-mysql的介绍及使用
1.tpcc-mysql简介:
1.TPC-C是专门针对联机交易处理系统(OLTP系统)的规范,一般情况下我们也把这类系统称为业务处理系统;
2.tpcc-mysql是percona基于TPC-C(下面简写成TPCC)衍生出来的产品,专用于MySQL基准测试;
3.tpcc-mysql通过模拟一个电商的业务,主要包含的业务有新增订单,库存查询,发货,支付等模块的测试,用来测试典型的复杂OLTP系统的性能;
4.其源码放在launchpad上,用bazaar管理,项目地址:https://code.launchpad.net/~percona-dev/perconatools/tpcc-mysql;
2.安装:
1.解压缩:gunzip tpcc-mysql-src.tgz;tar -xvf tpcc-mysql-src.tar;
2.安装:cd /path/tpcc-mysql/src; make; 之后会在/path/tpcc-mysql目录下生成两个tpcc 命令行工具:tpcc_load,tpcc_start;
1.tpcc_load:提供初始化数据的功能;
2.tpcc_start:进行压力测试;
3.移动工具位置:mv /tools/tpcc-mysql/tpcc_start /tools/tpcc-mysql/tpcc_load /usr/local/bin/;
3.查看帮助:
1.tpcc_load –help:
usage: tpcc_load [server] [DB] [user] [pass] [warehouse]
OR
tpcc_load [server] [DB] [user] [pass] [warehouse] [part] [min_wh] [max_wh]

* [part]: 1=ITEMS 2=WAREHOUSE 3=CUSTOMER 4=ORDERS
1.Server:服务器名;
2.DB:数据库名;
3.user:用户名;
4.pass:密码;
5.warehouse:测试库下仓库的数量;
6.part:tpcc_load其实是可以并行加载的,可以区分ITEMS/WAREHOUSE/CUSTOMER/ORDERS四个维度的数据并行加载(github上已经实现的并行加载的项目tpcc_load_parallel.sh:https://gist.github.com/sh2/3458844);
2.tpcc_start –help:
Usage: tpcc_start -h server_host -P port -d database_name -u mysql_user -p mysql_password -w warehouses -c connections -r warmup_time -l running_time -i report_interval -f report_file -t trx_file
1.-h server_host:服务器名;
2.-P port:端口号,默认为3306;
3.-d database_name:数据库名;
4.-u mysql_user:用户名;
5.-p mysql_password:密码;
6.-w warehouses:仓库的数量;
7.-c connections:线程数,默认为1;
8.-r warmup_time:预热时间,预热是为了将数据加载到内存,单位s,默认为10s;
9.-l running_time:测试时间,单位s,默认为20s;
10.-i report_interval:指定生成报告间隔时长;
11.-f report_file:测试结果输出文件;
12.-t trx_file:事务文件;
4.测试前准备工作:
1.创建测试数据库:mysql -uroot -p -e “CREATE DATABASE tpcc”;
2.创建表:mysql -uroot -p tpcc < /tools/tpcc-mysql/create_table.sql; 3.添加外键:mysql -uroot -p tpcc < /tools/tpcc-mysql/add_fkey_idx.sql; 4.查看tpcc-mysql的业务逻辑及其相关的几个表作用如下: 1.customer:客户表; 2.district:地区表; 3.history:支付信息表; 4.item:商品信息表; 5.new_orders:新订单表,其它信息还是存在orders表中; 6.order_line:发货信息表; 7.orders:订单表; 8.stock:库存信息表; 9.warehouse:仓库表; 5.测试: 1.单进程加载数据:tpcc_load localhost tpcc root "" 5; 2.对5个数据仓库,预热10秒,100个并发连接,运行60秒:tpcc_start -h localhost -d tpcc -u root -p "" -w 5 -c 100 -r 10 -l 60 -i 10 -f rpt_tpcc -t tr; 6.不足: 1.没有自增列作为主键:如果仅作为基准测试问题不大,但和我们实际生产中的设计模式可能有一定区别,相信大多数人还是习惯使用自增列作为主键的; 2.使用外键:个人认为MySQL对外键支持并不是太好,并且一定程度上影响并发性能,因此建议取消外键,仅保留一般的索引; 7.其它: 1.真实测试场景中,仓库数一般不建议少于100个;视服务器硬件配置而定,如果是配备了SSD或者PCIE SSD这种高IOPS设备的话,建议最少不低于1000个; 2.真实测试场景中,建议预热时间不小于5分钟,持续压测时长不小于30分钟,否则测试数据可能不具参考意义; 3.需要注意的是tpcc默认会读取/var/lib/mysql/mysql.sock这个socket文件,如果你的socket文件不在相应路径的话,可以做个软连接;或者通过TCP/IP的方式连接测试服务器; 4.script目录下的一些脚本主要是一些性能数据采集以及分析的; 5.可以使用gunpolt工具画图; -- 测试结果解读; [root@ocp ~]# tpcc_start -h localhost -d tpcc -u root -p "" -w 5 -c 100 -r 10 -l 60 -i 10 -f rpt_tpcc -t tr; *************************************** *** ###easy### TPC-C Load Generator *** *************************************** option h with value 'localhost' option d with value 'tpcc' option u with value 'root' option p with value '' option w with value '5' option c with value '100' option r with value '10' option l with value '60' option i with value '10' option f with value 'rpt_tpcc' option t with value 'tr'
[server]: localhost
[port]: 3306
[DBname]: tpcc
[user]: root
[pass]:
[warehouse]: 5
[connection]: 100
[rampup]: 10 (sec.)
[measure]: 60 (sec.)

RAMP-UP TIME.(10 sec.)

— 预热结束,开始进行压测;
MEASURING START.

— 为了能够清晰的说明以下内容,首先定义一些变量,便于以下的计算和说明:
1.success:执行成功的记录数;
2.late:执行延迟的记录数;
3.pre_success:上一次执行成功的记录数;
4.pre_late:上一次执行失败的记录数;

— 根据以上定义的变量,计算相应字段的结果和说明相应字段的含义:
1.时间间隔内成功的事务(包括成功和延迟的事务):sl=success+late-pre_success-pre_late;
2.时间间隔内延迟的事务:l=late-pre_late;
3.时间间隔内前90%记录(实际为99%)的平均响应时间:rt90;
4.时间间隔内最大的响应时间:max_rt;

— Count New-Order Payment Order-Status Delivery Stock-Level
— #, sl(l):rt90|max_rt , sl(l):rt90|max_rt , sl(l):rt90|max_rt, sl(l):rt90|max_rt, sl(l):rt90|max_rt
— 新订单成功执行压测的次数(推迟执行压测的次数):90%事务的响应时间|本轮测试最大响应时间;

10, 485(0):2.431|3.536, 505(0):0.709|1.550, 49(0):0.331|0.363, 48(0):3.061|3.162, 49(0):5.823|6.181
20, 511(0):2.544|3.928, 517(0):0.813|1.757, 52(0):0.204|0.235, 52(0):2.543|2.725, 52(0):5.964|6.062
30, 516(0):2.109|3.152, 510(0):0.493|1.421, 51(0):0.257|0.415, 50(0):2.684|2.855, 51(0):5.783|5.875
40, 480(2):3.008|8.578, 479(0):1.688|1.882, 47(0):0.241|2.038, 47(0):2.869|3.197, 48(0):6.349|6.550
50, 478(1):2.926|10.509, 481(0):1.080|1.795, 48(0):0.406|1.721, 47(0):2.810|2.877, 48(0):6.247|7.598
60, 434(4):3.783|7.095, 426(0):1.258|1.724, 44(0):0.398|1.789, 45(0):3.080|3.604, 45(0):7.136|8.169

— 压测结束;
STOPPING THREADS……………………………………………………………………………………….

— 第一次结果统计;
— 成功(success,sc)次数,延迟(late,lt)次数,重试(retry,rt)次数,失败(failure,fl)次数;

[0] sc:2897 lt:7 rt:0 fl:0 — New-Order:新订单业务;
[1] sc:2918 lt:0 rt:0 fl:0 — Payment:支付业务统计;
[2] sc:291 lt:0 rt:0 fl:0 — Order-Status:订单状态业务统计;
[3] sc:289 lt:0 rt:0 fl:0 — Delivery:发货业务统计;
[4] sc:293 lt:0 rt:0 fl:0 — Stock-Level:库存业务统计;
in 60 sec.

— 第二次统计结果;

[0] sc:2897 lt:7 rt:0 fl:0
[1] sc:2918 lt:0 rt:0 fl:0
[2] sc:291 lt:0 rt:0 fl:0
[3] sc:289 lt:0 rt:0 fl:0
[4] sc:293 lt:0 rt:0 fl:0

— 下面所有业务逻辑结果都必须为OK才行;
(all must be [OK])
[transaction percentage]
Payment: 43.58% (>=43.0%) [OK] — 支付成功次数(sc + lt)必须大于43.0%,否则结果为NG,而不是OK;
Order-Status: 4.35% (>= 4.0%) [OK]
Delivery: 4.32% (>= 4.0%) [OK]
Stock-Level: 4.38% (>= 4.0%) [OK]

— 响应耗时指标必须超过90%通过才行;
[response time (at least 90% passed)]
New-Order: 99.76% [OK]
Payment: 100.00% [OK]
Order-Status: 100.00% [OK]
Delivery: 100.00% [OK]
Stock-Level: 100.00% [OK]


2904.000 TpmC
— TpmC结果值(每分钟事务数,该值是第一次统计结果中的新订单事务数除以总耗时分钟数,eg:(2897+7)/1 = 2904.000;

MySQL EXPLAIN

explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。

使用方法,在select语句前加上explain就可以了:

如:

  1. explain select surname,first_name form a,b where a.id=b.id

EXPLAIN列的解释:

table:显示这一行的数据是关于哪张表的

type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL

possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句

key: 实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引

key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好

ref:显示索引的哪一列被使用了,如果可能的话,是一个常数

rows:MYSQL认为必须检查的用来返回请求数据的行数

Extra:关于MYSQL如何解析查询的额外信息。将在表4.3中讨论,但这里可以看到的坏的例子是Using temporary和Using filesort,意思MYSQL根本不能使用索引,结果是检索会很慢

extra列返回的描述的意义

Distinct:一旦MYSQL找到了与行相联合匹配的行,就不再搜索了

Not exists: MYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,就不再搜索了

Range checked for each Record(index map:#):没有找到理想的索引,因此对于从前面表中来的每一个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一

Using filesort: 看到这个的时候,查询就需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行

Using index: 列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候

Using temporary 看到这个的时候,查询需要优化了。这里,MYSQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上

Where used 使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题不同连接类型的解释(按照效率高低的顺序排序)

system 表只有一行:system表。这是const连接类型的特殊情况

const:表中的一个记录的最大值能够匹配这个查询(索引可以是主键或惟一索引)。因为只有一行,这个值实际就是常数,因为MYSQL先读这个值然后把它当做常数来对待

eq_ref:在连接中,MYSQL在查询时,从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用

ref:这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中读出。这个类型严重依赖于根据索引匹配的记录多少—越少越好

range:这个连接类型使用索引返回一个范围中的行,比如使用>或<查找东西时发生的情况

index: 这个连接类型对前面的表中的每一个记录联合进行完全扫描(比ALL更好,因为索引一般小于表数据)

ALL:这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免

mysql> explain select * from user where user=’root’\G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: user

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 5

Extra: Using where

1 row in set (0.00 sec)

SHOW PROCESSLIST介绍和使用

processlist命令的输出结果显示了有哪些线程在运行,可以帮助识别出有问题的查询语句,两种方式使用这个命令。
1.      进入mysql/bin目录下输入mysqladmin processlist;
2.      启动mysql,输入show processlist;
如果有SUPER权限,则可以看到全部的线程,否则,只能看到自己发起的线程(这是指,当前对应的MySQL帐户运行的线程)。

mysql> show processlist

-> ;

+—-+——-+———————-+——+———+——+——-+——————+

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

+—-+——-+———————-+——+———+——+——-+——————+

| 34 | ucjmh | 192.168.56.101:54031 | NULL | Query   |    0 | NULL  | show processlist |

+—-+——-+———————-+——+———+——+——-+——————+

1 row in set (0.00 sec)

mysql> exit

Bye

[root@ucjmh ~]# mysql -uroot -poracle

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 35

Server version: 5.5.41-log Source distribution

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql> show processlist;

+—-+——+———–+——+———+——+——-+——————+

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

+—-+——+———–+——+———+——+——-+——————+

| 35 | root | localhost | NULL | Query   |    0 | NULL  | show processlist |

+—-+——+———–+——+———+——+——-+——————+

1 row in set (0.00 sec)

各列的含义和用途:

id,标识会话id 类似于oracle中的sid,你要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语句就显示不全,但是一个判断问题语句的重要依据。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已经处理完了所有待处理的插入操作,正在等待新的请求。
大部分状态对应很快的操作,只要有一个线程保持同一个状态好几秒钟,那么可能是有问题发生了,需要检查一下。
这个命令中最关键的就是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已经处理完了所有待处理的插入操作,正在等待新的请求。
大部分状态对应很快的操作,只要有一个线程保持同一个状态好几秒钟,那么可能是有问题发生了,需要检查一下。

在mysql的官方文档中列出了所有可能的状态。

8.14.2 General Thread States

  •  After createThis occurs when the thread creates a table (including internal temporary tables), at the end of the function that creates the table. This state is used even if the table could not be created due to some error.
  •  AnalyzingThe thread is calculating a MyISAM table key distributions (for example, forANALYZE TABLE).
  •  checking permissionsThe thread is checking whether the server has the required privileges to execute the statement.
  •  Checking tableThe thread is performing a table check operation.
  •  cleaning upThe thread has processed one command and is preparing to free memory and reset certain state variables.
  •  closing tablesThe thread is flushing the changed table data to disk and closing the used tables. This should be a fast operation. If not, you should verify that you do not have a full disk and that the disk is not in very heavy use.
  •  converting HEAP to MyISAMThe thread is converting an internal temporary table from a MEMORY table to an on-disk MyISAM table.
  •  copy to tmp tableThe thread is processing an ALTER TABLE statement. This state occurs after the table with the new structure has been created but before rows are copied into it.
  •  Copying to group tableIf a statement has different ORDER BY and GROUP BY criteria, the rows are sorted by group and copied to a temporary table.
  •  Copying to tmp tableThe server is copying to a temporary table in memory.
  •  Copying to tmp table on diskThe server is copying to a temporary table on disk. The temporary result set has become too large (see Section 8.4.4, “How MySQL Uses Internal Temporary Tables”). Consequently, the thread is changing the temporary table from in-memory to disk-based format to save memory.
  •  Creating indexThe thread is processing ALTER TABLE ... ENABLE KEYS for a MyISAMtable.
  • Creating sort indexThe thread is processing a SELECT that is resolved using an internal temporary table.
  •  creating tableThe thread is creating a table. This includes creation of temporary tables.
  •  Creating tmp tableThe thread is creating a temporary table in memory or on disk. If the table is created in memory but later is converted to an on-disk table, the state during that operation will be Copying to tmp table on disk.
  •  deleting from main tableThe server is executing the first part of a multiple-table delete. It is deleting only from the first table, and saving columns and offsets to be used for deleting from the other (reference) tables.
  •  deleting from reference tablesThe server is executing the second part of a multiple-table delete and deleting the matched rows from the other tables.
  •  discard_or_import_tablespaceThe thread is processing an ALTER TABLE ... DISCARD TABLESPACE or ALTER TABLE ... IMPORT TABLESPACE statement.
  •  endThis occurs at the end but before the cleanup of ALTER TABLECREATE VIEWDELETEINSERTSELECT, or UPDATE statements.
  •  executingThe thread has begun executing a statement.
  •  Execution of init_commandThe thread is executing statements in the value of the init_command system variable.
  •  freeing itemsThe thread has executed a command. Some freeing of items done during this state involves the query cache. This state is usually followed by cleaning up.
  •  Flushing tablesThe thread is executing FLUSH TABLES and is waiting for all threads to close their tables.
  •  FULLTEXT initializationThe server is preparing to perform a natural-language full-text search.
  •  initThis occurs before the initialization of ALTER TABLEDELETEINSERT,SELECT, or UPDATE statements. Actions taken by the server in this state include flushing the binary log, the InnoDB log, and some query cache cleanup operations.

    For the end state, the following operations could be happening:

    • Removing query cache entries after data in a table is changed
    • Writing an event to the binary log
    • Freeing memory buffers, including for blobs
  •  KilledSomeone has sent a KILL statement to the thread and it should abort next time it checks the kill flag. The flag is checked in each major loop in MySQL, but in some cases it might still take a short time for the thread to die. If the thread is locked by some other thread, the kill takes effect as soon as the other thread releases its lock.
  •  LockedThe query is locked by another query.
  •  logging slow queryThe thread is writing a statement to the slow-query log.
  •  NULLThis state is used for the SHOW PROCESSLIST state.
  •  loginThe initial state for a connection thread until the client has been authenticated successfully.
  •  Opening tablesOpening tableThe thread is trying to open a table. This is should be very fast procedure, unless something prevents opening. For example, an ALTER TABLE or aLOCK TABLE statement can prevent opening a table until the statement is finished. It is also worth checking that your table_cache value is large enough.
  •  optimizingThe server is performing initial optimizations for a query.
  •  preparingThis state occurs during query optimization.
  •  Purging old relay logsThe thread is removing unneeded relay log files.
  •  query endThis state occurs after processing a query but before the freeing itemsstate.
  •  Reading from netThe server is reading a packet from the network.
  •  Removing duplicatesThe query was using SELECT DISTINCT in such a way that MySQL could not optimize away the distinct operation at an early stage. Because of this, MySQL requires an extra stage to remove all duplicated rows before sending the result to the client.
  •  removing tmp tableThe thread is removing an internal temporary table after processing a SELECT statement. This state is not used if no temporary table was created.
  •  renameThe thread is renaming a table.
  •  rename result tableThe thread is processing an ALTER TABLE statement, has created the new table, and is renaming it to replace the original table.
  •  Reopen tablesThe thread got a lock for the table, but noticed after getting the lock that the underlying table structure changed. It has freed the lock, closed the table, and is trying to reopen it.
  •  Repair by sortingThe repair code is using a sort to create indexes.
  •  Repair doneThe thread has completed a multi-threaded repair for a MyISAM table.
  •  Repair with keycacheThe repair code is using creating keys one by one through the key cache. This is much slower than Repair by sorting.
  •  Rolling backThe thread is rolling back a transaction.
  •  Saving stateFor MyISAM table operations such as repair or analysis, the thread is saving the new table state to the .MYI file header. State includes information such as number of rows, the AUTO_INCREMENT counter, and key distributions.
  •  Searching rows for updateThe thread is doing a first phase to find all matching rows before updating them. This has to be done if the UPDATE is changing the index that is used to find the involved rows.
  • Sending dataThe thread is reading and processing rows for a SELECT statement, and sending data to the client. Because operations occurring during this this state tend to perform large amounts of disk access (reads), it is often the longest-running state over the lifetime of a given query.
  •  setupThe thread is beginning an ALTER TABLE operation.
  •  Sorting for groupThe thread is doing a sort to satisfy a GROUP BY.
  •  Sorting for orderThe thread is doing a sort to satisfy a ORDER BY.
  •  Sorting indexThe thread is sorting index pages for more efficient access during a MyISAMtable optimization operation.
  •  Sorting resultFor a SELECT statement, this is similar to Creating sort index, but for nontemporary tables.
  •  statisticsThe server is calculating statistics to develop a query execution plan. If a thread is in this state for a long time, the server is probably disk-bound performing other work.
  •  System lockThe thread is going to request or is waiting for an internal or external system lock for the table. If this state is being caused by requests for external locks and you are not using multiple mysqld servers that are accessing the same MyISAM tables, you can disable external system locks with the --skip-external-locking option. However, external locking is disabled by default, so it is likely that this option will have no effect. For SHOW PROFILE, this state means the thread is requesting the lock (not waiting for it).
  •  Table lockThe next thread state after System lock. The thread has acquired an external lock and is going to request an internal table lock.
  •  updateThe thread is getting ready to start updating the table.
  •  UpdatingThe thread is searching for rows to update and is updating them.
  •  updating main tableThe server is executing the first part of a multiple-table update. It is updating only the first table, and saving columns and offsets to be used for updating the other (reference) tables.
  •  updating reference tablesThe server is executing the second part of a multiple-table update and updating the matched rows from the other tables.
  •  User lockThe thread is going to request or is waiting for an advisory lock requested with a GET_LOCK() call. For SHOW PROFILE, this state means the thread is requesting the lock (not waiting for it).
  •  Waiting for release of readlockThe thread is waiting for a global read lock obtained by another thread (withFLUSH TABLES WITH READ LOCK) to be released.
  •  Waiting for tablesWaiting for tableThe thread got a notification that the underlying structure for a table has changed and it needs to reopen the table to get the new structure. However, to reopen the table, it must wait until all other threads have closed the table in question.

    This notification takes place if another thread has used FLUSH TABLES or one of the following statements on the table in question: FLUSH TABLEStbl_nameALTER TABLERENAME TABLEREPAIR TABLEANALYZE TABLE, or OPTIMIZE TABLE.

  •  Waiting on condA generic state in which the thread is waiting for a condition to become true. No specific state information is available.
  •  Waiting to get readlockThe thread has issued a FLUSH TABLES WITH READ LOCK statement to obtain a global read lock and is waiting to obtain the lock.
  •  Writing to netThe server is writing a packet to the network.

[root@ucjmh ~]# cat kill_lock.sql
kill 43;
kill 55;
[root@ucjmh ~]# cat locked.txt
43 root localhost hi_db Query 3825 Waiting for table metadata lock insert into t values(4)
55 root localhost NULL Query 0 NULL show processlist
[root@ucjmh ~]# cat ger_lock.sh
#!/bin/bash
rm -rf locked.txt
rm -rf kill_lock.sql
mysql -uroot -poracle -e “show processlist”|grep -i “Query” >> locked.txt;
for line in $(awk ‘{printf $1″\n”}’ locked.txt)
do
echo “kill ${line};”>>kill_lock.sql
done

MySQL隐式转换

mysql> create table users(num int not null, id varchar(30) not null, password varchar(30) not null, primary key(num));

Query OK, 0 rows affected (0.00 sec)

mysql> insert into users values(1, ‘admin’, ‘ad1234’);

Query OK, 1 row affected (0.00 sec)

mysql> insert into users values(2, ‘wh1ant’, ‘wh1234’);

Query OK, 1 row affected (0.00 sec)

mysql> insert into users values(3, ‘secuholic’, ‘se1234’);

Query OK, 1 row affected (0.00 sec)

mysql> select * from users where id=0;

+—–+———–+———-+

| num | id        | password |

+—–+———–+———-+

|   1 | admin     | ad1234   |

|   2 | wh1ant    | wh1234   |

|   3 | secuholic | se1234   |

+—–+———–+———-+

3 rows in set, 3 warnings (0.00 sec)

mysql> show warnings

-> ;

+———+——+———————————————–+

| Level   | Code | Message                                       |

+———+——+———————————————–+

| Warning | 1292 | Truncated incorrect DOUBLE value: ‘admin’     |

| Warning | 1292 | Truncated incorrect DOUBLE value: ‘wh1ant’    |

| Warning | 1292 | Truncated incorrect DOUBLE value: ‘secuholic’ |

+———+——+———————————————–+

3 rows in set (0.00 sec)

mysql> select * from users where id=’0′;

Empty set (0.00 sec)

mysql> select * from users where 0=id;

+—–+———–+———-+

| num | id        | password |

+—–+———–+———-+

|   1 | admin     | ad1234   |

|   2 | wh1ant    | wh1234   |

|   3 | secuholic | se1234   |

+—–+———–+———-+

3 rows in set, 3 warnings (0.00 sec)

mysql> insert into users values(‘ucjmh’,’ucjmh’,’ucjmh’);

Query OK, 1 row affected, 1 warning (0.00 sec)

mysql> show warnings;

+———+——+————————————————————+

| Level   | Code | Message                                                    |

+———+——+————————————————————+

| Warning | 1366 | Incorrect integer value: ‘ucjmh’ for column ‘num’ at row 1 |

+———+——+————————————————————+

1 row in set (0.00 sec)

mysql> select * from users;

+—–+———–+———-+

| num | id        | password |

+—–+———–+———-+

|   0 | ucjmh     | ucjmh    |

|   1 | admin     | ad1234   |

|   2 | wh1ant    | wh1234   |

|   3 | secuholic | se1234   |

+—–+———–+———-+

4 rows in set (0.00 sec)

如果是在oracle中直接会报ora-01722

MySQL查询当前版本

1.使用Mysql -V
[root@ucjmh ~]# mysql -V
mysql Ver 14.14 Distrib 5.5.41, for Linux (i686) using readline 5.1
2.在mysql中输入命令–>status
mysql> status
————–
mysql Ver 14.14 Distrib 5.5.41, for Linux (i686) using readline 5.1

Connection id: 25
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ”
Using delimiter: ;
Server version: 5.5.41 MySQL Community Server (GPL)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
UNIX socket: /var/lib/mysql/mysql.sock
Uptime: 3 hours 4 min 36 sec

Threads: 2 Questions: 161 Slow queries: 0 Opens: 78 Flush tables: 3 Open tables: 24 Queries per second avg: 0.014
3.在help中找到
[root@ucjmh ~]# mysql –help | grep Distrib
mysql Ver 14.14 Distrib 5.5.41, for Linux (i686) using readline 5.1

4.使用version()函数
mysql> select version();
+———–+
| version() |
+———–+
| 5.5.41 |
+———–+
1 row in set (0.00 sec)

MySQL学习9–MySQL5.1的备份恢复

使用mysqldump工具备份
  1. mysql client is a backup program,it can be used to dump a database or a collection of databases for backup or for transferring the data to another SQL server(not necessarily a mysql server).The dump contains Sql statements to create the table or populate it, or both;
  2. 它可以导出所有的数据库,指定的一个或者几个数据库,或者一张表;
  3. mysqldump可以备份本地的或者远程的服务器,导出的文件包含CREATE TABLE和INSERT语句用于重新创建表,服务器发送表内容到mysqldump程序,它把文件写到客户端;
  4. 它可以备份各种引擎的表;
  5. 导出的文件是文本文件,所以有很强的灵活性,可以被用于在不同的服务器上;
mysqldump的参数
  1. -A,–all-databases:导出所有的数据库,跟使用–databases后面跟上所有的数据库是一样的;
  2. –add-drop-database:在创建数据库前添加drop database的语句;
  3. –add-drop-table:在创建表之前添加drop table语句;
  4. –add-locks:在插入语句前加锁;
  5. –allow-keywords:创建的列允许使用关键字;
  6. -i,–comments:写入附加信息,即添加注释;
  7. -c,–complete-insert:使用完全插入语句,个人觉得还是-e参数好,数据量小用-e,数据量大用-c;
  8. -B,–databases:备份多个数据库,把要备份的数据库跟在参数后面即可,当前数据库也会被包涵进来;
  9. –delete-master-logs:备份完成后删除主机日志,自动打开–master-data选项;
  10. -e,–extended-insert:使用multiple-row INSERT语句,即一个insert语句后面有多个值的列表,这是一种更高效的插入方式;
  11. -F,–flush-logs:开始备份前切换一下日志,如果你一次备份多个数据库(使用–databases或者–all-databases选项时),则在备份每个数据库前都会切换日志.当使用–lock-all-tables or –master-data时,日志只会被切换一次,因为此时所有的表都被锁住,数据库保持一致.所以当你想要备份和日志组切换同时发生时,要用–lock-all-tables or –master-data和–flush-logs一起使用;
  12. -h,–host=name:连接到主机;-u,–user-name:用户名;-p,–password:用户密码;
  13. –ignore-table=name:不备份指定的表,如果要指定多个表,则要数据库和表明一起指定,如:–ignore-table=database.table;
  14. -x,–lock-all-tables:会锁住所有数据库的表,会在备份期间加全局只读锁,自动关闭–single-transaction和–lock-tables选项;
  15. –master-data[=#]:使得二进制日志的位置和和名称被添加到输出文件中,如果等于1,会像CHANGE MASTER命令一样打印它,如果等于2,命令会以注释的形式出现.这个选项会打开–lock-all-table选项,除非–single-transaction选项也被指定(此时全局只读锁知会在开始备份时有效),可以通过show master status命令查看当前日志信息,在恢复和复制功能时有用.
  16. -n,–no-create-db:不包括创建数据库的语句;
  17. -t,–no-create-info:不包括创建表结构语句;
  18. -d,–no-data:只包含表定义,不包含表数据;
  19. –order-by-primary:使每个表中的记录按照主键排序,如果没有主键,则使用第一个唯一索引.当导出一个MyISAM表到一个InnoDB表时有用,但是会延长导出时间;
  20. –quick:不缓存query,直接导出到标准输出;
  21. -R,–routines:导出stored routines(存储过程和函数);
  22. –single-transaction:在一个事务中创建一个一致性的快照,只在支持多版本控制的引擎中起作用,目前只有innodb引擎.当–single-transaction进程工作时,为了保持数据一致性,则不能使用ALTER TABLE,DROP TABLE,RENAME TABLE,TRUNCATE TABLEY语句,此选项自动关闭–lock-tables选项;
  23. –opt:与同时指定–add-drop-table, –add-locks, –create-options, –quick, –extended-insert, –lock-tables, –set-charset, and –disable-keys相同.默认开启,要关闭使用–skip-opt;
  24. -w,–where=name:只导出选择的记录;
如何使用mysqldump备份
  1. 非事务表的一致备份:mysqldump –opt –lock-all-tables –master-data=2 -B db_name1 db_name2 > /tmp/backup.sql,备份时表是只读的;
  2. 事务表的一致备份:mysqldump –opt –single-transaction –master-data=2 -B db_name1 db_name2 > /tmp/backup.sql,备份时表是可读写的;
mysqlbinlog工具
  1. 服务器生成的binary log files是二进制文件,想要查看这些文件,必须使用mysqlbinlog工具.还可以使用mysqlbinlog工具读取复制功能slave服务器产生的relay log files,它和二进制日志有相同的结构;
  2. 用法:mysqlbinlog [options] log-files;
mysqlbinlog的参数
  1. -d,–database=name:列出某一个数据库的日志,只用于本地日志;
  2. -f,–force-read:如果mysqlbinlog读到它不能识别的二进制日志,会打印警告而忽略该事件并继续,如果没有该事件则停止;
  3. -o,–offset=#:忽略前N个实体;
  4. -R,–read-from-remote-server:从远程服务器读取二进制日志,如果没有指定此选项,则–host, –user, –password, –port, –protocal, –socket选项都被忽略;
  5. -r,–result-file=name:直接输出到给定的文件;
  6. –start-datetime=time:读取二进制日志的生成开始时间,可以使用任何mysql服务器的时间格式,datetime和timestamp类型,如:’YYYY-MM-DD HH24:MI:SS’;
  7. –stop-datetime=time:读取二进制日志的生成结束时间;
  8. -j,–start-position=#:读取二进制日志的生成开始位置,是一个整型参数;
  9. –stop-position=#:读取二进制日志的生成结束位置,一个整型参数;
  10. -t,–to-last-log:在mysql服务器中请求的二进制日志结尾处不停止,而是继续打印直到最后一个二进制日志的结尾,如果将输出发送给同一台mysql服务器,会导导致无限循环,要与–read-from-remote-server连用;
  11. -D,–disable-log-bin:禁用二进制日志,如果使用–to-last-logs选项将输出发送给同一台mysql服务器,可以避免无限循环,该选项在崩溃恢复也很有用,可以避免复制已经记录的语句;
binlog解读
  1. 二进制日志记录的方式与binlog_format参数有关;
  2. 查看binlog的语法:? binlog;
  3. 记录的内容有:时间戳, 主机server id, 时间结束位置, 时间对象, 时间标志位, 内部binlog命令和相关注释;
mysql数据库的备份与恢复
  1. 只备份routines(存储过程和函数,-R参数,在information_schema.routines表中)和events(作业,-E参数,在information_schema.events表中)信息:mysqldump -n -t -d -R -E > /tmp/routines.sql;
  2. 备份表结构,视图,函数,存储过程和作业的信息:mysqldump -d -R -E -S /mysql/logs/mysqld.sock –databases db_name > /tmp/objects.sql;
  3. 备份数据库test,包括视图信息:mysqldump –opt –lock-all-tables -R -E –master-data=2 -B test > /tmp/test_backup.sql;(查看当前二进制日志的名称和位置:show master logs;);                                                       
  4. 对表进行修改,然后删除:
    1. insert into t values(1, now());
    2. insert into t values(2, now());
    3. insert into t values(3, now());
    4. drop table t;
  5. 查看表删除的位置:mysql>show binlog events;如果要查询某一个日志文件中的内容使用:show binlog events in ‘binlog file name’;                     
  6. 查看表备份文件的位置:grep “CHANGE MASTER” /tmp/test_backup.sql;                           
  7. 还原数据库:mysql < /tmp/test_backup.sql;直接执行备份的脚本文件,还原到备份的状态;
  8. 恢复数据库(注意mysqlbinlog的版本,应该使用mysql basedir下的mysqlbinlog):mysqlbinlog –start-position=117 –stop-position=480 /path/mysql-bin.000001 | mysql; 可以使用–disable-log-bin:禁用二进制日志;                                                   
  9. 建议把备份的数据库恢复到测试服务器,然后把数据导入到生产环境;
表结构的复制
  1. 第一种做法是:CREATE TABLE table_name AS SELECT * FROM tb_name;
    1. 可以复制表接口和表中数据,如果只想要表接口可以加一个false的过滤;
    2. 但是会丢失表中列上面的属性(如自增属性)和索引(主外键);
  2. 第二种做法是:CREATE TABLE table_name(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY) SELECT * FROM table_name;
    1. 可以在创建表时指定所有的属性,并同步数据;
    2. 但是语法太麻烦;
  3. 第三种做法是:CREATE TABLE table_name LIKE table_name;
    1. 只复制表结构,而且保留列的属性和索引;
    2. 如果想要数据的话可以INSERT table_name SELECT * FROM table_name;

MySQL学习8–MySQL5.1的用户管理

用户管理:我们可以定义一个account访问和控制mysql服务器.在MYSQL服务器中,account包含两部分,用户名和主机名.也就是说,当连接到服务器时,除了要检查用户名还要检查连接进来的主机.一个隐式的概念就是说用户名相同但是主机名不同的account是不同的account;
Mysql可以支持的权限类型
  1. 管理权限
    1. CREATE TEMPORARY TABLES:创建临时表;
    2. CREATE USER:创建/删除/重命名账户;
    3. FILE:在sql语句中读写操作系统的文件;
    4. LOCK TABLES:锁表;
    5. PROCESS:查看进程的活动状态;
    6. RELOAD:重新加载,FLUSH OR RESET;
    7. REPLICATION CLIENT:作为复制功能的主机;
    8. REPLICATION SLAVE:作为复制功能的备机;
    9. SHOW DATABASES:查看数据库名称;
    10. SHUTDOWN:关闭服务器;
    11. SUPER:各种管理操作;
  2. 数据访问权限
    1. ALTER:修改表结构,alter table;
    2. ALTER ROUTINE:修改或者删除存储过程和函数;
    3. CREATE:创建数据库或者表;
    4. CREATE ROUTINE:创建存储过程或者函数;
    5. CREATE VIEW:创建视图;
    6. DELETE:删除表中数据;
    7. DROP:删除数据库或者表;
    8. EXECUTE:执行函数或者过程;
    9. GRANT OPTION:授权给其它账户;
    10. INDEX:创建/删除索引;
    11. INSERT:向表中插入记录;
    12. SELECT:查询表的记录;
    13. SHOW VIEW:查看视图定义,show create view;
    14. UPDATE:更新表的记录:
  3. 特殊的权限
    1. ALL and ALL PRIVILEGES:即’all privileges except grant option’,授予账户除了把权限赋予其它帐号外的所有权限;
    2. USAGE:即没有任何权限,但是它可以连接到数据库上,也在user表中生成一条记录.这类账户的存在就是为了执行向’show variables’ or ‘show status’这类的语句,也不能查看表的内容;
  4. 权限的级别
    1. 所有的权限都可以被授予全局的,一个账户拥有全局权限,它可以在任何数据库任何时间使用此权限.一般只授予管理员这样的权限;
    2. 一些权限可以被授予特定的数据库:ALTER, CREATE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, GRANT OPTION, IDEX, INSERT, LOCK TABLES, SELECT, SHOW VIEW and UPDATE.一个数据库级别的权限可以应用于所有的tables和routines;
    3. 一些权限可以被授予特定的表:ALERT, CREATE, DELETE, DROP, GRANT OPTION, INDEX, INSERT, SELECT and UPDATE.一个标记别的权限可以应用于表中所有的列;
    4. 一些权限可以被授予表中的列:INSERT, SELECT and UPDATE;
    5. 一些权限可以被授予函数和存储过程:EXECUTE, ALTER ROUTINE and GRANT OPTION;
授权表
  1. 在mysql数据库中有几张授权表包含了服务器大部分的访问控制信息,它们包含了哪些是合法的账户和这些账户拥有的访问级别的信息;
  2. user:每一个账户在user表包含一条记录,它记录了用户拥有的全局的权限,也包含了一些其它信息,比如:使用资源的限制,客户端连接进来是否需要使用SSL链接;
  3. db:列出了账户对指定数据库的权限;
  4. tables_priv:列出了账户对指定表的权限;
  5. columns_priv:列出了账户对指定列的权限;
  6. procs_priv:列出了账户对存储过程和函数的权限;
  7. 服务器使用授权表中的信息决定是否允许客户端连接进来,也决定了客户端是否有权限执行某些语句,mysql服务器每次启动时都把授权信息载入到内存,以加快读取权限的速度,在一下两种情况下会刷新权限表的内存拷贝:
    1. 使用CREATE USER, GRANT, REVOKE or SET PASSWORD语句修改磁盘上的账户信息;
    2. 也可以显式的重新加载这些表使用FLUSH PRIVILEGES语句,执行mysqladmin flush-privileges or mysqladmin reload命令;
管理用户
  1. 查看当前的用户:
    1. select user();
    2. select current_user();
    3. show grants:查看当前用户权限信息;
    4. show grants for ‘user’@’host’:查看某个用户的权限信息;
    5. show processlist:查看当前连接进来用户的信息;
  2. create user创建一个用户(可选的指定密码,不指定的话为null),这个语句在user表中创建一条记录.它没有授予任何权限,可以之后使用grant语句.eg:create user ‘user’@’host’ identified by ‘password’;
  3. drop user回收一个账户的所有权限,并且删除这个账户.这会删除所有授权表中跟这个账户有关的信息,如果要收回用户权限而不删除用户要使用revoke语句.eg:drop user ‘user’@’host’;
  4. rename user改变一个现有账户的用那个户名,可以修改用户名或者主机名的任意一部分,或者两部分都修改.eg:rename user ‘user’@’host’ to ‘user’@’host’;
  5. 创建一个匿名账户,不需要用户名和密码即可登录,比较危险.eg:insert into user(host, user, password) values(‘%’, ”, ”);
  6. 修改用户的密码:set password for ‘u1’@’%’=password(‘u1’);
  7. 授权语句:grant privileges on objects to ‘user’@’host’ identified by ‘password’;
    1. on *.*:全局权限,所有的对象,eg:grant all privileges on *.* to ‘u1’@’%’ identified by ‘u1’ with grant option;
    2. on db_name.*:对数据库的权限,eg:grant select, update on test.* to ‘u1’@’localhost’;
    3. on db_name.tbl_name:数据库中表的权限,eg:grant select on mysql.user to ‘u1’@’localhost’;
    4. on db_name.tbl_name.col_name:数据库中表的列的权限,eg:grant select(host, user) on mysql.user to ‘u1’@’%’;
    5. on db_name.routine_name:数据库中routine的权限;
  8. 要添加用户并授权一般使用:grant 权限1,权限2,… on 数据库.表 to “username”@”host” identified by “password”;(创建用户的同时授予权限)
    1. grant all privileges on *.* to “user1″@”%” identified by “pwd”:表示对user1授予所有数据库中所有表的所有权限,并可以从任意客户端连接进来;
    2. grant select,insert,delete,update on mysql.user to “user1″@”192.168.0.1” identified by “pwd”:表示对用户user1授予mysql数据库的user表增删改查权限,并且只能从192.168.0.1客户端连接进来;
    3. host列为%表示可以从任意的客户端连接到服务器端;
    4. 一般在开发的时候使host为%,在生产环境修改host的地址;
  9. 回收权限:revoke prilileges on objects from ‘user’@’host’;
    1. 回收全局权限:revoke all privileges, grant option from ‘u1’@’%’;
    2. 回收数据库的权限:revoke select, grant option on mysql.* from ‘u1’@’%’;
    3. 回收表的权限:revoke select on mysql.user from ‘u1’@’%’;
    4. 回收列的权限:revoke select(host, user) on mysql.user from ‘u1’@’%’;
  10. 限制用户资源:默认情况下对客户端连进来的次数,查询次数等资源没有限制,grant语句可以对账户以下几个方面的资源做限制:
    1. 每个小时允许连到服务器的次数:max_connections;
    2. 每个小时允许查询的次数:max_questions;
    3. 每个小时允许更新的次数:max_updates;
    4. 用户的并发连接数:max_user_connections;
    5. 语句:grant all privileges on *.* to ‘u1’@’%’ identified by ‘u1’ with max_queries_per_hour 10 max_updates_per_hour 5 max_connections_per_hour 5 max_user_connections 8;
  11. 忘记用户密码
    1. Linux中的处理方法:
      1. 关闭服务器或者kill掉mysqld的进程;
      2. 使用–skip-grant-tables选项登录,启动服务器并跳过授权表
      3. 使用mysql登录,可以不用使用用户名和密码,并且有全部权限;
      4. 登录之后修改密码(set password for u1@’%’=password(‘pwd’)),或者直接更新mysql.user表密码字段为空即可;
    2. Windows中的处理方法:
      1. 停止mysql的服务:net stop mysql;
      2. 到mysql的bin目录下执行mysqld -nt –skip-grant-tables;
      3. 到新的命令行下执行mysqladmin -uroot flush-privileges password ‘pwd’;
      4. 然后关闭mysql服务:mysqladmin -uroot -p shutdown,此时输入刚刚设置的密码;
      5. 启动mysql服务:net start mysql;

MySQL学习7–MySQL5.1的存储引擎

MySql Storage Engines

  1. 存储引擎的概述
    1. MySql服务器管理的表都有一些相似之处:比如,数据库中每一个表在数据库目录都有一个format file(.frm),这个文件存储着表定义的结构,他是由服务器创建;
    2. 这些表也有一些不同之处:就是可以使用不同的存储引擎去管理表.每个存储引擎都有一系列的特点.比如每一个引擎都会创建一个额外的和.frm文件相对应的磁盘文件去管理数据和索引的存储.每个存储引擎也都会有自己的特点,比如有的会使用锁去管理查询竞争,有的会提供事务而有的没有事务.这些存储引擎属性都影响着查询的性能,并发和预防死锁.
  2. 如何使用CREATE TABLE语句显式指定存储引擎
    1. 查看CREATE TABLE的语法:? CREATE TABLE;
    2. 指定存储引擎:CREATE TABLE t (id integer) ENGINE=engine_name;
    3. 查看表使用了哪种引擎:
      1. 查询表结构:show create table table_name \G;
      2. 查询表信息:show table status like ‘table_name’ \G;
      3. 查询表所在数据库中所有表的信息:show table status from db_name \G;
      4. information_schema数据库存放了数据库的架构信息,可以查询tables表获得表的信息:use information_schema;select * from tables where table_name = ‘table_name’ \G;
    4. 查看服务器上支持的存储引擎
      1. show engines;
      2. show variables like ‘hava%’;
  3. MyISAM
    1. 在硬盘上MyISAM引擎用三种文件管理表,这些文件都在数据目录中
      1. .frm文件:存储表结构的定义;
      2. .MYD文件:存储表行的内容;
      3. .MYI文件:存储表的索引;
    2. 在操作系统上支持链接文件的特性,可以把数据文件和索引文件存放在不同的磁盘上以减小I/O;
      1. 查看当前服务器指定的默认存储引擎:show variables like ‘storage_engine’;
      2. 通过查看CREATE TABLE的帮助(? CREATE TABLE),我们可以看到,可以通过指定DATA DIRECTORY和INDEX DIRECTORY选项来把数据文件和索引文件存放在不同的目录;
        1. 创建存放数据文件和索引文件的目录:mkdir -p /tmp/mysql/data /tmp/mysql/index;
        2. 修改文件的权限:chown -R mysql:mysql /tmp/mysql;
        3. 创建表,并指定数据文件和索引文件的目录:CREATE TABLE t (id INTEGER) ENGINE=MyISAM DATA DIRECTORY=’/tmp/mysql/data’ INDEX DIRECTORY=’/tmp/mysql/index’;
        4. 此时就会在数据文件下创建真正数据文件和索引文件的链接;
        5. 有没有参数可以指定缺省的目录,每次创建表都去指定太费劲了吧;??????
        6. 分区表指定数据文件和索引文件;???????
    3. MyISAM与其它引擎相比具有最灵活的AUTO_INCREMENT COLUMN功能,自动增长列;
      1. 创建自动增长列:create table t(id integer auto_increment primary key, name varchar(50));
      2. 使用自动增长列(auto_increment),此列必须是主键或者是主键中的一列;
      3. 插入时可以指定id列也可以不指定,如果指定的话就插入指定的值,如果不指定则插入比当前最大值大1的值,即max(id)+1;
      4. 获得上次插入的id值使用last_insert_id()函数:select last_insert_id();
      5. 设置自动增长id的初始值:alter table table_name auto_increment=n;但是如果这是的n小于max(id)则不生效;
      6. 为一个已存在的表增加一个自增长列:alter table table_name add column col_name integer auto_increment not null, add primary key(id);
    4. 不支持事务
      1. 查看自动提交事务的选项:show variables like ‘autocommit’;
      2. 修改此选项:set session autocommit=0|1;
      3. 因为不支持事务,所以不管此选项为何值,都不能commit和rollback;
    5. MyISAM的表可以被转换成一个fast,compressed,read-only的表从而节省空间
      1. 使用myisampack工具:mysqlpack –help;
      2. 进入到数据文件目录:myisampack table_name;                                                          
      3. 观察发现压缩比例为90%,只剩下10%的数据量大小;对指定DATA DIRECTORY和INDEX DIRECTORY选项的表同样使用,亲测;
      4. 重启之后检测表(check table table_name)就会发生错误,表内数据丢失,对只读的性能支不好,如果使用的话,压缩完之后一定要备份;
    6. MyISAM支持FULLTEXT索引和spatial数据类型,全文索引和空间数据类型
      1. 对全文索引支持不够好,可以使用instr()函数去实现;
      2. 也可以使用第三方的插件去实现;
    7. MyISAM引擎对锁的支持
      1. MySql管理使用MyISAM引擎的表之间的查询竞争使用表级的锁,这使得查询的性能非常快,多个查询可以同时访问一张表.对于写操作,会使用一个exclusive的表级锁去阻止其它读写操作.虽然表级锁会影响点性能,但是不会发生死锁;
      2. 显式的对表加锁:lock table table_name lock_type; lock tables table_name1 lock_type, table_name2 lock_type;
      3. 解锁:unlock tables;
      4. 如果在session中加write锁,则本session可以进行读写操作,其它的session对表进行读和写就需要等待锁释放;
      5. 如果在session中加read锁,则本session和其它session都可以进行读操作,本session无法进行写操作,其它的session对表进行读和写就需要等待锁释放;
      6. 如果在session中加read local锁,即只锁住加锁前一时刻的表的数据,则本session可以进行读操作(查到的只是加锁前的数据),但是不能进行写操作,其它session可以进行插入操作(查到的是所有的数据),但是删除和更新操作需要等待锁释放;
    8. 可以通过LOW_PRIORITY和HIGHT_PRIORITY来影响MyISAM表的内部调度机制;可以通过INSERT DELAYED先把表中数据缓存到服务端,等到表不忙的时候再插入;
      1. 一般情况下在OLTP系统中,更新操作优先于查询操作,因为更新操作时间比较短,查询操作时间比较长(所以一般要提升查询操作的优先级,降低更新操作的优先级);要修改查询的优先级使用:SELECT HIGH_PRIORITY * FROM t;修改更新语句的优先级使用:INSERT INTO t VALUES(1);可以使用read local锁做实验,优先级低的无法插入,优先级高可以插入;
      2. 数据延迟插入:INSERT DELAYED INTO t VALUES(1);可以使用write锁来模拟这种情况,不实用delayed则等待,使用就马上返回成功,但是真正插入要等表不忙的时候;当有延迟操作时会产生一个延迟进程,它是一个共用的线程,只有一个;
      3. 查看当前链接到服务器的进程列表:show processlist;杀掉进程:kill id;
      4. 与延迟插入有关的全局变量:show global variables ‘%delayed%’;
        1. delayed_insert_limit:延迟插入时,插入多少条数据后检查是否有查询操作,如果有查询操作,则查询操作先执行;
        2. delayed_insert_timeout:限制延迟操作的等待时间;
        3. delayed_queue_size:定义延迟线程队列的大小,以行为单位;
      5. 与延迟插入有关的全局状态:show global status ‘%delayed%’;
        1. delayed_errors:记录延迟插入错误的次数;
        2. delayed_insert_threads:当前有多少线程在使用延迟操作;
        3. delayed_writes:使用延迟线程插入的记录行数;
    9. 数据表的存储格式是非常的轻便的,因此可以通过直接拷贝表所在的目录到其它的主机以实现对表的备份额迁移
      1. 拷贝时需要注意文件的权限和拥有者,一般指定cp -a选项;
      2. 拷贝表时可能会有缓存,最好能在关闭服务器的情况系进行,以保证数据完整性;(岂不是保障不了高可用性了?)
    10. 可以指定一个MyISAM表最少存储多少条记录,这允许MyISAM表去调整表内部行指针的大小,也可以配置缺省的表内部行指针大小供服务器使用
      1. 在创建表时使用MAX_ROWS和MIN_ROWS选项(? CREATE TABLE),这个值只是一个参考值,实际的数据行数可以大于也可以小于这个值;
      2. 配置系统默认大小使用myisam_data_pointer_size选项:show variables like ‘myisam_data_pointer_size’,这个选项是当创建表时没有使用MAX_ROWS选项时使用,默认为6,不能小于2也不能大于7.它代表可以用几个字节(一个字节是8位)去寻址,指定n,表示2的8n次方,即指定为2,3,4,5,6时依次代表可以存放64K,16M,4G,1T,256T的数据;
      3. 把max_rows设为5,myisam_data_pointer_size范围是2~7,2个字节就足够了(2^16),所以其实就是让myisam是用2个字节的指针,并不是说最多5行.如果把max_rows设置为大于2^16的值,就要用3个字节表示,所以myisam_data_pointer_size会设为3,此时最多存放2^24行.
      4. 如果创建表时指定了max_rows,那么表至受限于最大的行数;如果没有max_rows,则表受限于最大大小;
    11. 导入数据时,可以先禁用掉索引,等到导入数据后再打开索引,这样会加快导入数据的速度.当使用LOAD DATA [LOCAL] INFILE导入数据时,它会自动的禁用和启用索引,以加快导入速度
      1. 查看LOAD DATA [LOCAL] INFILE的帮助:? load data; load data [local] infile file_name into table table_name;
      2. 与LOAD DATA INFILE相对应的是SELECT … INTO OUTFILE,把表中的数据导入到文件中;
      3. 语法:select * from t into outfile ‘/tmp/t.txt’ fields terminated by ‘,’ enclosed by ‘”‘; 字段以[“]包围,字段之间以[,]号分割,默认每行之间以换行分割;
      4. 语法:load data infile ‘/tmp/t.txt’ into table t fields terminated by ‘,’ enclosed by ‘”‘;
    12. 向MyISAM表中添加数据时,如果磁盘空间不足时服务器会挂起操作,直到空间变为可用状态,然后继续完成操作;
    13. MyISAM表的行存储格式
      1. 查看表使用哪种行存储格式:与查看表使用引擎的方式一样,表信息的Row_format字段.
        1. 表中包含有可变长度的列,则表就是Dynamic的;
        2. 表中没有包含可变长度的列,表就是Fixed的;
      2. 固定行存储格式:
        1. 所有的行有固定的大小;
        2. 行存储的位置是在行长度的整数倍的位置,方便查找;
        3. 占用更多的存储空间;
      3. 动态行存储格式:
        1. 行占用动态的长度;
        2. 查看起来不是很高效;
        3. 节省空间;
        4. 更容易产生碎片;
      4. 压缩行存储格式:
        1. 表被压缩以节省空间;
        2. 优化的存储以加快检索;
        3. 表是只读的;
      5. 做实验时可以使用hexdump工具,查看数据文件中实际存放的数据,可以加上-C选项;
      6. 手动像数据表文件中添加数据后不可用,需要经历check table table_name; optimize table table_name; repair table table_name;三个过程,应该是在information_schema库中写入统计信息;
  4. InnoDB
    1. 每一个InnoDB的表在磁盘的数据目录下都有一个.frm文件和存储数据和索引的表空间,InnoDB的表空间是一个逻辑的单存储区域,这个区域由一个或者多个文件组成,还可以使用裸分区.缺省情况下,一个InnoDB的表空间存放所有的InnoDB的表的内容,这种表空间的存储是与机器无关的,根据此特性,我们可以把InnoDB表空间拷贝到其它机器上完成备份和迁移.单个表的最大尺寸可以达到操作系统支持的最大大小.同样可以配置InnoDB使得每个表使用单独的表空间(innodb_file_per_table);
      1. InnoDB引擎的操作需要主要需要两块磁盘资源,一个表空间用来存放数据和索引,一系列的日志文件用来记录当前活动的日志;
      2. 每个InnoDB表都有一个.frm文件,这一点与其它的存储引擎相同.然而不同的是,InnoDB存储数据和索引在共享表空间,这是一个或者多个单独的逻辑存储区域,所有的InnoDB表都存储在一个表空间中.这个表空间也包含一个rollback节,事务修改记录的信息和undo日志信息都存储在这个节中,这些信息用于回复失败的事务;
      3. 在共享表空间的文件可以设置为自动增长,因为共享表空间保存着所有数据库中所有的InnoDB表,所以共享表空间文件默认存放在服务器的数据目录下,而不是某一个数据库目录下;
      4. 如果不想使用共享表空间存储表的内容,可以打开innodb_file_per_table选项,这样,对于每一个InnoDB表都会生成一个.idb的文件存放数据和索引和一个.frm文件保存表结构.但是共享表空间仍然是必须的,因为它要保存InnoDB的数据字典和rollback节.使用此选项不影响以前创建在共享表空间中的表;
    2. InnoDB引擎支持事务,可以使用commit和rollback,它遵循ACID机制,由于多版本控制(Multi-versioning),每个事务之间是互补影响的;
      1. ACID
        1. Atomic:整个事务事务中的所有的操作要不全都成功,要不全都取消;
        2. Consistent:在事务开始之前和事务结束以后,数据的完整性约束没有被破坏;
        3. Isolated:两个事务的执行是互不干扰的;
        4. Durable:事务完成以后,该事务对数据库所有的操作便持久的保存在数据库中,不会被回滚;
      2. 事务模型
        1. 显式的关闭自动提交功能:set autocommit=0;
        2. 开启一个事务:start transaction;
    3. 当MySql服务器或者主机crash之后,InnoDB提供了自动回复机制;
    4. MySql管理InnoDB的查询竞争使用多版本控制和行级锁,多版本控制是的每个事务都有一个单独是数据库界面;而行级锁使得查询竞争减小到最小,这使得多查询写入的时候效率最高,但是会导致死锁;
    5. InnoDB支持外键和引用完整性,包括级联删除和更新;
      1. 使用外键的两个表都必须是InnoDB的表,而且不能是临时表;
      2. 在父表中,被引用的列必须是键.在字表中作为外键的列必须是索引或者是组合索引的第一个,如果他不存在,在创建索引的时候会自动被创建;
      3. 使用外键的列不支持索引前缀;
      4. 如果使用CONSTRAINT子句时,要保证对象名是全局唯一的;
      5. 查看索引:show index from table_name \G;
    6. 数据表的存储格式是非常的轻便的,因此可以通过直接拷贝表所在的目录到其它的主机以实现对表的备份额迁移;
    7. 配置一个InnoDB表空间
      1. 它包含一个或者多个文件;
      2. 表空间中的内个组件可以是一个一般的文件或者是裸设备,或者是两种文件都有;
      3. 表空间文件可以在不同的文件系统或者是物理磁盘上.这样使用的一个原因是使用分布式系统;
      4. 表空间的大小可以超过文件系统支持的最大文件大小,主要是有两个原因
        1. 表空间由一个或者多个文件组成,因此大于一个单独的文件;
        2. 表空间可以包含裸设备,它不受限于文件系统的大小,可以使用裸设备的所有的extent;
      5. 表空间的最后一个文件可以自动增长,也可以定义文件的增长大小;
      6. 指定配置文件中的innodb_data_file_path参数(通过show variables like ‘innodb_data_file_path’);
        1. 默认路径下指定:[innodb_data_file_path=ibdata1:10M;ibdata2:10M:autoextend]两个文件之间用[;]分割,最后一个文件可以指定自动增长;
        2. 指定InnoDB的路径:innodb_data_home_dir指示数据文件的路径,缺省是在数据目录下面,innodb_log_group_home_dir指示日志文件的路径;
    8. 配置InnoDB的缓冲区:InnoDB使用一个缓冲池去存放经常读取的物理表的信息,目的是为了减小IO,缓冲池越大越好.可以使用innodb_buffer_pool_size参数改变缓冲池的大小.
      1. innodb_buffer_pool_size:定义了在内存中缓存表和索引的大小,这个值越大,访问硬盘的IO越小.在一个专用的数据库服务器中,你可以设置它的大小为物理内存的80%,当然也不能设置的过大,否则就会使用到交换分区;
      2. innodb_additional_mem_pool_size:表示存放数据字典和其它数据表结构的信息的大小.表越多,这个空间分配的要越大.如果这个空间大小不够的话,就会从操作系统申请空间,并在error log中记录警告信息;
      3. innodb_max_dirty_pages_pct:配置dirty page的百分比,默认为75,当脏数据超过这个值的时候,进程就会把这些页从缓冲池写入到硬盘上;
      4. 查看innodb的状态变量show golbal status like ‘innodb_%’;innodb_page_size:是每一页的大小,一般为16k;Innodb_buffer_pool_pages_total:是一共有的页数;
  5. Merge
    1. MERGE表是一组MyISAM表的集合,每一个MERGE表在磁盘上都有2个文件,一个是.frm文件和一个包含组成MERGGE表的MyISAM表的名称的.MRG文件.这两个文件都存放在数据库目录下;
    2. 当对一个MERGE表操作时,相当于对组成MERGE表的所有的MyISAM表的操作;
    3. 一个MERGE表可以突破MyISAM表的最大大小的限制;
    4. MYSQL管理MERGE表的查询竞争使用表级锁,即锁住组成它的MyISAM表,所以不会产生死锁;
    5. 一个MERGE表是很轻便的,因为.MRG文件是一个文本文件;
    6. 可以进行增删改查操作,在插入操作时可以指定是往哪个表中插入数据;
    7. 当MERGE引擎要锁住一个MERGE表时,就会对组成它的所有MyISAM表加锁;
    8. 对MERGE表执行SEELCT操作时,对底层的表加read lock;
    9. 对MERGE表执行更新操作(delete, update)时,对底层的表加write lock;
    10. 对MERGE表的操作:
      1. 创建MyISAM表m1:create table m1(id int, name varchar(10)) engine=myisam;
      2. 创建MyISAM表m2:create table m2(id int, name varchar(10)) engine=myisam;
      3. 创建MERGE表:create table m(id int, name varchar(10)) engine=merge union=(m1, m2);
      4. 插入数据:insert into m1 values(1, ‘a’);insert into m1 values(1, ‘a’);
      5. 查询:select * from m;
      6. 创建MyISAM表m3:create table m3(id int, name varchar(10)) engine=myisam;
      7. 加入merge表:alter table m union=(m1, m2, m3);很灵活,可以互相组合;
      8. 修改表使得merge表可以插入数据,create table m(id int, name varchar(10)) engine=merge union=(m1, m2) insert_method=last;method_method=0:不允许插入;first:插入到union中的第一个表;last:插入到union中最后一个表;
    11. 可以通过直接修改.MRG文件来修改MERGE表,修改后使用flush tables;来刷新表缓存;
  6. Memory
    1. MEMORY表的.frm文件在数据库目录下,数据和索引都存储在内存中;
    2. 对MEMORY表的操作性能都很高;
    3. 在服务器重启之后,MEMORY表中的数据就不存在了,但是他的表结构还是存在的;
    4. 因为MEMORY表使用的是内存,所以不适用于大表;
    5. MEMORY表使用表级锁来处理查询竞争,所以不会发生死锁;
    6. MEMORY表不支持TEXT和BLOB类型;
    7. 它支持两种索引:HASH和BTREE
      1. 缺省使用HASH索引,这种索引算法使用唯一索引会非常高效,然而HASH索引只能用于比较运算符(=, <>);
      2. BTREE索引算法更适合于范围查找,例如>,<或者between;
    8. 可以使用创建表时的max_rows和服务器参数max_heap_table_size来限制MEMORY表的大小;
    9. 设置索引:
      1. hash:alter table table_name add index idx_name using hash(col_name);
      2. btree:alter table table_name add index idx_name using btree(col_name);
    10. 当不需要MEMORY表的内容时,要释放被MEMORY表使用的内存,使用DELETE FROM, TRUNCATE TABLE或者删除整个表DROP TABLE;
  7. Federated
    1. 它访问的是在远程数据库表中的数据,而不是本地的表,仅在-MAX版的MySql可用;
    2. 如果要使用需要在在configure时添加–with-federated-storage-engine选项;
    3. 创建一个FEDERATED表时,服务器在数据库目录创建一个.frm文件,没有表数据文件,因为实际数据在远程数据库上;
    4. 操作表的内容时需要MYSQL客户端API,读取数据通过SELECT * FROM table_name来初始化,然后通过mysql_fetch_row()的c函数去一行行读取;
    5. 创建一个FEDERATED表
      1. 假设在远程服务器上有一个表为tbl;
      2. 在本地创建表:create table federated_tbl(id int, name varchar(10)) engine=federated connection=’mysql://root@remote_host:3306/federated/tbl’;
      3. 其他CONNECTION的格式:
        1. CONNECTION=’mysql://username:password@hostname:port/database/tablename’;
        2. CONNECTION=’mysql://username@hostname/database/tablename’;
        3. CONNECTION=’mysql://username:password@hostname/database/tablename’;
    6. 局限性
      1. 远程服务器必须是一个MYSQL服务器;
      2. 不支持事务;
      3. 支持增删改查的操作和索引,但是不支持ALTER TABLE和DROP TABLE;
    7. 用途:可以跨服务器访问,不用创建DB LINK了;
  8. BDB
    1. 需要下载包含BDB版本的MYSQL(MySql-Max分发版支持BDB);
    2. 安装时在configure加入–with-berkeley-db选项;
    3. BDB启动选项
      1. –bdb-home:指定BDB表的基础目录,应该和–datadir相同;
      2. –bdb-lock-detect:BDB锁定检测方式,DEFAULT,OLDEST,RANDOM,YOUNGEST;
      3. –bdb-logdir=path:BDB日志文件目录;
      4. –bdb-no-recover:不在恢复模式启动Berkeley DB;
      5. –bdb-no-sync:不同步刷新BDB日志,使用–skip-sync-bdb-logs代替;
      6. –bdb-shared-data:以多处理模式启动Berkeley DB(初始化Berkeley DB之时,不要使用DB_PRIVATE);
      7. –bdb-tmpdir=path:BDB临时文件目录;
      8. –skip-bdb:禁止BDB存储引擎;
      9. –sync-bdb-logs:同步刷新BDB日志.这个选项默认被允许,请使用–skip-sync-bdb-logs来禁止它;
    4. 创建一个BDB表会有两个文件,一个是.frm文件,一个是存放表数据和索引的.db文件;
    5. 支持事务;
    6. 每一个BDB表都需要一个primary key,如果创建时不指定则会隐式创建一个;
    7. SELECT COUNT(*) FROM tbl_name对BDB表很慢,因为在该表中没有行计数被维持;
    8. 使用页面级别的锁;
    9. 使用mysql客户端是,应该使用–no-auto-rehash选项;
    10. BDB表的限制
      1. 每个BDB表在.db文件里存储文件被创建之时到该文件的路径,这个被做来允许在支持symlinks的多用户环境里检测锁定.因此,从一个数据库目录往另一个目录移动BDB表是不能的;
      2. 当制作BDB表的备份之时,你必须使用mysqldump要么做一个包含对每个BDB表的文件(.frm和.db文件)及BDB日志文件的备份.BDB存储引擎在它的日志文件存储未完成的事务以及要求它们在mysqld启动的时候被呈出来.BDB日志在数据目录里,具有log.XXXXXXXXXX(10位数字)形式名字的文件;
      3. 如果允许NULL值的列有唯一的索引,只有单个NULL值是被允许的,这不同于其它存储引擎;
  9. EXAMPLE
    1. EXAMPLE引擎是一个不做适合事情的存储引擎,主要用于MySql源码中一个例子用来演示如何开始编写一个新的存储引擎;
    2. 需要在configure时添加–with-example-storage-engine选项;
    3. EXAMPLE引擎不支持编译索引;
  10. Archive
    1. ARCHIVE引擎被用来以非常小的空间存储大量无索引数据;
    2. 要使用此引擎需要在configure时添加–with-archive-storage-engine选项;可以通过show variables like ‘have_archive’查看;
    3. 创建一个ARCHIVE表会有一个保存表结构的.frm文件,保存数据和元数据的.ARZ和.ARM文件,如果有优化操作的话还有一个.ARN文件;
    4. ARCHIVE引擎仅仅支持SELECT和INSERT操作,以除了几何数据类型外的所有数据类型;
    5. 存储:当inesrt数据时,archive引擎使用zlib无损数据压缩的方式压缩,optimize table可以分析表,并打包为更小的格式;
    6. 查询:在查询数据时,记录根据需要被加压缩,没有行缓存.SELECT操作执行完全表格扫描,当一个SELECT发生时,它找出当前有多少行可用,并读取行的数量;
  11. CSV
    1. CSV引擎使用逗号分隔值格式的文本文件存储数据(eg:[“1″,”aaa”]);
    2. 要想使用此引擎在configure时使用–with-csv-storage-engine选项;
    3. CSV引擎不支持null值,所以在创建时应加上not null选项;
    4. CSV引擎不支持索引;
    5. 创建CSV表会在数据库目录创建一个.frm文件,一个.CSV的文本文件用来存储数据和一个.CSM文件;
  12. Blackhole
    1. BLACKHOLE引擎就像黑洞一样,它接收数据但是是丢弃它而不是存储它,查询时总返回NULL;
    2. 创建BLACKHOLE引擎后会在数据库目录创建一个.frm文件,没有其它文件与之关联;
    3. 它支持所有的索引;
    4. 要想使用此引擎在configure时使用–with-blackhole-storage-engine选项;
    5. 用途:
      1. BLACKHOLE表不记录任何数据,如果二进制日志被允许,SQL语句被写入日志,可以用作重复器或者过滤器机制;
      2. 转储文件语法的验证;
      3. 来自二进制记录的开销测量,通过比较允许二进制日志功能的BLACKHOLE的性能与禁止二进制功能的BLACKHOLE的性能;
      4. 因为BLACKHOLE本质是一个no-op存储引擎,可以用来查找与引擎自身不相关的性能瓶颈;

MySQL学习6–MySQL5.1的体系架构

MySql体系架构:

Mysql各个模块执行的过程:
  1. 初始化模块:当服务器启动的时候,初始化模块就会解析控制文件和命令行参数,分配全局的缓存,初始化全局变量和结构,加载访问控制表和执行其它的初始化任务.一旦初始化工作完成,初始化模块转交控制权给连接管理器,它是以一个循环的方式接收客户端的连接;
  2. 连接管理模块:当客户端连接到数据库服务器,连接管理模块执行一些底层的网络命令并把控制权交给线程管理模块;
    1. max_connections:定义服务器最大的连接数;(show variables like ‘%connect%’)
    2. max_user_connections:定义服务器针对单个用户最大的连接数;
    3. Aborted_connects:失败的连接数;(show global status like ‘%connect%’);
    4. Connections:连接的次数;
    5. Max_userd_connections:最大使用连接数,最大的并发量;
    6. Threads_connected:当前连接了多少个进程,与show processlist的结果相同;
  3. 线程管理模块:线程管理模块会提供一个线程,可能是新建的,可能是从线程池中获得的,一旦线程建立好,就会把控制权交给用户验证模块;
  4. 用户验证模块:会验证连接的用户名,密码和客户端IP,验证通过之后就会接收客户端发送的命令,然后交给命令分发模块;
  5. 命令分发模块:
  6. 日志模块:每一个查询都会记录通用查询日志;
  7. 查询缓存模块:命令分发器把查询发送给查询缓存模块,查询缓存模块查看这个查询是否是可以缓存的类型,并且查找之前是否缓存过,如果查询命中,就会把纯纯的结果返回给用户,连接管理模块就会接到控制权并处理下一个命令;如果查询缓存模块没有命中,则查询给解析器,它决定了根据查询如何转交控制权;
  8. 命令解析器:命令解析器选择那种方式;
  9. 查询优化器:查询语句会使用查询优化器;
  10. 表变更模块:插入,删除,创建表,架构修改会使用条变成模块;
  11. 表维护模块:检查,修复,更新键统计会使用表维护模块;
  12. 复制模块:和复制相关的查询会使用复制模块;
  13. 状态模块:状态报告会使用状态报告模块;
  14. 访问控制模块:在这一步,通过检查命令解析器模块涉及到的表或者列是否有权限,验证之后把控制权交给表管理模块;
  15. 表管理模块:会执行表的打开和锁定,并调用具体的存储引擎接口;
  16. 存储引擎接口:存储引擎接口实行行级别的操作;
  17. 核心API:内存管理,数字函数,字符函数;
  18. 网络交互模块:网络监听,协议处理;

MySQL学习4–获得MySQL5.1的帮助

如何获得帮助

  1. 官方帮助文档(chm);
  2. 客户端工具(mysql>help);
    1. ?与help一样,获得帮助信息;
    2. clear:清除当前输入的语句,在错误的语句后面输入\c即可;
    3. connect:重新连接服务器,可以指定主机名和服务器,输入connect dbname host或或者\r dbname host即可;
    4. delimiter:语句分隔符,设置执行语句的符号,执行delimiter $$即可;
    5. edit:调用vi修改sql语句,在要修改的语句后面输入\e即可;
    6. go:发送命令到mysql服务器;
    7. pager:查询内容太多,分页显示,设置:>pager less,禁止:>nopager;
    8. tee:把查询结果输入到一个文件中:>tee /tmp/rst.txt,禁止notee,主要用于数据库的备份脚本输出;
    9. prompt:改变提示符,如:prompt royalwzy>;则每次输入命令是提示符变为royalwzy>字符串(可以在配置文件中定义,prompt=xxx);
    10. quit/exit:都是退出客户端,输入quit,exit和\q都行;
    11. source:执行一个sql脚本文件,文件名为参数,source /tmp/sql.txt;
    12. system:执行操作系统的命令,用法:system ls -l /tmp 或者\! ls -l /tmp;
    13. status:查看服务器信息的状态,输入status或者\s即可;
    14. use:改变使用的数据库,后面跟数据库的名称,eg:use mysql;
    15. charset:修改字符集,可以通过status查看当前使用的字符集,eg:charset latin1;
    16. warnings:开启警告信息,当输入的sql语句出错时,可以通过show warning或者show errors来打印警告或者错误信息,设置:warning或者\W,关闭:nowarning或者\w;
    17. rehash:设置客户端自动补全功能;
      1. 在服务器的配置文件中[mysql]节点下,默认使用no-auto-rehash选项;
      2. 注释no-auto-rehash选项,添加auto-rehash选项,reboot;
  3. 获得服务器端帮助:>help contents;
    1. 可以通过help cmd获得更详细的信息;
    2. 获得管理操作的命令:>help administration;
    3. 获得数据类型:>help data types;
    4. 获得show命令的帮助:help show; ? show;
    5. show variables:打印系统变量,类似oracle中的show parameter;
      1. 查询包含某一关键字的变量:show variables like ‘%buffer%’;
      2. 设置变量的值用set命令:set global|session key=value;
  4. show variables和show status的区别
    1. show variables:当服务器运行之后如果没有人工干预所有的参数不会发生改变;
    2. show status:显示服务器运行过程中的动态信息,值会动态改变;
  5. 获得表中前几行数据使用:select * from table_name limit n;

MySQL学习5–MySQL5.1的物理结构

Mysql的物理结构

  1. 日志文件
    1. error log:
      1. 记录mysql启动,关闭和运行时产生的重大的错误的信息;
      2. 如果mysqld警告一个表需要自动的检查或者修复,也会记录一个错误日志;
      3. 可以使用–log-error=file_name选项来指定错误日志文件,如果没有指定,则系统默认在data目录下生产一个hostname.err的文件;
      4. 也可以在配置文件中配置log_error变量;
      5. 查询log_error的位置:>show variables like ‘log_error’;查看主机名:>system hostname;
    2. binary log:
      1. 记录所有对数据库更新和潜在的更新语句(一个delete语句,但是没有影响的行),语句以事件(event)的方式存储,同时也包含了更新语句执行的时间信息;
      2. 它不记录那些不修改任何数据的语句,如果想要记录所有的语句,可以使用query log;
      3. 它主要的目的是在做还原操作时尽可能全的更新数据库,因为它包含在一次备份后的所有更新操作.它同样被用在master replication server中作为一个记录发送给slave servers;
      4. 打开二进制日志会损失1%的性能,但是它带来的好处远远超过这些;
      5. 查看二进制日志是否打开,需要查看log_bin参数是否是ON:>show variables like ‘binlog_format’;
      6. 命令行参数
        1. –log-bin=filename:记录二进制日志文件的位置,尽量指定路径名,如果不指定的话则保存在数据目录;
        2. –log-bin-index=file:记录二进制日志文件索引的位置,保存了日志文件名;
        3. –max_binlog_size:单个文件最大多少;
        4. –binlog-do-db=db_name:哪个数据库使用,只有这个数据库使用;
        5. –binlog-ignore-db=db_name:哪个数据库不使用,只有这个数据库不使用;
      7. 系统变量
        1. log_bin:日志的位置;
        2. binlog_cache_size:二进制日志缓存大小,是每一个连接进来的线程分配的大小,不是整个服务器的大小;
        3. max_binlog_cache_size:最大缓存大小;
        4. max_binlog_size:单个文件最大大小,超过此大小则再分配一个文件,但是一个事务必须在一个文件中,所以可能会稍大点;
        5. binlog_cache_use:当前连接使用的binlog缓存的事务的数量,使用show status like ‘binlog_cache_use’查看(show status命令显示了所有连接到mysql服务器的状态值);
        6. binlog_cache_disk_use:如果binlog_cache_use不够用,则在磁盘上缓存,应该尽量避免;
        7. binlog_do_db:设置master-slave时使用;
        8. binlog-ignore-db:设置哪个数据库不记录日志;
        9. sync_binlog:缓存与硬盘的同步频率(commit多少下同步一次,0表示服务器自动控制);
      8. 查看当前二进制文件的名称和大小,show binary/master logs;
      9. 如果不指定二进制日志文件的位置,默认存放在data文件夹下,日志文件是:mysql-bin.xxxxxxx,索引文件是mysql-bin.index;
      10. 如果要切换日志的话,执行flush logs命令;
      11. 初始化二进制日志系统,从新生成:reset master命令;
      12. 删除某个日志文件:purge binary logs [before ‘datetime’ / to ‘log_name’] 删除指定日期之前的和删除指定文件之前的日志文件;
      13. 设置日志文件的失效期:参数为expire_logs_days,set global expire_log_days=n,N天前的日志自动删除;
      14. 二进制日志的格式
        1. 查看格式:show [global] variables like ‘binlog_format’;
        2. 设置日志格式:set [global] binlog_format = statement|row|mixed;
        3. 使用mysqlbinlog程序打开;
    3. general query log:
      1. 一般查询日志记录服务器运行期间所有操作的日志.当客户端连接或者断开的时候服务器会记录信息到日志中,并记录所有从客户端接收到的sql语句,它对于在客户端中排错和查看是哪个客户端发送的命令很有帮助;
      2. mysqld是按照接收到命令的方式记录语句的,这可能跟它们执行的顺序不同(这与二进制日志是有区别的,二进制日志是执行后记录).
      3. 在mysql5.1.6中可以使用–log选项启动和使用–log-output选项指定日志输出的位置,也可以输出到”Server Log Tables”表中.在5.1.6之前,开启此功能是用–log=file_name or -l file_name选项(之后版本使用–general-log选项),如果没有指定file_name,默认是在data目录下生产一个hostname.log文件;
      4. 服务器重新启动和log flush不会产生一个新的文件;
      5. 默认此功能关闭,通过show variables like ‘log’/’general_log’,log与general_log意思相同;
      6. 设置打开一般查询日志:set global log=1;(两个变量会同时打开关闭,打开之后立即生效);
      7. 可以在启动的时候指定–general-file选项或者在配置文件中指定general_log=1,general_file_log=/path;
      8. 一半不打开此日志功能,数据量太大,如果打开可以放到单独的磁盘中.
      9. 备份切换一般日志文件:
        1. 先备份:>mv hostname.log hostname.log.bak
        2. 切换日志组:mysqladmin flush-logs;
    4. slow query log:
      1. 调优时使用,记录超出指定时间的sql语句;
      2. 慢查询日志主要记录执行时间超过long_query_time变量指定时间的sql语句,这个时间不包括获得锁的时间,只包含执行时间,系统默认时间是10s(long_query_time=10.0);
      3. 在mysql5.1.6版本可以指定mysqld的–long-slow-queries=file_name选项启动,在之后的版本使用–slow-query-log=0|1选项和–slow-query-file-log=file_name选项指定;
      4. 命令行参数:
        1. –log-slow-queries=file_name;指定慢查询日志文件
      5. 系统变量:
        1. low-query-log:开启慢查询功能,set global low-query-log =0|1;
        2. slow-query-file-log:指定慢查询日志文件,系统默认是在data目录下的hostname-slow.log文件;
        3. long_query_time:指定查询的最大时间,set global long_query_time=n;
        4. long_queries_not_using_indexes:不用索引的慢查询,默认是功能关闭的;
          1. 查看某个表是否有索引:> show index from t;
          2. 打开此功能:>set global long_queries_not_using_indexes =1;
          3. 查看变量:>show variables like ‘long_queries_not_using_indexes’;
      6. 分析慢日志文件的工具:mysqldumpslow,查看具体的帮助是用mysqldumpslow –help;
    5. innodb redo log;
      1. 与innodb数据引擎相关;
      2. 用来实现灾难恢复(crash recovery),突然断电会导致innodb表空间中的数据没有写到磁盘上,通过执行redo log能够重新执行这些操作来恢复数据;
      3. 提升innodb的i/o性能,innodb引擎把数据和索引都载入到内存中的缓冲池中,如果每次休息数据和索引都需要更新到磁盘,必定会增加i/o请求,而且因为每次更新的位置都是随机的,磁头需要频繁的定位导致效率很低,所以innodb每处理完一个事务后只添加一条日志log,另外有一个线程负责智能的读取日志文件并批量更新到磁盘上,实现最高效的磁盘写入;
      4. 系统变量:
        1. innodb_log_buffer_size:日志缓冲区的大小;
        2. innodb_log_file_size:日志文件的大小;
        3. innodb_log_files_in_group:一组日志中有几个文件:
          1. 文件名为ib_logfileX(X从0开始一次增加);
          2. 先关闭数据库服务:>mysqladmin shutdown(mysql.server stop);
          3. 把data目录下的ib_logfile*文件移动走:>mv ib_logfile* /tmp;
          4. 在配置文件中添加innodb_log_files_in_group=n的参数;
          5. 启动数据库服务:>mysqld –defaults-file=./my.cnf –user=mysql(mysql.server start);
          6. 可以查看error log文件观察启动过程;
        4. innodb_log_group_home_dir:日志存放的性对路径(相对于$MYSQL_HOME/mysql/data目录,即datadir目录);
          1. 关闭服务器;
          2. 在配置文件中添加此参数,并指定路径;
          3. 启动服务器;
        5. innodb_flush_log_at_trx_commit:根据不同的数据安全级别去设定.
          1. 0:日志缓冲每秒一次的被写入到日志文件,并且对日志文件做到磁盘操作的刷新,但是在一个事务提交不做任何修改;
          2. 1:每个事务提交时,日志缓冲被写到日志文件,对日志文件做到磁盘操作的刷新;
          3. 2:每个事务提交后,日志缓冲被写到日志文件,但不对日志文件做到磁盘操作刷新,对日志文件每秒刷新一次;
          4. 查看此变量:>show variables like ‘innodb_flush_log_at_trx_commit’;
        6. innodb_os_log_written:写入到文件日志的数据量,使用show status查询;
        7. innodb_os_log_fsyncs:写入到磁盘的次数,使用show status查询;
  2. 数据文件:MySql服务器使用磁盘空间有几种方式,主要是在服务器数据目录(datadir)下的数据库目录和文件,主要有以下几点:
    1. 数据库目录:每一个数据库对应一个数据目录(datadir)下的目录,不管你创建哪种类型的表.比如,一个数据库目录可以包含MYISAM引擎的表,INNODB引擎的表或者混合的表;
    2. .frm文件(Table Format Files):包含了表结构的描述信息,每一个表都有一个.frm文件在对应的数据库目录下.它与表使用的哪种引擎没有关系;
    3. .MYD/.MYI:由MYISAM存储引擎在适当的数据库目录下创建的数据库数据文件和索引文件.
    4. INNODB存储引擎有它自己的表空间和日志文件,表空间包含所有使用InnoDB引擎表的数据和索引信息,同样也包括了事务回滚所必须的undo logs.日志文件记录了提交过的事务的信息,用来防止数据丢失.默认情况下,表空间和日志文件保存在数据目录,默认的表空间文件名叫ibdata1,默认的日志文件名叫ib_logfile0和ib_logfile1.(可以为每一个使用InnoDB引擎的表配置一个表空间,这种情况下,InnoDB给指定的表创建表在表数据库目录创建表空间)
      1. 查询表空间模式:>show variables like ‘innodb_file_per_table’ ON:单独表空间,OFF:共享表空间;
      2. 如果要修改这个值的话要关闭服务器,修改配置文件,启动服务这几步;
      3. 如果使用单独表空间模式的话会在相应的数据库目录创建tablename.frm(表结构文件)和tablename.ibd文件(数据和索引文件);
    5. 服务器日志文件和状态文件:这些文件包含服务器上执行过的语句信息,日志被用于复制和数据恢复,获得优化查询性能的信息和误操作信息;
  3. Relication相关文件
  4. 其他小文件