本章内容
- 关系型数据库基础
- 安装MySQL
- 管理数据库和表
- 用户和权限管理
- 函数和存储过程
- MySQL架构
- 存储引擎
- 服务器选项,系统和状态变量
- 优化查询和索引管理
- 锁和事务管理
- 日志管理 ###必须掌握
- 备份还原 ###必须掌握
- MySQL集群
数据库的发展史
使用磁盘文件来存储数据
出现了网状模型、层次模型的数据库
关系型数据库和结构化查询语言
“关系-对象”型数据库
数据库管理系统(DBMS)
DBMS采取S/C结构;DBMS为客户端建立了与数据库之间的连接,在DBMS中管理员可以对数据进行权限的设置和数据库数据的备份和安全的管理等。
DBMS与客户端之间通过网络连接,客户端需要访问数据库时会通过API
数据库管理系统的基本功能
数据库系统的架构
关系型数据库
库
students table
id name sex phone
1 zhang m 110 ###这就时一条记录
1 zhang m 110 ###重复的记录,使用主键来解决
2 wang f 120
scores table
id score
1 99
2 98
学员表和考试成绩表中学员编号之间是有联系的。
关系数据库
RDBMS:
数据库排名:
acid特性保证数据库的安全和稳定
NoSQL : redis高性能 高并发
实体-联系模型E-R
联系的类型
数据的操作:
数据的约束条件 :是一组完整性规则的集合
students table ##主键表
primary key(主键)
id name sex phone
1 zhang m 110 ###这就时一条记录
2 wang f 120
scores table
id score
foreign key(外键)---->students.d
1 99
1 98 ###学员考试成一对多关系
一对多的关系使用主外键。
sutdents 基本信息 主键表
pk
id name sex
1 a f
2 b m
3 c f
class 课程信息
id classname
1 linux
2 go
3 python
students_classes
id student_id (fk--->students.id) class id (fk-->class.id)
1 1 1
2 1 2
3 2 2
范式
1NF: 就是列的标题不能重复
无重复的列, 每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
2NF:
属性完全依赖于主键,第二范式必须先满足第一范式,要求表中的每个行必须可以被唯一地区分。通常为表加上一个列,以存储各个实例的唯一标识PK,非PK的字段需要与整个PK有直接相关性
3NF:
属性不依赖于其它非主属性,满足第三范式必须先满足第二范式。第三范式要求一个数据库表中不包含已在其它表中已包含的非主关键字信息,非PK的字段间不能有从属关系
SQL概念
SQL: Structure Query Language
S: server, 监听于套接字,接收并处理客户端的应用请求
mysql数据库端口3306 sqlserver 端口:1433 win远程端口:3389
C: Client
客户端程序接口
应用编程接口
数据库的约束
1、主键:一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行;必须提供数据,即NOT NULL,一个表只能有一个
2、惟一键:一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行;允许为NULL,一个表可以存在多个
3、外键:一个表中的某字段可填入的数据取决于另一个表的主键或唯一键已有的数据
4、检查:字段值在一定范围内
索引 :
关系运算 :
[root@localhost gconf.xml.defaults]# pwd
/etc/gconf/gconf.xml.defaults ###用户登陆界面用户名显示修改名户名修改处
/user_list 用户列表
MySQL历史
1979年: TcX公司 Monty Widenius, Unireg
1996年:发布MySQL1.0, Solaris版本, Linux版本
1999年: MySQL AB公司,瑞典
2003年: MySQL 5.0版本,提供视图、存储过程等功能
2008年: Sun 收购
2009年: Oracle收购sun
2009年: Monty成立MariaDB
MySQL和MariaDB
官方网址:
官方网址:
版本演变:
centos6 mysql-server
[root@localhost ~]# yum info mysql-server
Available Packages
Name : mysql-server
Arch : x86_64
Version : 5.1.73
centos7 mariadb
[root@centos7-4 ~]# yum info mariadb-server
Available Packages
Name : mariadb-server
Arch : x86_64
Epoch : 1
Version : 5.5.56
MYSQL的特性
1、插件式存储引擎:也称为“表类型”,存储管理器有多种实现版本,功能和特性可能均略有差别;用户可根据需要灵活选择,Mysql5.5.5开始innoDB引擎是
MYSQL默认引擎
2、单进程,多线程
3、诸多扩展和新特性
4、提供了较多测试组件
5、开源
安装MYSQL
Mariadb安装方式:
1、源代码:编译安装
2、二进制格式的程序包:展开至特定路径,并经过简单配置后即可使用
3、程序包管理器管理的程序包
CentOS安装光盘
项目官方: https://downloads.mariadb.org/mariadb/repositories/
rpm包安装Mysql
首先使用centos光盘系统安装自带的mariadb
环境:centos7
[root@centos7-4 ~]# yum install mariadb-server
[root@centos7-4 ~]# rpm -ql mariadb-server
/etc/my.cnf.d/server.cnf
/usr/lib/systemd/system/mariadb.service ###服务
客户端配置文件
[root@centos7-4 ~]# rpm -ql mariadb
/etc/my.cnf.d/client.cnf #客户端配置文件
/usr/bin/mysql #客户端工具
启动服务
[root@centos7-4 ~]# systemctl start mariadb.service
[root@centos7-4 ~]# ss -ntlp #端口号3306
LISTEN 0 50 *:3306 *:* users:(("mysqld",pid=10686,fd=14))
[root@centos7-4 ~]# ps aux #进程
mysql 10525 0.0 0.0 113304 1604 ? Ss 09:09 0:00 /bin/sh /us
mysql 10686 0.3 4.3 903336
[root@centos7-4 ~]# getent passwd mysql ##mysql 系统用户
mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
[root@centos7-4 ~]# ls /var/lib/mysql -d -l ##查看mysql用户所有者所属组信息
drwxr-xr-x 5 mysql mysql 177 Sep 28 09:09 /var/lib/mysql
[root@centos7-4 ~]# ls /var/lib/mysql -l 同时也是mysql的数据库存放路径
mysql.sock 本地sql客户端连接本地mysql服务器通信的桥梁
[root@centos7-4 ~]# pstree -p mysql
mysqld_safe(10525)───mysqld(10686)─┬─{mysqld}(10690)
├─{mysqld}(10691)
├─{mysqld}(10692)
├─{mysqld}(10693)
├─{mysqld}(10694)
├─{mysqld}(10695)
├─{mysqld}(10696)
├─{mysqld}(10697)
├─{mysqld}(10698)
├─{mysqld}(10699)
├─{mysqld}(10700)
├─{mysqld}(10701)
├─{mysqld}(10702)
├─{mysqld}(10703)
├─{mysqld}(10704)
├─{mysqld}(10705)
├─{mysqld}(10713)
└─{mysqld}(10714)
单进程 ------- 多线程
https://downloads.mariadb.org/mariadb/10.2.18/
RPM包安装MySQL
RPM包安装
CentOS 6
提高安全性
mysql_secure_installation ## sql 安全设置脚本
centos7中 Mysql 初步的使用和简单配置
运行mysql命令:默认空密码登录
[root@centos7-4 ~]# mysql ##本机客户端连接数据库
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.56-MariaDB MariaDB Server
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]>
MariaDB [(none)]> select user(); ##查看当前登陆用户
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
MariaDB [(none)]> show databases; ##查看mysql刚安装好时的数据库
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
MariaDB [(none)]> select user,host,password from mysql.user;
+------+-----------+----------+
| user | host | password |
+------+-----------+----------+
| root | localhost | |
| root | centos7-4 | |
| root | 127.0.0.1 | |
| root | ::1 | |
| | localhost | |
| | centos7-4 | |
+------+-----------+----------+
查看mysql数据库中 user的这个表中的 用户 、主机、和密码信息
[root@centos7-4 ~]# mysql -uroot -p -h127.0.0.1 连接数据库方法
默认情况下mysql数据库登陆的安全限制权限基本没有设置;我们可以拿任何一个匿名用户都可以登陆,这样给数据库带来了很大的安全隐患,所以我们在安装完数据后需要对数据库默认的安全限制做相应的基础配置。
例子: 我们现在使用非root用户登陆mysql
mysql_secure_installation ## sql 安全设置脚本
设置完之后在使用其它用户登陆就会失败
[root@centos7-4 ~]# mysql -uroot -p
Enter password:
MariaDB [(none)]> select user,password,host from mysql.user;
+------+-------------------------------------------+-----------+
| user | password | host |
+------+-------------------------------------------+-----------+
| root | *E74858DB86EBA20BC33D0AECAE8A8108C56B17FA | localhost |
| root | *E74858DB86EBA20BC33D0AECAE8A8108C56B17FA | 127.0.0.1 |
| root | *E74858DB86EBA20BC33D0AECAE8A8108C56B17FA | ::1 |
+------+-------------------------------------------+---------
mysql客户端程序:
1、mysql: 交互式的CLI工具 ###mysql本身也是个客户端工具
2、mysqldump:备份工具,基于mysql协议向mysqld发起查询请求,并将查得的所有数据转换成insert等写操作语句保存文本文件中
3、mysqladmin:基于mysql协议管理mysqld
4、mysqlimport:数据导入工具
musql的使用模式:
1、交互式模式
可运行命令有两类
客户端命令:MariaDB [(none)]> help ###输入help显示帮助工具列表
? (\?) Synonym for `help'.
clear (\c) Clear the current input statement.
connect (\r) Reconnect to the server. Optional arguments are db and host.
delimiter (\d) Set statement delimiter.
edit (\e) Edit command with $EDITOR.
ego (\G) Send command to mysql server, display result vertically.
exit (\q) Exit mysql. Same as quit.
go (\g) Send command to mysql server.
help (\h) Display this help.
nopager (\n) Disable pager, print to stdout.
notee (\t) Don't write into outfile.
pager (\P) Set PAGER [to_pager]. Print the query results via PAGER.
print (\p) Print current command.
prompt (\R) Change your mysql prompt.
quit (\q) Quit mysql.
rehash (\#) Rebuild completion hash.
source (\.) Execute an SQL script file. Takes a file name as an argument.
status (\s) Get status information from the server.
system (\!) Execute a system shell command.
tee (\T) Set outfile [to_outfile]. Append everything into given outfile.
use (\u) Use another database. Takes database name as argument.
charset (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets.
warnings (\W) Show warnings after every statement.
nowarning (\w) Don't show warnings after every statement.
mysql客户端工具使用例子:
MariaDB [(none)]> status 等价于 \s
Server: MariaDB
Server version: 5.5.56-MariaDB MariaDB Server
Protocol version: 10
UNIX socket: /var/lib/mysql/mysql.sock
MariaDB [(none)]> system ls 等价于 \! ls
anaconda-ks.cfg Documents initial-setup-ks.cfg Public
data.tar Downloads Music Templates
Desktop file1 Pictures Videos
数据库修改提示符:
[root@centos7-4 ~]# mysql -uroot -p
MariaDB [(none)]> show databases;
MariaDB [(none)]>use mysql
MariaDB [mysql]> use mysql; ##切换数据库
Database changed
MariaDB [mysql]> ##切换后提醒在mysql中
修改等提示符:
man mysql /prompt
方法一:
[root@centos7-4 ~]# vim /etc/profile.d/mysql.sh
export MYSQL_PS1="(\u@\h \v ) [\d]> "
方法二:
MariaDB [(none)]> mysql --prompt="(\u@\h) [\d]> " 登陆mysql数据库后修改
方法三:
vim /etc/my.cnf.d/mysql-clients.cnf
[mysql]
prompt=" \\r:\\m:\\s> "
MyISAM存储引擎的管理工具:
1、myisamchk:检查MyISAM库
2、myisampack:打包MyISAM表,只读
服务器端程序
1、mysqld_safe
2、mysqld ##默认使用mysqld
3、mysqld_multi:多实例 ,示例: mysqld_multi --example
*****所实例的意思是在一台主机上开多个mysql程序**** 在测试服务器中会使用 修改配置和端口等
用户账号
mysql用户账号由两部分组成:
'USERNAME'@'HOST‘
_ 匹配任意单个字符 / 172.16.0.0/255.255.0.0 或 172.16.%.%
例子:wang@'192.168.161.%'
服务器端命令:
SQL, 需要语句结束符;
脚本模式:
例子:
vim test.sql
show databases;
select user,host,password from mysql.user;
[root@centos7-4 ~]# mysql -uroot -p < test.sql
Enter password:
Database
information_schema
mysql
performance_schema
test
user host password
root localhost *E74858DB86EBA20BC33D0AECAE8A8108C56B17FA
root 127.0.0.1 *E74858DB86EBA20BC33D0AECAE8A8108C56B17FA
root ::1 *E74858DB86EBA20BC33D0AECAE8A8108C56B17FA
或者登陆mysql数据库后:
MariaDB [(none)]> source test.sql 同样也可以执行脚本文件 ##脚本的后缀不做要求
MariaDB [(none)]> \. test.sql 同样也可以执行脚本文件
Mysql客户端
mysql客户端可用选项:
-A, --no-auto-rehash 禁止补全
-u, --user= 用户名,默认为root
-h, --host= 服务器主机,默认为localhost
-p, --passowrd= 用户密码,建议使用-p,默认为空密码
-P, --port= 服务器端口
-S, --socket= 指定连接socket文件路径
-D, --database= 指定默认数据库
-C, --compress 启用压缩
-e “SQL“ 执行SQL命令
-V, --version 显示版本
-v --verbose 显示详细信息
--print-defaults 获取程序默认使用的配置
mysql 端口:3306 oracle 端口:1521 sql server端口:1433 远程桌面端口:3389
例子:
[root@centos7-4 ~]# mysql -uroot -p -D mysql
MariaDB [mysql]>
[root@centos7-4 ~]# mysql -uroot -pmysql -e "show databases"
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
服务器监听的两种socket地址:
ip socket: 监听在tcp的3306端口,支持远程通信
unix sock: 监听在sock文件上, 仅支持本机通信
如: /var/lib/mysql/mysql.sock)
说明: host为localhost,127.0.0.1连接时自动使用unix sock
MariaDB [(none)]> status
UNIX socket: /var/lib/mysql/mysql.sock
服务器端配置
服务器端(mysqld):工作特性有多种配置方式
命令行选项:
配置文件: 类ini格式
集中式的配置,能够为mysql的各应用程序提供配置信息
[mysqld]
[mysqld_safe]
[mysqld_multi]
[mysql]
[mysqldump]
[server]
[client]
格式: parameter = value
说明: _和- 相同
1, ON, TRUE意义相同, 0, OFF, FALSE意义相同
配置文件:
后面覆盖前面的配置文件,顺序如下:
/etc/my.cnf Global选项 全局
/etc/mysql/my.cnf Global选项 全局
SYSCONFDIR/my.cnf Global选项 全局
$MYSQL_HOME/my.cnf Server-specific 选项
--defaults-extra-file=path
~/.my.cnf User-specific 选项
[root@centos7-4 ~]# cat /etc/my.cnf
配置mariadb
侦听3306/tcp端口可以在绑定有一个或全部接口IP上
vim /etc/my.cnf
[mysqld]
skip-networking=1
关闭网络连接,只侦听本地客户端, 所有和服务器的交互都通过一个socket实现, socket的配置存放在/var/lib/mysql/mysql.sock) 可在/etc/my.cnf修改
[root@centos7-4 ~]# vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
skip=networking=1
[root@centos7-4 ~]# systemctl restart mariadb
[root@centos7-4 ~]# ss -ntl
*******mysql 数据库3306端口就会停用、只可以使用本地客户端连接******