第一章:数据库的介绍
1.1数据库概述
1.1.1 什么是数据库
存储数据的仓库其本质是一个文件系统,数据库按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询等操作
1.1.2 数据的存储方式
1) 数据保存在内存,例如:数组,集合;new出来的对象存储在堆中,堆是内存中的一个小块空间,优点:内存速度快,缺点是:断电/退出程序的时候,数据就清除了,内存价格贵
2)数据保存在普通文件,优点:永久保存,缺点:查找,增加,修改,删除数据比较麻烦,效率低
3)数据保存在数据库 优点:永久保存,通过SQL语句比较方便的操作数据库
1.2数据库的优点
数据库是按照特定的格式将数据存储在文件中,通过SQL语句可以方便的对大量数据进行增删改查操作,数据库是对大量的信息进行管理的高效的解决方案。
1.3数据库管理系统
数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立,使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统的高效的解决方案
RDBMS(关系型数据库):Oracle,MySQL,PG,MSSQL
NoSQL:MongoDB,Redis,ES
NEWSQL(分布式):TiDB,Spanner,AliSQL ,OB,PolarDB
1.2MySQL企业版本GA(稳定版)选择
5.6:5.6.34 5.6.36 5.6.38(2017年9月13) 5.6.40
5.7:5.7.18 5.7.20(2017年9月13) 5.7.24
(所用版本5.7.26简称5726)
8.0: 8011(8011是8.0版本第一个,时间:2018年)8014 8015 8016
版本选择建议要上新环境
1)一般选择官方主流版本:5.6 5.7
2)GA
3)6-12月的产品版本
第二章:二进制安装MySQL
第一步:解压软件
tar xf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz
mkdir /application
mv mysql-5.7.26-linux-glibc2.12-x86_64 /application/mysql
第二步:用户的创建,环境原始处理
rpm -qa|grep mariadb#这个为系统自带,需要移除,否则会 出问题
yum remove -y mariadb-libs-5.5.60-1.el7_5.x86_64
也可以通过:rpm -e --nodeps mariadb-libs(卸载忽略依赖)
useradd -s /sbin/nologin mysql
第三步:设置环境变量
vim /etc/profile
export PATH=/application/mysql/bin:$PATH
source /etc/profile
第四步:创建数据路径并授权
1.添加一块新硬盘:
2.格式化后并挂载
fdisk -l
mkfs.xfs /dev/sdb
mkdir /data
blkid(查询磁盘UUID)
vim etc/fstab
mount -a (全部挂载)
df -h
3.授权
chown -R mysql.mysql /application/mysql
chown -R mysql.mysql /data
第五步:初始化数据(创建系统数据)
5.6 版本 初始化命令 /application/mysql/scripts/mysql_install_db
mkdir -p /data/mysql/data
chown -R mysql.mysql /data
yum install -y libaio-devel
也可以通过rpm -e --nodeps mariadb-libs(卸载忽略依赖)--nodeps忽略依赖
mysqld --initialize --user=mysql --basedir=/application/mysql --datadir=/data/mysql/data
通过--initialize初始化后会生成一个随机密码,也就是初始密码,可以加
mysqld --initialize-insecure --user=mysql --basedir=/application/mysql --datadir=/data/mysql/data
初始化不会生成默认密码
--initialize参数
1.对于密码复杂度进行定制:12位,4种
2.密码过期时间:180天
3.给root@localhost用户设置临时密码
第六步:配置文件准备
cat >/etc/my.cnf <
第七步:启动数据库
方式1.sys-v
service sshd restart
service这种启动方式就是我们说的sys-v方式,存放路径是在/etc/init.d,将启动脚本放到这里就行
[root@db01 /etc/init.d]# cp /application/mysql/support-files/mysql.server /etc/init.d/mysqld
service mysqld restart
也可以用/etc/init.d/mysqld restart 启动重启
方式2.systemd
cat >/etc/systemd/system/mysqld.service <
1.错误分析
without undating PID 类似错误
查看日志:
在哪?/data/mysql/data/主机名.err
cat /data/mysql/data/db01.err
看[ERROR] 上下文
可能情况:
1)/etc/my.cnf 路径不对等
2) /tmp/mysql.sock 修改过该文件或该文件不存在
3)权限问题
2.管理员密码的设定(root@localhost)
[root@hosue /data/mysql/data]# mysqladmin -uroot password oldboy123
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.
也可以-p password进行交互,手动输入旧密码
管理员密码忘记修改方式
1)先关闭数据库
2)启动数据库到维护模式
[root@db01 ~]# mysqld_safe --skip-grant-tables --skip-networking & (跳过授权表启动MySQL)
3)登录并修改密码
mysql> alter user root@'localhost' identified by '123456';
直接执行这个命令会报错,如下文
mysql> alter user root@'localhost' identified by '123456';
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的体系结构与管理
3.1MySQL的C/S结构介绍
strings可以读二进制文件部分内容
TCP/IP方式(远程、本地):
mysql -uroot -poldboy123 -h 10.0.0.51 -P3306
Socket方式(仅本地):
mysql -uroot -poldboy123 -S /tmp/mysql.sock
3.2MySQL实例的构成****深入学
实例由:mysqld + master thread + worker thread + 预分配内存
3.3MySQL中mysqld服务器进程结构
3.3.1 SQL语句引入
结构化查询语言
操作和管理数据库的专用语言
DQL:
mysql> select user,host from mysql.user;
DDL:
DML:
DCL:
mysql> select user,host from mysql.user;
3.3.2 连接层
(1) 提供链接协议
Socket
TCPIP
(2)验证用户名(root@localhost)和密码合法性,进行匹配专门的授权表。
(3) 派生一个专用连接线程(接收SQL语句,返回结果)
mysql> show processlist;
+----+------+-----------+------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+------+---------+------+----------+------------------+
| 7 | root | localhost | NULL | Query | 0 | starting | show processlist |
+----+------+-----------+------+---------+------+----------+------------------+
1 row in set (0.01 sec)
mysql>
查看连接线程
改密码的参数在哪做的手脚?
--skip-grant-tables 在连接层的授权表,这里跳过授权表
--skip-networking 排除远程连接,仅允许本地Socket连接
3.3.3 SQL层(优化方面至关重要)
(1)验证SQL语法和SQL_MODE
(2)验证语义
(3)验证权限
(4)解析器进行语句解析,生成执行计划(解析树)
(5)优化器(各种算法,基于执行代价),根据算法,找到代价最低的执行计划。
代价:CPU IO MEM的消耗
(6)执行器安装优化器选择的最优执行计划,执行SQL语句。
**(7)提供query cache (查询缓存,默认不开),一般不开,用redis来代替
(8)记录操作日志(binlog)只记录增删改,查询类的不会记录,默认不开。
未完待续...
3.3.4 存储引擎层
真正和磁盘打交道的一个层次
根据SQL层提供的取数据的方法,拿到数据,返回给SQL,结构化成表, 再由连接层线程返回给用户。