概述
大部分互联网公司都选择MySQL作为业务数据存储数据库,除了MySQL目前还有很多公司使用Oracle(甲骨文)、SQLserver(微软)、MongoDB等。
从使用成本来区分可以将数据库分为企业版数据库(商业化)及社区版开源数据库:企业版数据库属于收费型软件,需要购买License或者Key,否则会在使用中受限于用户或数据大小的控制;开源数据库属于免费公开的类型,使用者不用花钱购买许可就可以使用。
像Oracle(甲骨文)企业版、SQL server(微软)、MySQL(甲骨文)企业版、DB2(IBM)属于企业版,MySQL社区版为开源版本。通常商业版本拥有更多的功能,同时拥有软件供应商的技术支持(但是通常技术支持很昂贵),所以银行以及垄断行业国企(电信行业)一般使用企业版数据库。互联网行业兴起后,对于数据的使用量需求增大,同时由于很多社区版数据库功能逐步丰富和性能的提高,互联网公司逐步从优先选择企业版数据库的思路转换尝试免费的社区版本,这样能够降低可观的使用成本(像一般中大型互联网公司的数据需求量,如果使用企业版本数据库则需要花费千万甚至上亿的资金购买企业正版认证和服务),相比较一个数据库工程师或者一个数据库工程师团队的人力成本要低很多。
前面大部分说的都是传统关系型数据库,关系型数据库的官方定义为:“建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据”。其中重点在于“建立在关系模型基础上的数据库”,后面会形象解释区别;针对关系型数据库还有非关系型数据库,非关系型数据库被人们统称NoSQL,像常用的Redis、MongoDB、Memcached等。关系型和非关系型数据库在数据存储是都是遵循Key-Value对应的,例如“用户名=张三,性别=男,年龄=20”,其中用户名、性别、年龄就是Key,对应的张三、男和20就是Value,这样就可以利用对应条件例如“用户名”是“张三”找到对应的“张三”的属性“性别=男,年龄=20”。
通常可以把关系型数据库中的Table(表)想象成一个标准的Excel文件中的sheet(页下签),在页面的第一行中是各个列的属性(列属性实际是表结构定义好的,列属性不单有列名,还包含其他属性,且在真正使用中列属性通常是隐式的),例如上面说的用户名、性别、年龄,列属性下面的所有内容就是所有数据,每一行的内容都是按照列属性定义好的,例如第一行是“张三,男,20”,第二行是“李四,男,21”。
非关系型数据库其实也是遵循Key-Value的,利用MongoDB举例(MongoDB是文档型数据库,其中的文档可以理解为数据行,数据表叫作集合),在MongoDB的集合中不规定你必须存储什么样的数据,既可以存储文档为“用户名=张三,性别=男,年龄=20”,也可以存储文档为“国家=中国,城市=北京”,列属性和列数量没有关系型数据库的表结构定义限制。关系型数据库与非关系型数据库没有好与坏的区分,他们需要根据不同业务场景和业务功能需要来使用。(简单了解即可)
MySQL的社区版又有很多分支,例如官方MySQL社区版、Percona社区版、MariaDB版本等,虽然他们软件提供方不一样,但实际都是在MySQL主要代码基础上封装了一些特有功能特点,例如MySQL 5.5版本、Percona 5.5版本和MariaDB 5.5版本基本功能是一样的。在实际工作中需要每个公司出的小版本都有哪些特性和新功能。
如果我们只需要维护一个简单的数据关系且数据量很小,那么可能一个Excel表格就能满足需求,但是如果数据量达到千万,数据文件几个G,那么就无法通过一个简单文本进行维护了。数据库的性能来自于数据结构和内存的使用,因为内存随机读速度比传统机械硬盘随机读速度高很多倍(暂时不引入固态硬盘讨论),所以如果能将数据库数据全部加载到内存中查询数据会很快,这也就是为什么数据库服务器的内存通常都很大,当然数据库内存大只是提供一个优良的平台,如果不进行合理的设计以及性能的调优,那么数据库使用的效率也会降低,后面会逐步说明。
数据库工程师英文全称是Database Administator,简称DBA,根据不同的数据库可以分为Oracle DBA、SQL Server DBA、MySQL DBA等。
MySQL 5.5官网功能说明索引:http://dev.mysql.com/doc/refman/5.5/en/
目前MySQL官方大版本为5.7。
1、安装
源码、分发包、rpm安装的区别和适用场景
源码包:
源码包就是程序源代码包,其中包含程序代码文件,这些代码文件是文本型,可以直接通过编辑器打开阅读内容,这里的程序还不能直接使用,因为操作系统和电脑无法直接调用文本代码,需要语言编译器将文本代码编译成二进制文件,编译完成的输出就是分发包。Windows系统安装软件时经常会出现一个自定义安装的选项,用户可以自主选择软件部分功能安装,取消安装不需要的组件,增加安装默认组件外的可选功能,在Linux系统上是通过编译参数控制软件自带功能的安装,稍后在编译安装MySQL时会举例说明。
分发包:
分发包是通过源码包编译完成的软件,可以直接使用。由于在公司生产环境中可能会出现Linux服务器版本不同、底层c和c++等语言库版本不同,可以根据系统环境版本及稳定性的需要选择源码包编译安装,或直接使用分发包。源码包编译安装可以根据自己需要选择开启或关闭一些功能,分发包由于是已经编译好的,无法再进行选择和调整,除非重新修改编译参数再编译。
rpm安装:
Linux系统提供yum命令的简单快捷软件安装方式,当Linux系统联网且yum源配置完成后,使用“yum install”加软件包名就可以安装该软件以及相关所需要的环境。
如果Linux系统主机未联网也可以在其他主机上登录软件官网下载rpm包,然后上传到该主机上使用rpm命令进行安装,但是系统会校验所需要的环境。
熟悉MySQL的三种安装方式:源码、分发包、rpm
MySQL官方下载地址:http://dev.mysql.com/downloads/mysql/
在下载页面中“Select Platform”的“Source Code”是源码包,“Linux - Generic”是官方分发包,“Red Hat EnterPrise Linux/Oracle Linux”中下载rpm包。
源码包安装:
#需要安装cmake,如果没有配置yum源可以编译安装 yum -y install cmake.x86_64 #解压源码包 tar -zxvf mysql-5.5.40.tar.gz #进入源码包目录 cd mysql-5.5.40 #cmake源码参数 #注意参数“-DCMAKE_INSTALL_PREFIX=”控制MySQL源码编译完软件放置的路径,通常情况用户自主安装的软件放置在“/usr/local/”下 #参数“-DWITH_INNOBASE_STORAGE_ENGINE=1”说明开启InnoDB引擎 #参数“-DDEFAULT_CHARSET=utf8”说明默认使用的字符集为utf8(字符集后面解释) cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DENABLED_LOCAL_INFILE=1 -DMYSQL_USER=mysql -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_PERFSCHEMA_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all #编译 make && make install #编译完成后可以查看安装完成的软件 [root@test1 ~]# cd /usr/local/mysql [root@test1 mysql]# ll total 200 drwxr-xr-x 2 root root 4096 Oct 21 15:19 bin -rw-r--r-- 1 root root 17987 Mar 15 2014 COPYING drwxr-xr-x 3 root root 4096 Sep 6 09:32 data drwxr-xr-x 2 root root 4096 Sep 6 09:32 docs drwxr-xr-x 3 root root 4096 Sep 6 09:32 include -rw-r--r-- 1 root root 133770 Mar 15 2014 INSTALL-BINARY drwxr-xr-x 3 root root 4096 Sep 6 09:32 lib drwxr-xr-x 4 root root 4096 Sep 6 09:32 man drwxr-xr-x 10 root root 4096 Sep 6 09:32 mysql-test -rw-r--r-- 1 root root 2496 Mar 15 2014 README drwxr-xr-x 2 root root 4096 Oct 22 17:57 scripts drwxr-xr-x 27 root root 4096 Sep 6 09:32 share drwxr-xr-x 4 root root 4096 Sep 6 09:32 sql-bench drwxr-xr-x 3 root root 4096 Sep 6 09:32 support-files #bin路径下都是MySQL的命令,包含MySQL启动、停止、备份等命令 #include、lib等路径下都是MySQL底层编译完成的类库文件 #scripts下面有初始化MySQL的脚本,每个MySQL都需要初始化建立最基础的系统表及用户表(也可以使用相同版本的初始化文件在其他未初始化实例中使用,就可以省略执行初始化脚本)
分发包安装:
#解压分发包 tar -zxvf mysql-5.5.41-linux-x86_64.tar.gz #解压完成以后就会像上面编译安装完后的样子
yum/rpm包安装:
#如果系统可以联网且配置yum源可以直接yum安装 yum install -y mysql* #如果未联网的系统可以下载好rpm包上传,然后使用rpm -ivh安装
安装完成后生成的文件
编译完成后生成的文件及文件夹如上面编译示例,分发包解压完成后也大致相同。但是编译安装后MySQL的路径是由编译前cmake参数控制的,编译完成MySQL文件会拷贝至该路径下。
分发包解压就可以使用。
yum和rpm安装会将MySQL命令安装到系统默认安装路径下。
2、启动
初始化
在第一次启动MySQL之前需要进行初始化,前面在介绍编译完的MySQL目录中提到了一个“scripts”目录,其中包含初始化脚本。因为MySQL数据库在启动时会使用一些系统表和用户表,这些表在初始状态下是没有的,都需要使用初始化脚本建立生成(也可以使用相同版本的初始化文件在其他未初始化实例中使用,就可以省略执行初始化脚本)
[root@test ~]# mkdir -p /data1/mysql/3306_mysql
[root@test ~]# /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/data1/mysql/3306_mysql Installing MySQL system tables... OK Filling help tables... OK ...
#执行命令后出现两个OK表示初始化正常(“/data1/mysql/3306_mysql”路径需要先建立),可能不同版本的MySQL输出内容不完全相同 #在上面mysql_install_db命令的参数中,“--basedir=/usr/local/mysql”是MySQL安装目录参数以及安装目录路径,“--datadir=/data1/mysql/3306_mysql”是MySQL数据目录参数及数据目录路径 #执行上面的命令后会在“/data1/mysql/3306_mysql”目录中建立几个目录和文件 [root@test ~]# ll /data1/mysql/3306_mysql/ total 1092 -rw-rw---- 1 root root 0 Feb 3 17:42 log-error.log drwx------ 2 root root 4096 Feb 3 17:42 mysql -rw-rw---- 1 root root 27711 Feb 3 17:42 mysql-bin.000001 -rw-rw---- 1 root root 1069399 Feb 3 17:42 mysql-bin.000002 -rw-rw---- 1 root root 38 Feb 3 17:42 mysql-bin.index drwx------ 2 root root 4096 Feb 3 17:42 performance_schema drwx------ 2 root root 4096 Feb 3 17:42 test
可以看到上面生成了3个目录分别是mysql、performance_schema、test,这3个目录是初始化脚本生成的3个库(数据库中的库,库是存放表的单位,MySQL会默认MySQL数据目录中的目录都是它是库),其中mysql目录最重要,其中包含上面提到的系统表和用户表,另外两个目录则默认为空。
mysql-bin为名的文件是MySQL的二进制日志,后面复制中会提到;log-error.log是MySQL的错误日志,其中会包含启动过程、运行中出现的错误以及一些其他信息。前面提到的两个文件可以通过修改配置文件调整文件命名规则,所以在一些人或公司使用MySQL时会出现其他的二进制文件名、错误日志名。
另外注意在初始化MySQL后要讲数据目录调整为mysql用户所属。
配置与配置文件
使用Windows软件时通常会有软件设置,在Linux系统中的软件通常在启动和使用时利用软件参数调整软件的自带功能。因为通常软件的启动参数较多,也有软件(例如MySQL)不支持直接使用内置参数加载,所以需要配置文件,配置文件是汇总一个软件配置信息的独立文件,软件通过直接读取配置文件获取所有的配置信息,不用在软件启动时后面跟很多参数。
MySQL启动时有启动参数(在Linux系统上的命令参数都可以使用“命令 --help”的方式获得说明,例如“mysqld_safe --help”),MySQL在使用中有动态和静态参数两种。
启动参数
MySQL在启动时一般使用“--defaults-file=配置文件”让MySQL实例启动时加载配置文件。
内置参数(配置文件中的)
由于数据库性能依靠内存,所以配置文件中会有很多针对MySQL实例内存的设置,用几个参数举例:
key_buffer_size = 64M #MyISAM引擎表内存预分配大小,实例级别参数
innodb_buffer_pool_size = 1G #InnoDB引擎表内存预分配大小(MySQL 5.7以前版本无法动态修改),实例级别参数
sort_buffer_size = 4M #MySQL服务在处理排列时可以使用的内存,线程级别
数据库一般会对请求进行限制,比如只能同时对200个不同请求源进行处理,在这之外的请求需要等待直到200个请求中有已经完成且断开连接的。可以把管理这些连接的东西看做一个池“连接池”,当连接池满了就无法在承载,除连接池外还有个处理等待请求的连接池。相关参数有:
max_connections=200 #最大连接数限制,就是上面说的200个请求,在MySQL中我们称之为thread“线程”
max_user_connections=150 #用户的最大连接数限制,也就是说同一个用户可以从不同的地方访问数据库,但是受限于这个值
connect_timeout = 20 #连接等待超时时间。当等待的请求超过这个时间就被断开
wait_timeout=30 #连接请求处理完成后,如果空闲时间超过30秒会被MySQL主动断开
interactive_timeout=30 #与wait_timeout设置相同即可,参数具体差异可以参考官网说明
动态参数与静态参数
动态参数就是在MySQL在使用中可以直接调整并且生效的参数。相反有些参数无法直接修改生效,需要修改配置文件并重启MySQL实例才可以。
MySQL不同版本的参数也完全相同,有的低版本参数在高版本中取消了,有的低版本参数无法动态修改然后高版本可以。
单、多实例启动
单实例启动 mysqld_safe
[root@test ~]# /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf & #上面命令中“/usr/local/mysql/bin”是MySQL编译安装完的命令目录,“--defaults-file=/etc/my.cnf”是配置文件参数以及配置文件位置,“&”是Linux的修饰符,表示这个命令在后台运行
在互联网公司中通常一台数据库服务器不只运行一个MySQL实例(一个运行的MySQL就叫作一个MySQL实例),就像一台电脑可以运行多个QQ一样。
同时启动多个实例 mysqld_multi
[root@test ~]# /usr/local/mysql/bin/mysqld_multi --defaults-file=/etc/my.cnf start 3306 3307 3308 #由于这种方式不常用,不多做解释,如果需要自己参考官网说明