什么是mysql

        mysql有mysqld AB公司自主研发,是最流行的开发源代码的数据库管理系统之一,它同时也是一个支持多线程高并发多用户的关系型数据库管理系统

        mysql数据库以其简单高效可靠的特点。

    mysql与其他数据库的简单比较

        功能比较:字段类型支持方面,另一个著名的开源数据库PostGreSQL支持的类型是最完整的,而oracle和其他一些商业数据库,比如DB2,Sybase等,较mysql来说也要相对少一些。事务支持方面,虽然mysql自己的存储引擎没有提供,但是已经通过第三方插件式存储引擎innodb实现了sql 92标准所定义的四个事务隔离级别的全部。在可编程支持方面,mysql和其他数据库相比还是一定的差距,虽然最新版的mysql已经开始提供一些简单的可编程支持。如开始支持procedure,function,trigger等。但是所支持的功能还是比较有限,和其他几大商用数据库管理系统相比,还存不足。

        易用性比较:系统易用性方面来比较,每一个使用过mysql的用户都能够明显地感觉出mysql在这方面与其他通用数据库管理系统之间的优势所在。尤其相对于一些大型的商业数据库管理系统如oracle,DB2以及sybase来说,对于普通用户来说,操作的难易程度明显不处于一个级别,mysql一直都奉行简单易用的原则。从安装方面来说,mysql安装包仅仅只有100MB左右,与几大商业数据库完全不在一个数量级,安装难易程度也要逼oraccle等商业数据库简单很多,不论是通过已经编译好的二进制分发包还是源码编译安装。数据创建比较,mysql仅仅只需要一个简单的create datebase命令,即可在瞬间完成建库的,而oracle创建一个数据库简直就是一个非常庞大的工程

        性能比较:仅仅只有oracle数据库能够与其一较高下

        可靠性:当前最火的facebook这样大型的网站都是使用mysql数据库,可以看出,mysql在稳定可靠性方面,而且排在全球10位的大型网站里面,大部分都是部分业务是运行在mysql数据库环境上。mysql数据库在发展过程中一直有自己的三个原则:简单,高效,可靠。


    mysql的主要适合场景

        web网站系统

            是mysql最大的客户群,因为mysql数据库的安装配置非常简单,使用过程维护也不像大型商业数据库管理系统那么复杂,而且性能出色。重要的一个原因是mysql是开放源代码的,可以完全免费使用。

        日志记录系统

            mysql数据库的插入和查询性能都非常的高效,如果设计地较好,在使用myLSAM存储引擎的时候,两者可以做到互不锁定,达到很高的并发性能。所以对需要大量的插入和查询日志记录的系统来说。比如处理用户的登录日志,操作日志等是非常适合的应用场景

        数据仓库系统

            随着21世纪的数据仓库数据量飞速增长,我们需要的存储空间越来越大,数据量的不断增长,使数据的统计分析变得越来越低效,也越来越困难。还是有几个可以解决的思路:一是采用昂贵的高性能主机以提高计算性能,用高端存储设备提供i/o性能,但是成本非常高:二是通过将数据复制到多台使用大容量硬盘的廉价pc server上,以提高整体计算性能和i/o能力,效果尚可,存储空间有一定的限制,成本低廉:三是通过将数据水平拆分,使用多台廉价的pc server和本地磁盘来存放数据,每台机器上面都只有所有数据的一部分,解决了数据量的问题,所有pc server一起并行计算,也解决了计算能力问题,通过中间代理程序调配各台机器的运算任务,即可以解决计算性能问题又可以解决i/o性能问题,成本也很低廉。第二和第三的实现,mysql都有较大的优势,通过mysql的简单复制功能,可以很好的将数据从一台主机复制到另一台,在internet也可以复制。当然,其他的数据库同样也可以做到,不是只有mysql有这样的功能,但是mysql是米那份,其他数据库大多数都是按照主机数量或cpu数量来收费,基本上所有数据库系统都能实现,但是其高昂的成本并不是每一个公司都能承担。

    mysql架构组成

        日志文件:错误日志,查询日志,慢查询日志,事务日志,二进制日志

            日志是mysql数据库的重要组成部分日志文件中记录着mysql数据库运行期间发生的变化,也就是说用来记录mysql数据库的客户端连接状况,sql语句的执行情况和错误信息等。当数据库意外损坏时可以通过查看日志文件找出错误的原因,并且还可以通过日志文件进行数据恢复。

            错误日志:ErrorLog

                在myslq数据库中,错误日志功能是默认开启的,错误日志默认存储在mysql数据库的数据目录中,错误日志文件通常的名称为hostname.err。其中,hostnmae表示服务器主机名。

                错误日志信息可以自己进行配置,错误日志所记录的信息是可以通过log-error和log-warnings来定义的,其中log-warnings是定义是否将警告信息也定义至错误日志中,默认情况下错误日志大概记录服务器启动和关闭过程中的信息,服务器允许过程中的错误信息,事件调度器允许一个事件时产生的信息,在服务器上启动服务器进程时产生的信息。


  mysql有很多系统变量可以设置,系统变量设置不同,会导致系统允许状态不同。

  查看系统设置:

            show [global | session] variables [like_or_where]

            show variables: shows the values of mysql system variables

  查看允许状态:

                        show [global | session] status [linke_or_where]

                        show status: provides server status information

  如何修改系统配置

  配置文件设置my.cnf

                            binlog_cache_size=1M

                        set global binlog_cache_size=1048576


  一般而言,日志级别的定义没有会话变量都只是在全局级别下进行定义


  查看错误日志的状态:show global variables like '%log_error%';

                        log_error定义为错误日志的文件路径

                        log_error_verbosity

  更改错误日志位置可以使用log-error来设置形式

                        vim /etc/my.cnf

                        log-error=/usr/local/mysql/data/mysqld.err

                        tail /usr/local/mysql/data/mysqld.err

  为了方便维护需要,有时候会希望将错误日志中的内容做北方并重新开始记录,这时候,可以利用

mysql的flush logs命令来告诉mysql备份旧日志文件并生成新的日志文件

备份文件名以.old结尾

删除错误日志

mysql5.5.7之前:数据库管理员可以删除很长时间之前的错误日志,以包子mysql服务器上的硬盘空间。mysql数据库中,可以使用mysqladmin命令开启新的错误日志。


mysqladmin命令语法:mysqladmin -u root -p    


flush-logs也可以登录mysql数据库中使用flush logs语句来开启新的错误日志。

在mysql5.5.7之后:服务器将关闭此项功能,只能使用重命名原来的错误日志文件,手动冲洗日志创建一个新的

        二进制日志:binary Log & Binary Log index

            二进制日志,也就是我们常说的binlog,也是mysql server中最重要的日志之一,主要用于记录修改数据或者可能引起数据改变的mysql语句,并且记录了语句发生时间,执行时长,操作的数据等等。所以说通过二进制日志可以查询mysql数据库中进行了哪些变化,一般大小体积上限为1G。

   当我们通过“log-bin=file_name”打开了记录的功能之后,mysql会将所有修改数据库数据的query以二进制形式记录到日志文件中,日志中并不仅限于query语句这么简单,还包括一条query所执行的时机,所消耗的资源,以及相关的事务信息,所以binlog是事务安全的

            和错误日志一样,binlog记录功能同样需呀“log-bin=file_name”参数的显式指定才能开启,如果未指定file_name,则会在数据目录下记录为mysql-bin.******

                查看二进制开启状态

                    show global variables like '%log_bin%';

                variable_name                value

                log_bin                      ON

                log_bin_basename             /usr/local/mysql/data/mysql-bin

                log_bin_index                /usr/local/mysql/data/mysql-bin.index

                log_bin_trust_function_creators OFF

                log_bin_use_v1_row_events    OFF

                binlog还有其他一些附加选项参数:

                    “max_binlog_size”设置binlog的最大存储上限,一般设置为512或1G,一般不能超过1G当日志达到上限是,mysql会重新创建一个日志开始继续记录,不过偶尔也有超过设置的binlog产生,一般都是因为即将达到上限是,产生了一个较大的事务,为了保证事务安全,mysql不会将同一个事务分开记录到两个binlog中

                    “binlog-do-db_name”参数明确告诉mysql,需要对某个数据库记录binlog,如果有了“binlog-do-db=db_name”参数的显示指定,mysql会忽略对其他数据库执行的query,而仅仅记录针对数据库执行的query。




错误日志:ErrorLog

        在mysql数据库中,错误日志功能是默认开启的。这个错误日志存储在mysql数据库的数据目录中。错误日志文件通常的名称为hostname.err,表示服务器的主机名。

        错误日志信息可以自己进行配置的,错误日志所记录的信息是可以通过log-error和log-warnings来定义的。其中log-warnings是定义是否将警告信息也定义至错误日志。默认情况下错误日志记录着服务器启动和关闭过程中的信息,服务器允许过程中的错误信息,事件调度器运行一个事件时产生的信息,在从服务器上启动服务器进程时产生的信息。

        mysql有很多系统变量可以设置,系统变量设置不同,会导致系统运行状态的不同。因此mysql提供查看系统设置和运行状态的命令。

            查看系统设置:

                show [global | session] variables [link_or_where]

                show variables: show the values of mysql system variables

            运行状态

                show [global | session] status [like_or_where]

                show status: provides server status information

            如何修改系统配置

                    方法一:配置文件设置my.cnf

                            binlog_cache_size=1M

                    方法二:set global binlog_cache_size=1048576

                一般而言,日志级别的定义没有会话变量都只是在全局级别下定义

                    show global variables like '%log_error%';

                    log_error定义为错误日志文件路径

                    log_error_verbosity

                更改错误日志位置可以使用log-error来设置形式

                    vim /etc/my.cnf

                    log-error=/usr/local/mysql/data/mysqld.err

                查看mysql错误日志

                    tail /usr/local/mysql/data/mysqld.err

                为了方便维护需要,有时候会希望将错误日志中的内容做备份并重新开始记录,就可以利用mysql的flush logs命令来告诉mysql备份旧日志文件并生成新的日志文件,备份文件名以.old结尾。

                删除错误日志

                        数据库管理员可以删除很长时间的之前的错误日志,保证mysql服务器上的硬盘空间。mysql数据库中,可以使用mysqladmin开启新的错误日志:mysqladmin -u root -p flush-logs也可以登录mysql数据库中使用flush logs语句来开启新的错误日志。

                    在5.5.7之后,服务器将关闭此项功能,只能使用重命名原来的错误日志文件,手动冲洗日志创建一个新的

二进制日志:binarylog & binary log index

        二进制日志,就是binlog。主要用于记录修改数据或有可能引起数据改变的mysql语句,记录了语句发送时间,执行时长,操作的数据等。通过二进制日志可以查询mysql数据库中进行了哪些变化。一般大小体积上限为1G。

        当我们通过log-bin=file_name打开了记录的功能之后,mysql会将所有修改数据库数据的query以二进制形式记录到日志文件中,日志中并不仅限于query语句这么简单,还包括每一条query所执行的时间,所消耗的资源,以及相关的事务信息。和错误日志一样,binlog记录功能同样需要log-bin=file_name参数的显显式指定才能开启,如果未指定file_name,则会在数据目录下记录为myslq-bin.******

        附加选项参数:

            max_binlog_size设置binlog的最大存储上限,一般设置为512M或1G,一般不能超过1G。当日志到达上限时,mysql会重新创建一个日志开始继续记录。为了保证事务安全,mysql不会将同一个事务分开记录到两个binlog中。

            binlog-do-db=db_name参数明确告诉mysql,需要对某个数据库记录binlog,mysql会忽略其他数据库执行的query,而仅仅记录针对指定数据库执行query。

            binlog-ignore-db=db_name,显式指定忽略某个数据库的binlog记录,当指定了这个参数之后,mysql会记录指定数据库以外所有的数据库的binlog。

            binlog-ignore-db=db_name与binlog-do-db=db_name两个参数中的db_name不是指query语句更新的数据所在的数据库,而是执行query的时候当前所处的数据库。不论更新哪个数据库的数据,mysql仅仅比较当前连接所处的数据库与参数设置的数据库名,而不会分析query语句所更新数据所在的数据库

            mysql-bin.index文件的功能是记录所有binary log的绝对路径,保证mysql各种线程能够顺利的根据他找到所需要的binary log文件。

            binlog_cache_size=32768    binglog_cache_size:一个事务,在没有提交的时候产生的日志记录到cache中,等到事务提交需要提交的时候,则把日志持久化到磁盘。一般来说,如果我们的数据库中没有什么大事务,2MB-4MB。如果数据库大事务较多,写入量大,可与适当调高。我们可以通过binlog_cache_use 以及 binlog_cache_disk_use来分析设置的binlog_cache_size是否足够,是否有大量的binlog_cache由于内存大小不够而使用临时文件(binlog_cache_disk_use)来缓存了。

            binglog_stmt_cache_size=32768    当事务事务语句使用二进制日志缓存,但是超出binlog_stmt_cache_size时,使用一个临时文件来存放这些语句。

                事务表支持将批处理当做一个完整的任务统一提交或回滚,即对包含在事务中的多条语句要么全执行,要么全不执行。

                非事务表则不支持此种操作,批处理的语句如果遇见错误,在错误钱的语句执行成功,之后的则不执行。

                log_bin=mysql-bin指定binlog的位置,默认在数据目录下。

                binlog-format={ROW | statement | mixed}指定二进制日志的类型,默认为MIXED。mysql复制主要有三种方式:基于sql语句的,基于行的复制,混合模式复制。对应的,binlog的格式也有三种:statement,row,mixed。

                    STATEMENT模式SBR

                        每一条修改的sql语句会记录到binlog中,优点是并不需要记录每一行的数据变化,减少binlog日志量,节约io,提高性能。缺点是在某些情况下会导致master-slave中的数据不一致。

                    ROW模式RBR

                        不记录每条sql语句的信息,仅需要记录哪条数据被修改了,修改成怎么样。缺点是会产生大量的日志,让日志暴涨

                    MIXED模式MBR

                        一般的复制使用STATEMENT模式保持binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,mysql会根据执行的sql语句选择日志保持方式。即交替使用行和语句,有mysql服务器自行判断。其中基于行的定义格式数据量会大一些但是可以保证数据的准确性。

                    sync_binlog=10    设定多久同步一次二进制日志至磁盘文件中,0表示不同步,任何正数值都表示对二进制每多少次写操作之后同步一次。当autocammit的值为1时,每条语句的执行都会引起二进制日志同步,否则每个事务的提交会引起二进制日志同步。

                    max_binlog_cache_size={4096..}    二进制日志缓存空间大小,5.5.9及以后的版本仅应用与事务缓存,其上限由max_binlog_stmt_cache_size决定。

                    max_binlog_stmt_cache_size    二进制日志缓存空间大小,5.5.9及以后的版本仅应用于事务缓存。

                    expire_log_days     设定二进制日志的过期天数,超出此天数的二进制日志文件将被自动删除。默认为0,表示不启用过期自动删除功能。如果启用此功能,自动删除工作通常发生在mysql启动或flush日志时。

                    通过编辑my.cnf中的log-bin选项可以开启二进制日志

                        格式:log-bin [=DIR/[filename]]

                        其中,DIR参数指定二进制文件的存储路径,filename参数指定二级制文件的文件名,其形式为filename.number,numer的形式为000001,000002等,每次重启mysql服务或允许mysql > flush logs,都会生成一个新的二进制日志文件,这些日志文件的number会不断地递增。

                        查看二进制日志;

                            二进制日志的定义方式为二进制格式,使用此格式可以存储更多的信息,并且可以使写入二进制日志的效率更高。但是不能直接使用查看命令打开并查看二进制日志。

                        当前使用的二进制文件及所处位置:show master status;

                        查看二进制日志信息的命令:show binlog events\G;

                        查看指定日志的二进制信息:

                            二进制日志的记录位置:通常为1上一个事件执行结束时间的位置

                            执行偏移量:show binlog events in

                        命令查看二进制日志:

                            由于无法使用cat等方式直接打开并查找二进制日志,所有必须使用mysqlbinlog命令。当时当正在执行mysql读写操作时建议不要使用此打开正在使用的二进制日志文件,若非要打开可flush logs。

                    删除二进制日志信息:

                        二进制日志会记录大量的信息,如果长时间不清理二进制日志,将会浪费很多的磁盘空间。但是删除之后可能导致数据库崩溃时无法进行恢复,所以若要删除二进制日志首先将其和数据库备份一份,其中也只能删除因为这样可能会给数据库带来错误的。若非要删除二进制日志需要导出备份数据库和二进制日志文件进行压缩归档存储。

                    根据文件或时间点来删除二进制日志:

                        purge {binary | master} logs {to 'log_name' | before datetiem_expr}

                    其中to log_name表示把这个文件之前的其他文件都删除掉,也可使用before datetime_expr指定把哪个时间之前的之前的二进制文件删除了。

                    删除所有的二进制日志

                        reset master;

    事务日志或称redo日志

            事务日志innodb特有的日志可以帮助提高事务的效率。使用事务日志,存储引擎在修改表数据时只需要修改其内存拷贝,再把修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘,事务日志采用追加的方式,因此写日志的操作是磁盘上一小块区域内的顺序i/o,而不像随机i/o需要在磁盘的多个地方移动磁头,所以采用事务日志的方式相对来说快得多。

            事务日志持久以后,内存中被修改的数据在后台可以慢慢的刷回到磁盘,目前大多数的存储引擎都是这样实现的。

            如果数据的修改已经记录到事务日志并持久化,但数据本身还没有写回磁盘,此时系统崩溃,存储引擎在重启时能够自动恢复这部分修改的数据。具有的恢复方式则视存储引擎而定。





mysql的物理文件组成包括错误日志,查询日志,慢查询日志,事务日志,二进制日志。

    日志文件中记录mysql数据库运行期间发生的变化,记录mysql数据库的客户端连接状况,sql语句的执行情况和错误信息。

mysql的逻辑结构可以看成是二层架构,第一层叫做SQL layes,数据库系统处理底层数据库之前的所有工作都在这一层完成,包括权限判断,sql解析,执行计划优化,query cache的处理等。第二层就是存储引擎层,叫做storage engine layes,也是底层数据存取操作实现部分,由多种存储引擎共同组成。

        实际上每一层都包含各自的很多模块。



    mysql存储引擎

            mysql5.1之前的版本是需要安装的时候一起被编译安装的,


            从mysql5.1开始,mysql AB在架构改造的时候,让存储引擎和sqllayes各自更为独立,可以做到在线加载新的存储引擎,而不影响mysql的正常运行。插件式存储引擎的架构为存储引擎的加载和移出更为灵活方便。


            主要的mysql存储引擎插件包括myLSAM,Innodb,DDB cluster,Maria,Falcon,Memory,Archive等,最著名而且使用最为广泛的myLSAM和Innodb两种存储引擎。


        MylSAM存储引擎是mysql5.1之前的默认存储引擎


        myLSAM存储引擎的表在数据库中,每一个表都被存放为三个以表名命名的物理文件


任何的存储引擎都会存放在以.frm文件的表结构中,


.MYD和.MYL文件分别存放了表的数据和索引数据


每个表都有且仅有这样三个文件做为myLSAM存储类型的表的存储。


不管表有多少个索引,都是存放在同一个.MYL文件中。


        MyLSAM至此三种类型的索引

            B-Tree索引,就是所有索引借点都安装balance tree的数据结构来存储,所有的索引数据节点都在叶节点。

            R-Tree索引,存储方式和B-Tree索引有一些区别,主要设计用于存储空间好多维数据的字段做索引。

            Full-text索引就是全文索引,存储结构也是B-Tree。只要为了解决在我们需要用like查询的低效问题。

            最经常使用的就是B-Tree索引,偶尔会使用到Fulltext,R-Tree索引一般系统中很少用到。B-Tree索引的所有字段的长度之和不能超过1000字节。

        不支持事务

        只有表锁


        虽然每一个MyLSAM的表都是存放一个相同后缀名的.MYD文件中,但是每个文件的存放格式实际上可能并不是完全一样。因为MyLSAM的数据存放格式是分为静态固定长度,动态可变长度以及压缩这三种格式。三种格式中是否压缩由自己选择,可以在创建表的时候通过ROW_FORMAT来指定compressed和defalut,也可以通过myisampack工具来进行压缩,默认不压缩。而在非压缩的情况下,是静态还是动态,就和表中字段的定义相关。只有表中有可变长度类型的字段存在,那么该表就是DYNAMIC格式,如果没有任何可变长度的字段,则为FIXED格式。可以通过alter table命令,强行将一个带有varchar类型的字段的dynamix的表转换为FIXED,但那好似原VARCHAR字段会被自动转换成CHAR类型。相反如果将FIXED转换为DYNAMIC,也会将CHAR类型字段转换为VARCHAR类型。

                    根据表的记录估量占用的磁盘空间

                        一个表中一行大概有多少字节

                        更具数据库的表每条增加几行记录,就能算出每条要增加多少硬盘空间,就可根据数据量估算规划多大的空间。

                        create database tanhong

                        create table tanhong.tan(stuid varchar(10) not null primary key, stunmae varchar(20) not null, stusex char(2) not null,stucardid varchar(20) not null,stucardid varchar(20) not null, birthday datetime defaukt null,address varchar(100) default null);

                        desc tanhong.tan;

                    10个字节+20个字节+2字节+20字节+8字节+100个字节=1.6MB