- su - 与 su 命令是有区别的。
看下面的实验:
su - 和 su 的区别:
su - 和 su 的主要区别在于它们切换用户时的环境变量处理方式。
使用 su 命令切换用户时,默认情况下不会读取目标用户的登录环境,而是保持当前用户的登录环境。而 su - 命令则会读取目标用户的登录环境,使得切换后的用户环境与目标用户一致。su - 这种方式的切换更加彻底,适合需要完全以目标用户身份执行操作的场景。
所以上面实验时开始使用的su命令,报错,postgres用户对目录 /root 没有权限。使用su - 命令就没有问题了。
2. 创建一个普通用户,授予CREATEDB 权限,并使用此普通用户登录数据库。
报错1:error: FATAL: Peer authentication failed for user "osdba"
与Oracle与MySQL相似,PG 的登录方式也是分本地登录和 TCP/IP方式登录两种。
本地登录,通过操作系统账户验证。上面登录方式,未指定-h ,默认走的本地登录方式,并没有建操作系统账户osdba,所以报错。
修改配置文件pg_hba.conf
-bash-4.2$ cd /var/lib/pgsql/12/data
-bash-4.2$ vi pg_hba.conf
在IPv4 local connections处增加一行,使用TCP方式登录,允许172.17.140.73单机通过密码验证方式连接数据库。
使用0.0.0.0/0 表示任意IP均可以访问,也可以使用172.0.0.0/0
修改完配置文件,需要重服务使其生效,或者运行"pg_ctl reload", 或者 执行 "SELECT pg_reload_conf()" 重新加载配置文件。
再次使用osdba进行登录:
报错2:FATAL: password authentication failed for user "osdba"
属于密码问题,刚才创建用户时指定了密码,不知为何此处输入后报错。
重新修改用户密码
再次登录
报错3:error: FATAL: database "osdba" does not exist
可见创建了用户,登录时默认会使用与用户名同名的数据库。
使用\l 命令查看现有数据库,并创建数据库osdba,并指定其owner 为osdba,再登录就可以了。
那能使用postgres 用户进入到osdba库吗
PG的用户不能同时进入多个database,如果想访问其他database,须使用dblink等方式。PG的database跟MySQL的database不同。
3.权限
使用osdba用户进入postgres库
可见osdba用户可以进入postgres库,能看到其有哪些对象,但不能访问。
授权osdba有访问postgres库public schema下表的select权限。
4.查询用户的数据字典可以使用pg_catalog.pg_user视图来查询用户数据字典,这与Oracle的DBA_USERS类似.
5.总结
(1)注意 su - 与 su 命令是有区别的,登录pg数据库时,注意使用su - 命令, 切换为postgres用户的环境变量来访问数据库。
(2)用户登录默认进入同名数据库,使用非操作系统用户进入别的数据库需要登录时指定数据库名称。
psql -h -p <端口> [数据库名称] [用户名称]
(3)数据字典视图pg_user 相当于 oracle的dba_users。




