Mysql介绍

什么是数据?

数据(data)是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经加工的的原始
素材。
数据可以是连续的值,比如声音、图像,称为模拟数据。也可以是离散的,如符号、文字,称为数字
数据。
在计算机系统中,数据以二进制信息单元0,1的形式表示。
数据的定义: 数据是指对客观事件进行记录并可以鉴别的符号,是对客观事物的性质、状态以及相互关
系等进行记载的物理符号或这些物理符号的组合。它是可识别的、抽象的符号。*

什么是数据库管理系统?
DBMS(Database Management System)针对数据,库,表的增删改查
数据库管理系统的种类?
关系型数据库(RDBMS Relational Database Management System):

  • MySQL
  • MSSQL(SQLserver)windows
  • Oracle
  • PosgreSQL(PSQL、PG)

非关系型数据库(NoSQL):

  • MongoDB 文档型数据库 Document
  • Redis 键值对数据库 key-value
  • Elasticsearch 搜索引擎数据库 search Engine
  • ETCD 键值对数据库 key-value

时序数据库:TSDB(Time Series Database)

  • InfluxDB
  • Prometheus

数据库排行点击查看排行网站

Mysql的安装方式-这里以5.6 5.7版本为例

目前主流常用的mysql版本有如下版本:
5.5 5.6 5.7 8.0
由于5.5已经没有在更新了,除了一些个别企业的数据比较久远,还在存放在老版本数据库
官网
版本选择(潜规则)
5.6:GA6-12个月,小版本号为偶数版
5.7:GA6-12个月,小版本号为偶数版,版本要高于5.7.20(MGR自带高可用功能)

源码安装

打开官网,选择DOWNLOADS

Img

往下找到MySQL Community (GPL) Downloads »

Img

根据实际情况选择,这里选择归档下载,因为归档下载包含所有版本选择

Img
Img

选择对应的版本和安装方式,这里选择5.6.50和源码安装
选择最后一个源码包下载

Img

#下载安装
[root@db01 ~]# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.6.50.tar.gz
#解压
[root@db01 ~]# tar xf mysql-5.6.50.tar.gz
#移动到解压后的目录
[root@db01 ~]# cd mysql-5.6.50/
#安装依赖
[root@db01 mysql-5.6.50]# yum install -y cmake openssl-devel ncurses-devel
#生成
[root@db01 mysql-5.6.50]# cmake . -DCMAKE_INSTALL_PREFIX=/app/mysql-5.6.50 -DMYSQL_DATADIR=/app/mysql-5.6.50/data -DMYSQL_UNIX_ADDR=/app/mysql-5.6.50/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 -DWITH_ZLIB=bundled -DWITH_SSL=system -DENABLED_LOCAL_INFILE=1 -DWITH_EMBEDDED_SERVER=1 -DENABLE_DOWNLOADS=1 -DWITH_DEBUG=0
#生成命令详解:
cmake .: 运行 cmake 命令,将当前目录作为源代码目录。
-DCMAKE_INSTALL_PREFIX=/app/mysql-5.6.50: 设置安装目录为 /app/mysql-5.6.50。这将是 MySQL 软件的安装路径。
-DMYSQL_DATADIR=/app/mysql-5.6.50/data: 设置数据目录为 /app/mysql-5.6.50/data。MySQL 将在此目录中存储数据文件。
-DMYSQL_UNIX_ADDR=/app/mysql-5.6.50/tmp/mysql.sock: 设置 MySQL 的 UNIX 套接字文件路径为 /app/mysql-5.6.50/tmp/mysql.sock。套接字文件用于客户端与 MySQL 服务器之间的通信。
-DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci: 设置默认字符集为 utf8,默认排序规则为 utf8_general_ci。
-DWITH_EXTRA_CHARSETS=all: 启用所有额外的字符集支持。
-DWITH_INNOBASE_STORAGE_ENGINE=1: 启用 InnoDB 存储引擎支持。
-DWITH_FEDERATED_STORAGE_ENGINE=1: 启用 Federated 存储引擎支持。
-DWITH_BLACKHOLE_STORAGE_ENGINE=1: 启用 Blackhole 存储引擎支持。
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1: 禁用示例存储引擎支持。
-DWITH_ZLIB=bundled: 使用打包的 zlib 库。
-DWITH_SSL=system: 使用系统提供的 SSL 库。
-DENABLED_LOCAL_INFILE=1: 启用本地文件加载功能。
-DWITH_EMBEDDED_SERVER=1: 启用嵌入式服务器支持。
-DENABLE_DOWNLOADS=1: 启用下载功能。
-DWITH_DEBUG=0: 禁用调试模式。
生成完成结果如下,也可使用echo $? 查看是否执行成功

Img

#编译安装
[root@db01 mysql-5.6.50]# make && make install
完成结果如下,也可使用echo $? 查看是否执行成功

Img

#优化初始化mysql
#1、做软链接
[root@db02 ~]# ln -s /app/mysql-5.6.50 /app/mysql
#2、创建MySQL用户
[root@db02 ~]# useradd mysql -s /sbin/nologin -M
#3、进入初始化脚本目录
[root@db02 ~]# cd /app/mysql/scripts/
#4、安装依赖并初始化,需要指定,程序安装目录,数据目录,用户
[root@db01 scripts]# yum install -y autoconf
[root@db02 scripts]# ./mysql_install_db --user=mysql --basedir=/app/mysql --datadir=/app/mysql/data

Img

#5、拷贝启动脚本
[root@db01 mysql]# cp /app/mysql/support-files/mysql.server /etc/init.d/mysqld
#6、创建sock存放目录并授权
[root@db01 mysql]# mkdir /app/mysql-5.6.50/tmp
[root@db01 ~]# chown -R mysql.mysql /app/mysql/
#7、添加环境变量
[root@db01 scripts]# echo 'PATH="/app/mysql/bin:$PATH"' > /etc/profile.d/mysql.sh
#8、生效文件
[root@db01 ~]# source /etc/profile
#9、启动mysql
[root@db01 mysql]# /etc/init.d/mysqld start
Starting MySQL.230718 17:53:33 mysqld_safe error: log-error set to '/var/log/mariadb/mariadb.log', however file don't exists. Create writable for user 'mysql'ERROR! The server quit without updating PID file (/var/lib/mysql/db01.pid).
#启动失败,出现如上报错,我们可以看出,是由于系统自带的my.cnf冲突导致启动失败,只要删除/etc/my.cnf的文件内容即可,切记不要删除文件
[root@db01 mysql]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS!    //出现SUCCESS表示启动成功

二进制安装

#1、下载安装
[root@db02 ~]# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.6.50-linux-glibc2.12-x86_64.tar.gz
[root@db02 ~]# ll
total 333524
-rw-r--r-- 1 root root       190 Jul 17 08:19 ip.sh
-rw-r--r-- 1 root root 341523632 Sep 23  2020 mysql-5.6.50-linux-glibc2.12-x86_64.tar.gz
#2、解压
[root@db02 ~]# tar xf mysql-5.6.50-linux-glibc2.12-x86_64.tar.gz
#3、创建目录
[root@db02 ~]# mkdir /app
#4、改名
[root@db02 ~]# mv /root/mysql-5.6.50-linux-glibc2.12-x86_64 /app/mysql-5.6.50
#5、移动到解压后的目录
[root@db02 ~]# cd /app/mysql-5.6.50
#6、做软链接
[root@db02 ~]# ln -s /app/mysql-5.6.50 /app/mysql
#7、创建MySQL用户
[root@db02 ~]# useradd mysql -s /sbin/nologin -M
#8、进入初始化脚本目录
[root@db02 ~]# cd /app/mysql/scripts/
#9、安装依赖并初始化,需要指定,程序安装目录,数据目录,用户
[root@db02 scripts]# yum install -y autoconf libaio-devel
[root@db02 scripts]# ./mysql_install_db --user=mysql --basedir=/app/mysql --datadir=/app/mysql/data

Img

#10、拷贝启动脚本
[root@db02 mysql]# cp /app/mysql/support-files/mysql.server /etc/init.d/mysqld
#11、编写MySQL配置文件 删除全文,添加如下内容
[root@db02 mysql]# vim /etc/my.cnf
[mysqld]
basedir=/app/mysql
datadir=/app/mysql/data
#12、添加环境变量
[root@db02 scripts]# echo 'PATH="/app/mysql/bin:$PATH"' > /etc/profile.d/mysql.sh
#13、生效文件
[root@db03 ~]# source /etc/profile
#14、启动mysql
[root@db02 scripts]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS!   //出现SUCCESS表示启动成功

关系型数据库和非关系型数据库的区别

关系型数据库

1、关系型数据库是指采用了关系模型来组织数据的数据库。简单来说,关系模式就是二维表格模型。
主要代表:SQL Server,Oracle,Mysql,PostgreSQL。
2、优点
(1).容易理解,二维表的结构非常贴近现实世界,二维表格,容易理解。
(2)使用方便,通用的sql语句使得操作关系型数据库非常方便。
(3)易于维护,数据库的ACID属性,大大降低了数据冗余和数据不一致的概率。
3.瓶颈
(1 )海量数据的读写效率。
对于网站的并发量高,往往达到每秒上万次的请求,对于传统关系型数据库来说,硬盘I/o是一个很大的挑战。
(2) 高扩展性和可用性。
在基于web的结构中,数据库是最难以横向拓展的,当一个应用系统的用户量和访问量与日俱增的时候,数据库没有办法像web Server那样简单的通过添加更多的硬件和服务节点来拓展性能和负载能力。

非关系型数据库

1.概念
NoSQL非关系型数据库,主要指那些非关系型的、分布式的,且一般不保证ACID的数据存储系统,主要代表MongoDB,Redis、CouchDB。
NoSQL提出了另一种理念,以键值来存储,且结构不稳定,每一个元组都可以有不一样的字段,这种就不会局限于固定的结构,可以减少一些时间和空间的开销。使用这种方式,为了获取用户的不同信息,不需要像关系型数据库中,需要进行多表查询。仅仅需要根据key来取出对应的value值即可。
2.分类
非关系数据库大部分是开源的,实现比较简单,大都是针对一些特性的应用需求出现的。根据结构化方法和应用场景的不同,分为以下几类。
(1)面向高性能并发读写的key-value数据库
主要特点是具有极高的并发读写性能,例如Redis、Tokyo Cabint等。
(2)面向海量数据访问的面向文档数据库
特点是,可以在海量的数据库快速的查询数据。例如MongoDB以及CouchDB.
(3)面向可拓展的分布式数据库
解决的主要问题是传统数据库的扩展性上的缺陷。
3.缺点
但是由于Nosql约束少,所以也不能够像sql那样提供where字段属性的查询。因此适合存储较为简单的数据。有一些不能够持久化数据,所以需要和关系型数据库结合。

两者区别

1.存储上?
Sql通常以数据库表的形式存储,例如存储用户信息,SQL中增加外部关系的话,需要在原表中增加一个外键,来关联外部数据表。如下:
NoSql采用key-value的形式存储
2.事务
SQL中如果多张表需要同批次被更新,即如果其中一张表跟新失败的话,其他表也不会更新成功。这种场景可以通过事务来控制,可以在所有命令完成之后,再统一提交事务。在Nosql中没有事务这个概念,每一个数据集都是原子级别的。
3.数据表 VS 数据集
关系型是表格型的,存储在数据表的行和列中。彼此关联,容易提取。而非关系型是大块存储在一起。
4.预定义结构 VS 动态结构
在sql中,必须定义好地段和表结构之后,才能够添加数据,例如定义表的主键、索引、外键等。表结构可以在定义之后更新,但是如果有比较大的结构变更,就会变的比较复杂。
在Nosql数据库中,数据可以在任何时候任何地方添加。不需要预先定义。
5.存储规范 VS 存储代码
关系型数据库为了规范性,把数据分配成为最小的逻辑表来存储避免重复,获得精简的空间利用。但是多个表之间的关系限制,多表管理就有点复杂。
当然精简的存储可以节约宝贵的数据存储,但是现在随着社会的发展,磁盘上付出的代价是微不足知道的。
非关系型是平面数据集合中,数据经常可以重复,单个数据库很少被分开,而是存储成为一个整体,这种整块读取数据效率更高。
6.纵向拓展 VS 横向拓展
为了支持更多的并发量,SQL数据采用纵向扩展,提高处理能力,通过提高计算机性能来提高处理能力。
NoSql通过横向拓展,非关系型数据库天然是分布式的,所以可以通过集群来实现负载均衡。
7.其他方面
比如:关系型是结构化查询语言,NoSql是采用更简单而且精确的数据访问方式;SQl数据库大多比较昂贵,而NoSql大多是开源的。

yum安装

#1、添加mysql安装源
[root@db01 ~]# vim /etc/yum.repos.d/mysql.repo
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch
enabled=1
gpgcheck=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022
file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
## 安装:
[root@db01 ~]# yum install -y mysql-server

练习

源码安装5.7.42版本mysql

#下载安装
[root@db03 ~]# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-5.7.42.tar.gz
#创建MySQL用户
[root@db02 ~]# useradd mysql -s /sbin/nologin -M
#解压
[root@db03 ~]# tar xf mysql-boost-5.7.42.tar.gz
#移动到解压后的目录
[root@db03 ~]# cd mysql-boost-5.7.42
#安装依赖
[root@db03 mysql-5.6.50]# yum install -y cmake openssl-devel ncurses-devel
#生成
[root@db03 mysql-5.6.50]# cmake . -DCMAKE_INSTALL_PREFIX=/app/mysql-5.7.42 -DMYSQL_DATADIR=/app/mysql-5.7.42/data -DMYSQL_UNIX_ADDR=/app/mysql-5.7.42/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 -DWITH_ZLIB=bundled -DWITH_SSL=system -DENABLED_LOCAL_INFILE=1 -DWITH_EMBEDDED_SERVER=1 -DENABLE_DOWNLOADS=1 -DWITH_DEBUG=0
#报错缺少boost库
[root@db03 ~]# wget -P http://sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz /opt --no-check-certificate
#解压文件
[root@db03 ~]# tar xf boost_1_59_0.tar.gz 
#重新生成 
[root@db03 ~]# cmake . -DCMAKE_INSTALL_PREFIX=/app/mysql-5.7.42 -DMYSQL_DATADIR=/app/mysql-5.7.42/data -DMYSQL_UNIX_ADDR=/app/mysql-5.7.42/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_FEDERATED_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 -DWITH_ZLIB=bundled -DWITH_SSL=system -DENABLED_LOCAL_INFILE=1 -DWITH_EMBEDDED_SERVER=1 -DENABLE_DOWNLOADS=1 -DWITH_DEBUG=0 
#编译安装
[root@db03 ~]# maek && make install
#做软链接
[root@db03 ~]# ln -s mysql-5.7.42/ mysql
#创建用户名
[root@db03 ~]# seradd mysql -s /sbin/nologin -M
#移动到bin下,进行初始化
[root@db03 ~]# cd /app/mysql/bin
[root@db03 ~]# ./mysqld --initialize-insecure --user=mysql --basedir=/app/mysql --datadir=/app/mysql/data
#复制启动脚本
[root@db03 ~]# cd /app/mysql/support-files/
[root@db03 ~]# cp mysql.server /etc/init.d/mysqld
#编辑my.cnf文件  //只保留如下行即可
[root@db03 ~]# vim /etc/my.cnf
[mysqld]
#创建soke存放目录
[root@db03 ~]# mkdir /app/mysql-5.7.42/tmp
#授权
[root@db03 ~]# chown -R mysql.mysql /app/mysql/
#添加环境变量
[root@db03 ~]# echo 'PATH="/app/mysql/bin:$PATH"' > /etc/profile.d/mysql.sh
#环境生效
[root@db03 ~]# source /etc/profile
#启动mysql
[root@db03 ~]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS! 
[root@db03 ~]# ps -ef | grep mysql
root      28977      1  0 14:15 pts/0    00:00:00 /bin/sh /app/mysql-5.7.42/bin/mysqld_safe --datadir=/app/mysql-5.7.42/data --pid-file=/app/mysql-5.7.42/data/db03.pid
mysql     29064  28977  9 14:15 pts/0    00:00:00 /app/mysql-5.7.42/bin/mysqld --basedir=/app/mysql-5.7.42 --datadir=/app/mysql-5.7.42/data --plugin-dir=/app/mysql-5.7.42/lib/plugin --user=mysql --log-error=db03.err --pid-file=/app/mysql-5.7.42/data/db03.pid
root      29104  15948  0 14:15 pts/0    00:00:00 grep --color=auto mysql

二进制安装5.7.42Mysql

#下载
[root@db04 ~]# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.42-linux-glibc2.12-x86_64.tar
#解压
[root@db04 ~]# tar xf mysql-5.7.42-linux-glibc2.12-x86_64.tar.gz
#创建目录
[root@db04 ~]# mkdir /app
#改名放至到app目录下
[root@db04 ~]# mv mysql-5.7.42-linux-glibc2.12-x86_64 /app/mysql-5.7.42
#做软链接
[root@db04 ~]# ln -s /app/mysql-5.7.42/ /app/mysql
#创建数据存放目录
[root@db04 ~]# mkdir /app/mysql/data
#编辑my.cnf配置文件
[root@db04 ~]# vim /etc/my.cnf
[mysqld]
basedir=/app/mysql
datadir=/app/mysql/data
#创建MySQL用户
[root@db02 ~]# useradd mysql -s /sbin/nologin -M
#初始化优化
[root@db04 ~]# /app/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/app/mysql --datadir=/app/mysql/data
#复制启动脚本
[root@db04 ~]# cp /app/mysql/support-files/mysql.server /etc/init.d/mysqld
#添加环境变量
[root@db04 ~]#  echo 'PATH="/app/mysql/bin:$PATH"' > /etc/profile.d/mysql.sh
#生效
[root@db04 ~]# source /etc/profile
#启动mysql服务
[root@db04 ~]# /etc/init.d/mysqld start
Starting MySQL...... SUCCESS! 
[root@db04 ~]# ps -ef | grep mysql
root       8556      1  0 14:14 pts/0    00:00:00 /bin/sh /app/mysql/bin/mysqld_safe --datadir=/app/mysql/data --pid-file=/app/mysql/data/db04.pid
mysql      8680   8556 38 14:14 pts/0    00:00:04 /app/mysql/bin/mysqld --basedir=/app/mysql --datadir=/app/mysql/data --plugin-dir=/app/mysql/lib/plugin --user=mysql --log-error=db04.err --pid-file=/app/mysql/data/db04.pid
root       8728   7790  0 14:14 pts/0    00:00:00 grep --color=auto mysql

误删除mysql root用户及密码后,怎么登录mysql?

#删除user表
truncate mysql.user;
#重启mysql
[root@db01 ~]# /etc/init.d/mysqld restart
Shutting down MySQL. SUCCESS! 
Starting MySQL. SUCCESS! 
[root@db01 ~]# mysql     //报错进不去数据库
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
#方法一:
#修复root
#1、停止数据库
[root@db01 ~]# /etc/init.d/mysqld stop
#2、跳过授权表和跳过网络启动
[root@db01 ~]# /app/mysql/bin/mysqld_safe --skip-grant-tables --skip-networking 
# 向mysql.user表插入数据
insert into mysql.user SET User='root',ssl_cipher='',x509_issuer='',x509_subject='';
# 给root用户赋予权限
update mysql.user set Host='localhost',select_priv='y', insert_priv='y',update_priv='y', Alter_priv='y',delete_priv='y',create_priv='y',drop_priv='y',reload_priv='y',shutdown_priv='y',Process_priv='y',file_priv='y',grant_priv='y',References_priv='y',index_priv='y',create_user_priv='y',show_db_priv='y',super_priv='y',create_tmp_table_priv='y',Lock_tables_priv='y',execute_priv='y',repl_slave_priv='y',repl_client_priv='y',create_view_priv='y',show_view_priv='y',create_routine_priv='y',alter_routine_priv='y',create_user_priv='y' where user='root';
# 刷新据库表
flush privileges;
#修改root密码   //不适用于跳过验证登录修改root密码
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123');
#登录数据库
[root@db01 ~]# mysql -uroot -p123

#方法二:
​```bash
# 停止数据库
[root@db01 ~]# /etc/init.d/mysqld stop
# 跳过授权表和跳过网络启动
[root@db01 scripts]# /app/mysql/bin/mysqld_safe --skip-grant-tables --skip-networking
# 进入数据库
[root@db01 scripts]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.6.50 Source distribution

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

# 刷新数据库表
mysql> flush privileges;

# 创建root用户给予权限
GRANT ALL ON *.* TO 'root'@'localhost' IDENTIFIED BY '123' WITH GRANT OPTION;
#重启数据库
[root@db01 ~]# /etc/init.d/mysqld restart
#登录MySQL
[root@db01 ~]# mysql -uroot -p123