PostgreSQL 具有createdb的用户无法创建数据库的原因(之一)

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共2340人左右 1 + 2 + 3 + 4 + 5 + 6 + 7) (1 2 3 4 5 均没有空位了,请不要在问了谢谢)

最近有一些特殊的事情,下周暂停更新一周,卷的尽头是无尽的卷,不如停下来给自己充充电,冷静思考整体社会转型中个人怎么应对各种变化。

b2f74e950918f4e7dce82772f5b50da3.png

最近有人问我,PostgreSQL的模板数据库的问题,说在模板数据库中打入了一些表和存储过程,并且还调整了extension的部分,但打入完毕后,通过模板数据库来创建数据库失败了,ERROR:  permission denied to copy database "template1",但他确认他有createdb的数据库权限。

首先模板数据库是PostgreSQL为在实例下快速扩展新数据库时,将PostgreSQL中复杂的配置带到新数据库中的一项功能。这项功能在建立新的PG逻辑库中是非常方便的,尤其在PG 数据库中包含了一些DBA 建立的便于PG查询系统信息的VIEW,或者运维存储过程,或特殊的EXTENSION后,在建立新数据库都需要带上这些东西,如果重新部署将变得十分的繁琐。

在使用template 模板数据库时,需要注意PG 有两个模板数据库,template0, template1,这里默认即使在改变模板数据库的情况下,只能动template1,而不能动template0,主要的原因是在操作的过程中如果将模板数据库设置错误,可以通过删除模板数据库,在重新创建的方法来将错误的信息消除,基本的原理是,必须要保持一个干净的template数据库。

下面复原一下那个人的情况,他提示的是superuser 可以创建数据库并从template1将里面的信息都带走,但其他的用户有createdb权限的不可以。

[postgres@postgresql13 ~]$ psql -h 192.168.198.100 -p 5432 -U test_t 
Password for user test_t: 
psql (13.8)
Type "help" for help.

postgres=> create database test;
ERROR:  permission denied to create database
postgres=> exit 
[postgres@postgresql13 ~]$ psql 
psql (13.8)
Type "help" for help.

postgres=# alter user test_t CREATEDB;
ALTER ROLE
postgres=# exit 
[postgres@postgresql13 ~]$ psql -h 192.168.198.100 -p 5432 -U test_t 
Password for user test_t: 
psql (13.8)
Type "help" for help.

postgres=> create database test;
ERROR:  permission denied to copy database "template1"
postgres=>

从上面提示的是test_t 没有权限创建数据库,但test_t 的确有createdb的权限。

postgres=> \du 
                                      List of roles
    Role name    |                         Attributes                         | Member of 
-----------------+------------------------------------------------------------+-----------
 pgadmin         | Superuser                                                  | {}
 pgbackrest_user | Superuser                                                  | {}
 postgres        | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 test            |                                                            | {}
 test_t          | Create DB                                                  | {}
 vacuum_user     | Superuser                                                  | {}

postgres=>

后经查证,原因是template1数据库被变动了,导致非superuser的用户无法建立数据库的问题,

postgres=# select * from pg_database;
  oid  |  datname  | datdba | encoding | datcollate | datctype | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfroz
enxid | datminmxid | dattablespace |               datacl                
-------+-----------+--------+----------+------------+----------+---------------+--------------+--------------+---------------+--------
------+------------+---------------+-------------------------------------
 13580 | postgres  |     10 |        6 | C          | C        | f             | t            |           -1 |         13579 |        
  478 |          1 |          1663 | 
 13579 | template0 |     10 |        6 | C          | C        | t             | f            |           -1 |         13579 |        
  478 |          1 |          1663 | {=c/postgres,postgres=CTc/postgres}
     1 | template1 |     10 |        6 | C          | C        | f             | t            |           -1 |         13579 |        
  478 |          1 |          1663 | {=c/postgres,postgres=CTc/postgres}
(3 rows)

postgres=# update pg_database set datistemplate = 't' where datname = 'template1';
UPDATE 1
postgres=#
Type "help" for help.

postgres=> create database test;
ERROR:  permission denied to copy database "template1"
postgres=> 
postgres=> 
postgres=> create database test;
CREATE DATABASE
postgres=> \du

参看上面的图根因是POSTGRESQL的template1的数据库中的datistemplate被修改成f,导致的问题。在POSTGRESQL 中对于数据库有明确的区分,是模板数据库还是非模板的数据库,当template1被取消了标记为模板数据库的情况下,默认进行create database 具有权限的普通用户的操作会失败。另外有同学提出高版本的数据库不存在这个问题

postgres@pg16:~$ psql -h 192.168.198.120 -p 5432 -U test_t 
Password for user test_t: 
psql (16.0)
Type "help" for help.

postgres=> create database test;
2024-07-22 09:10:13.431 UTC [186104] ERROR:  permission denied to copy database "template1"
2024-07-22 09:10:13.431 UTC [186104] STATEMENT:  create database test;
ERROR:  permission denied to copy database "template1"
postgres=> select version();
                                             version                                              
--------------------------------------------------------------------------------------------------
 PostgreSQL 16.0 on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.2.0-19ubuntu1) 11.2.0, 64-bit
(1 row)

postgres=>

这里在PG16也做了相关的测试,情况是一样的。

置顶文章:

专访唐建法-从MongoDB中国第一人到TapData掌门人的故事

MongoDB VS Austindatabases 上海MongoDB 大会专属礼物领取贴

PostgreSQL 14 小版本分析,有那个版本不建议使用

PostgreSQL 哪些版本尽量避免使用,版本更新重点明晰(PG12)

PostgreSQL 15 16 小版本更新信息小结 版本更新是不是挤牙膏

PolarDB serverless 真敢搞,你出圈了你知道吗!!!!

MySQL 让你还用5.7 出事了吧,用着用着5.7崩了

云原生数据库是一场闹剧,还是数据库市场的程咬金

PolarDB 从节点Down机后,引起的主从节点强一致的争论

往期热门文章:

临时工说:DBA 7*24H 给2万的工作,到底去不去?

PolarDB 最近遇到加字段加不上的问题 与 使用PolarDB 三年感受与恳谈

临时工说:改了三次还是不能播的,数据库市场思考

PostgreSQL 稳定性平台 PG中文社区大会--杭州来去匆匆

DISS 阿里云 DAS数据库服务,阿里云数据库服务的毒瘤

MongoDB 入门教学贴 从术语到操作 (用户权限 内部培训贴)

临时工说:  网友问35岁就淘汰,我刚入行DBA 怎么办?

临时工访谈:问金融软件开发总监  哪些业务不用传统数据库

MongoDB 的一张“大字报”  服务客户,欢迎DISS

MongoDB  聚合怎么写,更复杂的聚合案例

MySQL 8.0 小版本更新要点,哪个小版本更稳定(8.0.24-8.0.37)

SQL SERVER 2022 针对缓存扫描和Query Store 的进步,可以考虑进行版本升级

有思想的人,在这个年代会很痛苦?躺平还是醒着都无所谓了

MYSQL 版本迁移带来 严重生产事故“的”分析

PolarDB  Serverless POC测试中有没有坑与发现的疑问

临时工访谈:PolarDB  Serverless  发现“大”问题了  之 灭妖记 续集

临时工访谈:庙小妖风大-PolarDB 组团镇妖 之 他们是第一

PolarDB for PostgreSQL  有意思吗?有意思呀

PolarDB  Serverless POC测试中有没有坑与发现的疑问

MySQL 的SQL引擎很差吗?由一个同学提出问题引出的实验

临时工访谈:从国产数据库 到 普罗大众的产品 !与在美国创业软件公司老板对话

PostgreSQL 如何通过工具来分析PG 内存泄露

MySQL 的SQL引擎很差吗?由一个同学提出问题引出的实验

临时工访谈:我很普通,但我也有生存的权利,大龄程序员 求职贴

临时工说: 快速识别 “海洋贝壳类” 数据库方法速递

临时工说:国产 数据库 销售人员  图鉴

临时工说:DBA 是不是阻碍国产数据库发展的毒瘤 ,是不是?从国产DB老专家的一条留言开始 (其实更好看的是文章下方的留言)

MongoDB 不是软柿子,想替换就替换

MongoDB  挑战传统数据库聚合查询,干不死他们的

临时工说:国内数据库企业存活   “三板斧”

临时工说:搞数据库 光凭的是技术,那DBA的死多少次?

PostgreSQL  分组查询可以不进行全表扫描吗?速度提高上千倍?

临时工说:分析当前经济形势下 DBA 被裁员的根因

PostgreSQL PG_DUMP 工作失败了怎么回事及如何处理

MySQL 八怪(高老师)现场解决问题实录

PostgreSQL 为什么也不建议 RR隔离级别,MySQL别笑

临时工访谈:OceanBase上海开大会,我们四个开小会 OB 国产数据库破局者

临时工说:OceanBase 到访,果然数据库的世界很卷,没边

临时工访谈:恶意裁员后,一个国产数据库企业程序员的心声

临时工说:上云后给 我一个 不裁 DBA的理由

PolarDB for PostgreSQL  有意思吗?有意思呀

PostgreSQL   玩PG我们是认真的,vacuum 稳定性平台我们有了

临时工说:裁员裁到 DBA 咋办  临时工教你 套路1 2 3

PolarDB  搞那么多复杂磁盘计费的东西,抽筋了吗?

临时工说:OceanBase 到访,果然数据库的世界很卷,没边

MONGODB  ---- Austindatabases  历年文章合集

MYSQL  --Austindatabases 历年文章合集

POSTGRESQL --Austindatabaes 历年文章整理

POLARDB  -- Ausitndatabases 历年的文章集合

PostgreSQL  查询语句开发写不好是必然,不是PG的锅

SQL SERVER 如何实现UNDO REDO  和PostgreSQL 有近亲关系吗

MongoDB 2023纽约 MongoDB 大会 -- 我们怎么做的新一代引擎 SBE Mongodb 7.0双擎力量(译)

MongoDB 2023年度纽约 MongoDB 年度大会话题 -- MongoDB 数据模式与建模

MongoDB  双机热备那篇文章是  “毒”

MongoDB   会丢数据吗?在次补刀MongoDB  双机热备

临时工说:从人性的角度来分析为什么公司内MySQL 成为少数派,PolarDB 占领高处

Austindatabases 公众号,主要围绕数据库技术(PostgreSQL, MySQL, Mongodb, Redis, SqlServer,PolarDB, Oceanbase 等)和职业发展,国外数据库大会音译,国外大型IT信息类网站文章翻译,等,希望能和您共同发展。

截至今天共发布1196 篇文字

4834b678840640333cd83daa605d57cc.png

1212905353c04c43ca8f4646c9c8f867.png

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值