1、MySQL 知识点
- Mysql 关闭服务
systemctl stop mysql.service#或者 执行下边命令 这要看系统了 service mysql stop
- Mysql 开机自启动
#开机自启动 chkconfig mysql on #查看自启动列表 chkconfig --list |grep mysql#输出结果Note: This output shows SysV services only and does not include native systemd services. SysV configuration data might be overridden by native systemd configuration. If you want to list systemd services use 'systemctl list-unit-files'. To see services enabled on particular target use 'systemctl list-dependencies [target]'.mysql 0:off 1:off 2:on 3:on 4:on 5:on 6:off#我们只需要关注最后一行#这里我们可以看出来 0 1 6 的情况下mysql不会自启动 而 2 3 4 5 的情况下 mysql会自启动 #什么事0 1 2 3 4 5 6 ? https://www.jianshu.com/p/354102183a93 0 - 系统停机halt(千万不能把initdefault 设置为0 ) 1 - 单用户模式 (rescue mode)2 - 多用户,没有 NFS 支持 3 - 完全多用户模式(标准的运行级)4 - 没有用到 5 - 图形界面模式,X11 (xwindow)6 - 系统重启reboot(千万不要把initdefault 设置为6 )#说实话不是很懂 大概意思就是说 机器正常启动的情况下才会起作用 #开机自启动 还可以这样查看 执行以下命令 如果没有这个命令 先安装 yum install ntsysv ntsysv #可以查看 如果是自启动 服务前边会有一个* 下图所示
- Mysql 数据存储位置
–datadir 参数 (配置文件可以指定)
当创建一个新库的时候 就会在这个文件夹下有一个对应的文件 比如 我们创建一个 test001
查看datadir位置
ls /var/lib/mysql
小了解:
- 小问题
发现修改了root密码之后 再登录 还是不用密码 而且用root+密码 登录成功不了 但是客户端是没问题的
而且还报错:
ERROR 1044 (42000): Access denied for user ‘’@‘localhost’ to database ‘mysql’
原来是空用户导致的 参考:https://blog.csdn.net/jt_121217/article/details/78247265
service mysql stop 或者 systemctl stop mysql mysqld_safe --skip-grant-table ##然后再打开一个窗口 [root@localhost] mysql #登录mysql> use mysql;mysql> delete from user where USER='';mysql>flush privileges;### 这一步很重要的 呀呼嘿 mysql> exit;
重启 问题不现
- 创建 database 创建table 新增数据
#登录mysql -uroot -p123456 mysql> create database db1; #创建数据库mysql> use db1; #切换到db1mysql>show tables; #展示db1下边的所有表mysql>create table test01(id int not null,name varchar(20)); #创建表mysql>select * from test01; #查看表内容 mysql>vinsert into test01 values(1,'sd'); #新增数据mysql>select * from test01; #再次查看表内容 数据已经有了 mysql>insert into test01 values(1,'大幅度发'); #插入中文报错错误信息如下: ERROR 1366 (HY000): Incorrect string value: '\xE5\xA4\xA7\xE5\xB9\x85...' for column 'name' at row 1 解决方案:字符集问题 #查看字符集 结果看下图 show variables like 'character%';#结果 发现 character_set_database latin1 # character_set_server latin1# 需要修改为utf8 #修改字符集 在配置文件中加上 /etc/my.cnf default-character-set=utf8 #这个要加载[client] 后边 character_set_database=utf8 character_set_server=utf8 collation-server=utf8_general_ci
查看字符集
修改字符集:
小技巧:
vim的时候 按esc 出现: 之后再输入 set nu 就会展示文件的行号
vim当前光标下一行输入 按o
- 重启mysql 然后测试中文
#登录mysql -uroot -p123456 mysql> use db1; #切换到db1mysql>insert into test01 values(1,'大幅度发'); #插入中文报错 为什么呢 不是改了吗? ## 因为呀 我们是在修改编码之前 创建的库 所以呀 这个库的编码 没有修改过来 我们如果重新创建database 然后创建表 插入数据是没有问题的 ##那如果之前创建了 怎么办呢? 手动修改一下吧#查询编码 mysql>SHOW VARIABLES LIKE 'character_set_%';#结果+--------------------------+----------------------------+| Variable_name | Value |+--------------------------+----------------------------+| character_set_client | utf8 || character_set_connection | utf8 || character_set_database | latin1 || character_set_filesystem | binary || character_set_results | utf8 || character_set_server | utf8 || character_set_system | utf8 || character_sets_dir | /usr/share/mysql/charsets/ |+--------------------------+----------------------------+#手动更新 如果有多个属性编码不是utf8 那么就执行多次set 这里现在就一个属性不是utf8了 所以执行一次 mysql>set character_set_database=utf8#还是不行???? 查看表的编码 看到编码集是latin1 show create table test01; +--------+---------------------------------------------------------------------------------------------------------------------------+| Table | Create Table |+--------+---------------------------------------------------------------------------------------------------------------------------+| test01 | CREATE TABLE `test01` ( `id` int(11) NOT NULL, `name` varchar(20) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=latin1 |+--------+---------------------------------------------------------------------------------------------------------------------------+#修改表的编码alter table test01 character set utf8;#插入中文 还是报错???? 修改字段编码 alter table test01 change name name varchar(20) character set utf8 ;#再插入中文 成功了
2、MySQL 配置文件部分
二进制日志log-bin 主从复制
错误日志 log-error 默认关闭的,记录严重的警告和错误信息,每次启动和关闭的详细信息
查询日志log 默认关闭 记录查询的sql语句 如果开启会降低mysql的整体性能 因为记录日志也需要消耗系统资源 (可以用来只记录慢查询sql )
数据文件 windows 例如:D:\soft\mysql-5.7.17-winx64\data
linux 例如:/var/lib/mysqlfrm文件:存储的是表结构
MYD:存放的是数据
MYI :存放的是查找这些数据的索引
3、MySQL 逻辑架构简介
参考:https://www.cnblogs.com/andy6/p/5789254.html
MySQL 整体逻辑架构
第一层(连接/线程处理)连接层 ,这一层所包含的服务并不是MySQL所独有的技术。它们都是服务于C/S程序或者是这些程序所需要的 :连接处理,身份验证,安全性等等。
第二层值得关注(查询缓存、分析器、优化器 ) 服务层 。这一层是MySQL的核心部分。通常叫做 SQL Layer。在 MySQL数据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断, sql解析,执行计划优化, 查询缓存 的处理以及所有内置的函数(如日期,时间,数学运算,加密)等等。各个存储引擎提供的功能都集中在这一层,如存储过程,触发器,视 图等。
第三层(存储引擎) 引擎层 。通常叫做StorEngine Layer ,也就是底层数据存取操作实现部分,由多种存储引擎共同组成。它们负责存储和获取所有存储在MySQL中的数据。就像Linux众多的文件系统 一样。每个存储引擎都有自己的优点和缺陷。服务器是通过存储引擎API来与它们交互的。这个接口隐藏 了各个存储引擎不同的地方。对于查询层尽可能的透明。这个API包含了很多底层的操作。如开始一个事 物,或者取出有特定主键的行。存储引擎不能解析SQL,互相之间也不能通信。仅仅是简单的响应服务器 的请求。
第四层 存储层
数据最终存储的地方
MySQL逻辑模块组成
虽然从上图1看起来 MySQL 架构非常的简单,就是简单的两部分而已,但实际上每一层 中都含有各自的很多小模块,尤其是第二层 SQL Layer ,结构相当复杂的。下面我们就分别 针对 SQL Layer 和 Storage Engine Layer 做一个简单的分析。我们看下图体系结构:
1. Connectors
指的是不同语言中与SQL的交互
2. Management Serveices & Utilities:
系统管理和控制工具
3. Connection Pool: 连接池
管理缓冲用户连接,线程处理等需要缓存的需求 c3p0 druid 等 技术就是与它打交道。 负责监听对 MySQL Server 的各种请求,接收连接请求,转发所有连接请求到线程管理模块。 每一个连接上 MySQL Server 的客户端请求都会被分配(或创建)一个连接线程为其单独服务。而连接线程的主要工作就是负责 MySQL Server 与客户端的通信, 接受客户端的命令请求,传递 Server 端的结果信息等。线程管理模块则负责管理维护这些连接线程。包括线程的创建,线程的 cache 等
4. SQL Interface: SQL接口。
接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface
5. Parser: 解析器。
SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本。 在 MySQL中我们习惯将所有 Client 端发送给 Server 端的命令都称为 query , 在 MySQL Server 里面,连接线程接收到客户端的一个 Query 后,会直接将该 query 传递给专门负责将各种 Query 进行分类然后转发给各个对应的处理模块。 #主要功能: a . 将SQL语句进行语义和语法的分析,分解成数据结构,然后按照不同的操作类型进行分类, 然后做出针对性的转发到后续步骤,以后SQL语句的传递和处理就是基于这个结构的。 b. 如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的
6. Optimizer: 查询优化器。
SQL语句在查询之前会使用查询优化器对查询进行优化。就是优化客户端请求的 query(sql语句) , 根据客户端请求的 query 语句,和数据库中的一些统计信息,在一系列算法的基础上进行分析,得出一个最优的策略,告诉后面的程序如何取得这个 query 语句的结果 他使用的是“选取-投影-联接”策略进行查询。 用一个例子就可以理解: select uid,name from user where gender = 1; 这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行gender过滤 这个select查询先根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤 将这两个查询条件联接起来生成最终查询结果 ####这里是mysql 优化成自己以为最优的执行顺序记性执行 但不一定是DBA认为的最优的sql 所以DBA可以强制指定按照自己指定的顺序进行执行(这个我还不知道怎么做) ####在自己索引为什么没有被使用到或者没有起作用 的时候 可能就是这层搞的鬼
7. Cache和Buffer: 查询缓存。
他的主要功能是将客户端提交 给MySQL 的 Select 类 query 请求的返回结果集 cache 到内存中,与该 query 的一个 hash 值 做 一个对应。 该 Query 所取数据的基表发生任何数据的变化之后, MySQL 会自动使该 query 的Cache 失效。 在读写比例非常高的应用系统中, Query Cache 对性能的提高是非常显著的。当然它对内存的消耗也是非常大的。 如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。 这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等
8. 存储引擎接口
存储引擎接口模块可以说是 MySQL 数据库中最有特色的一点了。 !!!目前各种数据库产品中,基本上只有 MySQL 可以实现其底层数据存储引擎的插件式管理。 模块实际上只是 一个抽象类,但正是因为它成功地将各种数据处理高度抽象化,才成就了今天 MySQL 可插拔存储引擎的特色。 从图2还可以看出,MySQL区别于其他数据库的最重要的特点就是其插件式的表存储引擎。 MySQL插件式的存储引擎架构提供了一系列标准的管理和服务支持, 这些标准与存储引擎本身无关,可能是每个数据库系统本身都必需的,如SQL分析器和优化器等, 而存储引擎是底层物理结构的实现,每个存储引擎开发者都可以按照自己的意愿来进行开发。 ### 注意:存储引擎是基于表的,而不是数据库。
9.File System
数据最终落脚点 是文件系统 这就是关系型数据库 最后是需要存储在硬盘上的
4、Mysql存储引擎
- 查看命令
mysql > show variables like '%storage_engine%' +----------------------------+--------+| Variable_name | Value |+----------------------------+--------+| default_storage_engine | InnoDB || default_tmp_storage_engine | InnoDB || storage_engine | InnoDB |+----------------------------+--------+ 翻译: default_storage_engine 默认存储引擎 storage_engine 存储引擎(当前) default_tmp_storage_engine 默认临时存储引擎 或者 mysql > show engines;+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+| Engine | Support | Comment | Transactions | XA | Savepoints |+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL || MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO || MyISAM | YES | MyISAM storage engine | NO | NO | NO || BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO || CSV | YES | CSV storage engine | NO | NO | NO || MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO || ARCHIVE | YES | Archive storage engine | NO | NO | NO || PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO || InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ 翻译: Supports transactions, row-level locking, and foreign keys 支持事物, 行锁 ,外键 Support 支持程度 comment 说明 Transactions 事物 XA 分布式事务 Savepoints 保存点
MyyISAM:
对比项 | MyISAM | InnoDB |
---|---|---|
主外键 | 不支持 | 支持 |
事物 | 不支持 | 支持 |
行表锁 | 表锁 操作一行记录 也会锁表 不适合高并发 | 行锁,操作时只锁某一行,适合高并发 |
缓存 | 只缓存索引 不缓存真实数据 | 不进缓存索引 还缓存真实数据,对内存要求高 内存大小对性能有决定性影响 |
表空间 | 小 | 大 |
关注点 | 性能 | 事物 |
默认安装 | Y | Y |