percona-toolkit 中提供一个叫 pt-table-sync 的工具,可以获取一致性检查结果
create table students:table students already exists Please take follow action: 0.exit 1.insert 2. Please take follow action: 0.exit 1.insert 2.delete 3.update 4.query 5.showall 1 Please take Please take follow action: 0.exit 1.insert 2.delete 3.update 4.query 5.showall 4 Please take Please take follow action: 0.exit 1.insert 2.delete 3.update 4.query 5.showall 2 Please take 语句的过程中会经常使用到 sprintf ,它和 printf 的用法相似,但是将结果写到一个字符数组中,而不是直接打印到了终端上,这样便于后期的处理 ---- 总结 以下函数可以对sqlite数据库进行创建与控制,是存储数据的基础操作
,redis 中都是使用这个结构来进行组织的 typedef struct dict { dictType *type; void *privdata; dictht ht[2] type 字段对应的操作函数,具体有哪些操作函数,我们可以看到typedef struct dictType 给出的信息 privdata 字典依赖的数据,例如 redis 具体的操作等等 ht[2] 我们在 redis 源码中 src\server.h 也能够看到 redisdb 的数据结构 我们可以看到 dict 这个字典,是 redis 中使用是相当频繁和关键的 上面有说到 ht[2] 会用在渐进式 ht[0] 数据拷贝到 ht[1] 的方式一 是这样进行 rehash 的 : 扩容的时候,rehash 是这样做的: 先会对上述说到的 ht[1] 开辟内存空间,会将 ht[0].size * 2
首先我们带着下边三个问题来认识存储引擎 存储引擎在MySQL中的作用是什么? MySQL都有哪些存储引擎 SQL又与存储引擎有什么关系? 存储引擎在MySQL中的作用是什么? 所以我们的表在存储数据的同时,还要组织数据的存储结构,这个存储结构就是由我们的存储引擎决定的,所以我们也可以把存储引擎叫做表类型。 在MySQL中,支持多种存储引擎,他们是可以替换的,所以叫插件式的存储引擎。为什么要弄这么多存储引擎呢?一种还不够用吗? MySQL都有哪些存储引擎? 存储引擎的使用是以表为单位的。而且,创建表之后还可以修改存储引擎。 2(实时写,延迟刷) 每次事务提交时MySQL都会把logbuffer的数据写入logfile。但是flush操作并不会同时进行。该模式下,MySQL会每秒执行一次flush操作。
概述 MVStore是“多版本存储”(Multi-Version Store)的缩写,是一种持久化的基于日志结构的键值存储。它是H2的默认存储引擎,支持SQL、JDBC、事务、MVCC等。 文件头包含以下信息: H:2,block:2,blockSize:1000,chunk:7,created:1441235ef73,format:1,version:7,fletcher:3044e6cc H “H:2”代表 H2 数据库 块(block) 最新(不必是最新的 不同于文件头,数据块 header和 foot 的数据,页面数据是存储为字节数组的,其中包含长整型(8个字节)、整型(4个字节)、短整型(2个字节)和可变大小的整型和长整型(1到5/10个字节)。 说明一点:有些朋友有疑问,为什么 DawnSql 选择 h2 的存储内核,而不是去重新做一个?这里主要是为了高用性!h2 作为成熟的数据库存储内核,已经在实际的项目中应用了多年,它是经得起考验的。
2) 服务层 第二层架构主要完成大多数的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化,部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如 过程、函数等。 主要体现在存储引擎上,插件式的存储引擎架构,将查询处理和其他的系统任务以及数据的存储提取分离。这种架构可以根据业务的需求和实际需要选择合适的存储引擎。 2. country_id | country_name | +------------+--------------+ | 1 | China | | 2 | NewYork | 2 | | 3 | BeiJing | 1 | +---------+-----------+------------+ | NewYork | 2 | | 3 | BeiJing | 100 | +---------+-----------+------------+
存储虚拟化 随着存储的需求呈螺旋式向上增长,公司内的存储服务器和阵列都无一例外地随之成倍增长。对于这种存储管理困境的一种解决办法便是存储虚拟化。 存储虚拟化可以使管理程序员将不同的存储作为单个集合的资源来进行识别、配置和管理。存储虚拟化是存储整合的一个重要组成部分,它能减少管理问题,而且能够提高存储利用率,这样可以降低新增存储的费用。 存储节点虚拟化层: 可实现存储节点内部多个存储池之间的资源分配和管理,将一个或者多个按需分配的存储池整合为在存储节点范围内的统一的虚拟存储池。 存储区域网络虚拟化层: 可实现存储节点之间的资源分配和管理,集中地管理所有存储设备上的存储池,以组成一个统一的虚拟存储池。 三种目前能够实现的存储虚拟化方法 存储虚拟化是物理存储的集合,也就是将多个网络存储设备集合成一个存储设备,这样就能简化存储管理。
在前面我们了解了server层调用存储引擎层接口来完成sql的执行,使用存储引擎的好处是:每个存储引擎都有各自的特点,能够根据具体的应用建立不同存储引擎表。 1、常用存储引擎 1.1、InnoDB存储引擎 InnoDB是MySQL的默认事务型引擎,也是最重要、使用最广泛的存储引擎。特点是行锁设计,支持外键,5.6之后支持全文索引。 1.2、MyISAM存储引擎 MyISAM存储引擎不支持事务、只支持表锁、支持全文索引。在MySQL5.5之前是MySQl默认的存储引擎。 MyISAM对整张表加锁,而不是针对行。 2、存储引擎对比 不同的存储引擎都有各自的特点,以适应不同的需求,如表所示。为了做出选择,首先要考虑每一个存储引擎提供了哪些不同的功能。 ---- 参考: 【1】:《高性能MySQL》 【2】:极客时间 《MySQL实战45讲》 【3】:《MySQL技术内幕 InnoDB存储引擎》 【4】:MySQL存储引擎精讲(附带各种存储引擎的对比)
8-2 图的存储结构 1.邻接矩阵(顺序存储结构) 图结构的元素之间虽然具有“多对多”的关系,但是同样可以采用顺序存储,即使用数组有效地存储图。 集合V中所有的顶点可以利用一个一维数组存储;而集合E中所有的边可以用一个二维数组来存储, 此二维数组就称为 邻接矩阵! 2.邻接表 邻接表既适用于存储无向图,也适用于存储有向图。 邻接表存储图的实现方式是,给图中的每个顶点独自建立一个链表,第i个单链表中的节点包含顶点 i 的所有邻接点。 为了便于管理这些链表,通常会将所有链表的头节点存储到数组中(也可以用链表存储)。类似于树结构的孩子表示法。 也正因为各个链表的头节点存储的是各个顶点,因此各链表在存储临界点数据时, 仅需存储该邻接顶点位于数组中的位置下标即可。 ? ?
Linux 挂载2T以上存储 Linux 挂载2T以上存储 在生产环境中,我们会遇到分区大于2T的磁盘(比如:添加一个3TB的存储),由于MBR分区表只支持2T磁盘,所以大于2T的磁盘必须使用GPT分区表 Device Boot Start End Blocks Id System /dev/sdd1 1 2089 16777216 82 Linux swap / Solaris /dev/sdd2 minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 开始格式化 1.安装parted apt install parted 2. (parted) mkpart primary 0 -1 #将整块磁盘分成一个分区 (parted) quit #退出 3.格式硬盘 mkfs.ext4 /dev/sdb1 #格式化 #mke2fs 挂载新硬盘 4.1 创建需要挂载硬盘的目录 mkdir /data2 mount /dev/sdb1 /data2 #挂载 4.2 查找硬盘id号 blkid /dev/sdb1 #/dev/sdb1
2、(IN | OUT | INOUT parameter-name data-type,…) :传入参数 IN:输入参数 OUT:输出参数 INOUT:作为输入输出参数 parameter-name 返回所有员工超过平均薪水的数额,结果集包括name, position, and salary字段(参考数据库为db2的示例数据库sample)。 DECLARE c1 CURSOR FOR SELECT CAST(salary AS DOUBLE) FROM staff ORDER BY salary; DECLARE c2 SELECT COUNT(*) INTO v_numRecords FROM STAFF; OPEN c1; WHILE v_counter < (v_numRecords / 2 FETCH c1 INTO medianSalary; SET v_counter = v_counter + 1; END WHILE; CLOSE c1; OPEN c2;
,卸载主机的计算任务,结构上为:资源控制器+设备缓存; • CSD是集成到主机上的计算存储驱动,与CSP不同的是,因驱动器含存储设备,故额外增加:存储控制器+存储设备; • CSA是计算存储阵列,是端侧具备完整能力的架构 图中右侧还展示了一个示例的计算型存储驱动(CSD)的结构,包括用户空间、内核空间、设备驱动、计算型存储引擎(CSE)、资源库和设备存储。 发现CSx:这一步包括通过名称发现计算型存储设备并访问它; 2. 发现CSF:这一步需要发现想要执行的功能; 3. 分配FDM:在这一步中,需要分配设备内存。 在数据处理阶段: 4. 计算型存储架构与组件 SNIA定义了计算型存储三大架构:CSP(扩展处理器模块)、CSD(计算存储驱动)和CSA(计算存储阵列),各有应用场景,CSA能管理多CSD。 关键部件包括CSR(计算存储资源)、CSF(函数)、CSE(引擎)、CSEE(环境)、FDM(功能数据内存)和AFDM(分配内存)。这些构成计算型存储的核心。 2.
因此仅仅是作为存储的话差别其实是不大的。 现在大多数,涉及到存储内核的文章或者讲义,要么是一堆原理,要么就是玩具版本例子,根本无法应用到实际的工程上面去,就像马保国的闪电五连鞭一样。 我们选择 h2 的一个重要原因就是,学习完后,可以直接应用到工程上。行不行直接在擂台上比一下就知道了。 需要注意的是,pageSplitSize的值必须是2的幂次方。 图片 4、MVMap 查询的过程 图片 说明一点:有些朋友有疑问,为什么 DawnSQL 选择 h2 的存储内核,而不是去重新做一个?这里主要是为了高用性! h2 作为成熟的数据库存储内核,已经在实际的项目中应用了多年,它是经得起考验的。如果新做存储内核,可能会给使用者带来高可用性上面的顾虑,所以我们再三权衡后选择更稳定可用性更高的方案。
二、两类浮点型数据(float、double)在内存中的存储方式 2.1两类浮点型数据的存储模型 根据IEEE754标准规定,浮点型数据的存储和读取按照公式: Value为浮点型数据的二进制值 S表示浮点型数据的正负 指数位E即2的次方数,如 float n = 10.5,可以表示为。这里,E = 3。 再比如,真实指数位E = -2时,存入内存应为 E = -2 + 127 =125。 这是因为 n1 = 9.0 以浮点型数据的存储方式存入到了内存中(存储方式如图4.2所示),但在读取并打印这个数据的时候,却是对一个整型指针进行解应用,将9.0以整型数据的视角进行读取和打印。 故打印结果为: 四、总结 本文详细介绍了单精度浮点型数据和双精度浮点型数据在内存中存储的方法,给出了浮点型数据的存储模型和读取模型,并以案例的形式进行了介绍。浮点型数据可表示为: 。
如果以后再生成了快照2,则云主机将新的修改增量数据直接写入快照2中。快照1-快照2称为快照链,每一个快照只保存相对上一个快照的增量修改数据。 如果删除了快照1,云控制台将自动将快照1的数据添加到快照2,保障即使删除了快照链的数据,也不会影响数据的恢复。 在分布式存储+块存储的大趋势下,ROW是未来的快照存储主要趋势。原因如下:分布式场景下,数据是分开存储,数据越是分散,系统性能越高。而 ROW 把源数据卷中的原始数据打散之后,对性能反而有好处。 2、快照的速度更快。生成快照的速度比备份速度快的多,因为快照仅生成了一个空白的空间,仅有新数据写入时才会在快照中写数据。而备份一般会生成一份全量数据,因此一般只会在夜间业务量少时进行备份操作。 3、占用的存储空间不同。备份会占用双倍的存储空间,而快照所占用的存储空间则取决于快照的数量以及数据变动情况。极端情况下,快照可能会只占用1%不到的存储空间,也可能会占用数十倍的存储空间。
,在同一个数据库的同一模式下,不能存在存储过程名相同参数数目相同的存储过程,即使参数的类型不同也不行。 :参数名字,在此存储过程中唯一的标识符。 3、SPECIFIC specific-name:唯一的特定名称(别名),可以用存储过程名代替,这个特定名称用于dorp存储过程,或者给存储过程添加注视用,但不能调用存储过程。 13、SQL-procedure-body:存储过程的主体 例子1:产生一个SQL存储过程,返回员工的平均薪水. BINDADD privilege on the database, and one of the 2 following: 2 2 2 IMPLICIT_SCHEMA privilege on the
F2FS空间布局 F2FS空间布局整个存储空间被划分为6个区域: 超级块(SB) 包含基本分区信息和F2FS在格式化分区时确定不可更改的参数 检查点(CP) 保存文件系统状态,有效NAT/SIT(见下文说明 一个Segment要么存储数据,要么存储索引,据此可将Segment划分为数据段和索引段。 工具分析 单纯的用hexdump去分析f2fs块设备上的存储结构,我们还可以通过dump.f2fs工具去查看,当然Android源码下默认dump.f2fs是关闭的,以后我再写文章如何开启Android 因为F2FS支持inline data(数据直接存储在inode中),小文件大小最大可达约3.4KB,在Android大量小文件场景中对存取空间占用和性能有一定优化。 存储结构学习,只有这么一点是远远不够的,为什么研究文件系统要先研究存储结构?
浮点型在内存中的存储 常见的浮点数: 3.14159 1E10 ------ 1.0 * 10^10 浮点数家族包括: float、double、long double 类型 浮点数表示的范围: float.h中定义 3.1 一个例子 浮点数存储的例子: #include <stdio.h> int main() { int n = 9; float* pFloat = (float* 因此,我们可以推出:整型和浮点型在内存中的存储方式是有差异的! 3.2 浮点数存储规则 num 和 *pFloat 在内存中明明是同一个数,为什么浮点数和整数的解读结果会差别这么大? M表示有效数字,大于等于1,小于2。 2^E表示指数位。 IEEE 754规定: 对于32位的浮点数,最高的1位是符号位S,接着的8位是指数E,剩下的23位为有效数字M。 int main() { float f = 5.5; //101.1 //1.011 * 2^2 //(-1)^0 * 1.011 * 2^2 //S = 0 //M = 1.011 /
,解引用后就是多了一个字节的地址的数据,但这是小端存储,就要还原该有的数据,就是02000000 浮点数在内存中的存储 常见的浮点数:3.14159、1E10等,浮点数家族包括:float,double ^0*101.1*2^0 s=0,m=101.1,e=0 再比如,5.0这个浮点数,二进制101.0,相当于1.01*2^2,那么,按照上面V的格式,可以得出S=0,M=1.01,E=2 所以浮点数的存储其实就是在存储 s,m,e这三个相关的值 IEEE 754规定: 对于32位的浮点数,最高的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M 对于64位的浮点数,最高的1位存储符号位S,接着的11位存储指数 E,剩下的52位存储有效数字M 浮点数存的过程 IEEE 754对有效数字M和指数E,还有⼀些特别规定 前面说过, 1≤M<2 ,也就是说,M可以写成 1.xxxxxx 的形式,其中 xxxxxx 表示小数部分 //s=0 m=1.011 e=2 //但是e要加上一个中间值127才可以正确存储,所以e是129 //m存储的是小数点后面的数,就是011,但后面还有很多位,就在后面补0 //
由于本文公式较多,简书不支持公式渲染,完整版已发布在个人博客 存储 DianNao系列的存储的设计理念是分裂存储,这样有几个好处: 增大带宽:相同大小的单个存储器和多个存储器相比,多个存储器能提供更大的带宽 ShiDianNao_store.JPG 可以发现,每个存储器分裂为$2 \times P_y$个Bank,每个Bank的位宽是$P_x \times 16bit$。 imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 第一种与k-NN(k-邻近算法)类似,每个数据的重用间隔(这一次使用和下一次使用之间的间隔数据数量 都可以使用运算核心的MUL功能解决,即将NFU-2配置为加法树。在存储中,输入数据按[高度,宽度,通道数]维度排列,即先存储第一个数据位置的所有通道数据,再存储第二个数据位置的所有通道数据,以此类推。 以下说明均使用$P_x=P_y=2$ 卷积 ShiDianNao的每个节点的简化图形如下所示,以下说明将使用该图示: ?