【MySQL】MySQL无基础学习和入门之一:数据库基础概述和实验环境搭建

数据库基础概述
  大部分互联网公司都选择MySQL做为业务数据存储数据库,除了MySQL目前还有不少公司使用Oracle(甲骨文)、SQLserver(微软)、MongoDB等。
从使用成原本区分能够将数据库分为企业版数据库(商业化)及社区版开源数据库:企业版数据库属于收费型软件,须要购买License或者Key,不然会在使用中受限于用户或数据大小的控制;开源数据库属于免费公开的类型,使用者不用花钱购买许可就可使用。
  像Oracle(甲骨文)企业版、SQL server(微软)、MySQL(甲骨文)企业版、DB2(IBM)属于企业版,MySQL社区版为开源版本。一般商业版本拥有更多的功能,同时拥有软件供应商的技术支持(可是一般技术支持很昂贵),因此银行以及垄断行业国企(电信行业)通常使用企业版数据库。互联网行业兴起后,对于数据的使用量需求增大,同时因为不少社区版数据库功能逐步丰富和性能的提升,互联网公司逐步从优先选择企业版数据库的思路转换尝试免费的社区版本,这样可以下降可观的使用成本(像通常中大型互联网公司的数据需求量,若是使用企业版本数据库则须要花费千万甚至上亿的资金购买企业正版认证和服务),相比较一个数据库工程师或者一个数据库工程师团队的人力成本要低不少。
  前面大部分说的都是传统关系型数据库,关系型数据库的官方定义为:“创建在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据”。其中重点在于“创建在关系模型基础上的数据库”,后面会形象解释区别;针对关系型数据库还有非关系型数据库,非关系型数据库被人们统称NoSQL,像经常使用的Redis、MongoDB、Memcached等。关系型和非关系型数据库在数据存储是都是遵循Key-Value对应的,例如“用户名=张三,性别=男,年龄=20”,其中用户名、性别、年龄就是Key,对应的张3、男和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。 
mysql

 

搭建环境
  互联网公司的服务器一般使用Linux系统做为服务端和数据库的操做系统平台,因此咱们学习MySQL也须要先学会搭建一个本身实验的Linux平台环境。
  在搭建实验环境以前应该先了解实体机和虚拟机的区别。像通常家用台式机、笔记本,公司机房的服务器(机架服务器、刀片服务器或中大型服务器等)都属于实体机,实体机能够理解为现实存在的实体主机;反之虚拟机是虚构出来的没有实物存在的主机,虚拟机运行在实体主机内经过软件层面实现的虚构主机。一台实体主机能够虚拟多个虚拟机,也能够经过多台实体主机的群集虚拟更多的虚拟机实现虚拟化和云的概念。
  在Windows系统中咱们使用VMware Workstation软件搭建Linux虚拟机,根据咱们台式机或者笔记本硬件配置做为指标,实验项目为需求来构建虚拟机。
  下载VMware Workstation和Linux系统镜像(iso文件),而后进行安装,我使用的是VMware Workstation 9和Centos6.3(互联网公司通常使用Redhat或者Centos发布的Linux系统,具体区别可自行查询)。linux

“文件”->“新建虚拟机”c++

 

“新建虚拟机”向导第一步: 选择“标准”方式安装便可sql

 

“新建虚拟机”向导第二步:“安装盘镜像文件”中选择电脑中已经下好的Linux镜像文件,例如我电脑中的是一个Centos6.3 64位的镜像文件shell

 

“新建虚拟机”向导第三步:“Easy安装信息”这一步骤是设置主机名(和虚拟机内部的主机名没有关系)、默认用户和最高权限用户密码,注意这里密码是最高权限用户即root用户的密码数据库

 

“新建虚拟机”向导第四步:在“虚拟机名称”中输入的是在VMware Workstation中显示这台虚拟机的名称,能够看到第一个VMware Workstation截图中左侧“个人电脑”中已经有两个正在运行的虚拟机“Centos6.3.1”和“Centos6.3.2”。“位置”中选择这台虚拟机在Windows中保存的位置,由于虚拟机通常使用比较大的磁盘空间,因此都不会默认使用系统盘,我习惯在一个大磁盘中分配一个独立的空间给虚拟机使用安全

 

“新建虚拟机”向导第五步:在“最大磁盘空间”中设置这台虚拟机磁盘大小,这个磁盘就像实体机的硬盘同样,提供给虚拟机操做系统和数据存储使用服务器

 

“新建虚拟机”向导第六步:完成第五步就基本完成了虚拟机的配置,在第六步的“虚拟机将按一下设置被建立”中是你设置好的虚拟机的基本信息包括虚拟的硬件部分,好比虚拟的“硬盘”、“内存”等网络

 

“新建虚拟机”向导第六步:能够再次“定制硬件”,好比搭建一个测试某个软件功能的实验环境实际不须要大内存,咱们能够经过“定制硬件”将虚拟机分配的内存调小,通常512MB便可数据结构

 

“新建虚拟机”向导第七步:在第六步最下面点击“完成”后,虚拟机基本上都会自动进行安装,有的版本会在中间须要点击一次“OK”

 

“新建虚拟机”安装过程:Linux(不光Centos发布的,其余公司发行版本或社区版也是)实际是由不少功能块组成,在安装过程当中咱们能够看到安装的软件包

 

进入系统“登陆”:注意这时须要选择“other”,而后用root用户和虚拟机安装时设置的root密码进入

 

进入系统“打开命令行”:由于Linux一般不使图形界面来进行操做(Ubuntu的图形界面仍是很不错的),大部分工做都是经过命令行来完成的,因此咱们要学会打开命令行,学会修改主机名和IP地址。进入系统后,在图形界面的桌面鼠标右键打开菜单选择“Open In Terminal”

 

进入系统“查看IP地址”:在虚拟机的命令行中输入“ifconfig”命令能够查看到目前虚拟机的网络链接情况

 

进入系统“查看IP地址”:若是使用“ifconfig”命令获取不到IP地址,例如没有出现上图中“inet addr:192.168.1.105”的信息,而是以下图的状态,能够调整虚拟机的链接设置

 

设置虚拟机的“网络链接”:将虚拟机的“网络链接”从“NAT”调整为“桥接”,过一下子就会发如今虚拟机图形界面右上角时间左侧的电脑网络状态变为正常,红色叉子消失,而后在使用“ifconfig”命令获取虚拟机的IP地址

 

实验环境的使用
  搭建实验环境能够测试软件功能,同时也能够模拟一些场景,例如公司在真实环境中的服务器结构(一般所说的生产环境架构)。
  生产环境指的是互联网公司面向用户搭建的平台,就像工厂向用户提供产品同样,生产环境要求高安全高可靠,通常不会轻易调整生产环境。在软件开发过程当中须要模拟真实场景对软件进行测试,那么就有测试环境(有的公司还有功能环境,比测试环境更接近生产环境)。
  咱们搭建的虚拟机实验环境能够理解为一个测试环境,能够形象的认为VMware Workstation是一个虚拟的机房,而其中的虚拟机是虚拟机房机架上的服务器。
  一般公司的服务器都在大型机房中,咱们没法直接经过图形界面登陆服务器,咱们只能经过网络链接这些服务器,那么就须要SecureCRT或者Xshell这类远程ssh登陆软件。
  在上面搭建环境时咱们已经查看到了虚拟机的IP地址,若是咱们把VMware Workstation认为是虚拟机房,那么咱们就能够经过机房的网络端口与机房中的虚拟服务器进行链接,以下图:

 

下载并打开SecureCRT,“文件”->“快速链接”在主机名中输入刚才Centos6.3.3图形界面的命令行中使用ifconfig命令获取到的IP地址,用户名root,点击“链接”

在初次链接时会有提示“新建主机密钥”,选择“接受并保存”(我使用了Centos6.3.2的链接,因此显示的IP是192.168.1.104)

输入root用户密码,并勾选“保存密码”后肯定就模拟远程登陆进入了虚拟机

在开始使用SecureCRT时会发现Linux本身的一些颜色方案没法显示(好比文件夹蓝色字体、可执行文件绿色、连接的文/件目录浅蓝色),在会话选项中的“终端”选择Linux,同时勾选“ANSI颜色”和“使用颜色方案”

 

一、安装
源码、分发包、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命令安装到系统默认安装路径下。

 

二、启动

初始化

  在第一次启动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
#因为这种方式不经常使用,很少作解释,若是须要本身参考官网说明

 

 

启动后生成的文件 熟悉日志 三、使用 链接的概念 建库建表 添加、查询、删除、更改数据 SQL语法及简单函数 主从复制原理 用户管理及权限控制 备份四、优化 存储引擎的特色 SQL优化方法 监控内存、磁盘的使用

相关文章
相关标签/搜索