标签: PostgreSQL

PostgreSQL / openGauss 数据库易犯的十个错误

1

同时设置日志行前缀和csvlog格式

比较常见的是同时配置下面这两个参数:

  1. log_line_prefix = ‘%m %u %d %p’
  2. log_destination=‘csvlog’
  • %m是带毫秒的时间戳
  • %u是用户名
  • %d是数据库名
  • %p是进程ID

然后当我们配置为csvlog日志时,日志行的内容项是固定的,所以当我们需要配置日志前缀,精简日志行的内容项时,log_destination不能配置为csvlog。下面是正确的配置:

  1. log_destination=‘stderr’
  2. log_line_prefix = ‘%m %u %d %p’

2

不符合预期的日志轮换策略

日志轮换策略可以通过log_rotation_size参数按日志文件大小控制或者通过log_rotation_age参数按时间控制,但下面这四个参数需要合理组合使用。

  1. log_filename
  2. log_truncate_on_rotation
  3. log_rotation_age
  4. log_rotation_size

方案一:每天生成一个新的日志文件。

  1. log_filename=‘postgresql-%Y-%m-%d.log’
  2. log_truncate_on_rotation=off
  3. log_rotation_age=1d
  4. log_rotation_size=0

方案二:写满固定大小(如10MB),则进行切换。

  1. log_filename=‘postgresql-%Y-%m-%d_%H%M%S.log’
  2. log_truncate_on_rotation=off
  3. log_rotation_age=0
  4. log_rotation_size=10MB

这种方案我们一般是为了根据时间去查看日志,文件名根据日志量可以设置到时分秒,但这里设置log_rotation_size并不能严格控制固定大小。

方案三:保留固定天数的日志并循环覆盖,例如固定一周或者固定一个月。

  1. log_filename=‘postgresql-%u.log’
  2. log_truncate_on_rotation=on
  3. log_rotation_age=1d
  4. log_rotation_size=0

log_filename常见的通配符变量:

  • %u是星期的数字表示,范围是[1,7],1代表星期一
  • %w也是星期的数字表示,范围是[0,6],0代表星期天
  • %d是月份中的天数表示,范围是[01,31]

生产环境第三种方案更合适一些。

3

同步复制表的序列

看看下面这个例子,我们创建test表使用serial自增序列类型,系统帮我们生成了test_id_seq序列。

  1. postgres=# create table test(id serial primary key,name varchar unique);
  2. CREATE TABLE
  3. postgres=# \d test
  4.                                 Table “public.test”
  5. Column |       Type        | Collation | Nullable |             Default
  6. ——–+——————-+———–+———-+———————————-
  7. id     | integer           |           | not null | nextval(‘test_id_seq’::regclass)
  8. name   | character varying |           |          |
  9. Indexes:
  10.    “test_pkey” PRIMARY KEY, btree (id)
  11.    “test_name_key” UNIQUE CONSTRAINT, btree (name)

当我们复制t_test表时,test表的序列引用也同时复制过来了,可以使用虚拟生成列来解决这个问题。

  1. postgres=# create table t_test(like test including all);
  2. CREATE TABLE
  3. postgres=# \d t_test
  4.                                Table “public.t_test”
  5. Column |       Type        | Collation | Nullable |             Default
  6. ——–+——————-+———–+———-+———————————-
  7. id     | integer           |           | not null | nextval(‘test_id_seq’::regclass)
  8. name   | character varying |           |          |
  9. Indexes:
  10.    “t_test_pkey” PRIMARY KEY, btree (id)
  11.    “t_test_name_key” UNIQUE CONSTRAINT, btree (name)

openGauss对PG的这个问题做了修复,下面是openGauss复制t_test时,序列按表名做了区分。

  1. omm=# \d t_test
  2.                              Table “public.t_test”
  3. Column |       Type        |                      Modifiers
  4. ——–+——————-+—————————————————–
  5. id     | integer           | not null default nextval(‘t_test_id_seq’::regclass)
  6. name   | character varying |
  7. Indexes:
  8.    “t_test_pkey” PRIMARY KEY, btree (id) TABLESPACE pg_default
  9.    “t_test_name_key” UNIQUE CONSTRAINT, btree (name) TABLESPACE pg_default

4

跳变的序列值

创建序列seq1,设置cache为10,session A获取下一个值为1。

  1. postgres=# create sequence seq1 cache 10;
  2. CREATE SEQUENCE
  3. postgres=# select nextval(‘seq1’);
  4. nextval
  5. ———
  6.       1
  7. (1 row)

session B查询获取下一个值为11。

  1. postgres=# select nextval(‘seq1’);
  2. nextval
  3. ———
  4.      11
  5. (1 row)

序列值插入为了保证连续性,要设置cache为1。

5

从任意库查询pg_stat_statements模块统计信息

pg_stat_statements模块用来跟踪SQL语句的执行统计信息。我们如果把该模块安装到postgres数据库,就只能连到postgres数据库进行查询,除非其他数据库也安装了该模块,否则会提示报错找不到。

无论任何操作,都需要连接到一个数据库,即使是我们只想创建一个全局的数据库用户,所以选对数据库特别重要。

6

truncate操作理解为DML语句

log_statement参数控制日志记录级别,有4个选项:none、ddl、mod、all。开启ddl,它会记录create、alter和drop相关的语句,但不记录truncate。

truncate在Oracle中属于DDL语句,在PostgreSQL中属于DML语句。因此,当我们使用DDL日志记录语句时,无法记录到truncate。

7

认为数据库的owner可以管理其下所有对象

数据库、模式、表都有自己的owner,他们都属于实例中的对象,数据库owner只是具有数据库这个对象的CTc权限。数据库的默认权限为:

  • 允许public角色连接,即允许任何人连接。
  • 不允许除了超级用户和owner之外的任何人在数据库中创建schema。
  • 会自动创建名为public的schema,这个schema的所有权限已经赋予给public角色,即允许任何人在里面创建对象。

schema使用注意事项:schema的owner默认是该schema下的所有对象的owner,但是允许用户在别人的schema下创建对象,所以一个对象的owner和schema的owner可能不同,都有drop对象的权限。

8

认为public模式下的对象可以互相访问

public模式只是允许任何人在里面创建对象并管理自己的对象,并不能查看别人创建的对象。

9

创建索引时起名为表名称

单个数据库里,索引和表的名称不能重复,因为他们都属于relation。

  1. postgres=# create index a on a(id);
  2. ERROR:  relation “a” already exists

10

把walsender当作主库

通常我们从操作系统层查看主库有walsender,备库有walreceiver进程,并且walsender进程信息中可以看到备库的IP地址,可以初步判断主备状态正常。

但请注意有walsender进程或者数据库中能查到pg_stat_replication视图并不能断定是主库,仅在一主一备环境可以这样简单判断。下面的图可以看出,虽然有walsender进程,但它也是备库。

%title插图%num

PostgreSQL 有什么好用的客户端连接工具吗?

pgAdmin 感觉用不习惯,总感觉卡卡的。

Navicat 对 PostgreSQL 的字段类型显示不友好,smallint 类型显示成了 int2,bigint 显示成了 int8.
postgresql bigint smallint Navicat27 条回复 • 2021-08-03 14:52:32 +08:00
ThanksSirAlex 1
ThanksSirAlex 23 小时 35 分钟前 ❤️ 1
table plus,通吃所有数据库
aliceclark 2
aliceclark 23 小时 27 分钟前 ❤️ 4
Jetbrains 的 DataGrip 还不错
whoosy 3
whoosy 23 小时 25 分钟前
postico 只针对 pg 做的客户端
grissom 4
grissom 23 小时 23 分钟前
DBeaver
polyang 5
polyang 23 小时 19 分钟前
@whoosy 我是 Windows 系统
intmax2147483647 6
intmax2147483647 23 小时 10 分钟前 ❤️ 1
Navicate 没人提么
HashV2 7
HashV2 23 小时 7 分钟前
DataGrip + 1
monetto 8
monetto 22 小时 51 分钟前
HeidiSQL 吧。MySQL 的社区版 MariaDB 官方推荐的 GUI 工具。也可以连接 PostgreSQL 。
只有 Win 版本的,Mac 的 Wine64 可以直接免配置运行。
Mac 也可以用 DBevear
monetto 9
monetto 22 小时 50 分钟前
顺便,HeidiSQL 是我见过的,界面和 Navicat *像的工具了…
wmgx 10
wmgx 22 小时 47 分钟前
DataGrip+1

RicardoY 11
RicardoY 22 小时 34 分钟前 via iPhone
dbeaver
gzlock 12
gzlock 22 小时 23 分钟前 via Android
没有管理 Redis 需求的话首选 datagrip
dbeaver 支持的范围很广,但是 db 界面的操作响应不跟手( macos 和 win 都在用,都不跟手)
AngryPanda 13
AngryPanda 22 小时 23 分钟前
Navicat
shyrock 14
shyrock 22 小时 20 分钟前
再用 dbeaver,感觉不错。
yanzhiling2001 15
yanzhiling2001 22 小时 7 分钟前
袋鼠工具,国产货
https://gitee.com/dbkangaroo/kangaroo
pabupa 16
pabupa 22 小时 0 分钟前 ❤️ 1
https://github.com/beekeeper-studio/beekeeper-studio
leafre 17
leafre 21 小时 25 分钟前
收费 Navicat 免费 HeidiSQL
Maxwe11 18
Maxwe11 15 小时 2 分钟前
oracle 其实有个免费开源的 sql developer,装个驱动就能用,其实还挺好用的,跨平台,似乎用的人很少;
MarkLeeyun 19
MarkLeeyun 6 小时 46 分钟前
datagrip.
RRRoger 20
RRRoger 6 小时 8 分钟前
付费的还有一个 DbVisualizer
tobepro 21
tobepro 5 小时 33 分钟前
都不审题啊,楼主都说 Navicat 不行了,还推荐。个人用 Idea 的数据库管理就够了,和 Datagrip 一样,还不需要再打开一个 IDE,省内存
bairdshi 22
bairdshi 5 小时 6 分钟前
竟然没一个人用 pgadmin… 我落伍了吗
bairdshi 23
bairdshi 5 小时 6 分钟前
@bairdshi 对不起 看少了
polyang 24
polyang 4 小时 56 分钟前
@tobepro 哈哈,终于有个明白的人了。。。其实如果是 MySQL,用 Navicat 还是非常好的。
CoderLife 25
CoderLife 1 小时 50 分钟前
postico 吧
dbeaver, datagrid 都太重了
polyang 26
polyang 1 小时 41 分钟前
@CoderLife 这个貌似只有 mac 版本,我的是 Windows
NoUltimate 27
NoUltimate 57 分钟前
table plus,ui 比较好看,使用也方便,就是免费的好像会有限制

云数据库六大优势是什么 如何学好云计算技能

云数据库六大优势是什么?如何学好云计算技能?数据库是前端还是后台开发人员都需要了解和掌握的工具,传统的数据库工程师需要掌握基础理论知识、数据库基础知识、数据库运维知识以及数据库性能调优技能。不过随着云时代的到来,云数据库的应用及大规模普及,给数据库工程师的日常工作带来了很大的积*影响,下面就给大家详细介绍一下云数据库的六大优势:

%title插图%num

1、免部署。云数据库种类丰富,关系型数据库如MySQL、PostgreSQL、SQL Server,非关系型数据库如MongoDB、Redis、Memcache,兼容和支持各种版本。通过简单的购买操作,分钟级甚至秒级交付,云数据库一键部署。

2、高性能。云数据库软硬件深度调优,具有理想的性能表现。同时,底层硬件较快引入*新高性能硬件,多种性能加持下,DBA可聚焦在应用层优化。

3、高可靠性。云数据库能够自动探测,及时容灾,保证数据库服务不中断。对于数据库工程师来说,也不需要再额外部署高可用架构。

4、强大的灵活性和扩展性。云数据库弹性扩展的能力,至少是支持垂直扩展(scale-up),通常也支持水平扩展(scale-out)。灵活性则是第三维度的扩展,它可以支持一主多从,读写分离。数据库工程师能够在短期内聚焦业务,暂时不会有扩展性的烦恼。

5、自带运维能力。云数据库通常支持自动备份和手动备份两种模式,提供一键回档的功能找回数据。并提供详细的监控数据,也可配置异常自动告警。可以说,数据库工程师对云数据库基本没有运维工作。

6、安全可靠。云数据库在数据存储、网络链路访问、鉴权认证、多租户隔离方面做了多重保障,以确保数据安全,除此之外,它可以支持数据库审计,后端自动漏洞扫描,定期安全加固等。

使用云数据库后,数据库工程师可以有更多时间关注其他技能的锻炼和培养,提升自己的综合竞争力。如果你想了解更多云计算技术,可以选择专业学习一下。

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速