第一章 MySQL简介及安装
1、官方定义的MySQL DBA工作内容
(1)运维DBA
初级:各版本、各平台安装搭建、升级
中级:体系结构原理、基础管理(启动关闭、初始化配置文件管理、多实例管理、用户权限管理、基本SQL(增删改查))、
日志管理、备份与恢复、主从复制(构建、状态监控)
高级:高可用(MGR、InnoDB Cluster)、高性能(优化)
(2)开发DBA
懂至少一门开发语言 :JAVA、Python
基本SQL语句深入学习(增删改查)、数据库结构设计(建模)
高级SQL:存储过程、函数、触发器、视图、事件
2、mysql数据库知识框架
(1)MySQL 5.7 安装部署(二进制)*****
编译自己扩展
(2)MySQL升级步骤扩展 ***
(3)MySQL5.7 体系结构原理 *****
(4)MySQL基础管理 *****
(5)基础SQL语句使用 *****
(6)SQL高级应用 ***
(7)Information_schema获取元数据 ***
(8)索引、执行计划管理(基础优化)*****
(9)存储引擎 *****
(10)日志管理 *****
(11)备份与恢复 ******
(12)主从复制及架构演变 ******
(13)传统的高可用及读写分离(MHA&Atlas)****
(14)传统分布式架构设计与实现-扩展(Mycat--->DBLE,DRDS)**
(15)MySQL 5.7 高可用及分布式架构-扩展(MGR,InnoDB Cluster)***
(16)MySQL优化(安全、性能) ****
(17)MySQL 监控(zabbix、Open-falcon) ****
(18) RDS(阿里云课程) *****
额外要会的:
Redis
mongodb
了解:
PG
Oracle
3、DBA职业素养
3.1、人品
责任-----权利
3.2
3.2.1、严谨
磁带库----->备份软件-----17楼
数据库修改\删除类的命令时 再三考虑,而且要有理论或者实践的支撑
3.2.2 请收起你的好奇心!!!!!
注意规范:
脱库? 华住网(ip root 密码),“脱敏”!!!!!。
学会保护自己!!!
3.3、细心
把最简单的事情做的最漂亮,最专业。
不要怕成功的门很拥挤,因为很多人在半路就已经放弃了.
----oldguo
3.4、心态
别惹事,出事别怕事
3.5、熟悉操作系统(精通)
3.6、熟悉公司业务
业务?
产品的功能
用户的行为(热功能,热数据)
3.7、熟悉行业
熟悉行业发展趋势
版本
数据库产品类型
https://db-engines.com/en/ranking
3.8、喜欢数据库
体验很重要
4.数据库产品
4.1 什么是数据?
数据:文字、图片、视频。。。人类认知的数据表现方式
计算机:二进制、16进制的机器语言
基于数据的重要性和复杂性的不同,我们可能有不同的管理方式。
哪些数据是适合存储到数据库的呢?
重要性比较高的
关系较复杂的数据
4.2 什么是数据库管理系统(DBMS)?
RDBMS: 关系型数据库管理系统
比较适合于,安全级别要求高的数据以及关系较复杂的数据
NoSQL:非关系型数据库管理系统
适合于高性能存取数据,一般是配合RDBMS进行使用的
针对大数据处理分析,分布式架构更加擅长
4.3 数据库管理系统种类
RDBMS :
MySQL 、Oracle、MSSQL(SQL Server)、PG
NoSQL:Not Only SQL
键-值(key-value):Redis, ES
文档(document):Mongodb
NEWSQL( 分布式 ): TiDB , Spanner , AliSQL , OB , PolarDB
4.4 MYSQL 企业版本GA选择
5.6 : 5.6.34 、5.6.36 、5.6.38(2017913) 、5.6.40
5.7 : 5.7.18 、5.7.20 (2017913)、5.7.24 、( 上课版本: 5726 )
8.0 : 8.0.14 、8.0.15 、8.0.16
面试题:你们公司用的什么版本的MYSQL? 你在公司干了几年?
5. MYSQL 5.7.26 二进制安装
1、MYSQL 5.7.26 二进制版本安装
#、目录规范
mkdir -p /server/tools #----> 安装包存放目录
mkdir -p /application #----> 存放mysql软件目录
mkdir -p /data/mysql/data #----> mysql数据路径
-------------------------------------------------------------------------------
#2、解压安装包
tar xf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz
mv mysql-5.7.26-linux-glibc2.12-x86_64 /application/mysql
-------------------------------------------------------------------------------
#3、卸载mariadb
[root@db01 /application]# rpm -qa| grep mariadb
mariadb-libs-5.5.60-1.el7_5.x86_64
[root@db01 /application]# rpm -e --nodeps mariadb-libs
[root@db01 /application]# rpm -qa| grep mariadb
-------------------------------------------------------------------------------
#4、创建mysql用户
[root@db01 /application]# useradd mysql -s /sbin/nologin -M
-------------------------------------------------------------------------------
#5、设置环境变量
[root@db01 ~]# vim /etc/profile
[root@db01 ~]# export PATH=/application/mysql/bin:$PATH
[root@db01 ~]# . /etc/profile
[root@db01 ~]# mysql -V
mysql Ver 14.14 Distrib 5.7.26, for linux-glibc2.12 (x86_64) using EditLine wrapper
------------------------------------------------------------------------------
#6、创建数据路径并授权
1.添加一块新磁盘
[root@db01 ~]# fdisk -l #----> 查看磁盘
磁盘 /dev/sdb:5368 MB, 5368709120 字节,10485760 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
2.格式化磁盘
[root@db01 ~]# mkfs.xfs /dev/sdb
meta-data=/dev/sdb isize=512 agcount=4, agsize=327680 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=1310720, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
3.永久挂载磁盘
[root@db01 ~]# blkid
/dev/sdb: UUID="4eb4d119-fb74-4c05-a6cf-d11acfa556ef" TYPE="xfs"
[root@db01 ~]# vim /etc/fstab
UUID="4eb4d119-fb74-4c05-a6cf-d11acfa556ef" /data xfs defaults 0 0
[root@db01 ~]# mount -a
[root@db01 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sdb 5.0G 33M 5.0G 1% /data
------------------------------------------------------------------------------
#7、更改目录的用户组
[root@db01 ~]# chown -R mysql.mysql /application
[root@db01 ~]# chown -R mysql.mysql /data
------------------------------------------------------------------------------
#8、下载安装依赖包
[root@db01 /application/mysql]# yum install libaio-devel -y
------------------------------------------------------------------------------
#9、初始化数据库
[root@db01 /data/mysql/data]# mysqld --initialize-insecure --user=mysql --basedir=/application/mysql --datadir=/data/mysql/data
2019-06-13T04:28:06.825389Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2019-06-13T04:28:06.964841Z 0 [Warning] InnoDB: New log files created, LSN=45790
2019-06-13T04:28:07.001796Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2019-06-13T04:28:07.157424Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: a487a8e4-8d93-11e9-86a6-000c29848d8f.
2019-06-13T04:28:07.162657Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2019-06-13T04:28:07.165163Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
------------------------------------------------------------------------------
#10、配置mysql配置文件
cat >/etc/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/application/mysql
datadir=/data/mysql/data
socket=/tmp/mysql.sock
server_id=6
port=3306
[mysql]
socket=/tmp/mysql.sock
EOF
------------------------------------------------------------------------------
#11、启动mysql服务
1、
[root@db01 /data/mysql/data]# cd /application/mysql/support-files/
[root@db01 /application/mysql/support-files]# ./mysql.server start
Starting MySQL. SUCCESS!
[root@db01 /application/mysql/support-files]# ./mysql.server restart
Shutting down MySQL.. SUCCESS!
Starting MySQL. SUCCESS!
[root@db01 /application/mysql/support-files]# ./mysql.server status
SUCCESS! MySQL running (9641)
[root@db01 /application/mysql/support-files]# ./mysql.server restart
Shutting down MySQL.. SUCCESS!
Starting MySQL. SUCCESS!
[root@db01 /application/mysql/support-files]# ./mysql.server status
SUCCESS! MySQL running (9932)
[root@db01 /application/mysql/support-files]# ./mysql.server stop
Shutting down MySQL.. SUCCESS!
2、sys-v 管理
[root@db01 /application/mysql/support-files]# cp /application/mysql/support-files/mysql.server /etc/init.d/mysqld
[root@db01 /application/mysql/support-files]# service mysqld start
Starting MySQL. SUCCESS!
[root@db01 /application/mysql/support-files]# /etc/init.d/mysqld restart
3、systemd 管理
cat >/etc/systemd/system/mysqld.service <<EOF
[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=/application/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000
EOF
5.2如何分析处理MySQL数据库无法启动
#1、without updating PID 类似错误
查看日志:
在哪?
/data/mysql/data/主机名.err
[ERROR] 上下文
可能情况:
/etc/my.cnf 路径不对等
/tmp/mysql.sock文件修改过 或 删除过
数据库目录权限不是mysql
参数改错了
5.3创建数据库密码以及更改密码
mysqladmin -u root password '123456' #----->创建密码
mysqladmin -uroot -p123456 password 123 #---->更改密码
5.4管理员用户忘记密码
#1、关闭数据库
[root@db01 /data/mysql/data]# systemctl stop mysqld.service
#2、启动数据库到维护模式
[root@db01 ~]# mysqld_safe --skip-grant-tables --skip-networking &
#3、登陆并修改密码
mysql> alter user root@'localhost' identified by '1';
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement
mysql> flush privileges;
mysql> alter user root@'localhost' identified by '1';
Query OK, 0 rows affected (0.01 sec)
#4、关闭数据库,正常启动验证
mysql -uroot -p1
第二章MySQL体系结构与管理
1、MySQL C/S结构介绍 ***
两种连接方式:
TCP/IP :mysql -u -p123456 -h 10.0.0.51 -p3306
Socket : mysql -u -p123456 -S /tmp/mysql.sock
2、MySQL实例的构成 ***
公司: 老板 + 经理 + 员工 + 办公区
实例: mysqld + master thread +干活的Thread + 预分配的内存
3、MySQL中mysqld服务器进程结构
#1.连接层
(1)提供连接协议
Socket TCP/IP
(2)验证用户名(root@localhost) 密码合法性,进行匹配专门的授权表
(3)派生一个专用连接进程(接收SQL,返回结果)
通过以下语句可以查看连接线程的基本情况。
mysql> show processlist;
思考:
忘记密码的参数在哪里做的手脚?
--skip-grant-tables #---> 跳过授权
--skip-networking #---> 直接跳过TCP/IP 协议 本地连接
#2.SQL层 (优化方面至关重要的)
(1)验证SQL语法和SQL_MODE
(2)验证含义
DDL :数据定义语言
DCL :数据控制语言
DML :数据操作语言
DQL: 数据查询语言
...
(3)验证权限
(4)解析器进行语句解析,生成执行计划(解析树)
(5)优化器(各种算法,基于执行代价),根据算法,找到代价最低的执行计划。
代价: CPU IO MEM
(6)执行器按照优化器选择执行计划,执行SQL语句,得出获取数据得方法。
(7)提供query cache (默认不开),一般不开,会用redis
(8)记录操作日志(binlog),默认没开
#3. 储存引擎层
真正和磁盘打交道得一个层次
根据SQL层提供的取数据的方法,拿到数据,返回给SQL,结构化成表,再又连接层线程返回给用户。