一、数据库概述
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)
建议删除多余的用户,给余下的用户设置密码: