我知道如果常规视图所依赖的表被删除,则常规视图将无效。
这同样适用于物化视图吗?
我假设在物化视图中,由于数据已与源表分离,因此应该可以删除该表,但如果尝试重新创建或刷新视图,则会发出警告或中止。
简而言之,只要不尝试重新创建物化视图,就可以将其与其源表解耦吗?
我知道如果常规视图所依赖的表被删除,则常规视图将无效。
这同样适用于物化视图吗?
我假设在物化视图中,由于数据已与源表分离,因此应该可以删除该表,但如果尝试重新创建或刷新视图,则会发出警告或中止。
简而言之,只要不尝试重新创建物化视图,就可以将其与其源表解耦吗?
例如,我需要在datadir
(临时)创建一个名为“backup”的目录来存储备份文件,但我注意到MySQL将此目录解释为MySQL中的数据库。这安全吗?datadir
是否可以在MySQL 不认为它是数据库的情况下创建一个目录?”
从 pglz更改default_toast_compression
为 lz4 后,我想将现有数据更新为新的、更快的压缩。
唯一的方法似乎是转储整个表并从头开始重新创建它,这对于非常大和/或正在使用的数据库来说并不理想。
我发现这个邮件列表线程表明UPDATE tab SET id = id
可以做到这一点,但测试表明什么也没有发生。
postgres=# SHOW default_toast_compression;
default_toast_compression
---------------------------
lz4
(1 row)
postgres=# SELECT pg_column_compression(data) FROM pg_largeobject WHERE loid=49946 AND pageno=0;
pg_column_compression
-----------------------
pglz
(1 row)
postgres=# UPDATE pg_largeobject SET data=data WHERE loid=49946 AND pageno=0;
UPDATE 1
postgres=# SELECT pg_column_compression(data) FROM pg_largeobject WHERE loid=49946 AND pageno=0;
pg_column_compression
-----------------------
pglz
(1 row)
我想知道是否有办法更新server_uuid;我正在尝试主从复制,并且我需要不同的server_uuid。
仅供参考 - 我的 my.cnf 文件中没有 server_uuid,当我像这样更新它时:
mysql> SET GLOBAL server_uuid = '1';
我收到以下错误:
ERROR 1238 (HY000): Variable 'server_uuid' is a read only variable
我正在设置一个 SQL Server 可用性组,其中包含集群内的三个同步副本(一个主副本和两个辅助副本)以及来自另一个数据中心的另一个集群的附加异步副本。我需要使用远程集群中异步副本的公共 IP 来公开主副本。
我的目标是使用专门用于远程异步副本的公共 IP 公开主副本。相反,集群中的其他同步副本使用集群中主副本的 DNS 名称与主副本进行通信。
创建可用性组时,我需要指定每个副本的端点 URL。是否可以为 SQL Server 可用性组中的不同副本显式使用主副本的不同端点 URL?我想确保只有远程异步副本使用公共 IP 与主副本进行通信。相反,集群中的其他副本继续使用集群中主副本的 DNS 名称。
示例:创建了三个节点的可用性组,mssql-primary-0 和 mssql-primary-1 是 Kubernetes 集群中的两个 pod,它们使用无头服务(pod 的 DNS 名称)进行通信。mssql-remote-0 pod 来自使用负载均衡器服务的外部 IP 公开的另一个集群。
CREATE AVAILABILITY GROUP [AG1]
WITH (CLUSTER_TYPE = NONE)
FOR REPLICA ON
N'mssql-primary-0'
WITH (
ENDPOINT_URL = N'tcp://mssql-primary-0.headless-service:5022',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
SEEDING_MODE = AUTOMATIC,
FAILOVER_MODE = MANUAL,
SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
),
N'mssql-primary-1'
WITH (
ENDPOINT_URL = N'tcp://mssql-primary-1.headless-service:5022',
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
SEEDING_MODE = AUTOMATIC,
FAILOVER_MODE = MANUAL,
SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
),
N'mssql-remote-0'
WITH (
ENDPOINT_URL = N'tcp://172.232.87.37:5022',
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
SEEDING_MODE = AUTOMATIC,
FAILOVER_MODE = MANUAL,
SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
);
GO
当我想从远程节点 (mssql-remote-0) 加入时,我使用此命令。
ALTER AVAILABILITY GROUP [ag1] JOIN WITH (CLUSTER_TYPE = NONE);
mssql-remote-0节点自动获取主节点的端点URL,
ENDPOINT_URL = N'tcp://mssql-primary-0.headless-service:5022'
是否有任何选项可以提供主副本 (mssql-primary-0) 的不同端点 URL,仅适用于 mssql-remote-0 节点?
任何有关实现此设置的见解或建议将不胜感激。
在 SQL Server 扩展事件中,是否有任何方法可以将“开始”事件(例如 )rpc_starting
与“完成”事件(例如 )链接起来rpc_completed
?例如,是否有类似相关 ID 的东西可以唯一标识对 SQL Server 的调用?
我想查询记录的事件,以获取通话的开始时间(来自 )rpc_starting
及其持续时间(来自 )rpc_completed
。到目前为止,我还没有找到任何方法来唯一链接同一调用的开始和结束。
我认为该request_id
操作可能会起作用,但对于我查看过的事件,它似乎显示为 0。
我正在深入研究 SQL Server 可用性组 (AG),并发现了一个令人着迷的功能,它似乎可以简化设置副本的过程 - 自动种子设定的概念。根据我的理解,当我们配置可用性组时,有一个选项允许单个服务器自动为我们的数据库播种。这意味着我们不必提供主副本和辅助副本均可访问的共享位置来进行初始数据同步。
令我感兴趣的是这个功能的底层机制。SQL Server 究竟如何将数据库复制到我的辅助副本而不需要共享存储位置?我最初的想法是,它可能会在幕后利用某种形式的数据流或备份恢复操作。
具有 SQL Server 可用性组专业知识的人能否解释一下自动种子设定的过程?这种方法的可靠性如何?在使用自动种子设定进行数据库复制时,我们是否应该注意任何警告或先决条件?
期待就此主题进行富有启发性的讨论。预先感谢您的见解!
我正在使用 PostgreSQL-13.0。
有没有办法获取数据库的创建时间或上次修改时间?
谢谢!
我遇到了一个奇怪的情况,让我很头疼,解决之后我也想了解为什么。
基本上,用户拥有执行“触发器”所需的所有权限(它实际上是具有关联的 ON DELETE CASCADE 的外键约束)以及触发器本身触及的所有对象的所有权限,但是当他执行触发器时,他实际上使用了对象的所有者权限,而不是他自己的权限。所有者的权限比用户的权限少,因此它给出了一个非常神秘的错误。
我知道理解我的意思很复杂,所以我创建了一个希望能够澄清的工作示例。我创建的模式是一个 Spotify 类型的玩具示例,其中有用户和艺术家,并且用户有他们关注的艺术家列表。
使用超级用户执行以下所有操作(仅为简单起见)
-- ALL DATA
create schema website;
create table public.artists (
id_artist serial primary key,
name text not null unique
);
insert into public.artists (name)
values ('Heilung'), ('Rammstain'), ('Iron Maiden');
create table website.users (
id_user serial primary key,
email text not null unique
);
insert into website.users (email)
values ('[email protected]'), ('[email protected]');
create table website.users_list (
id_user int not null,
id_artist int not null,
CONSTRAINT user_fk FOREIGN KEY (id_user) REFERENCES website.users (id_user),
CONSTRAINT artist_fk FOREIGN KEY (id_artist) REFERENCES public.artists (id_artist) ON DELETE CASCADE);
insert into website.users_list (id_user,id_artist)
values (1,1), (1,2), (1,3), (2,1), (2,3);
-- USERS AND PRIVILEGES
create user jenny with password '123';
create user tommy with password '123';
-- tommy is owner but has zero privileges
alter table website.users_list owner to tommy;
-- jenny is not owner but has all privileges
grant usage, create on schema website to jenny;
grant all on all tables in schema website,public to jenny;
grant usage on all sequences in schema website to jenny;
然后使用用户 Jenny 逐一运行这些查询。
--1)
select *
from website.users_list ul;
--2)
select *
from artists a;
--3)
delete from artists
where id_artist = 3;
第一个和第二个查询正常工作,因为 Jenny 可以在 website.users_list 和 public.artists 上执行 SELECT。她显然拥有模式网站的使用权限。但第三个她却做不到。它给出了这个看似毫无意义的错误。
ERROR: permission denied for schema website
当她对 public.artists 执行 DELETE 操作时,她实际上触发了 website.users_list 的外键约束,因此必须从 website.users_list 中删除与 id_artist = 3 的艺术家相关的所有行。但在那一刻,她正在使用汤米(website.users_list 的所有者)的权限,正如我们上面所看到的,汤米没有模式网站上的使用权限,从而出现了奇怪的错误。
有人可以向我解释为什么会发生这种情况吗?当用户拥有所有必要的权限时,表所有者与运行触发器有什么关系?我发现这非常令人困惑,坦率地说调试是一场噩梦(不幸的是,我是根据个人经验发言的)。