MySQL 架构
原文:MySQL 架构
MySQL架构和结构分析
官方架构图:
MySQL DB 各模块架构图如下:
MySQL安装方式
MySQL初始化
简介:什么是事务; 事务: ACID : 事务确保了银行不会弄丢你的钱,而这种特性在应用逻辑设计中是很难实现的,甚至不可实现。一个ACID兼容的数据库服务器,要为事务处理大量的复杂工作确保ACID特性的实现,而这也许是用户未能察觉到的。
事务: ACID :
A :原子性(Atomicity) :一个事务必须被视为一个单独的内部”不可分“的工作单元,以确保整个事务要么全部执行,要么全部回滚。当一个事务具有原子性时,该事务绝对不会被部分执行,要么完全执行,要么根本就不执行。
C:一致性 (consistency): 数据库总是从一种一致性状态转换到另一种一致性状态。只要是最终事务没有被提交,任何事务处理过程中所做的数据改变,也不会影响到数据库的内容。
I:隔离性 (leolation) : 某个事务的结果只有在完成之后才对其它事务可见
D:持久性(durability) : 一旦一个事务提交,事务所做的数据改变是永久的。这意味着数据改变已被记录,即使系统崩溃,数据也不会因此丢失,持久性是个有点模糊的概念,因为实际上持久性也分为很多级别。
隔离: 隔离级别
read uncommitted : 读未提交内容:在read uncommitted 隔离级:所有事务都可以”看到“ 未提交事务的执行结构。(读未提交) 脏读,不可重读,幻读
read committee : 读取提交内容:大多数数据库系统的默认隔离是read
committed(但这不是mysql默认的!)它满足了隔离的早先简单定义:一个事务在开始时,只能“看见”已经提交事务所做的改变,一个事务从开始
到提交前,所做的任何数据改变都是不可见的,除非已经提交。这种隔离级别也支持所谓的”不可重复读“(nonrepeatable
read)。这意味着用户运行同一语句两次,看到的结果是不同的。(读提交) 不可重读,幻读
repeatable read : 可重读 : repeatable read 隔离解决了 read uncommitted
隔离导致的问题,它确保同一事物的多个实例在并发读取数据时,会”看到同样的“数据行。不过理论上,这会导致另一个棘手的问题:幻读(phantom
read).简单来说,幻读指当前用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行是,会发现有新的“幻影”
(phantom)行。(可重读), 幻读
innodb和falcon存储引擎通过多版本并发控制(multiversion concurrency control) 机制解决了幻读问题。
serializable : 可串行化
serializable 是最高级别的隔离级,它通过强制事务排序,使之不可能互相冲突,从而解决幻读问题。简言之 serializable 是在每个读的数据行上加上锁。在这个级别上,可能导致大量的超时(timeout)现象和锁竞争(lock contention) 现象。如果用户的应用为了数据的稳定性,需要强制减少并发的话,可以选择这种隔离级。强制事务的串行执行避免了幻读;建议:对事务要求不特别严格的场景下,可以使用读提交 read committee
ANSI SQL 隔离级别
隔离级别 |
脏读可能性 |
不可重复读可能性 |
幻读可能性 |
加锁读 |
READ UNCOMMITTED |
YES |
YES |
YES |
NO |
READ COMMITTED |
NO |
YES |
YES |
NO |
REPEATABLE READ |
NO |
NO |
YES |
NO |
SERIALZABLE |
NO |
NO |
NO |
YES |
死锁:是指两个事务或多个事务在同一资源上互相占用,并请求加锁时,而导致的恶性循环现象,当多个事务以不同顺序试图加锁同一资源时。就会产生死锁。任何时间,多个事务同时加锁一个资源,一定产生死锁。
MVCC:多版本并发控制
MVCC的实现,是通过保存数据库在某个时间点的快照来实现的,也就是说,不管执行多长时间,每个事务看到的数据都是一致的,根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据可能不一样的,
在MySQL中,每个事务启动时,InnoDB为每个启动的事务提供一个当下时刻的快照
为了实现此功能,InnoDB会为每个表提供两个隐藏的字段,一个用于保存行的创建时间,一个用于保存行的失效时间;
里面存储的是系统版本号:(system version number)
两个隔离级别下有效:read committee 和 repeatable read
简介:什么是事务日志:
事务日志可使事务处理过程更加高效。和每次数据一改变就能更新磁盘中表的数据,存储引擎可以先更新数据在内存中的拷贝。这非常快,然后,存储引擎将数据
改变记录写入事务日志,它位于磁盘上,因此具有持久性,这相对比较快,因为追加日志事件导致的写操作,只涉及了磁盘很小区域上的顺序
I/O(sequential I/O),而替代了写磁盘中所需要的大量随机I/O,(random
I/O).最后,相关进程会在某个时间把表数据更新到磁盘上.因此,大多存储引擎都选用了这种技术,也是通常所说的预写日志(write-athead
logging), 利用两次磁盘写入操作把数据改变写入磁盘。 如果说数据更新已写入事务日志,却还未写入磁盘的表中,而发生系统奔溃,存储引擎将会在重启后恢复相关数据改变,具体的恢复方式因存储引擎而异
事
务日志通常放在有冗余的硬件设备上,事务日志一般分为一组或者三个轮流使用
因为现在市场上流行的都是:机械式硬盘:随机读写;(如果把数据直接写入数据库中,因为数据太多,所所以会导致 硬盘随机读写.
可想而知机械师硬盘随机读写那速度可见有多慢,你们懂得.) 顺序读写:(如果把数据库的事务操作
写入事务日志当中,因为写的只是事务日志,而不是真正的数据,所以硬盘会分配连续的磁盘空间 供事务日志写入,速度可见一般!) 事务日志文件:顺序IO:事务日志,一组两个轮流替换,保存在可冗余的设备中 未提交的事务并且还能够回滚你懂得.
MySQL工作模式及常用命令
交互式模式:mysql>
# 交互式模式下的客户端命令
mysql> help # 获取命令帮助
mysql> \? # 同上
mysql> \c # 取消命令执行
mysql> \g # 发送命令至服务器端
mysql> \G # 发送命令至服务器端,垂直显示结果
mysql> \q # 退出
mysql> \! # 执行系统shell命令
mysql> \s # 显示服务器端状态信息
mysql> \. /path/to/mysql_script.sql # 批量执行sql
mysql> \u # 切换数据库
# 交互式模式下的服务器端命令(需要命令提示符,默认为分号)
mysql> help contents 能够获取帮助的分类信息
mysql> help keyword 获取关键字的帮助信息,如help select
脚本模式:mysql < /path/to/mysql_script.sql
注:常用于主从复制批量导入数据时
连接MySQL
连接类型
本地通信:客户端与服务器端位于同一主机,而且还要基于127.0.0.1(localhost)地址或lo接口进行通信
基于sock文件通信:如mysql -hlocalhost -uroot -p --socket=/tmp/mysql.sock
远程通信:客户端与服务器端位于不同的主机,或在同一主机使用非回环地址通信
基于 TCP socket通信
mysql客户端选项
实例
-u,--user # 指定连接用户
-h,--host # 指定连接主机
-p,--password # 指定连接密码
--protocol={tcp|socket|memory|pipe} # 指定连接协议
-P,--port # 指定连接端口,默认监听端口:tcp/
--socket # 指定本地连接的sock文件
--compress # 数据传输采用压缩格式
-D,--database # 指定连接后默认使用的数据库
-H,--html # 指定产生html输出
-X,--xml # 指定产生xml输出
--safe-updates # 拒绝使用无where子句的update或delete命令
# 使用实例:mysql -hlocalhost -uroot -p
mysql命令提示符
mysql> # 等待输入命令
-> # 等待继续输入
‘> # 等待结束单引号
“> # 等待结束双引号
`> # 等待结束反引号
/*> # 注释,不执行,需以*/结束注释
mysql的快捷键
ctrl+w:# 删除光标之前的单词
ctrl+u:# 删除光标之前至命令行首的所有内容
ctrl+y:# 粘贴所有ctrl+w或ctrl+u删除的内容
ctrl+a:# 移动光标至行首
ctrl+e:# 移动光标至行尾
MySQL管理工具mysqladmin
# 使用格式:mysqladmin [options] command [arg] [,command [arg]] …
# 常用的command包括:
create DB_Name:# 创建数据库
drop DB_Name:# 删除数据库
debug:# 打开调试日志并记录于error log中
status:# 显示简要状态信息
--sleep #:设置间隔时长
--count #:设置显示的批次
extended-status:# 显示扩展信息,输出mysqld的各状态变量及赋值,相当于执行“mysql> show global status”
variables:# 输出mysqld的各服务器变量
flush-hosts:# 清空主机相关的缓存:DNS解析缓存;此前因为连接错误次数过多而被拒绝访问mysqld的主机列表
flush-logs:# 日志滚动,只能滚动二进制日志和中继日志
refresh:# 相当于同时使用flush-hosts和flush-logs
flush-privileges:# 通知mysqld重读授权表
reload:# 功能同“flush-privileges”
flush-status:# 重置状态变量的值
flush-tables:# 关闭当前打开的表文件句柄
flush-threads:# 清空线程缓存
kill:# 杀死指定的线程,需指定线程ID;可以一次杀死多个线程,以逗号分隔,但不能有多余空格
password:# 修改当前用户的密码
ping:# 模拟ping操作,检测mysqld是否在线
processlist:# 显示mysqld线程列表
shutdown:# 关闭mysqld进程
start-slave,stop-slave:# 启动/关闭从服务器线程
MySQL数据文件解析
MyISAM表:每表有3个文件,都位于数据库目录中
tb_name.frm:# 表结构定义文件
tb_name.MYD:# 数据文件
tb_name.MYI:# 索引文件
InnoDB表:有2种存储方式
默认方式:每表有1个独立文件和一个多表共享的文件
tb_name.frm:# 表结构定义文件,位于数据库目录中
ibdata#:# 共享的表空间文件,默认位于数据目录(datadir指向的目录)中,如ibdata1
自定义方式:独立的表空间
tb_name.frm:#表结构定义文件
tb_name.ibd:# 独有的表空间文件
# 在MySQL初始化中打开独立表空间功能的方法:
vi /etc/my.cnf (在[mysqld]段下添加)
innodb_file_per_table = ON
# 注:表空间:table space,是由InnoDB管理的特有格式的数据文件,内部可同时存储数据和索引
MySQL 架构的更多相关文章
- 步步深入:MySQL架构总览->查询执行流程->SQL解析顺序
前言: 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一篇博文了. 本文将从MySQL总体架构--->查询执行流程--->语句执行顺序来 ...
- ch2 MySQL 架构组成
第 2 章 MySQL 架构组成 前言 麻雀虽小,五脏俱全.MySQL 虽然以简单著称,但其内部结构并不简单.本章从 MySQL 物理组成.逻辑组成,以及相关工具几个角度来介绍 MySQL ...
- mysql笔记01 MySQL架构与历史、Schema与数据类型优化
MySQL架构与历史 1. MySQL架构推荐参考:http://www.cnblogs.com/baochuan/archive/2012/03/15/2397536.html 2. MySQL会解 ...
- 理解MySQL——架构与概念
写在前面:最早接触的MySQL是在三年前,那时候MySQL还是4.x版本,很多功能都不支持,比如,存储过程,视图,触发器,更别说分布式事务等复杂特性了.但从5.0(2005年10月)开始,MySQL渐 ...
- MySQL架构优化:定时计划任务与表分区
转自: MySQL架构优化实战系列3:定时计划任务与表分区 - 今日头条(TouTiao.com)http://toutiao.com/a6304736482361049345/?tt_from=mo ...
- MySQL架构由小变大的演变过程
假设一个网站(discuz)从最开始访问量很小做到日pv千万,我们来推测一下它的mysql服务器架构演变过程. 第一阶段网站访问量日pv量级在1w以下.单台机器跑web和db,不需要做架构层调优(比如 ...
- 第 2 章 MySQL 架构组成
麻雀虽小,五脏俱全.MySQL 虽然以简单著称,但其内部结构并不简单.本章从MySQL物理组成.逻辑组成,以及相关工具几个角度来介绍 MySQL 的整体架构组成,希望能够让读者对 MySQL 有一个更 ...
- mysql 架构篇系列 3 复制运行状态监控与选项参数说明
一. 概述 在上一篇中,搭建了一主一从的复制架构,这篇通过一些诊断方法来了解复制的运行状态和一些选项参数说明.上次mysql主从服务关机,今天在打开mysql服务,出现了错误信息. 1.首先 启动主从 ...
- MySQL架构总览->查询执行流程->SQL解析顺序
Reference: https://www.cnblogs.com/annsshadow/p/5037667.html 前言: 一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后 ...
随机推荐
- 重新想象 Windows 8 Store Apps (9) - 控件之 ScrollViewer 基础
原文:重新想象 Windows 8 Store Apps (9) - 控件之 ScrollViewer 基础 [源码下载] 重新想象 Windows 8 Store Apps (9) - 控件之 Sc ...
- AutoFac使用方法总结:Part II
事件 AutoFac支持三种事件:OnActivating,OnActivated,OnRelease.OnActivating在注册组件使用之前会被调用,此时可以替换实现类或者进行一些其他的初始化工 ...
- Linux在简短而经常使用的命令
Linux组成: 内核:的心脏.是执行程序和管理像磁盘和打印机等硬件设备的核心程序. shell:是系统的用户界面,提供了用户和内核进行交互操作的一种接口.它接收用户输入的命令并把它送入内核去执行.是 ...
- Java获取的一天、本星期、这个月、本季度、一年等 开始和结束时间
1.代码 package com.zhaochao.utils; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...
- newinstance()和new有什么区别?(转)
在初始化一个类,生成一个实例的时候:newInstance() 和 new 有什么区别? 用newInstance与用new是区别的,区别在于创建对象的方式不一样,前者是使用类加载机制,那么为什么会有 ...
- Nginx禁止特定用户代理(User Agents)访问(转)
Nginx可以通过各种方式来限制访问,例如NGINX基本Http认证.allow/deny等等,这些都是前文提过的,今天来看看nginx如果通过用户代理来禁止访问. user agent是什么? 用户 ...
- leetcode第一刷_Merge Sorted Array
水题,只是思想还是实用的. 当然能够新建出一个数组.比較着拷贝过去.可是没有必要啊亲.想想为什么用源数组会麻烦,由于确定了前面的数.为了后面的数字不被覆盖,要依次往后移,转念一想,先确定后面的数字.就 ...
- 读书时间《JavaScript高级程序设计》四:BOM,客户端检测
隔了一段时间,现在开始看第8章. 第8章:BOM BOM提供了很多对象,用于访问浏览器的功能.BOM的核心对象是window,它表示浏览器的一个实例. window对象是通过javascript访问浏 ...
- 由<a href = "#" > 引发的思考
原文:由<a href = "#" > 引发的思考 前阵子在一个移动项目中,通过 <a href = "#" > 的方式 绑定clic ...
- ORACLE—002:Create创作型
--用于工作的积累SQL ORACLE另外还有的类型.储过程.函数等的输入输入出. 以下看下创建. 使用方法 CREATE OR REPLACE TYPE 类型名称 AS OBJECT( 字段1 ...