基本命令使用
psql命令行
pg的命令行操作与mysql的有很大的差异,进入pg命令行后可以使用?查看pg的操作命令
查看pg的操作命令
#首先在linux命令行登录pg,postgres是pg的默认用户
psql -h localhost -p 5432 -U postgres
#查看有哪些用户
\dg
#查看有哪些数据库
\l
#查看有哪些表
\d
#切换数据库
\c dnname
#例如切换为数据库test,则使用命令
\c test
还有很多的命令可以执行\?查看它们的使用方法和作用
linux命令行
#基于linux命令行创建postgresql用户,createuser命令用法可通过createuser --help查看
createuser -h localhost -U postgres -s -P -e test
#基于linux命令行创建数据库,createdb 命令用法可通过createdb --help查看
createdb -h localhost -p 5432 -e -U test Privilege -E UTF-8
#在linux命令行对数据库进行授权
psql -h localhost -p 5432 -U postgres -c "grant all privileges on database Privilege to rbac"
#基于linux命令行导入sql文件数据到指定数据库,数据库通过-d参数进行指定。
psql -h localhost -p 5432 -U test -d Privilege -f privilege.sql
#指定psql以用户rbac访问数据库Privilege,非postgres用户登录pg需要指定数据库,通过-d参数指定。
psql -h localhost -p 5432 -U rbac -d Privilege
##postgresql报表不存在,原因是我指定的数据库是Privilege,但由于psql默认为大小写不敏感的,所以创建时变成了privilege了,这个库里面没有表存在;而同时还存在一个Privilege,它里面是有表的,所以我一直以为程序访问的是Privilege,但实际上访问的却是privilege,它里面还没有表,创建了表之后就好啦。
脚本封装命令
由于上述命令在执行过程需要输入密码,如果封装成脚本执行的话,我们是断不应该再与服务器交互的,而应该让脚本自己实现自动交互的功能,自己输入密码。
我通过expect命令来实现的这个功能,代码如下:
编写一个自动交互脚本,脚本的命名格式为xxx.exp,即脚本的后缀为.exp,现我创建一个脚本文件为create_pg.exp
vim create_pg.exp
#!/usr/bin/expect
#下面这5行是传入的参数,按编号分别为第1到第5个参数
set user [lindex $argv 0]
set passwd [lindex $argv 1]
#这个是pg的默认用户postgres的密码
set rootpw [lindex $argv 2]
set host [lindex $argv 3]
set db [lindex $argv 4]
spawn createuser -h $host -p 5432 -U postgres -s -P -e $user
expect "Enter password for new role: "
send "$passwd\r"
expect "Enter it again: "
send "$passwd\r"
expect "Password: "
send "$rootpd\r"
set result [wait result]
set ret [lindex $result 3]
#puts $ret
if {$ret > 0} {
puts stdout "create user error\n"
exit 1
}
spawn createdb -h $host -p 5432 -e -U $user $db -E UTF-8
expect "Password: "
send "$passwd\r"
set result [wait result]
set ret [lindex $result 3]
#puts $ret
if {$ret > 0} {
puts stdout "create db error\n"
exit 2
}
spawn psql -h $host -p 5432 -U postgres -c "grant all privileges on database $db to $user"
expect "Password for user postgres: "
send "$rootpw\r"
set result [wait result]
set ret [lindex $result 3]
#puts $ret
if {$ret > 0} {
puts stdout "grant db error\n"
exit 3
}
这个脚本通过自动交互的方式可以实现自动创建用户、数据库以及完成授权操作。
脚本调用方式:
expect create_pg.exp test 123456 123456 localhost testdb
创建表
vim create_db.sql
DROP TABLE IF EXISTS permission;
CREATE TABLE permission (
id serial,
name varchar(255) DEFAULT '',
type varchar(255) DEFAULT '',
content varchar(255) DEFAULT '',
setting int DEFAULT '0',
modify_time timestamp DEFAULT NULL,
cluster_name varchar(10) DEFAULT NULL,
wb varchar(1) DEFAULT 'w',
flag int DEFAULT '0',
PRIMARY KEY (id)
) ;
ALTER TABLE permission OWNER TO rbac;
注:其中serial表示主键id自增,相当于mysql的auto_increament
创建数据表,通过linux命令行方式创建:
psql -h localhost -p 5432 -U test -d Privilege -f create_db.sql
初始化表
vim init_table.sql
insert into permission(name,type,content,setting,cluster_name,wb) values('work_hdfs_super','HDFS','/',7,'hdp','w');
insert into permission(name,type,content,setting,cluster_name,wb) values('yarn_hdfs_super','HDFS','/home/yarn',7,'hdp','w');
insert into permission(name,type,content,setting,cluster_name,wb) values('yarn_hdfs_super','HDFS','/',7,'hdp','w');
insert into permission(name,type,content,setting,cluster_name,wb) values('mr_hdfs_super','HDFS','/home/mr',7,'hdp','w');
insert into permission(name,type,content,setting,cluster_name,wb) values('hbase_hdfs_super','HDFS','/home/hbase',7,'hdp','w');
insert into permission(name,type,content,setting,cluster_name,wb) values('hive_hdfs_super','HDFS','/home/hive',7,'hdp','w');
insert into permission(name,type,content,setting,cluster_name,wb) values('hbase_hbase_super','HBASE','/',31,'hdp','w');
insert into permission(name,type,content,setting,cluster_name,wb) values('ALL_hbase_super','HBASE','/-ROOT-',31,'hdp','w');
insert into permission(name,type,content,setting,cluster_name,wb) values('ALL_hbase_super','HBASE','/.META.',31,'hdp','w');
通过linux命令行方式初始化pg数据表:
psql -h localhost -p 5432 -U test -d Privilege -f init_table.sql