数据库管理员

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

2
如何在PostgreSQL中复制数据库?
我需要将现有数据库(包括其架构和结构)复制到另一个新数据库。我在shell命令环境而不是pgadmin中需要它。请帮助我。 nohup pg_dump exampledb > example-01.sql createdb -O postgres exampledbclone_01 我的用户是“ postgres” nohup psql exampledbclone_01 < example-01.sql $ pg_dump mydb > db.sql $ psql -d newdb -f db.sql
17 postgresql 

1
使用子查询时,Postgres错误[列必须出现在GROUP BY子句中或在聚合函数中使用]
我有两个桌子employee和phones。员工可以使用0到n个电话号码。我想列出员工姓名和他们的电话号码。我正在使用下面的查询运行正常。 SELECT empname,array_agg(phonenumber) AS phonenumbers FROM employee LEFT OUTER JOIN phones ON employee.empid = phones.empid GROUP BY employee.empid 员工表可能包含大量行。我一次只想获取一些员工。例如,我想获取3名员工的电话号码。我正在尝试运行此查询。 SELECT empname,array_agg(phonenumber) AS phonenumbers FROM (SELECT * FROM employee ORDER BY empname LIMIT 3 OFFSET 0) AS employee LEFT OUTER JOIN phones ON employee.empid = phones.empid GROUP BY employee.empid 但是我得到这个错误。ERROR: column …


3
为什么查询的解析方式不允许大多数子句中使用列别名?
在尝试编写查询时,我发现(困难的方式)SQL Server在执行查询时在解析SELECT之前很久就解析了查询中的WHERE。 的MSDN文档说,一般逻辑解析顺序是这样的:SELECT被解析几乎最后(因此导致“没有这样的对象[别名]”试图使用在其他条款列别名时误差)。甚至有人建议允许在任何地方使用别名,这被Microsoft团队否决,理由是ANSI标准合规性问题(这表明此行为是ANSI标准的一部分)。 作为程序员(不是DBA),我发现这种行为有些令人困惑,因为在我看来,它在很大程度上违反了使用列别名的目的(或者至少可以使列别名的功能更加强大)。在查询执行的较早阶段进行了解析),因为您真正可以使用别名的唯一位置是ORDER BY。作为程序员,似乎缺少使查询变得更强大,更便捷和更干燥的巨大机会。 看起来这是一个显而易见的问题,因此,还有其他原因决定除SELECT和ORDER BY之外的任何内容都不应使用列别名,但是这些原因是什么?
16 sql-server  alias 

7
有没有什么好的工具可以监视PostgreSQL数据库?
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为数据库管理员Stack Exchange 的主题。 4年前关闭。 我计划很快有几个高负载的postgresql数据库。我在管理高负载的mysql数据库方面有一些经验,但是现在我们必须使用postgresql。 我想知道什么是用于日常数据库管理和状态报告的最佳工具。(当然,控制台是最好的控制台,但我也想知道其他选项) 欢迎所有经验!

2
当SQL Server没有可用的物理内存时会发生什么?
在进行谷歌搜索时,我发现了一些相互矛盾的信息。 一些站点指出,当没有物理内存可用于数据时,SQL Server会将已存在的数据移至TEMPDB中(请参阅:SQL Server:使TempDb神秘化和建议)。 但是其他站点指出,当剩余的物理内存不足时,操作系统可以使用PAGE FILE并将数据从物理内存移至该页面(请参阅SQL Server的页面文件)。 我想知道当SQL Server的物理内存用尽时,它将在哪里写入数据?要tempdb还是OS页面文件?还是两者都可以?

2
使用的列大小比必要的大得多
我正在与其他人创建SQL Server数据库。其中一张表很小(6行),数据可能保持不变。极有可能会添加新行。该表如下所示: CREATE TABLE someTable ( id int primary key identity(1,1) not null, name varchar(128) not null unique ); INSERT INTO someTable values ('alice', 'bob something', 'charles can dance', 'dugan was here'); 我正在查看该name列的char长度,并且我认为它的值可能永远不会大于,例如32个字符,甚至可能不大于24个字符。我将此列更改为,例如,varchar(32)? 另外,将默认列大小保持为4、8、32等的倍数是否有任何优势?

2
SQL语句是否可以在SQL Server的单个会话中并发执行?
我已经编写了一个使用临时表的存储过程。我知道在SQL Server中,临时表是会话作用域的。但是,我无法找到有关会话功能的确切信息。特别是,如果此存储过程有可能在单个会话中同时执行两次,则该过程中的事务需要更高的隔离级别,因为这两个执行现在共享一个临时表。

1
在RAW分区上创建数据库不再有效?
我正在尝试使用两个原始分区(即未格式化的分区)创建数据库。 Microsoft Docs声明您可以执行此操作,您只需要指定原始分区的驱动器号即可,如下所示: CREATE DATABASE DirectDevice ON (NAME = DirectDevice_system, FILENAME = 'S:') LOG ON (NAME = DirectDevice_log, FILENAME = 'T:') 但是,SQL Server 2017返回此错误: 消息5170,级别16,状态4,第1行 无法创建文件'S:',因为它已经存在。更改文件路径或文件名,然后重试该操作。 消息1802,级别16,状态4,第1行 CREATE DATABASE失败。列出的某些文件名无法创建。检查相关错误。 文档的相关部分指出: 如果文件位于原始分区上,则os_file_name必须仅指定现有原始分区的驱动器号。每个原始分区上只能创建一个数据文件。 是的,驱动器S:和T:都是我系统中确实存在的未格式化原始分区: DISKPART>详细分区 分区4 类型:ebd0a0a2-b9e5-4433-87c0-68b6b72699c7 隐藏:否 必填:否 属性:0000000000000000 字节偏移量:999934656512 卷### Ltr标签Fs类型尺寸状态信息 ---------- --- -------------- ----- ---------- ------- ---- ----- -------- …

1
为什么CHECKDB读取具有内存优化表的数据库上的事务日志文件?
tl; dr:为什么CHECKDB读取具有内存优化表的用户数据库的事务日志? 似乎CHECKDB在检查我的一个数据库-特别是使用内存中OLTP表的数据库时,正在读取用户数据库的事务日志文件。 该数据库的CHECKDB仍会在相当长的时间内完成,因此我主要是对行为感到好奇。但绝对是此实例上所有数据库中CHECKDB的最长持续时间。 从Paul Randal的史诗《从各个角度看CHECKDB:完整描述所有CHECKDB阶段》中,我看到SQL 2005以前的CHECKDB 用于读取日志,以便获得数据库的一致视图。但是由于这是2016年,因此它使用内部数据库快照。 但是,快照的先决条件之一是: 源数据库不得包含MEMORY_OPTIMIZED_DATA文件组 我的用户数据库具有这些文件组之一,因此看起来快照不在桌面上。 根据CHECKDB文档: 如果无法创建快照,或者指定了TABLOCK,则DBCC CHECKDB将获取锁以获取所需的一致性。在这种情况下,需要排他数据库锁来执行分配检查,并且需要共享表锁来执行表检查。 好的,所以我们正在执行数据库和表锁定而不是快照锁定。但这仍然不能解释为什么它必须读取事务日志。那有什么呢? 我在下面提供了一个脚本来重现该场景。它用于sys.dm_io_virtual_file_stats标识日志文件读取。 请注意,大多数情况下,它读取日志的一小部分(480 KB),但偶尔读取的日志则更多(48.2 MB)。在我的生产场景中,当我们运行CHECKDB时,它每天晚上在午夜读取大多数日志文件(约占2 GB文件的1.3 GB)。 这是到目前为止我通过脚本获得的输出示例: collection_time num_of_reads num_of_bytes_read 2018-04-04 15:12:29.203 106 50545664 或这个: collection_time num_of_reads num_of_bytes_read 2018-04-04 15:25:14.227 1 491520 如果我用常规表替换内存优化的对象,则输出如下所示: collection_time num_of_reads num_of_bytes_read 2018-04-04 15:21:03.207 0 0 为什么CHECKDB读取日志文件?尤其是为什么它偶尔会读取日志文件的很大一部分? 这是实际的脚本: -- let's have …

1
如何在SQL Server盒上扩展卷?
这是针对系统操作员(或那些曾经经历过此经验的人)的问题。 我公司想在生产中的现有SQL Server盒上分配额外的磁盘空间。我们想知道是否可以联机完成扩展卷(在磁盘管理中为“扩展卷...”),还是需要关闭SQL Server服务。 为何应停止SQL Server Service来执行此操作,还是在白天只执行此操作可以吗? 以防万一系统规格相关。这是运行Windows 2012 R2和SQL Server 2008 R2的真实设备(无虚拟化)。 谢谢!

5
由于WHERE子句中的条目超过100,000个,导致SQL Server错误8632
我的问题(或至少是错误消息)与查询处理器用尽内部资源非常相似-极长的sql查询。 我的客户正在使用SQL选择查询,其中包含一个正好有100,000个条目的子句。 查询失败,出现错误8632和错误消息 内部错误:已达到表达式服务限制。请在查询中查找可能复杂的表达式,然后尝试简化它们。) 我非常奇怪地抛出此错误消息,恰好在100,000个条目处,所以我想知道这是否是可配置的值。是这种情况,如果是的话,如何将该值增加到更高的值? 在MSDN上,建议重新编写查询,但我想避免这种情况。 同时,我发现我正在谈论的条目列表包含自然数,其中有些看起来似乎是连续的(例如(1,2,3,6,7,8,9,10,12, 13,15,16,17,18,19,20)。 这使得SQL的子句类似于: where entry in (1,2,3,6,7,8,9,10,12,13,15,16,17,18,19,20) 我可以将其转换为: where (entry between 1 and 3) OR (entry between 6 and 10) OR (entry between 12 and 13) OR (entry between 15 and 20) 可以通过以下方式将其缩短: where entry in (1,...,3,6,...,10,12,13,15,...,20) ...或类似的东西?(我知道这是一个长期的尝试,但这会使软件更新更容易且更具可读性) 供您参考:where子句中的数据是在另一个表上完成的计算结果:首先在该表的开头读取并过滤该表的条目,然后再进行一些额外的处理(使用SQL),这种额外处理的结果是更多的过滤,其结果在where子句中使用。由于不可能用SQL编写完整的过滤,因此使用了上述方法。显然,子句的内容可能在每个处理过程中都发生变化,因此需要动态解决方案。

1
PostgreSQL以什么顺序检查对象权限?
给定数据库角色,定义为存储过程user1的函数something()和创建的视图如下: CREATE VIEW view1 AS select * from something() 并且,鉴于此权限: REVOKE ALL ON FUNCTION something FROM user1 REVOKE SELECT ON view1 FROM user1 当我跑步时SELECT * FROM view1,出现错误permission denied for function something()。 我的问题是,如果我撤消了对视图的选择权限,为什么要调用该函数?我期待收到类似的东西: permission denied for relation view1 谢谢!

2
不(a = 1 AND b = 1)vs(a <> 1 AND b <> 1)
在WHERESQL查询的子句中,我希望这两个条件具有相同的行为: NOT (a=1 AND b=1) 与 a&lt;&gt;1 AND b&lt;&gt;1 第一个条件的行为符合预期,而我建议第二个条件做相同的事情,但事实并非如此。 这是非常基本的内容,但令人遗憾的是,我看不到自己在做错什么。
16 condition 


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.