数据库介绍
数据库管理系统--DBMS
# 数据库管系统(DBMS)作用 将人类可识别的信息转化为二进制存储在磁盘上永久保存 # DBMS分类 RDBMS(关系型数据库软件):主流核心使用数据软件 NOSQL(非关系数据库软件):辅助数据库软件程序 DDBMS(分布式数据库软件):解决海量数据存储与管理(NewSQL) # 数据库服务作用 实现数据持久化存储(安全性) 分析、管理数据信息(数据分析查询)
常见的数据库管理系统程序排名:https://db-engines.com/en/ranking
数据库服务分类⭐⭐
关系型数据库:实现数据的整合
关系型数据库四层结构信息:
| 序号 | 数据库结构 | 描述说明 |
|---|---|---|
| 01 | 数据库管理系统(DBMS) | 进行数据存储应用管理的操作环境或命令 |
| 02 | 数据库(DB) | 数据存储的承载环境 |
| 03 | 数据表(Table) | 数据关系的构建环境 |
| 04 | 数据字段(Field) | 实际数据信息展现形式 |
常见的关系型数据库应用程序:
| 序号 | 数据库程序 | 应用说明 |
|---|---|---|
| 01 | MySQL | 互联网公司应用最广泛 |
| 02 | Mariadb | 企业场景应用较少(20%),主要用于教学环境较多 |
| 03 | Oracle | 传统企业和部分国企应用较多,但也逐步被国产数据库替代 |
| 04 | SQLserver | 适合windows server系统环境部署的数据库服务,属于微软公司发布的数据库服务 |
| 05 | PostgreSQL | 适合于海量数据信息存储,对于金融行业数据信息分析能力将强 |
非关系型数据库:实现数据的拆分(辅助关系型数据库,解决高并发访问问题)
非关系型数据库数据存放形式:key value(键值对)
| 序号 | 数据库程序 | 应用说明 |
|---|---|---|
| 01 | Redis | 可以利用内存存储数据,也可以采用磁盘存储数据,数据常见展示形式为key-value形式 |
| 02 | Memcache | 可以利用内存存储数据,也可以采用磁盘存储数据,数据常见展示形式为key-value形式 |
| 03 | Mongodb | 属于面向文档数据存储的数据库 |
| 04 | ES | 主要用于做日志数据的收集与检索的数据库(ELK ELFK) |
新型数据库:数据分散在多个服务器或地区,通过分布式算法协调管理(垂直分布式、水平分布式)
| 序号 | 数据库程序 | 应用说明 |
|---|---|---|
| 01 | TiDB | 开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理的融合型分布式数据库产品 |
| 02 | OceanBase | 是由蚂蚁集团完全自主研发的国产原生分布式数据库,兼顾分布式架构的扩展性与集中式架构的性能优势 |
| 03 | PolarXDB | 是由阿里巴巴自主研发的云原生分布式数据库,是一款基于云架构理念分布式数据库产品,专注海量数据处理 |
| 04 | RDS/TDSQL | 阿里云/腾讯云平台基于SaaS云计算服务环境构建的数据库产品(PolarXDB TDSQL TiDB) |
MySQL安装部署

数据库软件安装方式⭐⭐⭐⭐
| 序号 | 安装方式 | 特征说明 |
|---|---|---|
| 01 | 采用二进制方式安装 | 直接解压缩二进制程序包,进行简单的配置和初始化操作即可 |
| 02 | 采用rpm包方式安装 | 需要从官方网站下载rpm程序包,并且需要考虑系统环境的兼容性,解决软件程序包依赖 |
| 03 | 采用yum包方式安装 | 需要根据官方网站说明,配置yum下载的仓库源信息,在联网情况下进行安装部署(最新版) |
| 04 | 采用源码包/编译方式安装 | 需要从官方网站下载源码程序包,并且需要解决程序包依赖问题,以及需要采用编译安装 |
二进制安装MySQL8.0.26⭐⭐⭐
配置数据库服务安装环境⭐⭐⭐
# 查看操作系统的版本信息 [root@db01 ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) # 查看操作系统的网卡地址 [root@db01 ~]# ip address show eth0 inet 10.0.0.51/24 brd 10.0.0.255 scope global noprefixroute eth0 # 查看系统本地域名解析信息 [root@db01 ~]# cat /etc/hosts 172.16.1.51 db01 # 查看防火墙服务是否关闭 [root@db01 ~]# systemctl status firewalld.service Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) # 查看selinux安全策略是否关闭(SELinux:限制进程和用户的权限) [root@db01 ~]# getenforce Disabled # 清除系统自带的mariadb数据库服务相关的程序包 [root@db01 ~]# rpm -qa |grep mariadb mariadb-libs-5.5.68-1.el7.x86_64 [root@db01 ~]# yum remove -y mariadb-libs # 安装数据库服务程序所需的依赖软件包 [root@db01 ~]# yum install -y libaio-devel # 需要修改链接库信息(只有centos 8 系统才需要进行操作修改) # 方法一: [root@db01 ~]# ln -s /usr/lib64/libncurses.so.6 /usr/lib64/libncurses.so.5 # 方法二: [root@db01 ~]# yum install ncurses-compat-libs
数据库服务安装⭐⭐⭐
# 上传数据库程序软件包并解压 [root@db01 ~]# cd /usr/local/ [root@db01 local]# rz -y [root@db01 local]# tar xf mysql-8.0.26-linux-glibc2.12-x86_64.tar.xz # 创建数据库服务程序目录的软链接 [root@db01 local]# ln -s mysql-8.0.26-linux-glibc2.12-x86_64 mysql # 配置数据库服务程序环境变量 [root@db01 local]# tail -1 /etc/profile export PATH=/usr/local/mysql/bin:$PATH [root@db01 local]# source /etc/profile # 重新加载/etc/profile文件中的环境变量配置 [root@db01 local]# mysql -V # 创建数据库服务管理用户信息 [root@db01 local]# useradd mysql # 创建数据库服务相关目录并进行目录信息进行授权 [root@db01 local]# mkdir -p /data/3306/data [root@db01 local]# chown -R mysql. /data/
初始化操作⭐⭐⭐
mysql数据库初始化⭐⭐⭐
mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data --initialize-insecure(非安全模式) 初始化数据库但不设置 root 密码(不安全,仅用于测试环境) 生产环境建议使用 --initialize(会生成随机密码,记录在日志中),安全模式 --user=mysql 指定 MySQL 服务运行的系统用户(需提前创建 mysql 用户) --basedir=/usr/local/mysql MySQL 二进制程序的安装目录(软链接指向的路径) --datadir=/data/3306/data 数据存储目录(需提前创建并确保 mysql 用户有权限)
数据库服务初始化经典报错⭐⭐⭐
mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file 原因:MySQL 依赖 libaio 库进行异步 I/O 操作 解决:安装依赖包 yum install -y libaio-devel # CentOS/RHEL apt-get install libaio1 # Ubuntu/Debian ------------------------------------------------------------------------------------------- The designated data directory /data/3306/data/ is unusable. 原因:datadir 目录已存在文件 解决:清空目录并重新初始化 rm -rf /data/3306/data/* # 删除所有文件 chown -R mysql:mysql /data/3306/data # 确保权限正确
mysql配置文件( my.cnf )⭐⭐⭐⭐⭐
my.cnf 是 MySQL 服务启动时加载的核心配置文件
[root@db01 ~]# cat /etc/my.cnf [mysql] socket=/tmp/mysql.sock [mysqld] user=mysql basedir=/usr/local/mysql datadir=/data/3306/data socket=/tmp/mysql.sock
数据库服务控制⭐⭐⭐
mysql数据库服务控制脚本⭐⭐⭐
/usr/local/mysql/support-files/mysql.server mysql官方提供的数据库服务控制脚本/etc/init.d/ 系统服务管理目录 # 将MySQL官方提供的服务控制脚本复制到Linux系统的服务管理目录,使MySQL服务可以被系统服务管理器识别和控制 使其能够被service/chkconfig/systemctl等命令识别 [root@xiaoQ-01 ~]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld [root@db01 init.d]# /usr/local/mysql/support-files/mysql.server start Starting MySQL.. SUCCESS! [root@db01 init.d]# /etc/init.d/mysqld stop Shutting down MySQL.. SUCCESS! [root@db01 init.d]# service mysqld start Starting MySQL.. SUCCESS! [root@db01 init.d]# service mysqld stop Shutting down MySQL.. SUCCESS! # 将service管理服务方式转换为systemd管理服务方式 [root@xiaoQ-01 ~]# systemctl enable mysqld mysqld.service is not a native service, redirecting to /sbin/chkconfig. Executing /sbin/chkconfig mysqld on # 33060端口: MySQL X Protocol 的默认端口,支持 NoSQL 风格的文档操作(如使用 MySQL Shell 的 X DevAPI)和高级管理功能 关闭该端口:编辑MySQL配置文件(/etc/my.cnf) [mysqld] mysqlx = 0 # 禁用 X Plugin systemctl restart mysqld # 禁用后重启服务

systemctl文件⭐⭐
[root@db01 ~]# cat /etc/systemd/system/mysqld.service [Unit] Description=MySQL Server Documentation=man:mysqld(8) Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html After=network.target After=syslog.target [Install] WantedBy=multi-user.target [Service] User=mysql Group=mysql ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf LimitNOFILE=5000 [root@db01 ~]# systemctl daemon-reload

数据库服务密码设置⭐⭐
没有密码设置密码
# 命令行中设置 # 方法一: mysqladmin password 'yuan' # 方法二: mysqladmin -uroot -p password 'yuan' # 数据库中设置密码 alter user root@'localhost' identified by 'yuan';
修改密码
# 命令行中修改密码 mysqladmin -uroot -pyuan password 'yuan123' # 数据库中修改密码 alter user root@'localhost' identified by 'yuan123';
数据库服务本地管理员密码遗忘如何处理⭐⭐⭐⭐⭐
解决处理方法:将数据库重启并进入数据库安全模式(不加载验证授权表模式)
# 使用mysqld_safe后台启动,跳过授权表和网络 [root@db01 ~]# mysqld_safe --skip-grant-tables --skip-networking & --skip-grant-tables:绕过权限验证 --skip-networking:禁用远程连接(安全加固) &:后台运行进程 # 无密码登录MySQL [root@db01 ~]# mysql -uroot mysql> FLUSH PRIVILEGES; -- 重载权限表 mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'root'; -- 修改密码# 停止mysql服务 [root@db01 ~]# pkill mysqld
mysqld / mysqld_safe /服务启动关闭
[root@db01 ~]# ps -ef |grep mysqld root 1405 1 0 18:02 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/3306/data --pid-file=/data/3306/data/db01.pid mysql 1549 1405 0 18:02 ? 00:00:24 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/3306/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=db01.err --pid-file=/data/3306/data/db01.pid --socket=/tmp/mysql.sock -- 利用mysqld命令可以启动数据库服务,并显示启动的命令进程信息,但不能负责完成数据库服务的停止和重启操作-- 利用mysqld_safe命令启动数据库服务,可以进行特殊功能信息配置,并且可以实现数据库维护性操作,还可以设置启停重启;

| 序号 | 启动方式 | 关闭方式 |
|---|---|---|
| 01 | mysqld & | kill/pkill/killall (不建议) kill -9 禁用 |
| 02 | mysqld_safe & | kill/pkill/killall (不建议) |
| 03 | mysql.server start | mysql.server stop |
| 04 | service mysqld start (建议) |
service mysqld stop (建议) |
| 05 | systemctl start mysqld | systemctl stop mysqld |
| 06 | > shutdown | |
| 07 | mysqladmin -uroot -poldboy123 shutdown |
部署mysql5.6
# 上传程序压缩包并进行解压 [root@db01 local]# tar xf mysql-5.6.48-linux-glibc2.12-x86_64.tar.gz mysql-5.6.48-linux-glibc2.12-x86_64/ # 创建软连接 [root@db01 local]# ln -s mysql-5.6.48-linux-glibc2.12-x86_64 mysql56 # 创建数据存储目录并设置权限 [root@db01 ~]# mkdir -p /data/3356/data [root@db01 ~]# chown -R mysql.mysql /data/3356/data # 初始化操作 [root@db01 ~]# /usr/local/mysql56/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql56 --datadir=/data/3356/data # 编写配置文件 [root@db01 ~]# cat /etc/my56.cnf [mysql] socket=/tmp/mysql.sock [mysqld] user=mysql basedir=/usr/local/mysql56 datadir=/data/3356/data socket=/tmp/mysql.sock # 启动数据库服务 vim /etc/systemd/system/mysqld56.service 将上述的ExecStart参数的值进行修改 ExecStart=/usr/local/mysql56/bin/mysqld --defaults-file=/etc/my56.cnf # 重新加载 Systemd 的单元配置文件 [root@db01 ~]# systemctl daemon-reload
部署mysql5.7
# 上传程序压缩包并进行解压 [root@db01 local]# tar xf mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz # 创建软连接 [root@db01 local]# ln -s mysql-5.7.30-linux-glibc2.12-x86_64 mysql57 # 创建数据存储目录并设置权限 [root@db01 ~]# mkdir -p /data/3357/data [root@db01 ~]# chown -R mysql.mysql /data/3357/data # 初始化操作 [root@db01 ~]# /usr/local/mysql57/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql57 --datadir=/data/3357/data # 编写配置文件 [root@db01 ~]# cat /etc/my57.cnf [mysql] socket=/tmp/mysql.sock [mysqld] user=mysql basedir=/usr/local/mysql57 datadir=/data/3357/data socket=/tmp/mysql.sock # 启动数据库服务 vim /etc/systemd/system/mysqld57.service 将上述的ExecStart参数的值进行修改 ExecStart=/usr/local/mysql57/bin/mysqld --defaults-file=/etc/my57.cnf # 重新加载 Systemd 的单元配置文件 [root@db01 ~]# systemctl daemon-reload
数据库服务基础管理
数据库服务用户管理⭐⭐⭐
用户的基本操作
用户名称@主机名称/主机地址范围 # 创建数据库服务用户信息 create user yuan@'172.16.1.%' identified by 'yuan123'; # 查询数据库服务用户信息 select user,host,authentication_string from mysql.user; # 查看当前系统登陆的用户信息 select user(); # 锁定/解锁数据库服务用户信息 alter user yuan@'172.16.1.%' account lock; alter user yuan@'172.16.1.%' account unlock;


5.7 和 8.0 创建用户授权区别
-- mysql5.7(grant命令即可完成用户创建操作+用户密码设置+用户授权操作) grant all on *.* to jiang@'localhost' identified by 'yuan123'; -- mysql8.0(先建立用户再进行授权) create user jiang@'localhost' identified by 'yuan123'; grant all on *.* to jiang@'localhost';
5.7 和 8.0 用户加密插件区别

-- mysql5.7 用户密码加密插件:mysql_native_password -- mysql8.0 用户密码加密插件:caching_sha2_password
如何解决数据库服务升级后,用户密码加密插件影响连接建立问题
-- 创建用户过程修改加密插件信息 create user xiao@'localhost' identified with mysql_native_password by 'yuan123'; -- 修改已经创建用户加密插件信息 alter user yuan@'172.16.1.%' identified with mysql_native_password by 'yuan123'; -- 修改数据库服务配置文件信息(全局修改) [root@db01 ~]# vim /etc/my.cnf [mysqld] default_authentication_plugin=mysql_native_password -- 修改数据库服务配置文件,并在mysqld中区域进行修改

数据库服务权限管理⭐⭐⭐
- 数据库中的授权表:用于存储和管理用户、角色及其权限分配信息
- 系统权限和数据库权限作用在哪里?
- 系统权限是作用于文件上的;
- 数据库权限是作用在用户上的,或者角色(相当于系统的用户组)上的;
| 查看数据库中可以授权的所有权限信息:show privileges; | |
|---|---|
| 输出列 | 解释说明 |
| Privilege | 表示可以授权的所有权限信息展示 |
| Context | 表示设置的权限可以对数据库服务哪些资源进行操作 |
| Comment | 对相应的权限功能进行简单解释说明 |
核心重要权限
| 序号 | 权限 | 授权资源 | 解释说明 |
|---|---|---|---|
| 01 | Select | Tables | 可以对表进行操作,查询表中数据信息 |
| 02 | Insert | Tables | 可以对表进行操作,插入表中数据信息 |
| 03 | Update | Tables | 可以对表进行操作,修改表中数据信息 |
| 04 | Delete | Tables | 可以对表进行操作,删除表中数据信息 |
| 05 | Alter | Tables | 可以对表进行操作,修改表中结构信息(元数据-属性) |
| 06 | Index | Tables | 可以对表进行操作,删除或创建表中的索引信息 |
| 07 | Create | Databases,Tables | 可以对表和库进行操作,用于创建数据库和表信息 |
| 08 | Drop | Databases,Tables | 可以对表和库进行操作,用于删除数据库和表信息 |
说明:all privileges(all)包含查看的所有权限信息,但是唯独缺了Grant option,不能授权用户,此权限只能给root@local用户
常见授权表信息(了解)
mysql> use mysql; mysql> show tables;
| 序号 | 授权表名称 | 解释说明 |
|---|---|---|
| 01 | user | 主要用于存储用户、主机域、密码、加密插件等信息,同时还存储了*.*级别的权限(全局权限) |
| 02 | db | 主要用于存储用户、主机域等信息,同时还存储了单库级别的权限(数据库级权限) |
| 03 | tables_priv | 主要用于存储用户、主机域等信息,同时还存储了单表级别的权限(表级权限) |
说明:以上授权表信息了解作用即可,不建议采用手工方式对授权表中的数据进行修改调整
设置数据库服务用户权限⭐⭐
grant 权限 on 授权对象范围(库信息.表信息) to 权限赋予用户信息 -- 授予权限 mysql> grant insert,update,delete,select on *.* to yuan@'172.16.1.%'; -- 查看用户权限 mysql> show grants for yuan@'172.16.1.%'; -- 回收权限 mysql> revoke select,insert on *.* from yuan@'172.16.1.%';

MySQL8.0权限管理特征(权限角色管理)⭐⭐⭐⭐⭐
之前的版本在设置权限信息时,只能针对用户设置权限
将相同用户的权限整合成一个组,类似于操作系统中的用户组
-- 创建role信息的语句结构信息,不加@信息表示角色白名单为%方式,实际还要根据具体用户定义 CREATE ROLE 'admin', 'developer'; CREATE ROLE 'webapp'@'localhost'; -- 创建两个不同的role组 mysql> create role yuan_rw,yuan_r; -- 将权限授权给role组 mysql> create database yuan; -- 首先创建一个yuan数据库 mysql> grant select,update,insert,delete on yuan.* to yuan_rw; mysql> grant select on yuan.* to yuan_r; -- 查看role授予的权限 mysql> show grants for yuan_r; +------------------------------------------+ | Grants for yuan_r@% | +------------------------------------------+ | GRANT USAGE ON *.* TO `yuan_r`@`%` | | GRANT SELECT ON `yuan`.* TO `yuan_r`@`%` | +------------------------------------------+ -- 实现不同的role信息与不同的用户进行捆绑 mysql> create user user01@'%' identified by 'user01'; mysql> create user user02@'%' identified by 'user02'; mysql> grant yuan_r to user01@'%'; mysql> grant yuan_rw to user02@'%'; -- 进行角色信息激活 -- 方式一:手动激活角色 mysql> set default role all to user01@'%'; mysql> set default role all to user01@'%'; -- 方式二:实现自动激活用户角色信息 mysql > set global activate_all_roles_on_login=on; -- 用对应的用户进入数据库, mysql> select current_role(); -- 显示用户对应的角色信息
数据库服务连接管理⭐⭐
- 数据库连接方式
- 本地连接
- 远程连接
- 软件终端操作连接登录数据库服务:Navicat
- 程序代码操作连接登录数据库服务
| 开发语言 | 连接数据库驱动程序 |
|---|---|
| python | 连接数据库驱动-pymysql |
| golang | 连接数据库驱动-gomysql |
| java | 连接数据库驱动-jar |
| php | 连接数据库驱动-phpmysql |
- 利用socket建立远程连接(unix 套接字文件连接)
# 套接字文件信息定义: [root@db01 ~]# cat /etc/my.cnf [mysql] socket=/tmp/mysql.sock # 指定数据库服务加载的套接字文件路径信息 [mysqld] socket=/tmp/mysql.sock # 指定数据库服务加载的套接字文件路径信息 # 利用套接字文件建立数据库服务连接 [ root@oldboy ~]# mysql -uroot -proot -S /tmp/mysql.sock # 进行本地连接时,hlocalhost -P3306 可以省略 # -S指定socket的信息可以省略,因为在数据库服务配置文件的客户端已经配置过了
- 利用TCP/IP建立远程连接(网络地址与端口)
# 利用TCP/IP建立数据库服务连接 [root@oldboy ~]# mysql -uroot -proot -h172.16.1.51 -P3306 -S /tmp/mysql.sock
浙公网安备 33010602011771号