mysql基础理论及通用二进制方式安装

一、数据库概述

1、文本数据库缺陷

数据冗余和不一致

数据访问困难

数据孤立

完整性问题:数据状态改变前后,总状态要一致

原子性问题:多个操作看成一个操作,要么同时完成,要么同时不完成

并发访问问题:

安全性问题:只允许访问部分信息如何解决

2、DBMS

(1)DBMS:DataBase Management System 数据库管理系统

用户层|视图层: 

逻辑层 :完成用户层到视图层转换

物理层:

(2)数据模型

     层次模型

     网状模型

     关系模型

          库和表,二维关系

    非关系型数据库模型:nosql

3、RDBMS

RDBMS:关系型数据库管理系统

C/S架构:通过专有协议,mysql协议

关系模型:表(行,列),二维关系

关系型数据库必须满足基本的设计范式:第一范式、第二范式、第三范式;

范式:英文名称是 Normal Form,它是英国人 E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结出来的,范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法

目前有迹可寻的共有8种范式,依次是:1NF,2NF,3NF,BCNF,4NF,5NF,DKNF,6NF。

通常所用到的只是前三个范式,即:第一范式(1NF),第二范式(2NF),第三范式(3NF)。

下面就简单介绍下这三个范式。
◆ 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。 
考虑这样一个表:【联系人】(姓名,性别,电话) 
如果在实际场景中,一个联系人有家庭电话和公司电话,那么这种表结构设计就没有达到 1NF。要符合 1NF 我们只需把列(电话)拆分,即:【联系人】(姓名,性别,家庭电话,公司电话)。1NF 很好辨别,但是 2NF 和 3NF 就容易搞混淆。 
◆ 第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。 

考虑一个订单明细表:【OrderDetail】(OrderID,ProductID,UnitPrice,Discount,Quantity,ProductName)。 
因为我们知道在一个订单中可以订购多种产品,所以单单一个 OrderID 是不足以成为主键的,主键应该是(OrderID,ProductID)。显而易见 Discount(折扣),Quantity(数量)完全依赖(取决)于主键(OderID,ProductID),而 UnitPrice,ProductName 只依赖于 ProductID。所以 OrderDetail 表不符合 2NF。不符合 2NF 的设计容易产生冗余数据。 
可以把【OrderDetail】表拆分为【OrderDetail】(OrderID,ProductID,Discount,Quantity)和【Product】(ProductID,UnitPrice,ProductName)来消除原订单表中UnitPrice,ProductName多次重复的情况。 
◆ 第三范式(3NF):首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。 
考虑一个订单表【Order】(OrderID,OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity)主键是(OrderID)。 
其中 OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity 等非主键列都完全依赖于主键(OrderID),所以符合 2NF。不过问题是 CustomerName,CustomerAddr,CustomerCity 直接依赖的是 CustomerID(非主键列),而不是直接依赖于主键,它是通过传递才依赖于主键,所以不符合 3NF。 
通过拆分【Order】为【Order】(OrderID,OrderDate,CustomerID)和【Customer】(CustomerID,CustomerName,CustomerAddr,CustomerCity)从而达到 3NF。 
第二范式(2NF)和第三范式(3NF)的概念很容易混淆,区分它们的关键点在于,2NF:非主键列是否完全依赖于主键,还是依赖于主键的一部分;3NF:非主键列是直接依赖于主键,还是直接依赖于非主键列。

关系运算

      选择:挑选符合条件的行

      投影:挑选符合条件的列

数据库:表,索引,视图(虚表)

SQL: Structure Query Language 结构化查询语言

DDL, DML,DCL

编程接口:

存储过程:

存储函数

触发器

事件调度器

过程式编程:选择、循环

三层模型:

物理层:存储角度,数据库存储设备中存储的样式

逻辑层:DBA脚本

视图层:用户角度

二、MySQL

1、RDBMS解决方案

商业:Oracle, Sybase, Infomix(IBM), DB2(IBM)

开源:MySQL,MariaDB, PostgreSQL(技术最先进),SQLite

MySQL重要版本: 5.1 --> 5.5 --> 5.6 --> 5.7

MariaDB:最新版本10.1.9

mysql特性:

       插件式存储引擎

       单进程多线程:

                    连接线程

                    守护线程

事务:一次多次操作的组合;把多个操作当作一个操作,要么都同时执行,要么都同时不执行

满足ACID测试:

        A:原子性

        C:一致性

        I:隔离性

        D:持久性

线程池:

ODBC:Open DataBase Connectivity

ANSI:SQL-86,SQL-89,SQL-92,SQL-99,SQL-2003

C/S架构:mysql/mysqld

三、安装MySQL

官网:www.mysql.com

四种方式安装mysql:

   1)OS Vendor:操作系统自带的rpm包

   2)MySql官方rpm包

   3)通用二进制格式

   4)源码编译

主流5.5

硬件:内存足够大,硬盘足够快

建议做在硬raid的lvm上

1、mysql安装

yum install -y mysql mysql-server mysql-devel

2、mysql初始化

    rpm包安装的mysql第一次启动会自动初始化   

在/var/lib/mysql下建立一些相关文件,建立mysql初始数据库,提示设置mysql默认管理员用户root设置密码,默认没有密码

[root@bogon ~]# ls /var/lib/mysql/     #没初始化前这个目录是空的,初始化后生成这6个文 件    
ibdata1  ib_logfile0  ib_logfile1  mysql  mysql.sock  test 
mysql> show databases;
+--------------------+
| Database           |   #默认有这3个数据库
+--------------------+
| information_schema |  
| mysql              |
| test               |
+--------------------+

3、安装后的设定

1)为所有root用户设定密码

方法1:用mysqladmin 
格式:mysqladmin -u用户名 -p旧密码 password 新密码 

      或者mysqladmin -u USER -p password PASSWORD     #这样写之后会提示输入原密码,输入正确后即可修改例子:mysqladmin -uroot -p123456 password 123          

方法2: 用SET PASSWORD命令 
首先登录MySQL。 
格式:mysql> set password for 用户名@localhost = password('新密码'); 
例子:mysql> set password for root@localhost = password('123'); 
方法3:用UPDATE直接编辑user表 
首先登录MySQL。 
mysql> use mysql; 
mysql> update user set password=password('123') where user='root' and host='localhost'; 
mysql> flush privileges; 
        

2)删除所有匿名用户

     mysql> drop user ''@'localhost';

3)建议关闭主机名反解功能

上述1,2步骤可运行命令完成:mysql_secure_installation

四、MySQL的配置文件

mysql主配置文件/etc/my.cnf

MySQL的配置文件:集中式的配置,能够为mysql的各应用程序提供配置信息

[mysqld]

[mysqld_safe]   #线程安全的mysql

[mysqld_multi]  #多实例的mysql

[server]             #服务器端mysql都有效

[mysql]              #专用于mysql客户端的配置

[mysqldump]

[client]                #客户端mysql都有效


parameter(参数) = value

支持"_","-"

例如:

skip-name-resolve  跳过名称解析

skip_name_resolve

mysql查找配置文件的顺序:

查找路径:/etc/my.cnf --> /etc/mysql/my.cnf --> $MYSQL_HOME/my.cnf --> --default-extra-file=/path/to/somedir/my.cnf(启动时指定的配置文件路径)--> ~/.my.cnf

注意:不管第一个是否查找到,都会继续按上述顺序继续查找下去

          靠后的参数是最终生效的

五、mysql的使用模式

1、mysql使用

 1)交互式模式:

可运行命令有两类:

客户端命令:

\h, help

服务器端命令:

SQL, 需要语句结束符“;”

 2)脚本模式:

# mysql -uUSERNAME -hHOST -pPASSWORD < /path/from/somefile.sql

# mysql> source /path/from/somefile.sql

2、MySQL客户端程序

mysql:交互式的CLI工具

mysqldump:备份工具,基于mysql协议向mysqld发起查询请求,并将查询所得的所有数据换成insert等写操作语句保存在文本文件中

mysqladmin:基于mysql协议管理mysqld

mysqlimport:数据导入工具

非客户端类管理工具(不能基于mysql协议远程管理mysqld):

myisamchk:检查,修复myisam表的工具

myisampack:打包,压缩myisam表后存放,只读,只能查询


如何获取程序默认使用的配置:

mysql --print-defaults

mysqld --print-defaults

客户端类应用程序的可用选项:

-u, --user=

-h, --host=

-p, --passowrd=

-P, --port=

--protocol={tcp|sock}

-S, --socket=  

-D, --database=    #使用的默认数据库

-C, --compress     #压缩


mysql -e "SQL"   #不进入交互模式而直接运行命令

3、服务器端(mysqld)

工作特性有多种定义方式:

命令行选项

配置文件参数

获取可用参数列表:

mysqld --help --verbose

获取运行中的mysql进程使用各服务器参数及其值:

mysql> SHOW GLOBAL VARIABLES;

mysql> SHOW [SESSION] VARIABLES;

注意:

      其中有些参数支持运行时修改,会立即生效;有些参数不支持,且只能通过修改配置文件,并重启服务器程序生效;

     有些参数作用域是全局的,且不可改变;有些可以为每个用户提供单独的设置;

修改服务器变量的值:

mysql> help SET

全局:

     mysql> SET GLOBAL system_var_name=value;

    mysql> SET @@global.system_var_name=value;

会话:

mysql> SET [SESSION] system_var_name=value;

mysql> SET @@[session.]system_var_name=value;


状态变量:用于保存mysqld运行中的统计数据的变量;

mysql> SHOW GLOBAL STATUS;

mysql> SHOW [SESSION] STATUS;

七、通用二进制格式,以5.5为例

最新稳定版:mysql-5.7.9

注意:通用二进制安装路径必须为/usr/local/mysql

      创建系统用户mysql来运行mysqld

      通同二进制包命名一般是:mysql-VERSION-OS-ARCH.tar.gz

1、下载安装包,解压及链接到/usr/local/mysql

[root@BAIYU_179 ~]# ls
anaconda-ks.cfg  install.log  install.log.syslog  mysql-5.5.33-linux2.6-x86_64.tar.gz  trash.sh
[root@BAIYU_179 ~]# tar xfC mysql-5.5.33-linux2.6-x86_64.tar.gz /usr/local 
[root@BAIYU_179 ~]# cd /usr/local
[root@BAIYU_179 local]# ls
bin  etc  games  include  lib  lib64  libexec  mysql-5.5.33-linux2.6-x86_64  sbin  share  src
[root@BAIYU_179 local]# ln -sv mysql-5.5.33-linux2.6-x86_64/ mysql
"mysql" -> "mysql-5.5.33-linux2.6-x86_64/"

2、创建系统用户mysql数据存放目录,并修改/usr/local/mysql/目录下所有文件的属主属组

[root@BAIYU_179 local]# useradd -rs /sbin/nologin mysql
[root@BAIYU_179 local]# cd mysql
[root@BAIYU_179 mysql]# ll
总用量 200
drwxr-xr-x  2 root root    4096 10月 27 16:59 bin
-rw-r--r--  1 7161 wheel  17987 7月  15 2013 COPYING
drwxr-xr-x  3 root root    4096 10月 27 16:59 data
drwxr-xr-x  2 root root    4096 10月 27 16:59 docs
drwxr-xr-x  3 root root    4096 10月 27 16:59 include
-rw-r--r--  1 7161 wheel 134493 7月  15 2013 INSTALL-BINARY
drwxr-xr-x  3 root root    4096 10月 27 16:59 lib
drwxr-xr-x  4 root root    4096 10月 27 17:00 man
drwxr-xr-x 10 root root    4096 10月 27 17:00 mysql-test
-rw-r--r--  1 7161 wheel   2496 7月  15 2013 README
drwxr-xr-x  2 root root    4096 10月 27 17:00 scripts
drwxr-xr-x 27 root root    4096 10月 27 16:59 share
drwxr-xr-x  4 root root    4096 10月 27 17:00 sql-bench
drwxr-xr-x  3 root root    4096 10月 27 17:00 support-files
[root@BAIYU_179 mysql]# chown -R mysql.mysql ./
[root@BAIYU_179 mysql]# ll
总用量 200
drwxr-xr-x  2 mysql mysql   4096 10月 27 16:59 bin
-rw-r--r--  1 mysql mysql  17987 7月  15 2013 COPYING
drwxr-xr-x  3 mysql mysql   4096 10月 27 16:59 data
drwxr-xr-x  2 mysql mysql   4096 10月 27 16:59 docs
drwxr-xr-x  3 mysql mysql   4096 10月 27 16:59 include
-rw-r--r--  1 mysql mysql 134493 7月  15 2013 INSTALL-BINARY
drwxr-xr-x  3 mysql mysql   4096 10月 27 16:59 lib
drwxr-xr-x  4 mysql mysql   4096 10月 27 17:00 man
drwxr-xr-x 10 mysql mysql   4096 10月 27 17:00 mysql-test
-rw-r--r--  1 mysql mysql   2496 7月  15 2013 README
drwxr-xr-x  2 mysql mysql   4096 10月 27 17:00 scripts
drwxr-xr-x 27 mysql mysql   4096 10月 27 16:59 share
drwxr-xr-x  4 mysql mysql   4096 10月 27 17:00 sql-bench
drwxr-xr-x  3 mysql mysql   4096 10月 27 17:00 support-files
[root@BAIYU_179 mysql]# mkdir /data/mydata
[root@BAIYU_179 mysql]# chown -R mysql.mysql /data/mydata/  #mysql用户肯定要有这个目录的权限咯

 3、初始化mysql并创建mysql服务脚本及配置文件

[root@BAIYU_179 mysql]# scripts/mysql_install_db --datadir=/data/mydata --user=mysql
[root@BAIYU_179 mysql]# ls /data/mydata
mysql  performance_schema  test          #每个目录(文件不是哦)被视为一个库
[root@BAIYU_179 mysql]# chown -R root .  #将mysql目录下的所有文件属主改为root
[root@BAIYU_179 mysql]# ll
总用量 200
drwxr-xr-x  2 root mysql   4096 10月 27 16:59 bin
-rw-r--r--  1 root mysql  17987 7月  15 2013 COPYING
drwxr-xr-x  3 root mysql   4096 10月 27 16:59 data
drwxr-xr-x  2 root mysql   4096 10月 27 16:59 docs
drwxr-xr-x  3 root mysql   4096 10月 27 16:59 include
-rw-r--r--  1 root mysql 134493 7月  15 2013 INSTALL-BINARY
drwxr-xr-x  3 root mysql   4096 10月 27 16:59 lib
drwxr-xr-x  4 root mysql   4096 10月 27 17:00 man
drwxr-xr-x 10 root mysql   4096 10月 27 17:00 mysql-test
-rw-r--r--  1 root mysql   2496 7月  15 2013 README
drwxr-xr-x  2 root mysql   4096 10月 27 17:00 scripts
drwxr-xr-x 27 root mysql   4096 10月 27 16:59 share
drwxr-xr-x  4 root mysql   4096 10月 27 17:00 sql-bench
drwxr-xr-x  3 root mysql   4096 10月 27 17:00 support-files

[root@BAIYU_179 mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld  #服务脚本
[root@BAIYU_179 mysql]# chkconfig --add mysqld
[root@BAIYU_179 mysql]# chkconfig --list mysqld
mysqld          0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭
[root@BAIYU_179 mysql]# \cp  support-files/my-large.cnf /etc/my.cnf   #配置文件

4、配置mysql配置文件/etc/my.cnf

[root@BAIYU_179 mysql]# grep -Ev '^#|^$' /etc/my.cnf 
[client]                         #应用于所有客户端  
port            = 3306
socket          = /tmp/mysql.sock
[mysqld]                         #应用于服务器端
port            = 3306
socket          = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
thread_concurrency = 2            #线程数,建议cpu核心数的2倍
datadir = /data/mydata            #添加这一行定义数据存储目录
log-bin=mysql-bin
binlog_format=mixed
server-id       = 1
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]                           #只应用于mysql这一种客户端
no-auto-rehash
[myisamchk]
key_buffer_size = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout

5、启动Mysqld并测试

[root@BAIYU_179 mysql]# service mysqld start
Starting MySQL... SUCCESS! 
[root@BAIYU_179 ~]# netstat -nlptu|grep mysqld
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      24680/mysqld 
[root@BAIYU_179 mysql]# ls /data/mydata
BAIYU_179.err  ibdata1      ib_logfile1  mysql-bin.000001  performance_schema
BAIYU_179.pid  ib_logfile0  mysql        mysql-bin.index   test

发现启动mysql后在数据存储目录生成了很多文件:

  ibdatal:innodb存储引擎表空间文件

  ib_logfile0,ib_logfile1:innodb事务日志

  mysql-bin.000001:mysql二进制日志(mysqld每次启动都会滚动一次)

  mysql_bin.index:mysql二进制日志索引文件(最后面的行是最新的正在使用的日志)

  BAIYU_179.err:mysql服务器的错误日志(启动和关闭的信息也记录在这)

  BAIYU_179.pid:mysql服务器的pid文件

存储引擎:(表类型)

mysql是插件式存储引擎

     MyISAM

     InnoDB(Oracle)-->XtraDB(percona)

6、后续配置

 1)输出二进制文件

[root@BAIYU_179 mysql]# echo "export PATH=/usr/local/mysql/bin:$PATH" > /etc/profile.d/mysql.sh
[root@BAIYU_179 mysql]# . /etc/profile.d/mysql.sh

 2)导处头文件

[root@BAIYU_179 mysql]# ln -sv /usr/local/mysql/include/mysql /usr/include/mysql
"/usr/include/mysql" -> "/usr/local/mysql/include/"
[root@BAIYU_179 mysql]# ls /usr/include/mysql
decimal.h   my_attribute.h  my_global.h   mysqld_ername.h  my_sys.h           sql_state.h
errmsg.h    my_compiler.h   my_list.h     mysqld_error.h   my_xml.h           sslopt-case.h
keycache.h  my_config.h     my_net.h      mysql_embed.h    plugin_audit.h     sslopt-longopts.h
m_ctype.h   my_dbug.h       my_pthread.h  mysql.h          plugin_ftparser.h  sslopt-vars.h
m_string.h  my_dir.h        mysql         mysql_time.h     plugin.h           typelib.h
my_alloc.h  my_getopt.h     mysql_com.h   mysql_version.h  sql_common.h

 3)导出库文件

[root@BAIYU_179 mysql]# ldconfig -p|grep mysql #查看所有已缓存的库文件和mysql相关的库文件
        libmysqlclient_r.so.16 (libc6,x86-64) => /usr/lib64/mysql/libmysqlclient_r.so.16
        libmysqlclient.so.16 (libc6,x86-64) => /usr/lib64/mysql/libmysqlclient.so.16
[root@BAIYU_179 mysql]# ls lib/
libmysqlclient.a        libmysqlclient_r.so.18.0.0  libmysqld.a             plugin
libmysqlclient_r.a      libmysqlclient.so           libmysqld-debug.a
libmysqlclient_r.so     libmysqlclient.so.18        libmysqlservices.a
libmysqlclient_r.so.18  libmysqlclient.so.18.0.0    libtcmalloc_minimal.so
[root@BAIYU_179 mysql]# echo "/usr/local/mysql/lib" > /etc/ld.so.conf.d/mysql.conf
[root@BAIYU_179 mysql]# ldconfig  #生成缓存
[root@BAIYU_179 mysql]# ldconfig -p|grep 'mysql' #再此查看
        libtcmalloc_minimal.so.0 (libc6,x86-64) => /usr/local/mysql/lib/libtcmalloc_minimal.so.0
        libmysqlclient_r.so.16 (libc6,x86-64) => /usr/lib64/mysql/libmysqlclient_r.so.16
        libmysqlclient.so.18 (libc6,x86-64) => /usr/local/mysql/lib/libmysqlclient.so.18
        libmysqlclient.so.16 (libc6,x86-64) => /usr/lib64/mysql/libmysqlclient.so.16
        libmysqlclient.so (libc6,x86-64) => /usr/local/mysql/lib/libmysqlclient.so

  4)导出man手册

 # vi /etc/man.config
添加 MANPATH /usr/local/mysql/man

八、mysql客户端使用

1、常用选项

-u[]USERNAME

--u=USERNAME

-p

--password=PASSWORD

-h

--host=HOSTNAME

-P PORT

默认:root 空密码 localhost 3306

2、用户帐号

分为2段:用户名@主机

3、设置密码:

mysql> help set password          #查看帮助
Name: 'SET PASSWORD'
Description:
Syntax:
SET PASSWORD [FOR user] =
    {
        PASSWORD('cleartext password')
      | OLD_PASSWORD('cleartext password')
      | 'encrypted password'
    }
    
statement like this:

SET PASSWORD FOR 'bob'@'%.example.org' = PASSWORD('cleartext password');

That is equivalent to the following statements:

UPDATE mysql.user SET Password=PASSWORD('cleartext password')
  WHERE User='bob' AND Host='%.example.org';
FLUSH PRIVILEGES;

Another way to set the password is to use GRANT:

GRANT USAGE ON *.* TO 'bob'@'%.example.org' IDENTIFIED BY 'cleartext password';

mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456789');
Query OK, 0 rows affected (0.00 sec)

4、两类默认用户

   root:

        127.0.0.1

        localhost

        HOSTNAME

        :::1

    '':

        localhost

        HOSTNAME

mysql> select user,host,password from mysql.user;
+------+------------+-------------------------------------------+
| user | host       | password                                  |
+------+------------+-------------------------------------------+
| root | localhost  | *CC67043C7BCFF5EEA5566BD9B1F3C74FD9A5CF5D |
| root | BAIYU\_179 |                                           |
| root | 127.0.0.1  |                                           |
| root | ::1        |                                           |
|      | localhost  |                                           |
|      | BAIYU\_179 |                                           |
+------+------------+-------------------------------------------+
6 rows in set (0.00 sec)

建议删除多余的用户,给余下的用户设置密码:


你可能感兴趣的:(mysql)