20210129 1. MySQL 基础 - 拉勾教育
MySQL 基础
安装 MySQL
-
准备 rpm 包,上传到 Linux 并解压
# Linux 之间远程复制文件 scp root@192.168.181.131:/root/mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar /root/mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar mkdir /root/mysqlinstall tar -xvf /root/mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar -C /root/mysqlinstall
-
删除 CentOS 7 自带的 MariaDB
# 查找 rpm -qa | grep mariadb # 删除 rpm -e mariadb-libs-5.5.56-2.el7.x86_64 --nodeps
-
分模块安装 MySQL
- common
- libs
- lib-compact
- client
- server
- devel
# 安装 rpm -ivh /root/mysqlinstall/mysql-community-common-5.7.28-1.el7.x86_64.rpm rpm -ivh /root/mysqlinstall/mysql-community-libs-5.7.28-1.el7.x86_64.rpm rpm -ivh /root/mysqlinstall/mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm rpm -ivh /root/mysqlinstall/mysql-community-client-5.7.28-1.el7.x86_64.rpm rpm -ivh /root/mysqlinstall/mysql-community-server-5.7.28-1.el7.x86_64.rpm rpm -ivh /root/mysqlinstall/mysql-community-devel-5.7.28-1.el7.x86_64.rpm # 卸载 rpm -ev --nodeps mysql-community-client-5.7.28-1.el7.x86_64 rpm -ev --nodeps mysql-community-common-5.7.28-1.el7.x86_64 rpm -ev --nodeps mysql-community-libs-5.7.28-1.el7.x86_64 rpm -ev --nodeps mysql-community-devel-5.7.28-1.el7.x86_64 rpm -ev --nodeps mysql-community-libs-compat-5.7.28-1.el7.x86_64 rpm -ev --nodeps mysql-community-server-5.7.28-1.el7.x86_64 ## 删除相关文件、目录 rm -f /etc/my.cnf rm -f /var/log/mysqld.log find / -name mysql rm -rf /etc/selinux/targeted/active/modules/100/mysql rm -rf /etc/selinux/targeted/tmp/modules/100/mysql rm -rf /var/lib/mysql rm -rf /var/lib/mysql/mysql rm -rf /usr/lib64/mysql rm -rf /usr/share/mysql
-
设置开机启动
systemctl enable mysqld systemctl daemon-reload
-
初始化 MySQL
mysqld --initialize --user=mysql
# 解决报错,原因是已存在 data 文件夹,如果是新库,直接删除之后再重新初始化 [root@localhost ~]# mysqld --initialize --user=mysql 2021-01-25T01:36:03.126200Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details). 2021-01-25T01:36:03.130345Z 0 [ERROR] --initialize specified but the data directory has files in it. Aborting. 2021-01-25T01:36:03.130376Z 0 [ERROR] Aborting
-
查看初始密码
cat /var/log/mysqld.log |grep 'temporary password'
-
启动 MySQL
# 启动 systemctl start mysqld.service # 查看状态 systemctl status mysqld.service
-
登录并修改 root 密码,密码修改后重新登录
mysql -uroot -p # 输入初始密码 set password=password('123456'); exit mysql -uroot -p # 输入修改后的密码
学前必备基础
- MySQL软件下载和安装(建议版本5.7.28)
- 熟悉MySQL工具和基本SQL操作
- Window : MySQL WorkBench, Navicat, SQLyog,HeidiSQL,MySQL Front
- Linux:MySQL WorkBeanch, Navicat
- IOS:Navicat、Sequel Pro
- DDL、DML、DQL、TCL
- 熟悉主键、外键、非空、唯一等约束
- 创建主键、外键....
- 熟悉索引、事务概念和基本使用
- 概念、创建
课程主要内容
- MySQL架构原理和存储机制
- MySQL体系结构(内存结构、磁盘结构)、SQL运行机制、存储引擎、Undo/Redo Log等等
- MySQL索引存储机制和工作原理
- 索引存储结构、索引查询原理、索引分析和优化、查询优化等
- MySQL事务和锁工作原理
- 事务隔离级别、事务并发处理、锁机制和实战等
- MySQL集群架构及相关原理
- 集群架构设计理念、主从架构、双主架构、分库分表等
- 互联网海量数据处理实战
- ShardingSphere、MyCat中间实战操作,分库分表实战
- MySQL第三方工具实战
- 同步工具、运维工具、监控工具等
MySQL 起源和分支
- 数据库流行度排行参考:DB-Engines 流行度排行
- MySQL 是最流行的关系型数据库软件之一,由于其体积小、速度快、开源免费、简单易用、维护成本低等,在集群架构中易于扩展、高可用,因此深受开发者和企业的欢迎。
MySQL发展历程如下:
时间 | 事件 |
---|---|
1979 | 当时瑞典的 Monty Widenius 在 Tcx DataKonsult 公司工作,他开发了一款名为 Unireg 的工具,它是一个面向报表的存储引擎,利用索引顺序来读取数据,这也是 ISAM 存储引擎算法的前身。 |
1985 | Monty 和 David Axmart 等几个小伙子成立了一家公司( MySQL AB 前身),研发出了 ISAM ( Indexed Sequential Access Method )存储引擎工具。 |
1990 | 客户要求 ISAM 工具能提供 SQL 接口,于是 Monty 找到了 David Hughes ( mSQL 的发明人)商讨合作事宜,后来发现 mSQL 的速度也无法满足需求。于是 Monty 决心自己重写一个 SQL 支持,由此着手 MySQL 设计和研发。 |
1996 | Monty 与 David Axmart 一起协作,开发出 MySQL 第一个版本 1.0 。 |
1996/10 | MySQL 3.1 发布了,没有 2.x 版本。最开始只提供了 Solaris 下的二进制版本。同年 11 月发布了 Linux 版本。 |
1999-2000 | Monty 、 Allan 和 David 三人在瑞典创建了 MySQL AB 公司,并且与 Sleepycat 合作引入了 BDB 引擎, MySQL 从此开始支持事务处理了 |
2000 | MySQL 公布了自已的源代码,并采用 GPL ( GNU General Public License )许可协议正式开源。 |
2000/4 | MySQL 对旧的存储引擎 ISAM 进行了整理,命名为 MyISAM |
2001 | Heikki Tuuri 向 MySQL 建议集成他的 InnoDB 存储引擎,这个引擎同样支持事务处理,还支持行级锁。 MySQL 与 InnoDB 正式结合版本是 4.0 。至此 MySQL 已集成了 MyISAM 和 InnoDB 两大主力引擎。 |
2005/10 | MySQL 5.0 版本发布,这是 MySQL 历史上最有里程碑意义的一个版本,在 5.0 版本加入了游标、存储过程和触发器的支持。 |
2008/1 | 2008 年 1 月 MySQL AB 公司被 Sun 公司以 10 亿美金收购, MySQL 数据库进入 Sun 时代。 |
2009/4 | Oracle 公司以 74 亿美元收购 Sun 公司,自此 MySQL 数据库进入 Oracle 时代,而其第三方的存储引擎 InnoDB 早在 2005 年就被 Oracle 公司收购 |
2010/4 | 发布了 MySQL 5.5 版本。 Oracle 对 MySQL 版本重新进行了划分,分成了社区版和企业版。默认引擎更换为 InnoDB 、增加表分区等。 |
2013/2 | MySQL 5.6 首个正式版 5.6.10 发布。 MySQL 5.6 对 InnoDB 引擎进行了改造,提供全文索引能力,使 InnoDB 适合各种应用场景。 |
2015/10 | MySQL 5.7 首个 GA 正式版 5.7.9 发布。 |
2016/9 | MySQL 8.0 首个开发版发布,增加了数据字典、账号权限角色表、 InnoDB 增强、 JSON 增强等等。 |
2018/4 | MySQL 8.0 首个 GA 正式版 8.0.11 发布 |
- MySQL 从最初的 1.0 、 3.1 到后来的 8.0 ,发生了各种各样的变化。被 Oracle 收购后, MySQL 的版本演化出了多个分支,除了需要付费的 MySQL 企业版本,还有很多 MySQL 社区版本。
- 还有一条分支非常流行的开源分支版本叫 Percona Server ,它是 MySQL 的技术支持公司 Percona 推出的,也是在实际工作中经常碰到的。 Percona Server 在 MySQL 官方版本的基础上做了一些补丁和优化,同时推出了一些工具。
- 另外一个非常不错的版本叫 MariaDB ,它是 MySQL 的公司被 Oracle 收购后, MySQL 的创始人 Monty 先生,按原来的思路重新写的一套新数据库,同时也把 InnoDB 引擎作为主要存储引擎,也算 MySQL 的分支。
MySQL 应用架构演变
-
架构 V1.0 - 单机单库
瓶颈:
- 数据量太大,超出一台服务器承受
- 读写操作量太大,超出一台服务器承受
- 一台服务器挂了,应用也会挂掉(可用性差)
-
架构 V2.0 - 主从架构
V2.0 架构主要解决架构 V1.0 下的高可用和读扩展问题,通过给 Instance 挂载从库解决读取的压力,主库宕机也可以通过主从切换保障高可用。在 MySQL 的场景下就是通过主从结构(双主结构也属于特殊的主从),主库抗写压力,通过从库来分担读压力,对于写少读多的应用, V2.0 主从架构完全能够胜任。
V2.0 瓶颈:
- 数据量太大,超出一台服务器承受
- 写操作太大,超出一台主库服务器承受
-
架构 V3.0 - 分库分表
对于 V1.0 和 V2.0 遇到写入瓶颈和存储瓶颈时,可以通过水平拆分来解决,水平拆分和垂直拆分有较大区别,垂直拆分拆完的结果,每一个实例都是拥有全部数据的,而水平拆分之后,任何实例都只有全量的 1/n 的数据。如上图所示,将 Userinfo 拆分为 3 个 Sharding ,每个 Sharding 持有总量的 1/3 数据, 3 个 Sharding 数据的总和等于一份完整数据。
数据如何路由成为一个关键问题, 一般可以采用范围拆分,List拆分、Hash拆分等。
如何保持数据的一致性也是个难题。
-
架构 V4.0 - 云数据库
云数据库(云计算)现在是各大 IT 公司内部作为节约成本的一个突破口,对于数据存储的 MySQL 来说,如何让其成为一个 saas ( Software as a Service )是关键点。 MySQL 作为一个 saas 服务,服务提供商负责解决可配置性,可扩展性,多用户存储结构设计等这些疑难问题。
杂项
-
MySQL 中 set global 与 set 的区别:set global 是全局的,除了当前链接会话,其他会话会立即生效,而 set 只是会话级别的,当前会话立即生效,别的会话不会有有影响
-
配置文件目录:
/etc/my.cnf
-
data 目录:
/var/lib/mysql
-
mysqldump 命令使用
# 查看帮助手册 mysqldump --help # 备份所有库 mysqldump --all-databases > mysql_all.sql -uroot -p
主从复制操作步骤
开启主从复制
-
主库配置
-
修改 MySQL 配置文件
/etc/my.cnf
[mysqld] # 启用 log_bin log_bin=mysql-bin # 设置 server-id server-id=1 sync-binlog=1 # 指定主从复制时排除的库 binlog-ignore-db=performance_schema binlog-ignore-db=information_schema binlog-ignore-db=sys # 指定主从复制的库 # binlog-do-db=lagou
-
重启 MySQL,应用配置
# 重启 MySQL systemctl restart mysqld
-
主库授权
mysql -uroot -p grant replication slave on *.* to 'root'@'%' identified by '123456'; grant all privileges on *.* to 'root'@'%' identified by '123456'; flush privileges; # 查看主库状态 show master status;
-
-
从库配置
-
确保从库可以访问主库
mysql -h 192.168.181.131 -P 3306 -u root -p
-
修改 MySQL 配置文件
/etc/my.cnf
[mysqld] server-id=2 relay_log=mysql-relay-bin read_only=1 relay_log_purge=0 # 备用主库需设置 log_bin=mysql-bin # 备用主库需设置
-
重启 MySQL,应用配置
# 重启 MySQL systemctl restart mysqld
-
从库授权
grant replication slave on *.* to 'root'@'%' identified by '123456'; grant all privileges on *.* to 'root'@'%' identified by '123456'; flush privileges;
-
从库设置跟随主库
mysql -uroot -p # 查看从库状态,确认结果为空,之前没有进行过配置 show slave status; # master_log_file 和 master_log_pos 从主库状态信息中获取 change master to master_host='192.168.181.131',master_port=3306,master_user='root',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=869; # 开始跟随主库 start slave; # 再次查看从库状态,可以看到状态信息 ## 行形式查看 show slave status; ## 列形式查看 show slave status\G;
-
-
主库从库同步使用
-
主库创建库和表
create database lagou; use lagou; create table lagou_position(id int primary key, name varchar(20), salary varchar(20), city varchar(20)) engine=innodb charset=utf8; create table lagou_position_detail(id int primary key, pid int, description text) engine=innodb charset=utf8; insert into lagou_position values (1, 'p1', 1000, 'sh'); insert into lagou_position values (2, 'p2', 2000, 'bj'); insert into lagou_position_detail values (1, 1, 'd1');
-
从库确认已同步
show databases; use lagou; show tables; select * from lagou_position; select * from lagou_position_detail;
-
取消主从复制
1、slave 流程
# 停止 slave
stop slave;
# 清除 slave 信息
reset slave all;
# 可以通过以下命令查看当前状态
show slave status\G;
之后 slave 可以直接关闭下线。
2、master 流程
清除 master 上主从信息:
reset master;
修改配置重启 MySQL:
如果想彻底清除主从的机制,可以修改配置文件,删除主从相关的配置项,然后重启 MySQL 即可。