压缩不会影响备份和恢复。
但这怎么可能呢?当然,如果我的表较小(由于压缩),那么这应该会对备份/恢复产生一些影响?如果我的表较小,那么加载速度应该更快。如果我的表需要一些解压,那么这应该会花费更长的时间。不管怎样,我就是不敢相信数据压缩对备份和恢复完全没有任何作用。
我缺少什么?
压缩不会影响备份和恢复。
但这怎么可能呢?当然,如果我的表较小(由于压缩),那么这应该会对备份/恢复产生一些影响?如果我的表较小,那么加载速度应该更快。如果我的表需要一些解压,那么这应该会花费更长的时间。不管怎样,我就是不敢相信数据压缩对备份和恢复完全没有任何作用。
我缺少什么?
我有一张桌子,我相信它的大小大部分归功于一根巨大的NVARCHAR(max)
柱子。我不知道如何测试它的大部分大小来自哪里。无论如何,这样的表会受益于行压缩吗?或者NVARCHAR(max)
已经以可变长度的方式保证行压缩不执行任何操作?
在没有激活数据库管理服务(DMS)的情况下,有哪些替代方法可以建立与PolarDB数据库集群的连接?
是否可以让不同的用户访问我的只读副本数据库?这实际上不是只读副本的一个流行用例吗?我希望一组有限的凭据能够访问我的主读写数据库,然后我希望其他人能够对只读副本进行只读访问以进行报告、临时查询等我不一定希望两个数据库具有完全相同的访问器。
我在托管只读副本的服务器上创建了 Microsoft Entra 登录名,但以下是当我尝试创建用于数据库访问的用户时得到的结果。
Msg 3906, Level 16, State 2, Line 1
Failed to update database "********" because the database is read-only.
嗯,当然数据库是只读的,它是我的只读副本。但我并不是尝试将数据写入数据库,只是为组织中允许访问只读副本的人员设置元安全详细信息。这不能做吗?
我有两个 Docker 容器,每个容器都有一个 Postgres 数据库。我使用 Docker 卷将每个容器的 Postgres 套接字暴露给另一个容器,如下所示:
docker run --rm -itd --name=containerone -p 127.0.0.1:3003:3000 -v containeronepgsocket:/var/run/postgresql -v containertwopgsocket:/var/run/postgresql_containertwo registry.gitlab.com/mycont/mycont
上面的内容使得在容器中我有常规套接字/var/run/postgresql
以及套接字/var/run/postgresql_containertwo
我的目标是能够使用 Postgres 对等身份验证方法(即不需要密码)从另一个容器中查询每个容器。
我在通过 javascript 查询时成功实现了这一点。这是我的代码,使用容器一内的 Sequelize 包来查询容器二:
const sequelize_containertwo = new Sequelize('containertwo', 'myuser', undefined, {
host: '/var/run/postgresql_containertwo',
dialect: 'postgres'
});
如您所见,密码保持未定义状态。只要套接字位于操作系统中,并且我使用正确的操作系统用户,对等身份验证方法就可以工作,并且我能够查询其他容器。
但我也有 PL/pgSQL 函数,并且我需要从这些函数中查询其他容器。这就是我遇到问题的地方。在函数内,我正在查询同一个容器,但我还需要查询另一个容器中的数据。
为了实现这一点,我的第一个想法是使用 dblink。我尝试做这样的事情:
SELECT *
FROM dblink('postgresql:///containertwo_db?host=/var/run/postgresql_containertwo',
SELECT mycol
FROM mytable
)
AS t1(mycol BIGINT);
这将主机作为连接字符串中的参数提供。我已经成功使用此连接字符串但从 docker_entrypoint 文件连接到套接字。当我在 dblink 中尝试时,收到需要密码的错误。
如何从 PL/pgSQL 函数中查询其他容器并使用对等身份验证?我可以通过 dblink 来完成吗?如果可以,怎么做?或者还有其他办法吗?
我使用此代码进行批量插入
BULK INSERT [Table]
FROM 'D:\phones.txt'
WITH
(
ROWTERMINATOR = '0x0a'
)
我的数据只有一列 10 个字符
例如
| 1234567890 |
| 1234567891 |
| 1234567892 |
保存到数据库后,通过运行以下代码,可以更加显示数据的长度
SELECT TOP (1)
[Phone]
,LEN([Phone]) AS Phonelength
FROM [Table]
结果
电话 | 电话长度 |
---|---|
1234567891 | 11 |
添加到字段末尾的额外字符是新行
为什么要添加新行?
我正在尝试使用此处的说明 -
在托管我的主数据库的服务器和托管我的只读副本的服务器之间复制登录名。这对我来说很重要,因为我希望当前正在查询生产数据库的所有用户开始查询只读副本。
我能够在主服务器上的 master 数据库中创建存储过程,但是当我尝试按照说明执行存储过程时,我收到以下错误:
执行 sp_help_revlogin
消息 229,级别 14,状态 5,过程 sp_help_revlogin,第 1 行 [批处理起始行 0] 对对象“sp_help_revlogin”、数据库“master”、架构“dbo”的 EXECUTE 权限被拒绝。
我该如何克服这个问题?
我正在使用 Azure 的托管 SQL 数据库,并以管理员身份登录服务器(使用定义为 Microsoft Entra 管理员的帐户)。
谢谢你的建议!
我最近正在查询我们的内部数据库库存工具以获取服务器、实例和数据库的列表,并向每个服务器、实例和数据库添加相应的状态。
Server ˂-- 1 : n --˃ Instance ˂-- 1 : n --˃ Database
˄ ˄ ˄
| | |
| 1 : 1 |
| | |
| ˅ |
+-- 1 : 1 --˃ Status ˂-- 1 : 1 --+
读作:
...一个服务器可以有多个实例
...一个实例可以有多个数据库
...一个服务器、一个实例和一个数据库可以有一个状态
CREATE TABLE [Status]
(
StatusID int,
StatusName char(20),
);
INSERT INTO [Status] (StatusID, StatusName)
VALUES
(1,'Productive'),
(2,'Prod ACC'),
(3,'Prod APP'),
(4,'Test'),
(5,'Test ACC'),
(6,'Test APP'),
(7,'OFFLINE'),
(8,'Reserved'),
(9,'Decommisioned');
CREATE TABLE [Server]
(
ServerID int,
ServerName char(20),
ServerStatusID int
);
INSERT INTO [Server] (ServerID, ServerName, ServerStatusID)
VALUES
(1,'FirstServer',1),
(2,'SecondServer',2),
(3,'ThirdServer',5),
(4,'FourthServer',8),
(5,'FifthServer',8);
CREATE TABLE [Instance]
(
InstanceID int,
ServerID int,
InstanceName char(30),
InstanceStatusID int
);
INSERT INTO [Instance]
(InstanceID, ServerID, InstanceName, InstanceStatusID)
VALUES
(1,1,'GENERAL',1),
(2,1,'TAXES',1),
(3,2,'GENERAL',9),
(4,2,'SOCIAL',2),
(5,3,'GENERAL',5),
(6,3,'FBI',8),
(7,5,'COMINGSOON',8);
CREATE TABLE [Database]
(
DatabaseID int,
InstanceID int,
DatabaseName char(30),
DatabaseStatusID int
);
INSERT INTO [Database]
(DatabaseID, InstanceID, DatabaseName, DatabaseStatusID)
VALUES
(1,1,'master',1),
(2,1,'model',1),
(3,1,'msdb',1),
(4,1,'UserDB1',1),
(5,2,'master',1),
(6,2,'model',1),
(7,2,'msdb',1),
(8,2,'TaxesDB',1),
(9,4,'master',2),
(10,4,'model',2),
(11,4,'msdb',2),
(12,4,'HealthCareDB',2),
(13,5,'master',5),
(14,5,'model',5),
(15,5,'msdb',5),
(16,5,'GeneralUserDB',5),
(17,6,'master',8),
(18,6,'model',8),
(19,6,'msdb',8),
(20,6,'CriminalDB',8);
初始 SELECT 语句仅涉及连接三个表:服务器、实例、数据库,如下所示:
-- Simple SELECT to get all information on Servers, Instances and Databases
-- The status of the server, instance or database is not returned
SELECT
ServerName,
InstanceName,
DatabaseName
FROM [Server] as srv
LEFT JOIN [Instance] as ins
ON srv.ServerID = ins.ServerID
LEFT JOIN [Database] as dbs
ON ins.InstanceID = dbs.InstanceID;
请注意...
服务器名称 | 实例名称 | 数据库名称 |
---|---|---|
第一服务器 | 一般的 | 掌握 |
第一服务器 | 一般的 | 模型 |
第一服务器 | 一般的 | 数据库数据库 |
第一服务器 | 一般的 | 用户数据库1 |
第一服务器 | 税收 | 掌握 |
第一服务器 | 税收 | 模型 |
第一服务器 | 税收 | 数据库数据库 |
第一服务器 | 税收 | 税收数据库 |
第二服务器 | 一般的 | 无效的 |
第二服务器 | 社会的 | 掌握 |
第二服务器 | 社会的 | 模型 |
第二服务器 | 社会的 | 数据库数据库 |
第二服务器 | 社会的 | 医疗保健数据库 |
第三服务器 | 一般的 | 掌握 |
第三服务器 | 一般的 | 模型 |
第三服务器 | 一般的 | 数据库数据库 |
第三服务器 | 一般的 | 通用用户数据库 |
第三服务器 | 联邦调查局 | 掌握 |
第三服务器 | 联邦调查局 | 模型 |
第三服务器 | 联邦调查局 | 数据库数据库 |
第三服务器 | 联邦调查局 | 刑事数据库 |
第四服务器 | 无效的 | 无效的 |
第五服务器 | 即将推出 | 无效的 |
在下一个语句中,我决定将状态添加到每个元素(服务器、实例、数据库),并JOIN
使用表编辑每个表,Status
如下所示:
-- Advanced SELECT to get all information on Servers, Instances and Databases
-- including their status
SELECT
ServerName,
srvst.StatusName,
InstanceName,
insst.StatusName,
DatabaseName,
dbsst.StatusName
FROM [Server] as srv
JOIN [Status] as srvst
ON srv.ServerStatusID = srvst.StatusID
LEFT JOIN [Instance] as ins
ON srv.ServerID = ins.ServerID
JOIN [Status] as insst
ON ins.InstanceStatusID = insst.StatusID
LEFT JOIN [Database] as dbs
ON ins.InstanceID = dbs.InstanceID
JOIN [Status] as dbsst
ON dbs.DatabaseStatusID = dbsst.StatusID
;
令我惊讶的是,没有实例和数据库的服务器以及有实例但没有数据库的服务器不再列出:
服务器名称 | 状态名称 | 实例名称 | 状态名称 | 数据库名称 | 状态名称 |
---|---|---|---|---|---|
第一服务器 | 富有成效 | 一般的 | 富有成效 | 掌握 | 富有成效 |
第一服务器 | 富有成效 | 一般的 | 富有成效 | 模型 | 富有成效 |
第一服务器 | 富有成效 | 一般的 | 富有成效 | 数据库数据库 | 富有成效 |
第一服务器 | 富有成效 | 一般的 | 富有成效 | 用户数据库1 | 富有成效 |
第一服务器 | 富有成效 | 税收 | 富有成效 | 掌握 | 富有成效 |
第一服务器 | 富有成效 | 税收 | 富有成效 | 模型 | 富有成效 |
第一服务器 | 富有成效 | 税收 | 富有成效 | 数据库数据库 | 富有成效 |
第一服务器 | 富有成效 | 税收 | 富有成效 | 税收数据库 | 富有成效 |
第二服务器 | 产品ACC | 社会的 | 产品ACC | 掌握 | 产品ACC |
第二服务器 | 产品ACC | 社会的 | 产品ACC | 模型 | 产品ACC |
第二服务器 | 产品ACC | 社会的 | 产品ACC | 数据库数据库 | 产品ACC |
第二服务器 | 产品ACC | 社会的 | 产品ACC | 医疗保健数据库 | 产品ACC |
第三服务器 | 测试ACC | 一般的 | 测试ACC | 掌握 | 测试ACC |
第三服务器 | 测试ACC | 一般的 | 测试ACC | 模型 | 测试ACC |
第三服务器 | 测试ACC | 一般的 | 测试ACC | 数据库数据库 | 测试ACC |
第三服务器 | 测试ACC | 一般的 | 测试ACC | 通用用户数据库 | 测试ACC |
第三服务器 | 测试ACC | 联邦调查局 | 预订的 | 掌握 | 预订的 |
第三服务器 | 测试ACC | 联邦调查局 | 预订的 | 模型 | 预订的 |
第三服务器 | 测试ACC | 联邦调查局 | 预订的 | 数据库数据库 | 预订的 |
第三服务器 | 测试ACC | 联邦调查局 | 预订的 | 刑事数据库 | 预订的 |
通过反复试验的方法检查了各种选项后,我发现必须将表JOIN
上的Status
更改为 a ,LEFT JOIN
以允许该语句显示没有实例或数据库的服务器,并显示没有数据库的实例:
-- Advanced SELECT to get all information on Servers, Instances and Databases
-- including their status
SELECT
ServerName,
srvst.StatusName,
InstanceName,
insst.StatusName,
DatabaseName,
dbsst.StatusName
FROM [Server] as srv
LEFT JOIN [Status] as srvst
ON srv.ServerStatusID = srvst.StatusID
LEFT JOIN [Instance] as ins
ON srv.ServerID = ins.ServerID
LEFT JOIN [Status] as insst
ON ins.InstanceStatusID = insst.StatusID
LEFT JOIN [Database] as dbs
ON ins.InstanceID = dbs.InstanceID
LEFT JOIN [Status] as dbsst
ON dbs.DatabaseStatusID = dbsst.StatusID;
服务器名称 | 状态名称 | 实例名称 | 状态名称 | 数据库名称 | 状态名称 |
---|---|---|---|---|---|
第一服务器 | 富有成效 | 一般的 | 富有成效 | 掌握 | 富有成效 |
第一服务器 | 富有成效 | 一般的 | 富有成效 | 模型 | 富有成效 |
第一服务器 | 富有成效 | 一般的 | 富有成效 | 数据库数据库 | 富有成效 |
第一服务器 | 富有成效 | 一般的 | 富有成效 | 用户数据库1 | 富有成效 |
第一服务器 | 富有成效 | 税收 | 富有成效 | 掌握 | 富有成效 |
第一服务器 | 富有成效 | 税收 | 富有成效 | 模型 | 富有成效 |
第一服务器 | 富有成效 | 税收 | 富有成效 | 数据库数据库 | 富有成效 |
第一服务器 | 富有成效 | 税收 | 富有成效 | 税收数据库 | 富有成效 |
第二服务器 | 产品ACC | 一般的 | 退役 | 无效的 | 无效的 |
第二服务器 | 产品ACC | 社会的 | 产品ACC | 掌握 | 产品ACC |
第二服务器 | 产品ACC | 社会的 | 产品ACC | 模型 | 产品ACC |
第二服务器 | 产品ACC | 社会的 | 产品ACC | 数据库数据库 | 产品ACC |
第二服务器 | 产品ACC | 社会的 | 产品ACC | 医疗保健数据库 | 产品ACC |
第三服务器 | 测试ACC | 一般的 | 测试ACC | 掌握 | 测试ACC |
第三服务器 | 测试ACC | 一般的 | 测试ACC | 模型 | 测试ACC |
第三服务器 | 测试ACC | 一般的 | 测试ACC | 数据库数据库 | 测试ACC |
第三服务器 | 测试ACC | 一般的 | 测试ACC | 通用用户数据库 | 测试ACC |
第三服务器 | 测试ACC | 联邦调查局 | 预订的 | 掌握 | 预订的 |
第三服务器 | 测试ACC | 联邦调查局 | 预订的 | 模型 | 预订的 |
第三服务器 | 测试ACC | 联邦调查局 | 预订的 | 数据库数据库 | 预订的 |
第三服务器 | 测试ACC | 联邦调查局 | 预订的 | 刑事数据库 | 预订的 |
第四服务器 | 预订的 | 无效的 | 无效的 | 无效的 | 无效的 |
第五服务器 | 预订的 | 即将推出 | 预订的 | 无效的 | 无效的 |
这里有一个db<>fiddle的链接来重现我的发现。
为什么 SQL Server 需要在表LEFT JOIN
中Status
显示不存在的子项以及查询来显示这些项?
我正在将数据库恢复到事务和合并复制的每一端。基本上,发布者和订阅者最初是同一个数据库。
我仍然需要运行快照代理才能开始工作。
我的意思是,如何在不运行 bcp 命令的情况下运行快照,而不复制数据?
不过,我同意复制数据结构。
我有下面的 SQL 查询,运行速度非常慢。至于这个查询,这是由于“ORDER BY”语句造成的,因为Postgres通过“计数器”扫描changes
表,它可以有数百万个值。删除“ORDER BY”语句使查询速度更快。
对于上面提到的其他查询,我通过在两个字段上创建索引来优化它。然而,对于这个查询,我不确定哪个索引是正确的。我尝试打开索引,(item_id, counter)
但它根本没有帮助,我不知道我还能尝试什么。有什么建议么?
慢SQL查询:
SELECT "id", "item_id", "item_name", "type", "updated_time", "counter"
FROM "changes"
WHERE counter > -1
AND type = 2
AND item_id IN (SELECT item_id FROM user_items WHERE user_id = 'xxxx')
ORDER BY "counter" ASC
LIMIT 200;
解释(分析、缓冲区、设置)结果:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Limit (cost=1001.15..27628.99 rows=200 width=99) (actual time=98730.912..116273.818 rows=200 loops=1)
Buffers: shared hit=78113369 read=3224064 dirtied=3
I/O Timings: read=137436.119
-> Gather Merge (cost=1001.15..10431526.45 rows=78343 width=99) (actual time=98730.911..116273.783 rows=200 loops=1)
Workers Planned: 2
Workers Launched: 2
Buffers: shared hit=78113369 read=3224064 dirtied=3
I/O Timings: read=137436.119
-> Nested Loop (cost=1.13..10421483.70 rows=32643 width=99) (actual time=98493.185..112919.559 rows=75 loops=3)
Buffers: shared hit=78113369 read=3224064 dirtied=3
I/O Timings: read=137436.119
-> Parallel Index Scan using changes_pkey on changes (cost=0.56..5949383.56 rows=6197986 width=99) (actual time=1.076..42523.117 rows=4075591 loops=3)
Index Cond: (counter > '-1'::integer)
Filter: (type = 2)
Rows Removed by Filter: 10370914
Buffers: shared hit=18993521 read=2672415
I/O Timings: read=85551.814
-> Index Scan using user_items_item_id_index on user_items (cost=0.56..0.72 rows=1 width=23) (actual time=0.017..0.017 rows=0 loops=12226772)
Index Cond: ((item_id)::text = (changes.item_id)::text)
Filter: ((user_id)::text = 'xxxx'::text)
Rows Removed by Filter: 1
Buffers: shared hit=59119848 read=551649 dirtied=3
I/O Timings: read=51884.305
Settings: effective_cache_size = '16179496kB', jit = 'off', work_mem = '100000kB'
Planning Time: 1.465 ms
Execution Time: 116273.929 ms
(26 rows)
索引:
"changes_pkey" PRIMARY KEY, btree (counter)
"changes_id_index" btree (id)
"changes_id_unique" UNIQUE CONSTRAINT, btree (id)
"changes_item_id_index" btree (item_id)
"changes_user_id_counter_index" btree (user_id, counter)
"changes_user_id_index" btree (user_id)