数据库表结构变更看起来只是几条 DDL,核心难点在于并非“写出脚本”,而是“怎么把脚本安全、全面、按顺序地发到开发、测试、预发、生产”。 NineData 的“结构设计与发布”之所以值得单独讨论,就在于它不是又一个仅可提交 SQL 的页面,而是一套专门为多环境结构发版设计的流程编排机制。 技术文档明确写到,版本管理会自动采集来自 SQL 窗口、SQL 任务、结构设计与发布等多种来源的 DDL,并支持差异对比和回滚 SQL 生成。这对多环境表结构发版特别重要。 ‘加强脚本管理’能解决的阶段,而是需要像 NineData 这样把多环境结构发布流程本身产品化。 总结多环境表结构发版核心难点在于,不是写出一条 DDL,而是让各类环境都仅执行该执行的内容、按该有的顺序往前走。
explicit-locking.html 从锁冲突矩阵和锁定义看出ALTER TABLE属于AccessExclusiveLock类型,也就是常说的排它锁,它的锁粒度非常大,和所有其他锁冲突,所以给生产环境表加索引的时候非常容易出现被阻塞的现象 正确的加字段或者索引姿势 尽量业务低峰期操作 原因1:上一章节讲到,加字段和加索引操作会伴随着数据拷贝动作,会导致操作系统IO或者负载变高,在业务高峰期可能会影响性能; 原因2:Alter Table操作会拿表级排它锁 ,排它锁会阻塞其他访问该表的SQL操作,造成业务请求堆积,大量请求堆积可能导致连接数上涨、实例负载升高等问题; 使用CONCURRENTLY关键字 使用CONCURRENTLY加索引时,持有锁降为ShareUpdateExclusiveLock 加索引: stone=# create index CONCURRENTLY idx_test_text on test(text) ; CREATE INDEX session 2 vaccum表, stone=# vacuum test; VACUUM session 3 使用pg_blocking_pids查看阻塞情况: image.png image.png 上图可以看出vaccum表操作被
背景 如果我们需要在生产环境中修改MySQL数据库中某个库表的结构。那么,需要考虑哪些要点,才能确保不会出问题呢? 碰到的问题 这里先描述一下我在生产环境MySQL数据库中修改库表结构时遇到的问题。 这里解释下metadata的概念,metadata lock(MDL)也就是元数据锁,它是一种表级锁。 各种对该表的操作,比如增删改查,都会占有MDL的读锁。当修改表结构时,会占用MDL的写锁。 如果有一个长事务在对该表进行操作,那么在修改表结构时,就会有状态:Waiting for table metadata lock,也就是锁等待。 当然,对该表的查询操作就会全部阻塞。 我当时的情况就是这样,有一个事务操作了该表,但是可能由于大意没有关掉该事务,该事务长时间存在。而我同时又进行表结构的更改,于是导致了这次事故。 MySQL数据库中库表结构是一件比较有风险的事情,所以一定要三思而后行,避免引起任何可能的线上事故。
3 分钟学会企业开发中的多环境知识 大家好,我是鱼皮,今天给大家分享企业项目开发的重要知识 —— 多环境。 本文大纲: [鱼皮 - 多环境技术大纲] 什么是多环境? 先思考一个问题。 我:思路不错,但问题在于,如果本地和线上运行项目时,连接的是同一个数据库,那么当你在本地测试向数据库中插入乱七八糟的假数据、或者修改数据库表结构时,不就会影响到线上的数据了么? 这便是多环境的好处。 常用环境 多环境听起来虽然挺爽的,但事实上,环境不是区分的越多越好! 一方面是搭建多环境需要额外的工作量;另一方面是项目依赖的资源越多,成本就越高,而且维护起来也更麻烦。 ("db-test.properties"); 无论是前端还是后端,大部分的多环境实现都是这个原理 —— 搞多套配置,所以总能在项目中看到类似的配置文件: [多环境配置文件] 注入环境参数 到目前为止, 其实在企业中,多环境比这复杂的多!除了代码中要区分环境,流水线、镜像、容器也通通要区分。不过原理都是一样的~ 最近整理了我原创的 140 篇编程经验和技术文章,欢迎大家阅读,一起成长!
然而它与线性表、树、图等结构不同的是,前面几种结构,数据元素之间都存在某种逻辑关系,可以用连线图示表示出来,而哈希技术的记录之间不存在什么逻辑关系,它只与关键字有关联。 static int GetHashCode(string number) { string index = number.Substring(6) 在.NET中,实现了哈希表数据结构的集合类有两个,其中一个就是Hashtable,另一个是泛型版本的Dictionary<TKey,TValue>。 2.2 剖析Hashtable (1)闭散列法 Hashtable内部使用了闭散列法来解决冲突,它通过一个结构体bucket来表示哈希表中的单个元素,这个结构体有三个成员: private struct 四、.NET中几种查找表的对比 4.1 测试对比介绍 在.NET中有三种主要的查找表的数据结构,分别是SortedDictionary(前面已经介绍过了,其内部是红黑树数据结构实现)、Hashtable
处理多环境 开发者常常希望根据是生产环境还是开发环境能够区分不同的定制行为,例如,如果在开发环境的程序当中输出详细的错误信息这样做对开发者来说是非常有帮助的,但是这样做的话在生产环境中会造成一些安全问题 这样能够根据不同服务器安装环境定制不同的环境依赖。 使用这个常量,除了会影响到一些基本的框架行为外(见下一章节),在开发过程中你还可以使用常量来区分当前运行的是什么环境。 在生产环境禁用错误输出是 良好的安全实践。 配置文件 另外,CodeIgnite 还可以根据不同的环境自动加载不同的配置文件,这在处理例如不同环境下有着不同的API Key的情况时相当有用。 这在 配置类 文档中的“环境”一节有着更详细的介绍。
discuz 主题表pre_forum_thread 注解 tid mediumint(8) unsigned NOT NULL auto_increment COMMENT '主题id', fid mediumint (8) unsigned NOT NULL default '0' COMMENT '上级论坛', posttableid smallint(6) unsigned NOT NULL default ' 0' COMMENT '帖子表ID', typeid smallint(6) unsigned NOT NULL default '0' COMMENT '主题分类id', sortid smallint (6) unsigned NOT NULL default '0' COMMENT '分类信息id', readperm tinyint(3) unsigned NOT NULL default '0' COMMENT '回帖奖励积分主题记录积分值', discuz 内容表,帖子表pre_forum_post 注解 pid int(10) unsigned NOT NULL auto_increment
表分类 ACT_RE_* 仓库数据:流程定义,流程资源(图片,规则等)等静态信息。 ACT_RU_* 运行时数据:流程实例,用户任务,变量,作业等运行时数据。 这可以保证运行时表性能。 ACT_HI_* 历是数据:已经完成的流程实例,变量,任务等等历史数据。 ACT_GE_* 通用数据:用于保存变量用例。 通用数据 表名 描述 act_ge_bytearray 流程模型定义,流程相关资源 act_ge_property 系统属性 仓库数据 表名 描述 act_re_deployment 流程的部署信息 act_re_procdef 流程定义 act_re_model 模型信息 运行时数据 表名 描述 act_ru_variable 运行时变量 act_ru_task 运行时任务(流程当前节点) 字段 运行时流程执行实例 act_ru_event_subscr 运行时事件 act_ru_identitylink 运行时用户关系信息,存储任务节点与参与者的相关信息 act_ru_job 运行时作业 历是数据 表名
命令行下具体用法 mysqldump -u用戶名 -p密码 -d 数据库名 表名 > 脚本名; 导出整个数据库结构和数据 mysqldump -h localhost -uroot -p123456 database > dump.sql 导出单个数据表结构和数据 mysqldump -h localhost -uroot -p123456 database table > dump.sql 导出整个数据库结构(不包含数据) mysqldump -h localhost -uroot -p123456 -d database > dump.sql 导出单个数据表结构(不包含数据
及其xdes部分,每个组都有256个区,每个区都有一个对应的xdes entry结构,这256个entry都存在第一个页中。 File Space Header & xdes(5)FSP HDR独立表空间结构(三十一) XDES类型 虽然一个xdes enrty只有40个字节,但架不住数量多,所以把256个区分为一个组,每个组的第一个页面存放 Empty space:6个节点,尚未使用的空间,用于页结构的填充。 File Trailer:文件尾部,效验页是否完整。 他们都有一个对应的segment header结构: space id of inode entry:对应inode entry所在的表空间。 不过需要注意的是,因为一个索引只对应两个段,所以只需要索引的根目录记录着这两个结构就好。
COLUMN_COMMENT 备注 FROM INFORMATION_SCHEMA.COLUMNS WHERE -- test_database为数据库名称,到时候只需要修改成你要导出表结构的数据库即可 table_name = 'test_table' 运行之后显示: 之后选中复制粘贴到文档中即可 这种方法的不足之处是 查询整个数据库所有的表的结构时 比较混乱,建议单个表进行查询。 ---- 第二种 :利用SQLyog的导出html功能 SQLyog的使用就不多说,直接去官网下载傻瓜式安装运行即可 运行之后连接数据库,右键选中需要导出表结构的数据库,选择最下面的Create Schema character_set_connection = utf8; 第三种 :利用项目导出 在我寻找导出文档工具的过程中,有幸碰到一个博主的文章,是关于java导出mysql或者oracle数据库表结构设计文档 :https://www.jianshu.com/p/884aff422649 项目下载运行之后: 如上填写完信息之后 测试连接成功之后 就可以 导出文档: 唯一的不足之处是不能选择导出某个或几个表的结构
1-3 云商城环境准备和数据库表结构 在商城系统中我们会使用到很多基础环境,比如MySQL数据库、Nacos注册中心、Redis数据库等、这些我们都会安装在Docker容器中。 所以接下来我们搭建下基础环境 ? 1、Linux环境搭建 Linux环境我们使用的是centos7.9。 5、数据库设计 5.1 商品数据库 品牌表:brand CREATE TABLE `brand` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '品牌 ; 商品分类表:category CREATE TABLE `category` ( `id` int(20) NOT NULL AUTO_INCREMENT COMMENT '分类ID', ` 好了到此环境准备工作就搞定了~
抽象数据结构 抽象数据结构(ADT)是一些操作的集合,集合了一些必要且重用性高的操作,这些操作在一个项目中只被编写一次。 抽象数据结构只定义操作的存在,并不定义操作的实现 表 概念 表是一种基础的数据结构,是一系列逻辑上"顺序"的数据(顺序指具有连续的数值索引)。 例如$A_{0},A_{1},A_{2}$就是一个表,数据具有连续索引1,2,3。 数组实现:查找快,插入与删除慢,大小固定,内存中一般连续 链表实现:查找较慢,插入与删除相对较快,大小可变,内存中一般不连续 表需要的方法 is_empty:判断是否为空表 is_last:判断是否为结尾 find:根据值获得在表中的节点(find_previous:获得前驱元) visit:根据位置获得值(find) delete:删除元素 insert:插入元素 实现 接口与结构体 //表中数据类型
参考链接:数据结构(严蔚敏) 文章发布很久了,具体细节已经不清晰了,不再回复各种问题 文章整理自严蔚敏公开课视频 可以参考 https://www.bilibili.com/video/av22258871 / 如果链接失效 可以自行搜索 数据结构严蔚敏视频 @2021/07/12 一、什么是Hash表 要想知道什么是哈希表,那得先了解哈希函数 哈希函数 对比之前博客讨论的二叉排序树 二叉平衡树 红黑树 使用举例 比如我们存储3 6 9,那么p就不能取3 因为 3 MOD 3 == 6 MOD 3 == 9 MOD 3 p应为不大于m的质数或是不含20以下的质因子的合数,这样可以减少地址的重复(冲突 ) 比如key = 7,39,18,24,33,21时取表长m为9 p为7 那么存储如下 index 0 1 2 3 4 5 6 7 8 key 7 21(冲突后移) 24 *39* 18(冲突后移) 9,p取3是 3 MOD 3 == 6 MOD 3 == 9 MOD 3 此时3 6 9都发生了hash冲突 哈希冲突的解决方案 不管hash函数设计的如何巧妙,总会有特殊的key导致hash冲突,
总结:一个Project可以包含多个Target,也就是说通过不同Target我们可以生成不同的APP; 多环境配置的三种方法: 多target配置; Scheme配置; xcconfig文件配置 点击“+”,可以在这里增加新的configuration(以Dev为例); 2.切换多环境 增加configuration后,在Edit Scheme时,也会多出一种configration。 我们在run的时候,就可以手动切换configration使用不同的环境; 3.多Scheme 每次手动切换configration较为繁琐,我们还可以使用不同的Scheme直接对应不同的配置; 4 .测试Scheme多环境 1.Build Setting -> User-Defined里自定义Host_URL,再对不同的configration配置不同的值; 2.将Host_URL以变量的方式配置到 ,分别设置 #include "Pods/Target Support Files/Pods-TestProject/Pods-TestProject.debug.xcconfig" 6.xcconfig
<profiles> <profile> <id>dev</id> <properties> <profiles.active>dev</profiles.active> </properties> </profile> <profile> <id>beta</id> <properties>
多数项目都会有开发环境、测试环境、生产环境,各个环境配置可能都会不一样,于是在构建时,会涉及到环境配置的切换。来回手工修改配置,效率低下,容易出错。 可以配置多个含有不同环境配置的Profile,在构建时指定构建环境,达到多环境下快速灵活构建的目的。 项目结构: ? jdbc.username} jdbc_password=${jdbc.password} prop下的dev.properties、test.properties、prod.properties分别对应开发、测试、生产环境的配置 -- 自定义属性env,在不同环境有不同的值 --> <env>dev</env> </properties> <activation> <! -- 默认激活dev环境的配置 --> <activeByDefault>true</activeByDefault> </activation> </profile>
1、多Profile文件 在写主配置文件时,文件名可以是 application-{profile}.properties/yml 默认使用application.properties的配置 # application.properties application-dev.properties server.port=8082 # application-prod.properties server.port=8083 2、使用yml配置多文档块方式
Nacos官网地址 https://nacos.io nacos-server-1.3.2(我这里是下载的windows环境配置) 这里下载的是1.3.2的版本,其他环境启动命令请看官网 运行命令 startup.cmd -m standalone 控制台(如图示,创建了两个命名空间) 每个命名空间下创建同样的一个文件 用来测试多环境效果的内容如下示 版本 JDK 1.8 MAVEN nacos-config-spring-boot-starter</artifactId> </dependency> springboot的配置项 application.properties # 指定环境 nacos.config.group=DEFAULT_GROUP # 测试使用的配置文件 nacos.config.data-id=auto-deployed.yaml # 命名空间(必须指定,就是通过命名空间来做多环境配置的 nacos.config.group=DEFAULT_GROUP # 测试使用的配置文件 nacos.config.data-id=auto-deployed.yaml # 命名空间(必须指定,就是通过命名空间来做多环境配置的
在工作中不可避免的就要针对新需求进行表结构设计, 那应该将表结构设计成什么样, 又该依据什么准则设计呢? 带着这些问题, 一起看下如何进行表结构设计. 表结构目的 我们应该带着什么样的目标, 或者说设计成什么样才算是合理的设计呢? 好的设计是要尽量避免这些数据维护异常; 今天就一起看下, 如何做好表设计. 表结构设计步骤 知道了设计目标之后, 在一起看下, 如何才能达到这个目标. ; (3) 设计出来的表是二维表结构; 第二范式(2NF): 属性完全依赖于主键 在第一范式的基础上, 所有非主属性都完全依赖于主键属性时, 称为第二范式. 按3NF整理后, 表结构如下.