我已经配置ssl = on
的postgresql.conf
(并且安装了证书等等)。这是否确保所有客户端始终通过 SSL 连接?
(也就是说,ssl = on
如果没有SSL 加密就无法连接吗?)
是否有其他方法可以确保所有客户端始终通过 SSL/TLS 进行连接?
在工作中,我们将所有网络服务器托管在 Amazon EC2 上,并且通常使用与 Apache 网络服务器安装在同一台机器上的 MySQL 数据库,并在localhost
. 我们现在需要将我们的数据库迁移到我们的系统之一的自己的服务器上。我有两种解决方案可供选择:使用Amazon RDS,或者只是启动一个新的Amazon EC2 机器并在其上安装 MySQL。
RDS 是与 EC2 同一家公司提供的专用数据库服务,似乎应该是更好的选择。但是,当我查看这两个选项的定价时(请参阅http://aws.amazon.com/ec2/pricing和http://aws.amazon.com/rds/pricing),似乎 RDS 服务器的成本几乎对于具有相同规格的盒子,是 EC2 服务器的两倍。
鉴于我能够自己处理备份,并且 EC2 提供了与 RDS 所需的相同的扩展实例的能力,我完全看不出有任何理由使用 RDS 而不是 EC2。不过,似乎我可能遗漏了一些重要的东西,因为如果我是对的,那么没有人会使用 RDS。我到底缺少什么,与在 EC2 实例上安装自己的数据库相比,RDS 有哪些优势?
由于 MySQL 5.6 引入了在线 DDL,该ALTER TABLE
命令可以选择具有ALGORITHM=INPLACE
或ALGORITHM=COPY
指定。在线 DDL的概述指出,默认情况下,INPLACE
尽可能使用,并暗示(从未完全说明)该INPLACE
算法比算法便宜COPY
。
那么我有什么理由必须ALGORITHM=COPY
在ALTER TABLE
声明中指定?
许多 PostgreSQLALTER TABLE
命令(例如添加具有默认值的新列)在最新版本的 PostgreSQL 中进行了巧妙的优化,一旦 Postgres 短暂获取了表上的锁,即使在大型表上,它们也能基本上立即执行。
不幸的是,最后的警告很重要。链接博客文章中类似这样的命令
ALTER TABLE users ADD COLUMN credits bigint NOT NULL DEFAULT 0;
Run Code Online (Sandbox Code Playgroud)
仍然需要等待表上的独占锁users
才能运行,尽管一旦获取锁就会立即执行。更糟糕的是,当它等待该锁时,它会阻止涉及该表的所有写入和读取。
重现此问题的一些简单步骤(在 Postgres 13.3 中测试):
在一个psql
shell 中,创建一个表,然后启动一个事务,从表中进行读取,但不提交:
CREATE TABLE users (id SERIAL, name TEXT);
INSERT INTO users (name) VALUES ('bob'), ('fred');
START TRANSACTION;
SELECT * FROM users WHERE id = 1;
Run Code Online (Sandbox Code Playgroud)
让第一个 shell 打开,然后打开第二个 shell 并尝试更改表:
ALTER TABLE users ADD COLUMN credits bigint NOT NULL DEFAULT 0;
Run Code Online (Sandbox Code Playgroud)
请注意,此查询挂起,等待第一个 shell …
在 PostgreSQL 中将枚举值转换为字符串的正常方法是对其进行强制转换(使用::text
),或者在将其连接到另一个字符串时简单地依赖隐式转换:
testdb=# CREATE TYPE color AS ENUM ('red', 'green', 'blue');
CREATE TYPE
testdb=# CREATE TABLE object (id serial, name text, color color);
CREATE TABLE
testdb=# INSERT INTO object (name, color) VALUES ('table', 'red'), ('chair', 'green');
INSERT 0 2
testdb=# SELECT name || color FROM object;
?column?
------------
tablered
chairgreen
(2 rows)
Run Code Online (Sandbox Code Playgroud)
然而,有一个问题:Postgres似乎并不认为这种转换是不可变的。因此,如果您尝试在需要不可变表达式的地方(例如在列的定义中)使用它们,您会收到GENERATED
错误:
testdb=# ALTER TABLE object ADD COLUMN namecolor text GENERATED ALWAYS AS (name || color) STORED;
ERROR: generation expression is …
Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个基于 LAMP 的网站。我不知道自从 MySQL 安装在我们的服务器上以来对它进行了哪些配置更改。我们使用 MySQL 的方式,我们的数据库没有理由接受任何远程连接;它只需要通过 PHP 或通过 ssh 会话通过命令行 shell 在本地访问。
出于安全原因,我想确保无法远程连接到我们的数据库。我需要检查哪些设置以确保是这种情况?我可以在某处设置一个选项来阻止所有远程连接吗?
通常,支持多列 B 树索引的 SQL 数据库还支持按索引中列的子集进行查找,当且仅当它们是索引中的第一列。例如,如果我在列上有一个索引(a, b, c, d)
并想执行:
SELECT * FROM my_table
WHERE b = 7 AND a = 'foo';
Run Code Online (Sandbox Code Playgroud)
然后这将使用索引并且速度很快,因为该对(a, b)
位于索引的开头,因此数据库可以导航树以查找以('foo', 7, ... )
.开头的索引记录。但是,如果我跑
SELECT * FROM my_table
WHERE b = 7 AND c = 'bar';
Run Code Online (Sandbox Code Playgroud)
那么索引将不会被使用*,因为匹配的记录将根据它们在 column 中的值分布在整个索引中a
。
* (除了可能通过对索引进行完整或部分扫描,如下面Evan 的回答中所述 - 但由于完整索引扫描仍然具有与完整表扫描相同的时间复杂度,并且部分索引扫描可能也会这样做,这没有多大帮助。)
我有一个包含n列和潜在大量行的表。我还有一个前端 GUI,它允许用户通过这些列的任意组合的精确值进行过滤并查看结果表。这个前端产生的任何查询导致全表扫描得到结果是不可接受的;每个可能的过滤器都必须由索引支持。
对于n列,我需要创建的 B 树索引的最小数量是多少,以确保某个索引覆盖了所有可能的列组合?
假设我的表有4列:a
,b
,c
,和d …
Postgres 文档经常使用术语“对象”。例如,https://www.postgresql.org/docs/current/app-psql.html 上的各种\d
命令的描述(例如用于列出表或用于列出聚合函数)使用如下短语:\dt
\da
默认情况下,只显示用户创建的对象;提供模式或
S
修饰符以包含系统对象。
由此,我可以推断出,至少每个命令列出的特定内容——比如聚合函数、表、字符集编码、模式和一大堆其他东西——是 Postgres 命名法中的“对象”。考虑到在它们的描述中避免使用“对象”这个词,我还可以合理地猜测一些可以用\d
命令列出的东西,比如角色,不是对象。
但这究竟是什么意思?目前我无法判断任何特定的东西(如表格行、表格列或角色)是否被正确地视为“对象”,除非发生在 Postgres 文档中的某个位置如此称呼。文档使用的基本定义是什么?
postgresql ×4
mysql ×3
alter-table ×2
amazon-ec2 ×1
amazon-rds ×1
btree ×1
ddl ×1
index ×1
locking ×1
performance ×1
security ×1
terminology ×1