一、为什么会有数据库呢?

    刚开始接触数据库的朋友们,都会问数据库用来干啥的呢?字面表达的意思就是用来存储数据的仓库简称"数据库",在日常生活中我们与数据库相关的事务都是一大把一大把的,例如: 1.我们去做火车的时候需要实名认证,为什么安检人员可以通过我们的身份证就可以查询我们的个人信息呢,因为们都是有户口的群众,在公安居民信息库都录入着我们的信息,而们的信息也是存储在国家公民的信息库里面的,这也是我们所说的数据库,早期最传统的数据库就是文本文件,没当查询数据时都需要从头到尾把整个文件都查询一次,查询和检索的效率极其低下,随着互联网大数据的爆发,这种方式以及面临淘汰,于是后来开发产生出各种各样的数据管理程序,这就是数据库的开端及新生。


文本数据库管理数据的缺陷:

  1. 数据冗余、信息冗余产生及数据完整性:导致同一个数据有可能重复多次。

  2. 数据访问缓慢麻烦。

  3. 数据孤立性:数据拆分很难再次建立关联关系。

  4. 原子性问题:有效保证数据库之间交互,能及时同步数据。

  5. 并发访问:文件方式无法实现多并发访问。

  6. 安全性问题:文件方式授权过于笼统,不能实现精细化授权(如:针对库授权、针对表授权、针对用户授权)


数据库管理系统

    为了更加精细的操作数据的存取,在应用程序和数据之间建立一个中间层,专门用来负载数据存取和管理,就产生了数据库管理系统(DBMS)。

wKiom1crJ3vhM8QDAAHgvTpf1jE465.jpg

(DBMS)数据库管理系统,包含前端API接口与前端应用程序交互,也包含shell命令行接口与程序员直接交互。同时负责完成数据存取。这时,前端程序将不再直接面对数据,而有数据库管理系统代理完成更加精细管理工作。包括权限,以及如何按照比较高效的方式分配数据。


数据库模型:
1)层次模型
2)网状模型
3)关系模型:1975年又IBM研究院E.F.Coded提出并发表了最开始论述关系型数据库的模型论文,有拉里.克瑞森和其程序员朋友将其实现,后来承接了美国军方一个名叫oracle的项目创建了oracle公司
4)NoSQL:No only SQL , 很多产品,各有侧重点。 由于海量数据是由分布式存贮, 所以需要CAP测试,NoSQL 产品通常只能满足两个。
CAP测试: Consistent Avilable Partition tolerence 一致性, 可用性,容错性


目前市面上的开源数据库:

1)sqliteMySQL
2)PostgreSQL(EnterpriseDB)
3)MariaDB
4)MySQL


关系型数据库管理模型:

wKioL1csCQqz_yIvAAOp0c-i5ZU517.jpg

存储的文件: 

1)数据:保存的数据

2)索引:保存数据的索引文件

3)事物文件:操作事物文件 

2.磁盘空间管理器: 用于管理磁盘上数据的存取,建立索引等工作 

3.缓冲区管理器: 为了解决频繁I/O的低效,一部分检索结果会存在缓冲区中内存中,缓冲区管理器用于管理存于内存中

4.存取方法接口:管理数据的存取方法,于sql语句作用

5.事务管理器:当以个存取操作完成后,并不是直接写入数据文件,而且写入事物日志中,如果此时数据库崩溃,数据库存取数据将会存入事务日志中。写入数据库文件为随机I/O,写入日志文件为顺序I/O 所以后者比较快。
事务:满足ACID测试
  A:原子性
  C: 一致性
  I:隔离性
  D:持久性

6.锁管理器:当某一数据在被用户访问时,它将不能再被其他用户访问,会被锁管理器锁住。

7.恢复管理器:存取操作写入事务日志但没写入数据中时,数据库崩溃,在第二次重新启时候,事务日志中内容将通过恢复管理器写入到数据文件中

8.SQL查询引擎

1). SQL Struct Query Language: 结构化查询语言, 包含以下三类命令

    (1) DCL: Data Control Language: 数据控制语言,主要是授予或取消某些访问权限

        GRANT/REVORK

    (2) DDL: Data Definition Language:数据定义语言,建立表,创建索引

        CTREAT/ALTER/DROP

    (3) DML : Data Manipulation Language:数据操作语言

        SELECT/INSERT/DELETE/UPDATE

2). SQL查询引擎包含四个部分
    (1) 分析器,进行SQL语言的语法分析
    (2) 查询计划,对查询对象路径进行优化,有可能统一对象存在多条索引
    (3) 优化器, 对于SQL语言查询方式进行优化
    (4) 求解器, 管理返回结果等
    (5) 线程池, 当mysql服务器接收多个并发请求时,分配线程响应多用户
9.SQL命令行接口: SQL的客户端程序,使用SQL命令查询SQL服务器
10.应用程序命令API:不同编程语言有不同的SQL命令输出接口,可以通过API驱动把SQL语句输送给SQL服务器,本质上也是SQL客户端
11.ODBC: 底层关系型数据库查询标准
12.SQL索语言的标准 ANSI: SQL-86, SQL-89, SQL-92, SQL-99, SQL-2003

13.事务隔离:

    隔离级别:

                    读未提交:read uncommitted

                    读提交: read committed

                    可重读:repeatable read

                    串行化: serializable

14.Mysql存储引擎

             MyISAM:无事务

                    非聚集

            InnoDB:事务型  

                    聚集索引

15.关系数据库的约束:

                        主键

                        外键

                        惟一键

                        条件约束

                        非空约束


二、MySQL数据库管理软件安装:

mysql程序来源: mysql.com
  1)vendor 系统自带的rpm包
  2)MySQL官方rpm包:不建议使用,可能会打破依赖关系
  3)通用二进制格式:建议
  4)源码编译:建议


下面我们通过案例进入关系数据库MySQL生产实战配置(编译安装):

操作系统:CentOS release 6.5(x64)

mysql版本:mysql-5.6.30

(1).安装开发环境及开发包组:

# yum -y groupinstall "Development Tools"
# yum -y groupinstall "Development Libraries"
# yum -y install pcre-devel
# yum -y install ncurses-devel
# yum -y install openssl-devel

(2).安装夸平台编译器cmake

# tar xf cmake-2.8.8.tar.gz 
# cd cmake-2.8.8
# ./configure 
# make && make install

(3).数据存储目录规划准备:

规划一个大小为:20G的逻辑卷,以便后期数据量扩展:

# fdisk /dev/sda
# kpartx -l /dev/sda
# kpartx -af /dev/sda
# partx -a /dev/sda

创建逻辑分区管理:

# pvcreate /dev/sda3 
# vgcreate myvg /dev/sda3 
# lvcreate -L 10G -n mydata myvg

格式化挂载逻辑卷目录:

# mke2fs -t ext4 /dev/myvg/mydata 
# mkdir /mydata   #创建挂载目录
# vim /etc/fstab  #在最后加入此行
/dev/myvg/mydata    /mydata            ext4    defaults,acl    0 0
# mount -a
# mkdir /mydata/data
# groupadd -r -g 3306 mysql                    #创建mysql服务用户组
# useradd -r -g 3306 -d /mydata/data/ -s /sbin/nologin mysql    #创建mysql服务用户
# chown mysql.mysql /mydata/data/

考虑生产环境数据安全,可使用ACL权限控制:

# setfacl -m u:mysql:rwx /mydata/data/
# getfacl /mydata/data/
getfacl: Removing leading '/' from absolute path names
# file: mydata/data/
# owner: mysql
# group: mysql
user::rwx
user:mysql:rwx
group::r-x
mask::rwx
other::r-x

(4).编译安装mysql-5.5.33

编译安装之前我们需要设置主机名及主机名解析:

# hostname mysql.samlee.com
# vim /etc/sysconfig/network 
HOSTNAME=mysql.samlee.com
# vim/etc/hosts 
172.16.100.7    mysql.samlee.com

编译安装:

# tar xf mysql-5.5.33.tar.gz
# cd mysql-5.5.33
# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
> -DMYSQL_DATADIR=/mydata/data \
> -DSYSCONFDIR=/etc \
> -DWITH_INNOBASE_STORAGE_ENGINE=1 \
> -DWITH_ARCHIVE_STORAGE_ENGINE=1 \
> -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
> -DWITH_READLINE=1 \
> -DWITH_SSL=system \
> -DWITH_ZLIB=system \
> -DWITH_LIBWRAP=0 \
> -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
> -DDEFAULT_CHARSET=utf8 \
> -DDEFAULT_COLLATION=utf8_general_ci
# make && make install

(5).数据库服务器初始化

# cd /usr/local/mysql/
# chown -R :mysql /usr/local/mysql/    #赋予目录用户组为mysql

#运行./script/mysql_install_db 创建系统库 
# scripts/mysql_install_db --user=mysql --datadir=/mydata/data/

# cp support-files/my-large.cnf /etc/my.cnf             #复制配置文件                                                       
# vim/etc/my.cnf                                        #编辑配置文件
在[mysqld]下添加此项:
datadir = /mydata/data
# cp support-files/mysql.server /etc/init.d/mysqld        #复制启动脚本
# chkconfig --add mysqld                                #加入服务列表
# service mysqld start                                    #启动mysql服务

查询初始化及启动后创建的文件:

# ll /mydata/data/
total 28700
-rw-rw----. 1 mysql mysql 18874368 May  6 14:27 ibdata1                #inodb存储引擎的表空间文件
-rw-rw----. 1 mysql mysql  5242880 May  6 14:27 ib_logfile0            #inodb事物日志    
-rw-rw----. 1 mysql mysql  5242880 May  6 14:27 ib_logfile1
drwx------. 2 mysql root      4096 May  6 14:25 mysql
-rw-rw----. 1 mysql mysql      107 May  6 14:27 mysql-bin.000001          #二进制日志
-rw-rw----. 1 mysql mysql       19 May  6 14:27 mysql-bin.index
-rw-r-----. 1 mysql root      1777 May  6 14:27 mysql.samlee.com.err      #错误信息记录
-rw-rw----. 1 mysql mysql        6 May  6 14:27 mysql.samlee.com.pid      #pid文件
drwx------. 2 mysql mysql     4096 May  6 14:25 performance_schema
drwx------. 2 mysql root      4096 May  6 14:25 test

导出头文件,库文件和man文档:

# ln -sv /usr/local/mysql/include/ /usr/include/mysql
# vim /etc/ld.so.conf.d/mysql.conf
添加此行:
/usr/local/mysql/lib/
# ldconfig
# ldconfig -p | grep mysql
# vim /etc/man.config 
添加此行:
MANPATH /usr/local/mysql/man
# man mysqld

(6)配置PATH环境变量

# vim /etc/profile.d/mysql.sh
export PATH=$PATH:/usr/local/mysql/bin
# chmod +x /etc/profile.d/mysql.sh
# . /etc/profile.d/mysql.sh

以上mysql编译安装过程。


、MySQL配置文件my.cnf及MySQL命令的应用:

1).服务器配置文件和客户端配置是集中式的配置属于多个应用程序共用的配置文件,可以分为以下3个部分:

(1)[mysql]: mysql客户端配置部分,只是用来配置mysql自己的客户端 。
(2)[mysqld]: mysql客户端服务器配置部分。
(3)[client]: mysql的所有客户端,包括其他的客户端。

使用配置文件的方式:
    1、它依次查找每个需要查找的文件,结果是所有文件并集;
    2、如果某参数在多个文件中出现多次,后读取的最终生效;


2).查询mysql服务变量方式有如下:

(1)显示mysqld程序启动时可用的选项,通常都是长选项
(2)显示mysqld的配置文件中可用的服务变量

# /usr/local/mysql/bin/mysqld --help --verbose

进入mysql模式查询:

mysql> SHOW GLOBAL VARIABLES
mysql> SHOW SESSION VARIABLES


3).修改mysql管理员密码删除匿名用户:

用户帐号由两部分组成:username@host
host还可以使用通配符
%: 任意长度的任意字符
_: 匹配任意单个字符

(1)删除所有匿名用户

mysql> DROP USER ''@'localhost';        
mysql> DROP USER ''@'mysql.samlee.com'; 
mysql> DROP USER 'root'@'::1';

(2)修改管理员密码

第1种方式:

mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('redhat');
mysql> SET PASSWORD FOR 'root'@'127.0.0.1' = PASSWORD('redhat');
mysql> SET PASSWORD FOR 'root'@'mysql.samlee.com' = PASSWORD('redhat');
mysql> FLUSH PRIVILEGES;

第2种方式:

# mysqladmin -uroot -h172.16.100.7 password 'redhat' -p
# mysqladmin -uroot -hlocalhost password 'redhat' -p
# mysqladmin -uroot -hmysql.samlee.com password 'redhat' -p

第3种方式:

# mysql -uroot -hlocalhost -p
mysql> use mysql;
mysql> UPDATE user SET password = PASSWORD('redhat') WHERE user = 'root';
mysql> FLUSH PRIVILEGES;



4).连入MySQL服务器

连接过程如下:

                    mysql client <--mysql protocol--> mysqld


mysqld接收连接请求:
    本地通信:客户端与服务器端位于同一主机,而且还要基于127.0.0.1(localhost)地址或lo接口进行通信;
        Linux OR Unix: Unix Sock, /tmp/mysql.sock, /var/lib/mysql/mysql.sock
        Windows: memory, pipe
    远程通信:客户端与服务器位于不同的主机,或在同一主机便使用非回环地址通信
        TCP socket
客户端工具:mysql, mysqladmin, mysqldump, mysqlcheck
    [client]
通行的选项:
        -u, --user=
        -h, --host=
        -p, --password=
        --protocol={tcp|socket|memory|pipe}
        --port=
        --socket=    例如:/tmp/mysql.sock
mysql默认监听的端口: 3306/tcp


演示如下:

# mysql -uroot -hlocalhost -p
Enter password: 

# mysql -uroot -h127.0.0.1 -p --port=3306 --socket=/tmp/mysql.sock
Enter password:


5).MySQL工作模式:

           脚本模式:

            # mysql -uUsername -hhostname -p < /path/to/mysql_script.sql

脚本演示如下:

wKiom1csTz7xdk3oAASNiR6iMu4438.jpg

mysql交互式模式:
    客户端命令
        mysql> help
        mysql> \?
            \c:结束当前输入执行
            \g:按列显示
            \G:以行显示
            \q:退出mysql
            \!
            \s
            \. /path/to/mysql_script.sql

服务器端命令:需要命令结束符,默认为分号(;)
        mysql> help contents
        mysql> help Keryword

mysql命令行选项:
    --compress
    --database=, -D
    -H, --html:输出结果为html格式的文档
    -X, --xml: 输出格式为xml
    --sate-updates: 拒绝使用无where子句的update或delete命令;
wKiom1csUafwGoERAANOXbijZxk199.jpg


mysql命令提示符:
    mysql> 等待输入命令
    ->
    '>
    ">
    `>
    /*> 注释信息

mysql的快捷键:
    Ctrl + w: 删除光标之前的单词
    Ctrl + u: 删除光标之前至命令行首的所有内容
    Ctrl + y: 粘贴使用Ctrl+w或Ctrl+u删除的内容
    Ctrl + a: 移动光标至行首
    Ctrl + e: 移动光标至行尾


mysqldmin工具:
    mysqladmin [options] command [arg] [command [arg]] ...

        command:
            create DB_NAME
            drop DB_NAME
            debug: 打开调试日志并记录于error log中;

            status:显示简要状态信息
                --sleep #: 间隔时长
                --count #: 显示的批次


            extended-status: 输出mysqld的各状态变量及其值,相当于执行“mysql> SHOW GLOBAL STATUS”
            variables: 输出mysqld的各服务器变量
            flush-hosts: 清空主机相关的缓存:DNS解析缓存,此前因为连接错误次数过多而被拒绝访问mysqld的主机列表
            flush-logs: 日志滚动,二进制日志和中继日志
            refresh: 相当于同时使用flush-logs和flush-hosts
            flush-privileges:
            reload: 功能同flush-privileges
            flush-status: 重置状态变量的值
            flush-tables: 关闭当前打开的表文件句柄
            flush-threads:清空线程缓存
            kill: 杀死指定的线程,可以一次杀死多个线程,以逗号分隔,但不能有多余空格
            password: 修改当前用户的密码;
            ping:
            processlist:显示mysql线程列表
            shutdown: 关闭mysqld进程;
            start-slave
            stop-slave: 启动/关闭从服务器线程

实例演示:

# mysqladmin -uroot -hmysql.samlee.com status --sleep 1  -p
# mysqladmin -uroot -hmysql.samlee.com variables -p


GUI客户端工具:
    Navicat for mysql
    Toad for mysql
    mysql front
    sqlyog
    phpMyAdmin

以上Mysql编译安装及数据库基础(一)所有内容。