目录
一、理论
1.数据库管理系统
(1)概念
数据库管理系统(Database Management System,DBMS)是实现对数据库资源有效组织、 管理和存取的系统软件。它在操作系统的支持下,支持用户对数据库的各项操作。DBMS 主 要包括以下功能。
数据库的建立和维护功能:包括建立数据库的结构和数据的录入与转换、数据库的 转储与恢复、数据库的重组与性能监视等功能。
数据定义功能:包括定义全局数据结构、局部逻辑数据结构、存储结构、保密模式 及信息格式等功能。保证存储在数据库中的数据正确、有效和相容,以防止不合语 义的错误数据被输入或输出。
数据操纵功能:包括数据查询统计和数据更新两个方面。
数据库的运行管理功能:这是数据库管理系统的核心部分,包括并发控制、存取控 制、数据库内部维护等功能。
通信功能:DBMS 与其他软件系统之间的通信,如 Access 能与其他 Office 组件进行 数据交换。
(2)功能
① 数据定义
② 数据处理
③ 数据安全
④ 数据备份
(3)架构
① 单机架构
② 大型主机/终端架构
③ 主从式架构(C/S)
④ 分布式架构
(4)分类
①层次数据库
层次模型数据库系统是最早研制成功的数据库系统,这种数据库最成功的典型是IMS。
IMS的全称时Information Management System,由IBM公司研制成功。
IMS于1969年投入运行,最早的版本有IMS/360-1和IMS/360-2。较近的版本有IMS/VS DL/1,它是在操作系统DOS/VS(Disk Operation System/Virtual Storage)支持下运行。
②网状数据库
网状数据库是采用网状原理和方法,以网状数据模型为基础建立的数据库。一般是指由网状数据库管理系统产生的网状数据库系统。网状数据模型是以记录类型为结点的网络结构,即一个结点可以有一个或多个下级结点,也可以有一个或多个上级结点,两个结点之间甚至可以有多种联系。
例如“教师”与“课程”两个记录类型,可以有“任课”和“辅导”两种联系,称之为复合链。两个记录类型之间的值可以是多对多的联系,例如一门课程被多个学生修读,一个学生选修多门课程。
③RDBMS 关系型数据库
Relational Database Management System,关系模型最初由IBM公司的英国计算机科学家埃德加·科德(Edgar F. Codd)于1969年描述,1974年,IBM开始开发系统R,这是一个开发RDBMS原型的研究项目。然而,第一个商业上可用的RDBMS是甲骨文,于1979年由关系软件(现为甲骨文公司)发布。
2.关系型数据库
(1)概念
关系型数据库组成:
表1 关系型数据库组成
组成 | 功能 |
关系Relational | 关系就是二维表,其中:表中的行、列次序并不重要 |
行row | 表中的每一行,又称为一条记录record |
列column | 表中的每一列,称为属性,字段,域field |
主键Primary key | PK , 用于惟一确定一个记录的字段,一张表只有一个主键 |
域domain | 属性的取值范围 |
(2)常用关系型数据库
常用关系型数据库如下:
表2 常用关系型数据库
类型 | 特点 |
MySQL(甲骨文公司收购) | 免费、开源、体积小 |
SQL Server(微软公司产品) | 面向Windows操作系统 简单、易用 |
Oracle(甲骨文公司产品) | 面向所有主流平台安全、完善,操作复杂 |
DB2(IBM公司产品) | 面向所有主流平台大型、安全、完善 |
PostgreSQL(加州大学计算机系开发的POSTGRES) | 简称为pgsql,EnterpriseDB |
(3)关系型数据库三要素
关系型数据库三要素:
表3 关系型数据库三要素
要素 | 功能 |
实体 | 也称为实例,对应现实世界中可区别于其他对象的“事件”或“事物” |
属性 | 实体所具有的某一特性,一个实体可以有多个属性 |
联系 | 实体集之间的对应关系称为联系,也称为关系 |
(4)关系型数据库与非关系型数据库
①关系型数据库
关系数据库系统是基于关系模型的数据库系统,它的数据结构使用简单易懂的二维数据表,可用简单的“实体-关系”(E-R)图来表示,E-R图中包含了实体(数据对象)、关系和属性三个要素。
存储结构:
关系型数据库的存储结构是二维表格,在每个二维表中,每一行称为一条记录,用来描述一个对象的信息,每一列称为一个字段,用来描述对象的一个属性。
②非关系型数据库
非关系数据库也被称作NoSQL(Not Only SQL),存储数据不以关系模型为依据,不需要固定的表格式。
优点:
1) 数据库可高并发读写
2)对海量数据高效率存储与访问
3)数据库具有高扩展性与高可用性
③ 对比
表5 对比
类型 | 关系数据库 | 非关系型数据库 |
优点 | 易于维护:都是使用表结构,格式一致; 2、使用方便:SQL语言通用,可用于复杂查询; 3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。 | 格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、 图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。 2、速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘; 3、高扩展性与高可用性; 4、成本低:nosql数据库部署简单,基本都是开源软件。 |
缺点 | 读写性能比较差,尤其是海量数据的高效率读写; 2、固定的表结构,灵活度稍欠; 3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。 | 不提供sql支持,学习和使用成本较高; 2、无事务处理; 3、数据结构相对复杂,复杂查询方面稍欠。 |
3.数据库
(1)数据
数据用来描述事物的符号记录,包括数字,文字、图形、图像、声音、档案记录等,以“记录”形式按统一的格式进行存储。
(2)表
表将不同的记录组织在一起,用来存储具体数据。
(3)数据库
表的集合是存储数据的仓库,以一定的组织方式存储的相互有关的数据集合。
(4)数据库访问流程
4.MySQL数据库
(1)概念
一款深受欢迎的开源关系型数据库,Oracle旗下的产品,遵守GPL协议,可以免费使用与修改。
官网:MySQL
(2)特点
表6 MySQL特点
特点 | 功能 |
可靠性高 | MYSQL是严格遵循ACID(原子性、一致性、隔离性、持久性)规范的关系型数据库,因此保证了数据的可靠性。 |
免费开源 | MYSQL是免费开源的数据库系统,其代码完全公开,可以随意使用、修改和分发。 |
跨平台兼容性好 | MYSQL可以运行在各种操作系统上,如Linux、Windows、Mac OS等,且支持各种编程语言接口,如PHP、Java等,实现了与其他应用程序的兼容性。 |
可扩展性强 | MYSQL可以实现多台服务器的集群部署,提高了数据库性能和可靠性。 |
功能丰富 | MYSQL拥有完善的数据类型支持、事务处理、查询处理、存储过程等丰富的功能。 |
性能高效 | MYSQL采用了高效的存储引擎,如InnoDB、MyISAM等,提高了系统的性能,且支持水平扩展、垂直扩展等多种优化策略。 |
安全性高 | MYSQL提供了完善的安全功能,如用户权限管理、访问控制等,可以有效保护数据的安全。 |
(3)分类
MySQL主要分为:mysql、mariadb、percona Server
(4)组成
表7 MySQL组成
类别 | 功能 |
客户端程序 | mysql: 交互式的CLI工具 mysqladmin:基于mysql协议管理mysqld mysqlimport:数据导入工具 MyISAM存储引擎的管理工具: myisamchk:检查MyISAM库 myisampack:打包MyISAM表,只读 |
服务器端程序 | mysqld_safe mysqld mysqld_multi 多实例 |
5.MySQL部署
(1)编译安装MySQL数据库
① 安装相关依赖包
yum -y install gcc gcc-c++ cmake bison bison-devel zlib-devel libcurl-devel libarchive-devel boost-devel ncurses-devel gnutls-devel libxml2-devel openssl-devel libevent-devel libaio-devel
②下载并压缩源码包
#切换目录,上传压缩包
cd /opt
rz -E
#解压
tar xf mysql-boost-5.7.20.tar.gz
③编译安装
1. #切换目录
cd mysql-5.7.20/
2. #编译
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=boost \
-DWITH_SYSTEMD=1
3. #安装
make -j2 && make install
#############模块解释#####################
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
#指定mysql的安装路径
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
#指定mysql进程监听套接字文件(数据库连接文件)的存储路径
-DSYSCONFDIR=/etc \
#指定配置文件的存储路径
-DSYSTEMD_PID_DIR=/usr/local/mysql \
#指定进程文件的存储路径
-DDEFAULT_CHARSET=utf8 \
#指定默认使用的字符集编码,如utf8
-DDEFAULT_COLLATION=utf8_general_ci \
#指定默认使用的字符集校对规则
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
#安装INNOBASE存储引擎
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
#安装ARCHIVE存储引擎
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
#安装BLACKHOLE存储引擎
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
#安装FEDERATED存储引擎
-DMYSQL_DATADIR=/usr/local/mysql/data \
#指定数据库文件的存储路径
-DWITH_BOOST=boost \
#指定boost的路径,
-DWITH_SYSTEMD=1
#生成便于systemctl管理的文件
④数据库目录进行权限调整、改变属主属组
useradd -s /sbin/nologin mysql
chown -R mysql:mysql /usr/local/mysql/
chown mysql:mysql /etc/my.cnf
⑤调整配置文件
vim /etc/my.cnf
--------------------------内容如下
[client]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock
[mysql]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
⑥设置环境变量
#配置环境变量
echo 'PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH' >> /etc/profile
echo 'export PATH' >> /etc/profile
#刷新
source /etc/profile
#查看是否成功
echo $PATH
⑦初始化数据库
#切换目录
cd /usr/local/mysql/
#初始化
bin/mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data
cp usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
⑧数据库开启自启、关闭、状态
systemctl enable mysqld #设置开机自启
systemctl start mysqld #开启
systemctl stop mysqld #关闭
systemctl start mysqld #开启
systemctl status mysqld #查看状态
ss -anpt | grep 3306 #过滤端口验证是否开启
⑨设置MySQL密码
#修改密码为123123 开始初始密码为空 回车即可
mysqladmin -u root -p password "123123"
⑩登录、登出MySQL
#登录
mysql -u root -p
#授予root用户可以在所有终端远程登录,使用的密码是123123,并对所有数据库和所有表有操作权限
grant all privileges on *.* to 'root'@'%' identified by '123123';
#退出
quit
(2)yum安装MySQL数据库
1. #创建mysql源
cd /etc/yum.repos.d/
vim mysql.repo
[mysql]
name=mysql5.7
baseurl=https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/mysql-5.7-community-el7-x86_64/
gpgcheck=0
2. #安装服务mysql-community-server
yum install mysql-community-server -y
3. #启动服务
systemctl start mysqld
ss -ntap |grep 3306
4. #登入数据库,但是密码是默认的,需要查看
mysql -u root -p
grep password /var/log/mysqld.log
mysql -u root -p'默认的密码'
#特殊符号用单引号引起来
5. #登入数据库后必须修改密码
alter user root@'localhost' identified by 'Admin@123';
#alter user root@'主机名' identified by '新密码';
grant all privileges on *.* to root@"%" identified by "Admin@123" with grant option;
flush privileges;
#可以使用mysql> \h查看帮助
(3)配置MySQL数据库的Tab补全
①yum安装的自动补全
vim /etc/my.cnf
--------------------添加
[mysql]
prompt=(mysql) [\\d]>\\_
auto-rehash
② 安装mycli 插件
需要先修改配置文件安装自动补全功能
vim /etc/my.cnf
--------------------添加
[mysql]
prompt=(mysql) [\\d]>\\_
auto-rehash
安装
1. #安装依赖包
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel
2. #压缩安装包
cd /opt
rz -E
tar zxvf Python-3.8.0_.tgz
3 #切换目录编译安装
cd Python-3.8.0/
./configure --prefix=/usr/local/Python-3.8.0/
make -j2 && make install
4. #做软链接
ln -s /usr/local/Python-3.8.0/bin/python3.8 /usr/bin/python38
ln -s /usr/local/Python-3.8.0/bin/pip3.8 /usr/bin/pip38
pip38 install mycli -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com
ln -s /usr/local/Python-3.8.0/bin/mycli /usr/bin/mycli
5. #登录
mycli -u root -p 123123
二、实验
1.yum安装MySQL
(1)配置MySQL源
(2)安装
(3)启动并监听服务
2.编译安装MySQL
(1)下载MySQL相关安装包➝ 服务器
(2)登录到服务器安装MySQL相关依赖包和函数库
(3)解压MySQL安装进行安装
(4)编译安装➝切换到MySQL解包路径下➝安装路径以及模块
(5)编译安装
(6)创建普通用户管理
(7)更改管理主/组
chown mysql:mysql /etc/my.cnf
(8)配置MySQL文件➝my.cnf
(9)设置环境变量,申明/宣告MySQL 命令便于系统识别
(10)初始化数据库
(11)为了启动服务方便,MySQL 启动服务加入到systemd系统管理➝可使用service或systemctl进行管理
(12)检查MySQL监听端口
(13)测试数据库
3.配置MySQL数据库的Tab补全
(1)修改配置文件安装自动补全功能
(2)安装依赖包
(3)解压
(4)编译安装
(5)做软链接
查看
ln -s /usr/local/Python-3.8.0/bin/python3.8 /usr/bin/python38
ln -s /usr/local/Python-3.8.0/bin/pip3.8 /usr/bin/pip38
pip38 install mycli -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com
查看
ln -s /usr/local/Python-3.8.0/bin/mycli /usr/bin/mycli
(6)登录验证
可以自动补全
三、问题
1.数据库登录报错
(1) 报错
1045(28000):用户'root'@'localhost'(使用密码:YES)拒绝访问
首先解析此英文:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES);
解析的地方有两处:Access denied(拒绝访问);using password:NO/YES
(2) 原因分析
① mysql的服务器停止:
若MySQL已经没有启动,重启MySQL服务器:systemctl restart mysqld
② 用户的端口号或者IP导致:
若用户的端口号与IP(3306/3307)不一致,打开my.ini文件进行编辑。全部编辑替换为: port=X
③ mysql的配置文件错误----my.ini等文件:
my.ini文件误输入无效内容,不知道到何处。复制替换该文件;有人已经对my.ini文件进行解释以及注释
④ root用户的密码错误(后面解决)
(3)解决方法
vim /etc/my.cnf文件;
在[mysqld]后添加skip-grant-tables(登录时跳过权限检查)
重启MySQL服务:sudo systemctl restart mysqld
输入:set password for ‘root’@‘localhost’=password(‘123456’);
如果报:ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
输入:flush privileges;
再次输入:set password for ‘root’@‘localhost’=password(‘123456’);
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY '123456' WITH GRANT OPTION;
flush privileges;
如果还不行,修改命令
update mysql.user set authentication_string=password('123456') where user='root='root'and Host ='localhost';
2.数据库密码复杂度报错
(1)报错
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
(2)原因分析
mysql 初始化时,使用临时密码,修改自定义密码时,由于自定义密码比较简单,就出现了不符合密码策略的问题。
(3)解决方法
查看 mysql 初始的密码策略,
输入语句 show variables like 'validate_password%';
进行查看,如下:
首先需要设置密码的验证强度等级,设置 validate_password_policy 的全局参数为 LOW 即可,
输入设值语句 set global validate_password_policy=LOW; 进行设值,如下:
当前密码长度为 8 ,如果不介意的话就不用修改了,按照通用的来讲,设置为 4位的密码,设置 validate_password_length 的全局参数为 6即可,
输入设值语句 “ set global validate_password_length=6; ” 进行设值,
3.数据库连接报错
(1)报错
(2)原因分析
my.cnf 配置文件中设置了 [mysqld] 的参数 socket ,而没有设置[client]的参数socket。
(3)添加 [client] 配置项,如下所示
登录成功
四、总结
关系数据库和非关系数据库区别:数据一致性不同、数据存储方式不同、扩展方式不同、对事务性的支持不同。
关系型数据库三要素:实体、属性、联系。