服务端持久化层MySQL零基础入门实战"/>
【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安装包下的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、修改myf配置文件
vi /etc/myf
[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
(2)关闭selinux
vi /etc/selinux/config --->将SELINUX=disabled
(3)安装wget命令
yum -y install wget
(4)下载阿里云docker社区版yum源
cd /etc/yum.repos.d/ 进入到yum源的路径wget .repo
(5)下载网络源安装contain-SElinux包
wget -O /etc/yum.repos.d/CentOS-Base.repo .repo
yum clean allyum -y update #这一块时间有点长,耐心等待
- 注意:一定要有这一步,否则会报找不到selinux包
(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": [""]
}
- 重启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
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 ~]# mysqlmysql> 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/dockerf
(3)退出容器,重启容器
1.exit2.docker restart mysql
(4)再次进入容器
docker exec -it mysql bash
(5)登录mysql(无需密码)
mysql -uroot
(6)更新权限,修改密码,退出,替换掉刚才加的跳过权限表的加载参数
1.flush privileges;2.alter user 'root'@'localhost' identified by '123456';
(或者:update user set password=password('123456') where user ='root')3.exit4.sed -i "s/skip-grant-tables/ /" /etc/mysql/conf.d/dockerf
(7)退出容器,重启容器
1.exit2.docker restart mysql
1.4.MySQL支持简体中文
1、临时开启mysql支持简体中文
2、永久开启mysql支持简体中文
(1)源码mysql服务
- 修改/etc/myf配置文件
vi /etc/myf加如下内容:
[client]
default-character-set=utf8[mysql]
default-character-set=utf8
(2)容器mysql服务
- 进入容器内部,修改配置文件
1.docker exec -it mysql(容器名) bash2.vim /etc/mysql/conf.d/dockerf加如下内容:
[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;
查看数据库中的数据表信息:
use 数据库名; #使用数据库
show tables; #查看当前库下的所有表
显示数据表的结构:
describe 数据库.表名
describe mysql.user; (或者desc user)
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】服务端持久化层MySQL零基础入门实战
发布评论