我刚刚查看了PostgreSQL的宣传页面,我发现了这件小艺术品:
它是“Turtle Style” PostgreSQL 标志。这是多少岁了,PostgreSQL 是否曾经正式使用乌龟而不是大象?这里有什么故事?
如果文件组包含列存储索引,则似乎设置文件组以read_only
防止dbcc checkdb
整个数据库。尝试运行checkdb
或checkfilegroup
(对于数据库中的任何文件组,包括读写辅助文件和[PRIMARY]
)时,将返回以下错误...
Msg 8921, Level 16, State 1, Line 24
Check terminated. A failure was detected while collecting facts.
Possibly tempdb out of space or a system table is inconsistent. Check previous errors.
Run Code Online (Sandbox Code Playgroud)
是否有支持在只读文件组中存储列存储数据的方法?还是在这种情况下我无法进行完整性检查?
create database check_fg_ro
go
use check_fg_ro
go
exec sp_changedbowner 'sa';
go
alter database check_fg_ro add filegroup check_fg_ro_2;
alter database check_fg_ro
add file (
name='check_fg_ro_2'
,filename='C:\check_fg_ro_2.ndf'
) to filegroup check_fg_ro_2;
go
create table …
Run Code Online (Sandbox Code Playgroud) sql-server filegroups columnstore dbcc-checkdb read-only-database
在我的新工作中,我们在每台服务器上都有多个命名实例。例如
我在工作中有一个 SQL PowerShell 脚本,它调用操作系统,调用Foo.exe
但需要传递命令行参数(连接字符串)。每个实例上都将存在一个 SQL 代理作业,带有 PowerShell 类型的步骤,需要知道当前上下文是什么。即此执行在 DevIntegrated 上开始。
我不想让每个脚本都以...开头
$thisInstance = "Dev"
Run Code Online (Sandbox Code Playgroud)
...特别是因为当我们在接下来的几个月中迁移到环境(新服务器和命名实例)时,我必须对其进行编辑。
如果我启动 SQLPS,我可以通过切片和切块 Get-Location 的结果或运行来确定我的实例
(Invoke-Sqlcmd -Query "SELECT @@servername AS ServerName" -SuppressProviderContextWarning).ServerName
Run Code Online (Sandbox Code Playgroud)
当 SQL 代理启动 PowerShell 类型的作业时,它会在 C:\windows\system32 中启动,并且Get-Location
路由不起作用,因为它不在 SQLSERVER 上下文中。我可以切换到该上下文,但我将处于 SQL Server 的“根”,并且不知道我应该在哪个实例中。Invoke-Sqlcmd
出于相同的原因,使用该路由也不起作用(从技术上讲,它在那里超时不是默认实例)
据我所知,我已经列举了我可以进入工作日志的所有基本“事情”,但似乎没有任何显示 SQLSERVER:\SQL\Server1\DevIntegrated
Get-ChildItem
Get-Host
Get-Location
Get-Process
Get-PSDrive
Get-PSProvider
Get-Service
Get-TraceSource
Get-Variable
Get-Process
似乎我可以使用它和一些尝试通过击中实例和匹配 spid 来拼凑东西的巫术,但这听起来像是来自地狱的血腥黑客。一定有一些基本的东西我错过了,有人能解释一下吗?
我曾调查过使用其他工作类型,但没有得到令人满意的解决方案。研究表明,SQL 代理下列出的 PowerShell 是 SQLPS,通过右键单击代理启动它的实例会自动将我放到正确的位置。只有当我将交互式代码粘贴到作业步骤中时,我才知道前面提到的差异。
操作系统的作业类型使我处于相同的状态,因为我找不到确定哪个实例将我放入命令外壳的方法。当然,我可以使用 sqlcmd 并获取 的值,@@servername …
将一个 quickie proc 放在一起以帮助调试,我遇到了一个似乎是编译器错误的地方。
create proc spFoo
@param bit
as
begin
if @param = 0
begin
select *
into #bar
from [master].dbo.spt_values
-- where number between ...
end
else
begin
select top 10 *
into #bar
from [master].dbo.spt_values
order by newid();
end;
end;
Run Code Online (Sandbox Code Playgroud)
尝试上述返回以下错误
消息 2714,级别 16,状态 1,过程 spFoo,第 19 行
数据库中已经有一个名为“#bar”的对象。
在人类可读的意义上,proc 似乎很好:select into
由于它们被包裹在if-else
块中,因此只会执行一个语句。不过很好,SQL Server 无法确认这些语句在逻辑上是否相互排斥。也许更令人困惑的是,当将drop table #foo
放在 if-else 块中时错误仍然存在(假设它会告诉编译器取消分配对象名称),如下所示。
create proc spFoo
@param bit
as
begin
select top 1 *
into #bar …
Run Code Online (Sandbox Code Playgroud) 目前我正在试图创建一个表,一个文本列将比较案例在默认情况下是敏感的。这是因为我们有一个第三方程序可以对我们的数据库执行搜索。该SELECT
程序使用的语句不能更改。
抽象的问题是我们不知何故需要这个搜索不区分大小写,但它目前是区分大小写的。
我读到 Postgres 12 确实支持允许这种行为的非确定性排序规则。
我在德国 Windows 机器上安装了 Postgres 服务器(版本 PostgreSQL 12.1,由 Visual C++ build 1914 编译,64 位)。
因此,出于测试目的,我创建了一个新数据库进行测试:
CREATE DATABASE collation_test
WITH
OWNER = postgres
ENCODING = 'UTF8'
CONNECTION LIMIT = -1;
Run Code Online (Sandbox Code Playgroud)
在这个数据库中,我创建了以下排序规则,我在一篇关于这些排序规则的文章中找到了
CREATE COLLATION collat_ci (
provider = 'icu',
locale = 'und-u-ks-level2',
deterministic = false
);
Run Code Online (Sandbox Code Playgroud)
在此之后,我需要一个表来测试这个排序规则
CREATE TABLE public.person
(
"Id" bigint NOT NULL,
"Name" text COLLATE public.collat_ci,
PRIMARY KEY ("Id")
);
ALTER TABLE public.person
OWNER to postgres;
INSERT …
Run Code Online (Sandbox Code Playgroud) 产品版本 10.0.2531.0 产品级别 SP1 版本 企业版(64 位) 引擎版本 3
$conn = New-Object System.Data.SqlClient.SqlConnection("Data Source=localhost\myServer; Initial Catalog=SysAdmin; Integrated Security=SSPI")
$conn.Open()
$cmd = $conn.CreateCommand()
gwmi -query "select * from Win32_LogicalDisk where DriveType=3" | select Name, FreeSpace, Size | foreach {
$Name = $_.Name.substring(0,1)
$FreeSpace = $_.FreeSpace
$Size = …
Run Code Online (Sandbox Code Playgroud) 我正在设计一个过程来测试我的 postgresql 10.8 备份,方法是将它们恢复到一次性虚拟机中的随机时间点。不过,我一直无法完全自动化该过程。我在官方文档的第 8 步(第 25.3.4 节)被阻止
- 启动服务器。
执行pg_ctl start
over ssh 时,命令会挂起,直到被杀死。如果我直接通过 ssh 连接到 VM 并执行pg_ctl start
,则命令会按预期快速返回。
2012 年的这个帖子似乎描述了一个类似的场景。在我的情况,不过Postgres的过程也即使当它是挂呼叫会话被杀死成功启动(可能是9.0.5和10.8之间虽然有所改善?)。
这个 github 问题似乎相关,但遗憾的是,通过用一种我不知道的语言进行了长时间的重写“解决了”,并最终得出结论,它是pg_ctl
二进制文件中的一个错误。
如何自动执行第 8 步,以便我可以继续对备份媒体进行后续验证测试?
这是我需要破解的二进制文件中的一个突出错误吗?或者我错过了一个明智的实施?
今天我想定义一个 uuid 的 value 00000000-0000-0000-0000-000000000000
。作为一名 SQL Server 人员,我通常会...
select cast(0x0 as uniqueidentifier);
Run Code Online (Sandbox Code Playgroud)
...但我现在在 postgres 世界中,所以我提出了一个明智的...
select cast('\x00'::bytea as uuid);
Run Code Online (Sandbox Code Playgroud)
ERROR: cannot cast type bytea to uuid
LINE 1: select cast('\x00'::bytea as uuid);
^
Run Code Online (Sandbox Code Playgroud)
该死!所以我头部到对类型转换的Postgres文档希望看到像DOC这一个来审查,数据类型,我可以通过与默认情况下,无需施展创造一个显式类型转换。
如果文档中确实存在这样的图表,那么它就会被很好地隐藏起来。谷歌在这方面也不是很有帮助。
是否有关于 postgresql 中默认允许的类型转换的良好文档参考?
需要明确的是,我实际上并不关心 uuid
该文档页面国家(重点煤矿)
退出状态
如果 psql 正常完成,则向 shell 返回 0,如果发生自身的致命错误(例如,内存不足,找不到文件),则返回 1,如果与服务器的连接出现故障并且会话没有交互,则返回3,如果脚本中发生错误并且设置了变量 ON_ERROR_STOP。
但是,我似乎无法诱导退出代码 3。
bash-4.2$ uname -a
Linux mvpg-centos-76.vagrantup.com 3.10.0-957.21.3.el7.x86_64 #1 SMP Tue Jun 18 16:35:19 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
bash-4.2$ psql --version
psql (PostgreSQL) 10.12
bash-4.2$ psql -v ON_ERROR_STOP=1 -c 'select 1/0;'
ERROR: division by zero
bash-4.2$ echo $?
1
bash-4.2$
Run Code Online (Sandbox Code Playgroud)
我还在 FreeBSD 11.3 和 Darwin 19.3 上重现了这种行为。我是否误解了文档或使用了错误的语法?
sql-server ×5
postgresql ×4
powershell ×2
collation ×1
columnstore ×1
connections ×1
datatypes ×1
dbcc-checkdb ×1
ddl ×1
filegroups ×1
psql ×1
restore ×1
ssh ×1
tempdb ×1