为什么 MySQL 在 8.0 版本之后去掉了查询缓存功能?
我想将所有表从架构移动xyz到默认架构public。
我可以移动单个表
ALTER TABLE table_name
SET SCHEMA public;
Run Code Online (Sandbox Code Playgroud)
我可以得到所有的桌子
SELECT table_name FROM information_schema.tables WHERE table_schema='xyz'
Run Code Online (Sandbox Code Playgroud)
有没有办法将这两者结合在一起?
我有一个包含多个用户的数据库:foo、bar和super。我正在考虑pg_hba.conf锁定访问权限。
我希望允许foo并bar能够通过密码身份验证从任何 IP 进行连接。或者在本地使用信任身份验证。
我想允许super只能通过信任身份验证在本地登录。切勿来自非本地地址。
我就是从这个开始的。
# TYPE DATABASE USER ADDRESS METHOD
# Allow everything if you're on the same machine.
local all all trust
host all all 127.0.0.1/32 trust
Run Code Online (Sandbox Code Playgroud)
但是,然后我陷入困境,因为我不知道如何说“所有用户,除了超级用户”。我正在寻找这样的东西。
host all not_super all md5
Run Code Online (Sandbox Code Playgroud)
我认为我可以采取的一种方法是列出foo并bar明确。但是,我想知道是否还有其他方法。
host all foo all md5
host all bar all md5
Run Code Online (Sandbox Code Playgroud) 从一个非常大的备份文件(mysqldump的创建)我需要带回只有一个(或几个)特定表(S),而无需加载所有表。
有没有快速的替代品?
设置
我们有一个多租户应用程序,大约有 1000 个客户。当客户流失时,我们会在一段时间后删除他们的所有数据。我们有一些非常大的表,我们正在考虑使用分区来按客户拆分它们。
问题
1000 个租户(客户)是很多分区 - 在 PostgreSQL 上这样做合理吗?
更多细节
目前,我们的租户之间的分离是通过account_id数据库中所有表上的列来实现的。有几张桌子都很大。例如,有一个event表(我对分区感兴趣的表)包含审核日志和我们应用程序中发生的所有事件的其他事件。
以下是有关事件表的一些事实:
account_id非常不均匀,5% 的帐户拥有 50% 的数据。author_id等等)account_id)。删除的数据可能有数百万行。没有更新。删除大帐户的情况很少见,目前并不是一个大的性能问题。account_id+ id)或给定时间段内的所有事件。并不总是设定时间段。account_id始终出现在查询中。可能的解决方案
分区方式account_id:
优点:
DROP TABLE.WHERE account_id = 123缺点:
按时间戳分区:
优点:
缺点:
我正在处理从外部源收到的 JSON 文档。在本文档中,有一个timestamp属性对应于timestampPostgreSQL 数据类型的文本格式。换句话说,它可以被转换为timestamp类型:(data->>'timestamp')::timestamp。
我想timestamp在索引中使用该属性。我尝试了以下方法:
create table t
(
data jsonb
);
create index on t(((data->>'timestamp')::timestamp));
Run Code Online (Sandbox Code Playgroud)
我正进入(状态:
ERROR: functions in index expression must be marked IMMUTABLE
Run Code Online (Sandbox Code Playgroud)
为什么是这样?我知道转换为 atimestamptz并不是不可变的,因为本地化配置设置不是静态的,但我无法将该逻辑应用于转换为timestamp.
还有办法将我的timestamp财产放入索引吗?
我正在使用几天前发布的 PostgreSQL 12。
我想设置一个 CHECK 约束来确保text[]列的元素仅包含某些值。
设置一个例子:
CREATE TABLE foo(
countries text[]
);
INSERT INTO foo VALUES ('{"Morocco", "Mali", "Indonesia"}');
INSERT INTO foo VALUES ('{"Sokovia", "Mali"}');
Run Code Online (Sandbox Code Playgroud)
现在只允许“摩洛哥”、“马里”和“印度尼西亚”,因此第二行应该被约束拒绝。
我有一个“有效”的解决方案:
CHECK (array_length(
array_remove(
array_remove(
array_remove(
countries,
'Indonesia'
), 'Mali'
), 'Morocco'
), 1) IS NULL)
Run Code Online (Sandbox Code Playgroud)
但这不太可读。
我也尝试过这个:
CHECK ((
SELECT unnest(countries)
EXCEPT
SELECT unnest(array['Morocco', 'Mali', 'Indonesia'])
) IS NULL)
Run Code Online (Sandbox Code Playgroud)
但:
错误无法在检查约束中使用子查询
假设我在 Postgres (11.3) 中有一个简单的表:
create table posts
(
id serial not null,
created_at timestamp(0)
constraint posts_pkey
primary key (id)
);
Run Code Online (Sandbox Code Playgroud)
如果用户请求 id=5869,我需要能够在按列排序的查询中返回该行之前的 N 行和之后的 N 行created_at。如果我们能够假设 越大id,则 越大created_at,我们可以做一些相对简单的事情,如下所示:
(select * from posts where id < 5869 order by id limit 10)
union all
(select * from posts where id >= 5869 order by id limit 11);
Run Code Online (Sandbox Code Playgroud)
但是,我无法假设更高的 id 是最近创建的,我想知道在这种情况下检索该数据的最佳方法是什么。此方法有效,但在 100k 行数据集上速度非常慢:
WITH
boundaries AS (
SELECT *,
row_number() OVER (ORDER BY created_at DESC) AS …Run Code Online (Sandbox Code Playgroud) 我对 PostgreSQL 管理还比较陌生,我正在尝试了解具体的细节。我的问题是,假设我不需要灾难恢复并且我没有通过设置打开归档archive_mode = on,Postgres 是否有内部机制可以将 WAL 文件轮换出来pg_xlog?如果有,频率是多少?
稍微不同的是,设置archive_mode = on但不配置archive_command- 是否存在 Postgres 将尝试存档到的默认位置?
根据最佳实践,建议将所有tempdb(不仅仅是 tempdb)文件移动到不同的物理磁盘中。
我有一个虚拟服务器,最初有来自同一RAID 10池的 4 个 LUN。在卷管理器的帮助下,我将这 4 个 LUN 转换为 4 个不同的卷。
现在的问题是,移动tempdb到单独的卷中是否会产生任何影响,或者就性能而言,将它们与其他 SQL Server 文件保留在一起就可以了?
postgresql ×7
mysql ×2
alter-table ×1
archive-log ×1
array ×1
cast ×1
index ×1
mysql-8.0 ×1
mysqldump ×1
partitioning ×1
query-cache ×1
raid ×1
restore ×1
schema ×1
sql-server ×1
tempdb ×1
timestamp ×1