【MySQL】服务端持久化层MySQL零基础入门实战

文章目录

      • 1.MySQL入门
        • 1.1.源码安装MySQL5.7
        • 1.2.Docker安装MySQL5.7
        • 1.3.忘记MySQL超户密码
        • 1.4.MySQL支持简体中文
      • 2.MySQL数据库操作
        • 2.1.SQL语句概述
        • 2.2.数据库表的管理操作
        • 2.3.用户权限设置
        • 2.4.其他的常用的命令
      • 3.MySQL索引
        • 3.1.数据库索引概述
        • 3.2.常见的检索方案
        • 3.3.B+Tree数据结构解析
        • 3.4.创建、查看、删除索引
      • 4.MySQL数据库管理
        • 4.1.MySQL用户账号管理
        • 4.2.MySQL用户授权操作
        • 4.3.MySQL日志管理
        • 4.4.MySQL数据乱码问题
      • 5.MySQL完全备份与恢复
        • 5.1.数据备份的重要性
        • 5.2.数据备份的分类
        • 5.3.MySQL完全备份操作
        • 5.4.恢复数据库
        • 5.5.Mysql数据库备份脚本
      • 6.MySQL增量备份与恢复
        • 6.1.MySQL增量备份的概念
        • 6.2.MySQL增量恢复
      • 7.MySQL存储引擎
        • 7.1.存储引擎概念介绍
        • 7.2.MyISAM介绍
        • 7.3.InnoDB介绍
        • 7.4.InnoDB索引的结构
        • 7.5.企业选择存储引擎
        • 7.5.配置适合的存储引擎
      • 8.MySQL事务
        • 8.1.事务简介
        • 8.2.事务隔离级别
        • 8.3.脏读幻读不可重复读
      • 9.MySQL主从复制
        • 9.1.单个MySQL问题分析
        • 9.2.主从复制原理
        • 9.3.主从复制的模式
        • 9.4.MySQL主从复制服务搭建
        • 9.5.GTID方式搭建主从复制
      • 10.MySQL读写分离
        • 10.1.读写分离场景背景
        • 10.2.SpringBoot+MySQL实现读写分离
      • 11.MySQL性能优化分析
        • 11.1.基于Durid分析MySQL执行性能
        • 11.2.MySQL性能优化分析
      • 12.MySQL分库分表
        • 12.1.分库分表的原因
        • 12.2.分库分表的方式
        • 12.3.Sharding-JDBC实现分库分表读写分离
      • 13.MMM实现MySQL高可用
        • 13.1.MMM介绍
        • 13.2.MMM实现MySQL高可用

1.MySQL入门

1.1.源码安装MySQL5.7

1、关闭防火墙、selinux

systemctl stop firewalld.service
vi /etc/selinux/config 
更改 SELINUX=disabled

2、安装cmake工具

yum -y install cmake

3、解压boost压缩包(mysql5.1.17必须依赖)

tar -xf boost_1_59_0.tar.gz

4、yum安装其他组件

yum -y install gcc gcc-c++ bzip2 bzip2-devel bzip2-libs python-devel ncurses ncurses-devel openssl-devel

5、创建mysql程序用户

useradd -M -s /sbin/nologin mysql

6、创建mysql安装路径,数据文件路径,并授权

安装路径:mkdir -p /usr/local/mysql
数据文件路径:mkdir -p /usr/local/mysql/data
授权:chown -R mysql:mysql /usr/local/mysql /usr/local/mysql/data

7、使用cmake工具对mysql5.7.17进行环境收集检验于配置相关模块

#解压mysql源码包,并进入解压后的路径 (注意:cmake之前一定要解压boost_1_59_0.tar.gz)
tar -xf mysql-5.7.17.tar.gz
cd mysql-5.7.17
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql/ \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DSYSCONFDIR=/etc \
-DMYSQL_USER=mysql \
-DMYSQL_TCP_PORT=3306 \
-DWITH_XTRADB_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DMITH_READLINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EXTRA_CHARSETS=1 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEFAULT_CHARSET=all \
-DWITH_BIG_TABLES=1 \
-DWITH_BOOST=../boost_1_59_0 \
-DWITH_DEBUG=0
参数详细信息解释:
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \	#指定mysql数据库安装目录
-DMYSQL_DATADIR=/data/mydata \				#指定数据库文件路径
-DSYSCONFDIR=/etc \							#指定配置文件目录
-DWITH_INNOBASE_STORAGE_ENGINE=1 \			#安装INNOBASE存储引擎
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \ 			#安装ARCHIVE存储引擎 
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ 		#安装BLACKHOLE存储引擎 
-DWITH_READLINE=1 \ 						#使用readline功能 
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \ 		#连接文件位置
-DWITH_SSL=system \ 						#表示使用系统上的自带的SSL库 
-DWITH_ZLIB=system \ 						#表示使用系统上的自带的ZLIB库 
-DDEFAULT_CHARSET=utf8 \ 					#指定默认使用的字符集编码 
-DDEFAULT_COLLATION=utf8_general_ci \		#指定默认使用的字符集校对规则 
-DDOWNLOAD_BOOST=1 \
-DWITH_BOOST=../boost_1_59_0 \ 				#指定Boost库的位置,mysql5.7必须添加该参数 
-DENABLE_DOWNLOADS=1 						#支持下载可选文件

【MySQL】服务端持久化层MySQL零基础入门实战_第1张图片

编译完成警告忽略,如果出现报错删除mysql安装包下的CMakeCache.txt文件

8、编译并安装(此步时间过长,可以来把王者压压惊)

make && make install

9、编译并安装

/usr/local/mysql/bin/mysqld \
--initialize \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data \
-socket=/tmp/mysql.sock

10、修改my.cnf配置文件

vi /etc/my.cnf
[mysqld]
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
symbolic-links=0

[mysqld_safe]
log-error=/usr/local/mysql/log/mysql.errlog
pid-file=/usr/local/mysql/data/$hostname.pid

11、创建错误日志文件,并将文件归属到mysql程序用户下

touch /usr/local/mysql/log/mysql.errlog
chown -R mysql:mysql /usr/local/mysql/log/mysql.errlog

注意:如果配置文件里面配置了,某个文件一定要在启动前提前创建好,否则会报错

Starting MySQL.2019-08-03T14:19:37.028727Z mysqld_safe error: log-error set to '/usr/local/mysql/log/mysql.errlog', however file don't exists. Create writable for user 'mysql'. ERROR! The server quit without updating PID file (/data/mydata/localhost.localdomain.pid).

12、初始化数据库

mysql_install_db --user=mysql --datadir=/usr/local/mysql/data

在这里插入图片描述

13、创建软链接

ln -s /usr/local/mysql/bin/* /usr/bin/

14、启动mysql服务

/usr/local/mysql/support-files/mysql.server start

15、停止mysql服务

/usr/local/mysql/support-files/mysql.server stop

16、登入mysql服务

mysql -uroot -p
设置密码:set password=password('123456');
1.2.Docker安装MySQL5.7

1、查看centos内核版本

uname -a

在这里插入图片描述

  • 安装条件:docker官方至少要求3.8,建议3.10以上

2、安装Docker的前期准备

(1)关闭防火墙

systemctl stop firewalld

【MySQL】服务端持久化层MySQL零基础入门实战_第2张图片

(2)关闭selinux

vi /etc/selinux/config   --->将SELINUX=disabled

【MySQL】服务端持久化层MySQL零基础入门实战_第3张图片

(3)安装wget命令

yum -y install wget

(4)下载阿里云docker社区版yum源

cd /etc/yum.repos.d/  进入到yum源的路径

wget  http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

(5)下载网络源安装contain-SElinux包

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all

yum -y update #这一块时间有点长,耐心等待
  • 注意:一定要有这一步,否则会报找不到selinux包

【MySQL】服务端持久化层MySQL零基础入门实战_第4张图片

(6)安装docker ce社区版

yum -y install docker-ce.x86_64

在这里插入图片描述

(7)设置开机自启

systemctl enable docker

(8)更新xfsprogs

yum -y update xfsprogs

3、启动docker容器

systemctl start docker

4、查看docker版本和详细信息

(1)查看docker版本

docker version

(2)查看docker详细信息

docker info

5、配置阿里云镜像加速

  • 新建文件:vi /etc/docker/daemon.json
  • 编辑文件
{
   
  "registry-mirrors": ["https://6j96rs65.mirror.aliyuncs.com"]
}
  • 重启docker
  • systemctl daemon-reload
  • systemctl restart docker
  • 查看容器独有的IP地址
  • docker inspect --format=‘{ {.NetworkSettings.IPAddress}}’ 容器名|容器ID

6、拉取mysql:5.7镜像

docker pull mysql:5.7

7、启动MySQL5.7容器

docker run -p 3306:3306 --name mysql \ 
-v /usr/local/docker/mysql/conf:/etc/mysql \ 
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7
docker run #启动一个容器 
--name mysql #设置容器名称为mysql 
-p 3306:3306 #宿主机端口:容器内部端口, 将容器的mysql服务端口映射给宿主机的一个端口,对外提供 访问
-v /usr/local/docker/mysql/conf:/etc/mysql #挂载映射,将容器内部的/etc/mysql文件挂载载 宿主机的/usr/local/docker/mysql/conf目录下,其他同理 
-e MYSQL_ROOT_PASSWORD=123456 #-e设置额外的参数,设置root用户的密码 
-d #后台运行 
mysql:5.7 #镜像名称

8、docker ps查看MySQL容器运行状态

docker ps 

【MySQL】服务端持久化层MySQL零基础入门实战_第5张图片

1.3.忘记MySQL超户密码

1、源码服务mysql忘记超户密码

(1)暂停 mysq服务

systemctl stop mysql  #或者/etc/init.d/mysqld start

(2)跳过 grant表授权,进入安全模式,并在后台运行

mysqld_safe --skip-grant-tables &

(3)进入安全模式修改密码

[root@mysql ~]# mysql

mysql> use mysql;
Database changed
mysql> update user set Password=password('123456') where user='root';
Query OK, 3 rows affected (0.00 sec)
Rows matched: 4    Changed: 3     Warnings: 0
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye

(4)重启mysql服务

systemctl start mysql #或者/etc/init.d/mysqld restart
mysql -uroot -p123456

2、容器服务mysql忘记超户密码

(1)进入容器内部

docker exec -it mysql bash

(2)设置跳过权限表的加载,注意这块表示任何用户都能登进来,非常不安全

echo "skip-grant-tables" >> /etc/mysql/conf.d/docker.cnf

【MySQL】服务端持久化层MySQL零基础入门实战_第6张图片

(3)退出容器,重启容器

1.exit

2.docker restart mysql

(4)再次进入容器

docker exec -it mysql bash

(5)登录mysql(无需密码)

mysql -uroot 

【MySQL】服务端持久化层MySQL零基础入门实战_第7张图片

(6)更新权限,修改密码,退出,替换掉刚才加的跳过权限表的加载参数

1.flush privileges;

2.alter user 'root'@'localhost' identified by '123456';
(或者:update user set password=password('123456') where user ='root')

3.exit

4.sed -i "s/skip-grant-tables/ /" /etc/mysql/conf.d/docker.cnf

【MySQL】服务端持久化层MySQL零基础入门实战_第8张图片

(7)退出容器,重启容器

1.exit

2.docker restart mysql

【MySQL】服务端持久化层MySQL零基础入门实战_第9张图片

1.4.MySQL支持简体中文

1、临时开启mysql支持简体中文

【MySQL】服务端持久化层MySQL零基础入门实战_第10张图片

2、永久开启mysql支持简体中文

(1)源码mysql服务

  • 修改/etc/my.cnf配置文件
vi /etc/my.cnf

加如下内容:
[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

(2)容器mysql服务

  • 进入容器内部,修改配置文件
1.docker exec -it mysql(容器名) bash

2.vim /etc/mysql/conf.d/docker.cnf

加如下内容:
[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

2.MySQL数据库操作

2.1.SQL语句概述
  • SQL语句是(Structured Query Language)的缩写,是关系型数据库的标准语言,用于维护管理数据库,如数据查询、数据更新、访问控制、对象管理等功能。
  • SQL分类:
    • DDL:数据定义语言,用于增删改数据库的对象。
    • DML:数据操作语言,用于对表数据的增删改。
    • DQL:数据查询语句,用于数据查询。
    • DCL:数据控制语句。
2.2.数据库表的管理操作

1、查看数据库结构

查看数据库结构:
show databases;

【MySQL】服务端持久化层MySQL零基础入门实战_第11张图片

查看数据库中的数据表信息:
use 数据库名;  #使用数据库
show tables;  #查看当前库下的所有表

【MySQL】服务端持久化层MySQL零基础入门实战_第12张图片

显示数据表的结构:
describe 数据库.表名
describe mysql.user; (或者desc user)

【MySQL】服务端持久化层MySQL零基础入门实战_第13张图片

2、DDL语句操作

数据定义语言,用于增删改数据库对象。

(1)create创建新库、创建新表

创建test库:
create database test;
创建test表:
create table test (id int(10) not null);

(2)drop删除库、删除表

删除test库:
drop database test;
删除test表:
drop table test;

3、DML语句表数据操作

数据操作语言,用于对表中的数据进行增删改。

(1)insert插入新数据

insert into 表名(字段1,字段2,....) values ('字段1的值','字段2的值',.....);
示例:
INSERT INTO sys.sys_config
(variable, value, set_time, set_by)
VALUES('diagnostics.include_raw', 'OFF', '2021-11-01 14:43:22.0', NULL);

(2)update更改原有的数据

update 表名 set 字段1 = 值1,.... where 表达式条件;
示例:
UPDATE sys.sys_config
SET value='OFF', set_time='2021-11-01 14:43:22.0', set_by=NULL
WHERE variable='diagnostics.include_raw';

(3)delete删除不需要的数据

delete from 表名 where 表达式条件;
示例:
DELETE FROM sys.sys_config
WHERE variable='diagnostics.include_raw';

4、DQL语句操作

数据查询语句,用于数据库的查询。

  • select查询语句
select 字段名1,字段名2,.... from 表名;
select 字段名1,字段名2,.... from 表名 where 表达式条件;
示例:
SELECT variable, value, set_time, set_by
FROM sys.sys_config
WHERE variable='diagnostics.include_raw';
2.3.用户权限设置

1、设置用户权限(用户不存在则新建用户)

grant 权限 on 库名.表名 to 'root'@'localhost' IDENTIFIED BY '123456';
grant all on *.* to 'root'@'localhost' IDENTIFIED BY '123456';

all #代表所有权限
on  #作用在那个库那些表中
*.* #第一个*代表所有的库第二个*代表所有的表
to 'root'@'localhost' #作用在本地的root用户上
IDENTIFIED BY '123456' #设置密码

grant select on mysql.* to 'lixiang'@'localhost' IDENTIFIED BY '123456';

#将mysql库的所有表的查询的权限付给本地lixiang这个用户,初始密码为123456

2、查看用户权限

show grants;#查看当前用户的权限
show grants for 'lixiang'@'localhost';#查看本地用户lixiang的权限
show grants for 'lixiang'@'192.168.10.4';#查看远程用户lixiang的权限
#注意:执行完成记得flush privileges;刷新一下

3、撤销用户权限

revoke select on mysql.* from 'lixiang'@'localhost';
#删除lixiang用户对mysql下的所有表的查询权限,注意:撤销完记得flush privileges;刷新一下
2.4.其他的常用的命令

1、用于显示广泛的服务器状态信息

show status;

2、显示服务器错误或警告信息

show errors;
show warnings;

3、显示当前连接用户

select user();

4、显示当前时间

select now();

5、显示当前数据库

select database();

6、显示服务器状态

status;

3.MySQL索引

3.1.数据库索引概述

1、数据库索引

  • 在数据库中,索引使数据库程序无需对整个表进行扫描,就可以在其中找到对应的数据。
  • 数据库的索引是某个表中一列或者若干列值的集合,以及物理标识这些值的数据页的逻辑指针清单。

2、索引的作用

  • 设置了合适的索引之后,数据库利用各种快速的定位技术,能够大大加快查询速率,特别是当表很大时,或者查询涉及到多个表时,使用索引可使查询加快成千倍。
  • 可以降低数据库的 IO成本,并且索引还可以降低数据库的排序成本。
  • 通过创建唯一性索引保证数据表数据的唯一性,可以加快表与表之间的连接。
  • 在使用分组和排序时,可大大减少分组和排序时间。

3、索引的分类

(1)普通索引

  • 这是最基本的索引类型,而且没有唯一性之类的限制。

(2)唯一性索引

  • 与普通索引基本相同,区别在于:索引列的所有值都只能出现一次,即必须唯一,但可为空。

(3)主键

  • 是一种特殊的唯一索引,必须指定为“PRIMARY KEY”,具有唯一性的同时不能为空。

(4)全文索引

  • MySQL从 3.23.23版开始支持全文索引和全文检索。在 MySQL中,全文索引的类型为FULLTEXT,全文索引可以在 VARCHAR或者 TEXT类型的列上创建。贴吧的文本内容,和一些小型的网站网页内容,存放在数据库中即为全文索引模式。

(5)单列索引与多列索引

  • 索引可以是单列上创建的索引,也可以是多列上创建的索引。

4、索引高性能保证

  • 把查询过程中的随机事件变成顺序事件
  • 数据保存在磁盘上,为了提高性能,每次又可以把部分的数据读到内存中来计算,访问磁盘的成本大概是访问内存的十万倍左右
  • 磁盘IO与预读
    • 考虑到磁盘IO是非常高昂的操作,计算机操作系统做了一些优化,当一次IO时,不光把当前磁盘地址的数据读到内存缓冲区,而是把相邻的数据也读到内存缓冲区内,因为局部预读性原理,当计算机访问一个地址的数据的时候,与其它相邻的数据也会很快被访问到。每一次IO读取的数据我们称为一页(page)。具体一页有多大数据跟操作系统有关系,一般是4K或者8K。
3.2.常见的检索方案
  • 顺序检索:最基本的查询算法-复杂度O (n),大数据量此算法效率糟糕。
  • 二叉树查找(binary tree search):O(log2n),单层节点所能存储数据量较少,需要遍历多

你可能感兴趣的:(数据库,mysql,后端)