数据库管理员

希望提高数据库技能并向社区中的其他人学习的数据库专业人员的问答

1
PostgreSQL 9.2-9.6升级,停机时间为零
我必须从PostgreSQL 9.2升级到9.6。以下是我面临的挑战: 由于我们具有流复制设置,并且PostgreSQL在流复制模式下不支持从较低版本升级到较高版本,因此在升级主服务器时,我必须重建从服务器,这需要3个小时。我没有时间闲暇。在任何给定时间,我们需要一个从属服务器和一个主控服务器。是否有其他方法可以使用流复制来升级而不必重建从服务器? 为了构建逻辑复制,我们考虑过使用slony,但是slony具有一些局限性,因为它无法自动复制: 更改为大对象(BLOBS) DDL命令所做的更改 用户和角色的更改 ...并且我们的应用程序具有连续的创建命令。因此,我们不能使用slony。 请提出一些建议,以避免从站重建,并以最少的停机时间进行升级,并准备好一个主站和一个从站。

1
了解IAM页面:范围间隔
我正在阅读Itzik的书《查询Microsoft SQL Server 2012》,以及在互联网上阅读/观看不同的教学材料。我的目的是对数据库内部如何工作有一个有益的了解。 我有一个小小的疑问,我无法解决有关IAM页面的问题。由于我尚处于了解的初期,因此也许我需要那些了解情况更好的人的额外帮助,因此,如果我的疑问似乎很可笑,请原谅我。 在第15章“实现索引和统计信息”中,出现了一个图像-如下图所示-作为IAM页面的示例: 您可以通过红色箭头看到与同一范围相关的16页内容。那怎么可能?是作者/编辑的错误吗?还是更有可能的:我是否有一些不正确的理解? 我的另一个问题与页面间隔有关。为什么它们不连续?以最后一个范围为例,它将覆盖ID为336至22642或前一个ID为296至328的页面。

2
PostgreSQL Upsert在分区表上不起作用
有一个这样的表: CREATE TABLE aggregated_master ( "user" BIGINT, type TEXT, date TIMESTAMP, operations BIGINT, amount NUMERIC, PRIMARY KEY ( "user", type, date ) ); 该表是从中继承许多分区的主表。分区由DATE字段中的MONTH完成。例如:2017年8月的分区将是agg_201708,它的PK将是pk_agg_201708。在插入之前,通常有触发器将插入重定向到适当的分区。 事情是我想对这张表做一个UPSERT。DO CONFLICT部分不起作用。 代码首先是这样的 INSERT INTO aggregated_master (user, type, date, oeprations, amount) SELECT user, type, date, SUM(ops), SUM(amt) FROM ... WHERE ... GROUP BY USER, TYPE, DATE …

2
究竟何时有多个用户无法同时使用临时表运行存储过程?
我对最近在TechNet上阅读的有关Temp Tables的文档有疑问。该页面上“ 临时表”部分的第四段内容如下: 如果使用命名约束创建了一个临时表,并且该临时表是在用户定义的事务范围内创建的,则一次只能有一个用户可以执行创建临时表的语句。例如,如果存储过程创建具有命名主键约束的临时表,则该存储过程不能由多个用户同时执行。 我在这样一个环境中工作:我们大量使用了一些使用索引临时表的存储过程,而我们从未遇到过用户必须等待一个执行完成才能开始下一个执行的问题。我希望情况会继续如此,但我担心,如果未正确理解此警告,可能会成为一个问题。 具体来说,我不清楚以下几点: 这仅适用于全局临时表还是局部临时表?一个在会话外部不可见的表(在后一种情况下)会阻止另一个会话同时执行,这似乎很奇怪。 什么才算是“命名约束”?并非所有约束都具有名称(即使它们是系统生成的)?这是否指的是具有用户定义别名的约束?对我来说,这似乎是措辞不好。 “多个用户”实际上意味着多个会话吗?这些过程是通过使用单个服务帐户的应用程序调用的,因此99.9%的脚本调用是由该单个帐户进行的(对于管理员偶尔在后端进行的调用,我并不担心)。如果服务帐户可以同时在多个会话中运行该存储过程,那么出于我的目的,这个问题就没有意义了。

5
互斥的多对多关系
我有一个表containers,可以有几个表一个多一对多的关系,让我们说那些是plants,animals和bacteria。每个容器可以包含任意数量的植物,动物或细菌,并且每个植物,动物或细菌可以位于任意数量的容器中。 到目前为止,这非常简单,但是我遇到的问题是每个容器应仅包含相同类型的元素。例如包含植物和动物的混合容器应成为数据库中的约束违例。 我的原始模式如下: containers ---------- id ... ... containers_plants ----------------- container_id plant_id containers_animals ------------------ container_id animal_id containers_bacteria ------------------- container_id bacterium_id 但是使用这种模式,我无法提出如何实现容器应该是同质的约束。 有没有一种方法可以使用参照完整性来实现这一点,并确保在数据库级别上容器是同质的? 我为此使用Postgres 9.6。

3
触发更改创建时的数据库排序规则
我正在尝试创建一个触发器,以更改数据库创建时的排序规则,但是如何捕获触发器中要使用的数据库名称? USE master GO CREATE TRIGGER trg_DDL_ChangeCOllationDatabase ON ALL SERVER FOR CREATE_DATABASE AS declare @databasename varchar(200) set @databasename =db_name() ALTER DATABASE @databasename COLLATE xxxxxxxxxxxxxxxxxxx GO 显然,这是行不通的。

6
并行运行存储过程
我正在尝试尝试同时使用不同的参数多次运行相同的存储过程。 我正在使用SQL 2014 这样做的原因是该过程大约需要7个小时才能完成。实际上,它多次执行相同的过程。因此,例如,它可能会为每个分支建立一个新的数据库和表。 我想要做的是分解存储过程,这样我可以在每个分支中运行,但随后并行运行每个查询。我已经通过在单独的查询窗口中运行它进行了测试,并且运行速度快了将近80%。 谁能给我一个虚拟的指南,以并行运行查询?

1
SQL Server查询存储是否捕获参数值?
SQL Server 2016中引入的新查询存储很棒。它是我以前使用较旧的Profiler工具所做的大部分工作的理想替代品。但是,我还没有找到一种方法来捕获与嗅探到的高资源消耗查询的各个调用相关的参数值。这可能吗? 我知道查询存储处理的是聚合数据而不是单个调用,因此我怀疑我在这里可能不走运。当我发现一个慢查询时,我发现它很方便进行故障排除,使其参数也与其最慢的调用之一相关联。我想知道如何使用最新最好的工具来执行此操作。(我不会错过使用Profiler!) 从安全角度来看,查询存储的锁定程度是否低于Profiler?我认为它需要从某个级别的单个调用中捕获数据才能计算聚合。只是不确定是否存储了其中的任何一个。

2
一字节的“ char”类型在PostgreSQL中如何工作?
我经常看到人们在谈论"char"。我没用过 在文档中定义为 类型“ char”(请注意引号)与char(1)的不同之处在于,它仅使用一个字节的存储空间。在系统目录中内部使用它作为一种简单的枚举类型。 并进一步, "char" 1 byte single-byte internal type 那么,如果它是一个字节,则域是什么,您将如何使用它?它是签名的还是未签名的?在@Erwin Brandstetter的这篇文章中,他对此进行了阐述,但我仍然感到困惑。他正在使用ascii()和chr(),并提供了 SELECT i , chr(i)::"char" AS i_encoded , ascii(chr(i)::"char") AS i_decoded FROM generate_series(1,256) i; 这在10到11之间确实很奇怪。 i | i_encoded | i_decoded -----+-----------+----------- ... 8 | \x08 | 8 9 | | 9 10 | +| 10 | | -- …


2
创建PostgreSQL约束以防止唯一组合行
假设您有一个简单的表: name | is_active ---------------- A | 0 A | 0 B | 0 C | 1 ... | ... 我需要创建一个特殊的唯一约束,该约束在以下情况下会失败:is_active对于相同的name值,不同的值不能共存。 允许条件的示例: 注意:简单的多列唯一索引不允许这样的组合。 A | 0 A | 0 B | 0 允许条件的示例: A | 0 B | 1 条件失败的示例: A | 0 A | 1 -- should be prevented, …

2
不能索引大于缓冲区页面1/3的值
我对DB不太满意,所以请多多包涵。 我正在尝试将很长的JSON数据放入表中,该表是由Django框架创建的。 我在Heroku上使用Postgres。因此,当我尝试放入数据时,出现以下错误: File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/utils.py", line 64, in execute return self.cursor.execute(sql, params) psycopg2.OperationalError: index row size 3496 exceeds maximum 2712 for index "editor_contentmodel_content_2192f49c_uniq" HINT: Values larger than 1/3 of a buffer page cannot be indexed. Consider a function index of an MD5 hash of the value, or use full text …

2
将标识列从INT更改为BIGINT
我有一个带有标识列的表,该列也是主键。当前,它有5000万行,标识列的最高值为148921803。该表具有很多DELETEs并对其INSERTS执行,因此值很高。 我们希望将数据类型从更改为INT,BIGINT以准备添加更多行。请注意,没有对PK列的引用。 用最少的停机时间来做到这一点的最佳方法是什么?我有两个选择。 放下PK并更改色谱柱;要么 复制落重命名方法,描述在这里:

2
升序关键问题-品牌为“ Stationary”的前导列-SQL Server
我一直在研究数据库中运行缓慢的查询,并得出结论,这是一个经典的升序关键问题。由于几乎总是不断地插入新行,并且每隔30分钟就会运行一条用于从数据库中提取最新数据的SQL代码,因此每30分钟更新一次统计信息的第一种选择听起来像是在浪费资源。 因此,我研究了跟踪标志2389,它在原则上应该有帮助,但是这要求Leading列被标记为Ascending,并且当我使用Trace Flag 2388检查(PK)索引统计信息时,我发现该领先列实际上是品牌为固定-与同时更新其他表上的多个PK索引相同。 关于文具品牌的结果似乎没有太多指导,但是我确实发现KB2952101表示如果少于90%的插入物大于旧的最大值,它将被归类为文具。我们所有的插入内容都是新提交的内容,前导列是bigint IDENTITY列,因此100%的插入内容应大于先前的最大值。 所以我的问题是,当列显然是升序的时候,为什么要将该列打上固定的名称? 较早尝试解决某些日常运行的SQL(确实运行良好)的问题,导致设置了一项工作来每晚更新此表的统计信息。该更新不执行FULLSCAN,所以采样扫描有时可能会丢失新行,因此它并不总是以升序显示吗? 我唯一想到的可能会影响此的原因是,我们有一个后台运行的存档作业,删除了一定期限内的行。这会对品牌产生影响吗? 该服务器是SQL Server 2012 SP1。 更新:另一天,另一项统计信息更新-相同的固定品牌。自从之前的统计信息更新以来,已经有28049个新插入内容。每行都有插入时间的时间戳,因此如果我从timestamp <'20161102'的表中选择max(id),则会得到23313455类似地,如果我对今天的统计信息进行更新,则会得到23341504。 它们之间的区别是28049个新插入物,因此,如您所见,所有新插入物都被赋予了新的升序键(如预期的那样),这表明前导柱应被标记为升序而不是固定的。 在同一时期,我们的归档作业删除了213,629行(我们正在慢慢清除旧数据)。行数减少是否有可能为固定品牌做出贡献?我之前对此进行了测试,但看起来没有任何区别。 更新2:另一天,另一项统计信息更新,该列现在标记为升序!根据有关影响删除的理论,我检查了插入与删除相比更新的百分比,昨天有13%是插入,而前两天插入约占12%。我认为这没有任何决定性的意义。 有趣的是,相关表平均插入该主表中的每一行都会插入4行,并同时更新其统计信息,其IDENTITY PK列是否仍为Stationary !? 更新3:在周末,我们会获得更多插入。今天早上,领导小组回到了固定式。在上次统计信息更新中,我们有46840次插入,而只有34776次删除。 再次,有趣的是,我上面提到的相关表现在将其前导列标记为Ascending。没有文档可以解释这一点吗? 更新4:大约一周前,归档作业已经清除了积压的订单,因此我们一直在删除大约三分之二的要插入的行。这些统计数据在相关表中显示出混合的结果,其中一个显示固定,而两个显示上升,尽管它们均按相似的比例进行更新。

3
应该允许开发人员使用LocalDB还是“开发”实例?
就像之前在此处围绕“ 开发人员是否能够查询生产数据库? ” 这一问题的脉络一样,我想让您对另一个特别烦人的话题发表想法! 许多公司阻止开发人员在开发计算机上安装SQL Server Express等,而是促进使用集中式开发SQL Server。 具体而言,这样做是为了确保: 开发服务器和生产之间的补丁程序级别一致性 能够证明和验证上面的任何补丁 数据安全; 仅开发服务器上的数据用于开发 可恢复性;数据是可恢复的并且仍在备份 整理差异可能会在转移到生产中时引​​起问题 在我看来,所有这些论点都是特别无效的,也许是补丁的例外。但是,如果本地计算机上的数据库仅用于开发活动而不是测试,则当应用程序通过Test / UAT等进行生产时,将证明补丁是可行的。 排序规则似乎不是一个正当的理由,好像这是数据库的问题一样,无论如何在创建数据库时都应进行设置。据我所知,只有SharePoint和SCCM对此有问题;) 现在,假设它仅用于开发,并且数据库不会“移至”生产环境,唯一的移动是: 创建数据库的脚本正在生成以部署到生产环境 来自“生产”第三方系统的备份在适用于验证和开发的情况下被还原和截断 谁能看到任何问题吗?我想念什么吗? 我想最大的担忧之一是本地数据库实例过时的能力,但这就是软件管理问题,而不是DBA IMO。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.