数据库介绍
以一定的组织形式存在于存储介质里;
DBMS(Datebase Mannagement System):这是一款管理数据库的系统软件;
DBA(Datebase Administrator):数据库管理员。
基本功能:
数据定义、数据处理、数据安全、数据备份。
目前市场使用的一般都是关系型数据库(RDBMS),主要有以下几种:
MySQL、MariaDB、Percona Server、Oracle、MSSQL、DB2、PostgreSQL;
其中“关系”就是二维表的表现形式:
row(行):每行为一条记录;
column(列):表示每一种属性;
在每一种属性上可加入主键(primary key):确保被设为主键的属性不重复记录,保证唯一性。
数据库的正规化分析
数据库设计时都需要遵从不同的规范要求,这些不同的规范要求被称为不同范式,并且是呈递次规范,越高则数据库的冗余越小,目前来说,只需要满足 第三范式(3NF)即可。(NF:Normal Form)
(注意3NF是建立在满足1NF和2NF的情况下)
MySQL和MariaDB数据库
两者隶属于同一作者开发,因而无大变化,并且在Linux中两者基本通用
官方文档:https://dev.mysql.com/doc/
安装MySQL
方法一:yum源安装
官方提供:https://downloads.mariadb.org/mariadb/repositories/,点开此网站,可以查询到具体的yum源地址
清华大学提供的具体的yum源地址:https://mirrors.tuna.tsinghua.edu.cn/mariadb/yum/10.2/
方法二:安装二进制格式程序包
建议安装在逻辑卷上,这样可以保证后期数据库增大后,可以随时进行增加容量。
步骤如下:
第一步:从相应的网站下载对应的mysql二进制安装包
https://downloads.mariadb.org/
第二步:在原有硬盘增加逻辑卷,并进行挂载
fdisk /dev/sda 增加分区并指定类型为LVM
pvcreate “LVM分区” 创建物理卷
vgcreate“卷组名”“物理卷” 创建卷组
lvcreate -n“逻辑卷名”-l 100%FREE“卷组名” 全部设逻辑卷
mkfs.xfs /dev/“卷组名”/“逻辑卷名” 创建文件系统
在此可专门建立文件夹为挂载点,假设为 /data 目录
为保证开机即可挂载,可将其写入/etc/fstab文件中
第三步:创建系统用户mysql信息
useradd -r -d /data/mysql -m mysql -s /sbin/nologin
第四步:二进制程序的准备
tar xvf“二进制文件”-C /usr/local 解压缩致/usr/local/中
进入到/usr/local/中,创建解压缩后二进制文件的软连接:
ln -sv“解压缩后二进制文件”mysql
并修改软连接mysql的属性:
chown -R mysql.mysql /usr/local/mysql
第五步:创建数据库文件
进入到/usr/local/mysql/目录中,执行如下命令:
./scripts/mysql_install_db --datadir=/data/mysql --user=mysql
第六步:在/etc/下,创建配置文件,为了方便管理,可以专门创建指定目录:
mkdir /etc/mysql
cp /usr/local/mysql/support-files/my-huge.cnf /etc/mysql/my.cnf(注意配置文件名必须为my.cnf)
另外还需要修改配置文件里的部分内容:
datadir=/data/mysql
第七步:准备启动脚本
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
systemctl start mysqld
systemctl enable mysqld(可设为开机启动)
第八步:对数据库进行安全加固
mysql_secure_installation
方法三:源码编译安装
第一步,安装编译需要的程序包
yum install bison bison-devel zlib-devel libcurl-devel libarchive-devel boost-devel gcc gcc-c++ cmake ncurses-devel gnutls-devel libxml2-devel openssl-devel libevent-devel libaio-devel
第二步,做准备用户和数据目录
mkdir /data
useradd -r -s /bin/false -m -d /data/mysqldb/ mysql
tar xvf mariadb-10.2.15.tar.gz
第三步,cmake 编译安装
cd mariadb-10.2.15/
cmake . -DCMAKE_INSTALL_PREFIX=/app/mysql -DMYSQL_DATADIR=/data/mysqldb/ -DSYSCONFDIR=/etc -DMYSQL_USER=mysql -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DWITHOUT_MROONGA_STORAGE_ENGINE=1 -DWITH_DEBUG=0 -DWITH_READLINE=1 -DWITH_SSL=system -DWITH_ZLIB=system -DWITH_LIBWRAP=0 -DENABLED_LOCAL_INFILE=1 -DMYSQL_UNIX_ADDR=/app/mysql/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
make && make install
如果出错,执行rm -f CMakeCache.txt
后续操作和方法二二进制安装一样,进行数据库文件的生成、配置文件准备、启动脚本设置。
补充:因为需要经常使用mysql二进制程序,所以建议将路径加入到PATH变量中,并且为确保每次开机都有效,则可写入配置文件中:
vim /etc/profile.d/mysql.sh
PATH=/usr/local/mysql/bin:$PATH
source /etc/profile.d/mysql.sh
Mysql多实例的创建(这里假设建立3个,并以端口号作为区分)(是已安装mariadb-server已经安装的情况下)
第一步:创建需要多线程对应的文件夹,并修改对应权限
mkdir /mysqldb/{3306,3307,3308}/{etc,bin,data,pid,socket,log} -pv
chown -R mysql.mysql /mysqldb/
第二步:数据库初始化的建立
mysql_install_db --datadir=/mysqldb/3306/data --user=mysql(其中3307和3308以同样方式修改)
第三步:准备配置文件
cp /etc/my.cnf /mysqldb/3306/etc/ (拷贝原配置文件)
vim /mysqldb/3306/etc/my.cnf (修改如下配置)
[mysqld]
port=3306
datadir= /mysqldb/3306/data
socket=/mysqldb/3306/socket/mysql.sock
[mysqld_safe]
log-error=/mysqldb/3306/log/mariadb.log
pid-file=/mysqldb/3306/pid/mariadb.pid
(其中3307和3308以同样方式修改)
第四步:创建启动脚本
cp mysqld /mysqldb/3306/bin/ (拷贝服务脚本)
vim /mysqldb/3306/bin/mysqld
cmd_path="/usr/bin"
chmod +x /mysqldb/3306/bin/mysqld (加上执行权限)
(其中3307和3308以同样方式修改)
(在这里需要注意的是cmd_path的路径,在yum安装、编译安装或者二进制安装时如果设置不同的话,需要修改成对应的路径)
第五步:为保证安全,可给root修改口令
mysqladmin -S /mysqldb/3306/socket/mysql.sock password '密码'
此步骤需要在服务启动的情况下修改
(其中3307和3308以同样方式修改)
注意,若要打开连接指定的mysql时,则需要指定对应的socket文件,命令如下:
mysql -S /mysqldb/3306/socket/mysql.sock -p
SQL语言(Structure Query Language)(关系数据库使用的国际标准语言)
大小写不敏感,语句可以单行或多行,以“;”结尾
数据库对象的名称有以下几个重要要求:
必须以字母开头、不与数据库资源同名、同一数据库下不重名
SQL语句的分类如下:
第一种:DDL (Data Defination Language)数据定义语言
CREATE 用来创建数据库
DROP 删除数据库
ALTER 修改数据库
create|drop|alter database|scheme DB_NAME
第二种:DML (Data Manipulation Language)数据库操纵语言
INSERT 增加数据库里的内容
DELETE 删除数据库里的内容
UPDATE 修改数据库里的记录内容
第三种:DCL (Data Control Language)数据控制语言
GRANT :授权、REVOKE :取消授权
COMMIT:提交、ROLLBACK:取消提交
第四种:DQL (Data Query Language)数据库的查询语言
SELECT 例:select * from “数据库表名”
mysql数据库中的一些查看命令(注意结尾都需要“;”,以下省略)
show databases 显示已有的数据库列表
show warnings 查看警告信息(只显示上一条信息)
use DB_NAME 可切换数据库
show tables 显示某个数据库中的表信息
desc TB_NAME 查看某个表的结构内容
mysql数据库表的建立
create table TB_NAME(字段1,字段2,字段3)
创建的字段包括:字段名、字段数据类型、修饰符(类似于awk中修饰)
数据类型的三大原则:
尽量使用正确存储数据的最小数据类型
使用简单的数据类型方便CPU处理
尽量避免NULL
字段数据类型:
char(n) 指定字符长度为n,固定不变,不够会用空格补齐
varchar(n) 根据输入字符串长度变化,但不超过
ENUM 枚举 表示只能选其中一个
修饰符:
PRIMARY KEY 主键(每个表只能有一个,且所属字段内容不为空)
UNIQUE KEY 唯一键(每个表中可有多个)
AUTO_INCREMENT 自动递增是配合主键、唯一键一起使用的,并且适用于整数类型
mysql数据表中内容的增删改查:
insert into TB_NAME(字段名)value(对应字段的内容) 在指定表中加入一条记录
select * from TB_NAME 将表中的内容显示一遍
truncate table TB_NAME 清空表
update TB_NAME set“字段”where“条件” 表示在指定条件下修改表中某行记录
delete from TB_NAME where“条件” 删除指定条件的表中的内容
为了防止在进行数据库表中内容修改时避免误操作,可在mysql-clients.cnf这个配置文件中的[mysql]中加入“safe-updates”,或者可在执行mysql命令时,加入选项“-U | --safe-updates”
在bash命令行可通过 mysql -e "SQL语句" 直接执行需要操作的SQL语句,不需要进入mysql命令的交互式状态
一些运用较多的DQL语句
select“字段名”as“别名”from TB_NAME 将某个字段以别名的方式显示
select * from TB_NAME where“条件” 通过指定条件查询表中内容
其中“条件”包括如下一些类型:
1.算数运算符(+、-、*、/、%)、比较运算符(<、=、>)
2.between *** and ***
3.like‘***%’(这里%相当于正则里的*)表示模糊查询,其中‘_’表示任意单一字符
4.rlike 可以运用正则表达式
select distinc“字段名”from TB_NAME 去除指定表中某个字段下的重复内容
若是需要按照指定字段排序,则在语句最后加入 :
order by“字段” 正序
order by“字段”desc 倒序
可根据指定条件将查询结果分组用于聚合函数运算:avg()、max()、min()、count()、sum()
例如:select gender,avg(age) from students group by gender 表示以gender字段分类,求各分类段平均年龄
也支持多个分组一起: group by“字段1”,“字段2”
也可对指定组进行过滤条件:group by“字段”having“条件”
mysql数据库中多表的使用
join 横向合并使用
交叉连接(笛卡尔乘积):(总行数=表1行数*表2行数)
select * from “表1”cross join “表2”
内连接,需要有指定条件:
select * from “表1”“表2”where“条件”(老方法)
select * from “表1”inner join “表2” on “条件”
这里需要注意的是“*”中的字段名可根据需要填写,若是表1和表2有冲突,则需要进行划分,可通过设置表的别名的方式来区分
外连接分为以下:
左、右外连接:
包括交集:
select * from“表1”left|right join“表2”on“条件”
不包括交集:
select * from“表1”left|right join“表2”on“条件”where“条件中表2|1的字段”is null
完全外连接:(注意此语法mysql不支持)
包括交集:
select * from“表1”full join“表2”on“条件”
此语法可通过左右外连接包括交集,并使用union结合
不包括交集:
select * from“表1”full join“表2”on“条件”where“条件中表1的字段”is null or“条件中表2的字段”is null
可在完全外连接后,并在 where条件下“条件中表1的字段” is null or“条件中表2的字段”is null执行select语句
自连接:
当在一张表中需要取出两个字段作为对应关系,则可以对一张表进行多次别名设置,然后利用连接方法,得出内容
union 纵向合并使用
在使用union时,则需要保证合并的表的字段数对等,操作如下:
select * from“表1”union select * from“表2”
若需要对合并之后的表单在进行条件查询,则需要指定别名来进行辨别,否则不会识别具体对哪个表的字段进行查询,称为子查询,操作如下:
select * from(合并后的表内容)as A where“A.字段 符合的条件”
为保证安全,可建立虚表,此时虚表无数据,数据是从实表查询到
create view“虚表名”as select“部分字段”from“表”
如果对虚表进行增加数据内容,会直接写入实表中
mysql数据库中设置变量的方法:select set@a=10
用户的管理和权限
创建用户
create user‘用户名’@‘主机地址’identified by‘密码’
此时会因为授权的问题,只能够查阅部分数据库
通过 show processlist 可查看已连接至数据库的用户信息,
删除用户如下:
drop user‘用户名’@‘主机地址’
若是需要修改密码,则可以使用如下命令:
方法一:立即生效
set password for‘用户名’@‘主机地址’= password(‘新密码’)
方法二:
因为用户信息也是属于数据库mysql里的表,所以可以进入到mysql数据库中使用update语句
update user set password=password(‘新密码’)where“条件”
除此之外还需要执行:flush privileges 指令,才会生效
方法三:
mysqladmin -u用户 -p旧密码 password‘新密码’
权限的一些设定:
授权指令如下:
grant“操作指令”on“某数据库或某表”to 用户名@‘主机地址’
也可在后面加入 identified by‘密码’,若是没有此用户,则会自动创建
也可取消授权:
revoke“操作指令”on“某数据库或某表”from 用户名@‘主机地址’
show grants for用户名@‘主机地址’ 可查看指定用户授权
show grants for current_user() 可查看当前用户授权
体系架构
存储引擎是用来将在数据库中的增、删、改、查操作内容写入到磁盘中
show engines 可查看支持的存储引擎
show variables like‘%storage_engine%’ 查看默认的存储引擎
目前主流的是MyISAM和InnoDB,两者的区别在于:
MyISAM支持表级锁,InnoDB支持行级锁;
只有InnoDB支持事务性,MVCC(高并发)
在存储方式上:
MyISAM文件分为三种:表格式定义(.frm)、数据文件(.MYD)、索引文件(.MYI)
InnoDB文件分为两种:表格式定义(.frm)、数据和索引文件放在一起(.ibd)
(在MySQL 5.5版本以后数据库默认使用InnoDB引擎,并且会将每个数据库的数据索引文件都分别存放,不会集中放入一个文件中)
实际生产中建议的my.cnf配置文件中的选项:
下面的“#”表示设定的数值
Innodb_file_per_table=1 数据库中每个表数据单独存放
max_connections=# MySQL服务器允许的最大同时会话连接数
back_log=# 最大同时会话连接数达到时可另外保持的连接数
max_connect_errors=# 某个主机连接错误次数超过指定值,会阻止此主机连接
max_allowed_packet =# 每个连接传输的数据包允许的最大值
open_file_limit=# 所有线程打开表的数量
innodb_buffer_pool_size=# 设置缓冲池,可相对的提高数据库性能
innodb_log_file_size=# 事务日志文件的大小
innodb_log_files_in_group=# 事务日志文件的总数