mirror of
https://github.com/LCTT/TranslateProject.git
synced 2024-12-23 21:20:42 +08:00
parent
4382cbdb3e
commit
c4b97a5aec
@ -3,28 +3,32 @@
|
||||
[#]: author: "Elizabeth Garrett Christensen https://opensource.com/users/elizabethchristensencrunchydatacom"
|
||||
[#]: collector: "lkxed"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-15601-1.html"
|
||||
|
||||
管理大型 Postgres 数据库的 3 个技巧
|
||||
======
|
||||
|
||||
![][0]
|
||||
|
||||
> 在处理庞大的数据库时,请尝试这些方便的解决方案,以解决常见的问题。
|
||||
|
||||
关系型数据库 PostgreSQL(也被称为 Postgres)已经越来越流行,全球各地的企业和公共部门都在使用它。随着这种广泛的采用,数据库已经变得比以前更大了。在 Crunchy Data,我们经常与 20TB 以上的数据库打交道,而且我们现有的数据库还在继续增长。我的同事 David Christensen 和我收集了一些关于管理拥有巨大表的数据库的技巧。
|
||||
|
||||
### 大表
|
||||
|
||||
生产数据库通常由许多具有不同数据、大小和模式的表组成。常见的情况是,最终有一个巨大的、无序的数据库表,远远大于你数据库中的任何其他表。这个表经常存储活动日志或有时间戳的事件,并对你的应用或用户来说是必要的。
|
||||
生产数据库通常由许多具有不同数据、大小和模式的表组成。常见的情况是,最终有一个巨大的、无序的数据库表,远远大于你数据库中的任何其他表。这个表经常存储活动日志或有时间戳的事件,而且对你的应用或用户来说是必要的。
|
||||
|
||||
真正的大表会因为很多原因造成挑战,但一个常见的原因是锁。对表的定期维护往往需要锁,但对大表的锁可能会使你的应用瘫痪,或导致堵塞和许多令人头痛的问题。我有一些做基本维护的技巧,比如添加列或索引,同时避免长期运行的锁。
|
||||
|
||||
**添加索引的问题**:索引的创建会在创建过程中锁住表。如果你有一个庞大的表,这可能需要几个小时。
|
||||
**添加索引的问题**:在创建索引的过程中锁住表。如果你有一个庞大的表,这可能需要几个小时。
|
||||
|
||||
```
|
||||
CREATE INDEX ON customers (last_name)
|
||||
```
|
||||
|
||||
**方案**:使用 **CREATE INDEX CONCURRENTLY** 功能。这种方法将索引创建分成两部分,一部分是短暂的锁定,以创建索引,立即开始跟踪变化,但尽量减少应用阻塞,然后是完全建立索引,之后查询可以开始使用它。
|
||||
**方案**:使用 `CREATE INDEX CONCURRENTLY` 功能。这种方法将索引创建分成两部分,一部分是短暂的锁定,以创建索引,立即开始跟踪变化,但尽量减少应用阻塞,然后是完全建立该索引,之后查询可以开始使用它。
|
||||
|
||||
```
|
||||
CREATE INDEX CONCURRENTLY ON customers (last_name)
|
||||
@ -34,10 +38,9 @@ CREATE INDEX CONCURRENTLY ON customers (last_name)
|
||||
|
||||
在数据库的使用过程中,添加列是一个常见的请求,但是对于一个巨大的表来说,这可能是很棘手的,同样是由于锁的问题。
|
||||
|
||||
**问题**:当你添加一个新的默认列,并调用一个函数时,Postgres 需要重写表。对于大表,这可能需要几个小时。
|
||||
**问题**:当你添加一个新的默认值为一个函数的列时,Postgres 需要重写表。对于大表,这可能需要几个小时。
|
||||
|
||||
**Solution**: Split up the operation into multiple steps with the total effect of the basic statement, but retain control of the timing of locks.
|
||||
**方案**:将操作拆分为多条基本语句,总效果一致,但保留对锁的时间控制。
|
||||
**方案**:将操作拆分为多条基本语句,总效果一致,但控制锁的时间。
|
||||
|
||||
添加列:
|
||||
|
||||
@ -48,12 +51,10 @@ ALTER TABLE all_my_exes ADD COLUMN location text
|
||||
添加默认值:
|
||||
|
||||
```
|
||||
ALTER TABLE all_my_exes ALTER COLUMN location
|
||||
|
||||
SET DEFAULT texas()
|
||||
ALTER TABLE all_my_exes ALTER COLUMN location SET DEFAULT texas()
|
||||
```
|
||||
|
||||
使用 **UPDATE** 来添加默认值:
|
||||
使用 `UPDATE` 来添加默认值:
|
||||
|
||||
```
|
||||
UPDATE all_my_exes SET location = DEFAULT
|
||||
@ -64,11 +65,7 @@ UPDATE all_my_exes SET location = DEFAULT
|
||||
**问题**: 你想添加一个用于数据验证的检查约束。但是如果你使用直接的方法来添加约束,它将锁定表,同时验证表中的所有现有数据。另外,如果在验证的任何时候出现错误,它将回滚。
|
||||
|
||||
```
|
||||
ALTER TABLE favorite_bands
|
||||
|
||||
ADD CONSTRAINT name_check
|
||||
|
||||
CHECK (name = 'Led Zeppelin')
|
||||
ALTER TABLE favorite_bands ADD CONSTRAINT name_check CHECK (name = 'Led Zeppelin')
|
||||
```
|
||||
|
||||
**方案**:告诉 Postgres 这个约束,但不要验证它。在第二步中进行验证。这将在第一步中进行短暂的锁定,确保所有新的/修改过的行都符合约束条件,然后在另一步骤中进行验证,以确认所有现有的数据都通过约束条件。
|
||||
@ -76,11 +73,7 @@ CHECK (name = 'Led Zeppelin')
|
||||
告诉 Postgres 这个约束,但不要强制执行它:
|
||||
|
||||
```
|
||||
ALTER TABLE favorite_bands
|
||||
|
||||
ADD CONSTRAINT name_check
|
||||
|
||||
CHECK (name = 'Led Zeppelin') NOT VALID
|
||||
ALTER TABLE favorite_bands ADD CONSTRAINT name_check CHECK (name = 'Led Zeppelin') NOT VALID
|
||||
```
|
||||
|
||||
然后在创建后**验证**它:
|
||||
@ -100,9 +93,10 @@ via: https://opensource.com/article/23/2/manage-large-postgres-databases
|
||||
作者:[Elizabeth Garrett Christensen][a]
|
||||
选题:[lkxed][b]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/elizabethchristensencrunchydatacom
|
||||
[b]: https://github.com/lkxed/
|
||||
[0]: https://img.linux.net.cn/data/attachment/album/202303/06/113049bkunsxun1clzuca8.jpg
|
Loading…
Reference in New Issue
Block a user