http://hongge.blog.51cto.com/
一、MySQL Server 简介
什么是MySQL
MySQL 是由MySQL AB 公司(目前已经被SUN 公司收归麾下)自主研发的,目前IT 行业
最流行的开放源代码的数据库管理系统之一,它同时也是一个支持多线程高并发多用户的关
系型数据库管理系统。
MySQL 数据库以其简单高效可靠的特点,在最近短短几年的时间就从一个名不见经传的
数据库系统,变成一个在IT 行业几乎是无人不知的开源数据库管理系统。从
小型的web 网站,至大型的企业级应用,到处都可见其身影的存在。
MySQL 与其他数据库的简单比较
1)功能比较:
作为一个成熟的数据库管理系统,要满足各种各样的商业需求,功能肯定是重点参考对象的。MySQL经过多年的改进和完善之后,已经基本具备了所有通用数据库管理系统所需要的相关功能。
MySQL 基本实现了ANSI SQL 92 的大部分标准,仅有少部分并不经常被使用的部分没有
实现。比如在字段类型支持方面,另一个著名的开源数据库PostGreSQL 支持的类型是最完
整的,而Oracle 和其他一些商业数据库,比如DB2、Sybase 等,较MySQL 来说也要相对少一些。在事务支持方面,虽然MySQL 自己的存储引擎并没有提供,但是已经通过第三方插件式存储引擎Innodb 实现了SQL 92 标准所定义的四个事务隔离级别的全部。
不过在可编程支持方面,MySQL 和其他数据库相比还有一定的差距,虽然最新版的MySQL
已经开始提供一些简单的可编程支持,如开始支持Procedure,Function,Trigger 等,但
是所支持的功能还比较有限,和其他几大商用数据库管理系统相比,还存在较大的不足。如
Oracle 有强大的PL/SQL,SQL Server 有T-SQL,PostGreSQL 也有功能很完善的PL/PGSQL
的支持。
整体来说, MySQL的功能完全可以满足我们的通用商业需求,提供足够强大的服务。而且不管是哪一种数据库在功能方面都不敢声称自己比其他任何一款商用通用数据库管理系统都强,甚至都不敢声称能够自己拥有某一数据库产品的所有功能。因为每一款数据库管理系统都有起自身的优势,也有起自身的限制,这只能代表每一款产品所倾向的方向不一样。
2)易用性比较:
从系统易用性方面来比较,每一个使用过MySQL 的用户都能够明显地感觉出MySQL 在这方面与其他通用数据库管理系统之间的优势所在。尤其是相对于一些大型的商业数据库管理系统如Oracle、DB2 以及Sybase 来说,对于普通用户来说,操作的难易程度明显不处于一
个级别。MySQL 一直都奉行简单易用的原则,也正是靠这一特性,吸引了大量的初级数据库用户最终选择了MySQL。
从安装方面来说,MySQL 安装包大小仅仅只有100MB 左右,这与几大商业数据库完全不在一个数量级。安装难易程度也要比Oracle 等商业数据库简单很多,不论是通过已经编译好
的二进制分发包还是源码编译安装,都非常简单。
再从数据库创建来比较,MySQL 仅仅只需要一个简单的CREATE DATABASE 命令,即可在瞬间完成建库的动作,而Oracle 数据库与之相比,创建一个数据库简直就是一个非常庞大的工程。当然,二者数据库的概念存在一定差别。
3)性能比较
性能方面,一直是MySQL 引以为自豪的一个特点。在权威的第三方评测机构多次测试较量各种数据库TPCC 值的过程中,MySQL 一直都有非常优异的表现,而且在其他所有商用的通用数据库管理系统中,仅仅只有Oracle 数据库能够与其一较高下。
4)可靠性
关于可靠性的比较,MySQL 也有非常优异的表现,从当前最火的Facebook 这样大型的网站都是使用MySQL 数据库,就可以看出,MySQL 在稳定可靠性方面,而且排在全球前10 位的大型网站里面,大部分都有部分业务是运行在MySQL数据库环境上,如Yahoo,Google 等。
总的来说,MySQL 数据库在发展过程中一直有自己的三个原则:简单、高效、可靠。
MySQL 的主要适用场景
MySQL是目前最为流行的开源数据库管理系统软件了。那么MySQL 主要用于什么场景下
1)Web 网站系统
Web 站点,是MySQL 最大的客户群,MySQL 之所以能成为Web 站点开发者们最青睐的数据库管理系统,是因为MySQL 数据库的安装配置都非常简单,使用过程中的维护也不像很多大型商业数据库管理系统那么复杂,而且性能出色。还有一个非常重要的原因就是MySQL 是开放源代码的,完全可以免费使用。
2)日志记录系统
MySQL 数据库的插入和查询性能都非常的高效,如果设计地较好,在使用MyISAM 存储引擎的时候,两者可以做到互不锁定,达到很高的并发性能。所以,对需要大量的插入和查询日志记录的系统来说,MySQL 是非常不错的选择。比如处理用户的登录日志,操作日志等是非常适合的应用场景。
3)数据仓库系统
随着现在数据仓库数据量的飞速增长,我们需要的存储空间越来越大。数据量的不断增长,使数据的统计分析变得越来越低效,也越来越困难。怎么办?这里有几个主要的解决思路,一个是采用昂贵的高性能主机以提高计算性能,用高端存储设备提高I/O 性能,效果理想,但是成本非常高;第二个就是通过将数据复制到多台使用大容量硬盘的廉价pc server上,以提高整体计算性能和I/O 能力,效果尚可,存储空间有一定限制,成本低廉;第三个,通过将数据水平拆分,使用多台廉价的pc server 和本地磁盘来存放数据,每台机器上面都只有所有数据的一部分,解决了数据量的问题,所有pc server 一起并行计算,也解决了计算能力问题,通过中间代理程序调配各台机器的运算任务,既可以解决计算性能问题又可以解决I/O 性能问题,成本也很低廉。在上面的三个方案中,第二和第三个的实现,MySQL 都
有较大的优势。通过MySQL 的简单复制功能,可以很好的将数据从一台主机复制到另外一台,
不仅仅在局域网内可以复制,在广域网同样可以。当然,其他的数据库同样也可以做到,不是只有MySQL 有这样的功能。但是MySQL是免费的,其他数据库大多都是按照主机数量或者cpu 数量来收费,当我们使用大量的pc server 的时候,license 费用相当惊人。第一个方案,基本上所有数据库系统都能够实现,但是其高昂的成本并不是每一个公司都能够承担的。
二、MySQL 架构组成 Mysql物理文件组成: 1)日志文件:主要包含:错误日志、查询日志、慢查询日志、事务日志、二进制日志
日志是mysql数据库的重要组成部分。日志文件中记录着mysql数据库运行期间发生的变化;也就是说用来记录mysql数据库的客户端连接状况、SQL语句的执行情况和错误信息等。当数据库遭到意外的损坏时,可以通过日志查看文件出错的原因,并且可以通过日志文件进行数据恢复。
1、错误日志:Error Log
在mysql数据库中,错误日志功能是默认开启的。默认情况下,错误日志存储在mysql数据库的数据目录中。错误日志文件通常的名称为hostname.err。其中,hostname表示服务器主机名。
错误日志信息可以自己进行配置的,错误日志所记录的信息是可以通过log-error和log-warnings来定义的,其中log-error是定义是否启用错误日志的功能和错误日志的存储位置,log-warnings是定义是否将警告信息也定义至错误日志中。默认情况下错误日志大概记录以下几个方面的信息:服务器启动和关闭过程中的信息(未必是错误信息,如mysql如何启动InnoDB的表空间文件的、如何初始化自己的存储引擎的等等)、服务器运行过程中的错误信息、事件调度器运行一个事件时产生的信息、在从服务器上启动服务器进程时产生的信息
注1:MySQL有很多系统变量可以设置,系统变量设置不同,会导致系统运行状态的不同。因此mysql提供两组命令,分别查看系统设置和运行状态。
1、查看系统设置:
SHOW [GLOBAL | SESSION] VARIABLES [like_or_where]
SHOW VARIABLES: shows the values of MySQL system variables.
2、运行状态:
SHOW [GLOBAL | SESSION] STATUS [like_or_where]
SHOW STATUS: provides server status information.
如何修改系统配置
方法1:配置文件设置my.cnf
如:binlog_cache_size = 1M
方法2:set global binlog_cache_size = 1048576;
注2:查看mysql的版本
或
或
一般而言,日志级别的定义没有会话变量都只是在全局级别下进行定义
错误日志的状态:
其中
log_error定义为错误日志文件路径
log_error_verbosity:
The MySQL error log has received some attention in MySQL 5.7, with a new setting called log_error_verbosity.
There are three possible values, as documented in the manual:
Verbosity Value
Message Types Logged
1
Errors only
2
Errors and warnings
3
Errors, warnings, and notes (default)
更改错误日志位置可以使用log-error来设置形式如下
#vi /etc/my.cnf
log-error = /usr/local/mysql/data/mysqld.err
查看mysql错误日志:
#tail /usr/local/mysql/data/mysqld.err
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 219 #事件开始处
#160829 0:23:22 server> #160829 0:23:22年月日的简写方式;end_log_pos事件结束处;thread_id=2 哪个会话线程创建的此语句;exec_time=0 执行时长单位为秒;error_code=0 错误代码0表示没有
SET TIMESTAMP=1472401402/*!*/;
SET @@session.pseudo_thread_id=2/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1075838976/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 296
#160829 0:23:22 server> use `db2`/*!*/;
SET TIMESTAMP=1472401402/*!*/;
insert into tb1 values(3)
删除二进制日志信息:
二进制日志会记录大量的信息(其中包含一些无用的信息)。如果很长时间不清理二进制日志,将会浪费很多的磁盘空间。但是,删除之后可能导致数据库崩溃时无法进行恢复,所以若要删除二进制日志首先将其和数据库备份一份,其中也只能删除备份前的二进制日志,新产生的日志信息不可删。也不可在关闭mysql服务器之后直接删除因为这样可能会给数据库带来错误的。若非要删除二进制日志需要做如下操作:导出备份数据库和二进制日志文件进行压缩归档存储。删除二进制文件的方法如下:
方法1:根据文件或时间点来删除二进制日志:
语法形式:
mysql> PURGE { BINARY | MASTER } LOGS {TO 'log_name' | BEFORE datetime_expr }
其中TO 'log_name'表示把这个文件之前的其他文件都删除掉,也可使用BEFORE datetime_expr指定把哪个时间之前的二进制文件删除了。
启动和设置慢查询日志:
方法1:通过配置文件my.cnf开启慢查询日志:
注:在不同的mysql版本中,开启慢查询日志参数不太一样,不过都可以通过 show variables like "%slow%" 和show variables like "%long%"查看出来。
方法2:通过登录mysql服务器直接定义,方式如下:
mysql>set global slow_query_log=1; #开启慢查询日志
Query OK, 0 rowsaffected (0.35 sec)
mysql>set session long_query_time=0.0001; #更改时间(当前session中,退出则重置)
Query OK, 0 rowsaffected (0.00 sec)
mysql>set global long_query_time=0.0001; #更改时间(全局中,重启服务则重置)
mysql> SHOW VARIABLES LIKE 'long%'; #查询定义时间
查看慢查询日志
mysql> use mysql
mysql> selectuser,host from user where user="root";