1基础信息
1.1基础设施
数据库服务器推荐配置 |
CPU 双核2.5GHz,内存 32G以上 |
数据库服务器操作系统 |
CentOS Linux release 7.2.1511 (Core) |
数据库服务器版本 |
Postgresql9.6 |
1.2 PostgreSQL简介
1.2.1 Postmistress是什么
PostgreSQL 是一个免费的对象-关系数据库服务器(ORDBMS),在灵活的BSD许可证下发行。
PostgreSQL 开发者把它念作 post-gress-Q-L。
PostgreSQL 的 Slogan 是 "世界上最先进的开源关系型数据库"。
1.2.2 ORDBMS 术语
在我们开始学习 PostgreSQL 数据库前,让我们先了解下 ORDBMS 的一些术语:
数据库: 数据库是一些关联表的集合。
数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
列: 一列(数据元素) 包含了相同的数据, 例如邮政编码的数据。
行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
外键:外键用于关联两个表。
复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
1.2.3 PostgreSQL 特征
函数:通过函数,可以在数据库服务器端执行指令程序。
索引:用户可以自定义索引方法,或使用内置的 B 树,哈希表与 GiST 索引。
触发器:触发器是由SQL语句查询所触发的事件。如:一个INSERT语句可能触发一个检查数据完整性的触发器。触发器通常由INSERT或UPDATE语句触发。 多版本并发控制:PostgreSQL使用多版本并发控制(MVCC,Multiversion concurrency control)系统进行并发控制,该系统向每个用户提供了一个数据库的"快照",用户在事务内所作的每个修改,对于其他的用户都不可见,直到该事务成功提交。
规则:规则(RULE)允许一个查询能被重写,通常用来实现对视图(VIEW)的操作,如插入(INSERT)、更新(UPDATE)、删除(DELETE)。
数据类型:包括文本、任意精度的数值数组、JSON 数据、枚举类型、XML 数据
等。
全文检索:通过 Tsearch2 或 OpenFTS,8.3版本中内嵌 Tsearch2。
NoSQL:JSON,JSONB,XML,HStore 原生支持,至 NoSQL 数据库的外部数据包装器。
数据仓库:能平滑迁移至同属 PostgreSQL 生态的 GreenPlum,DeepGreen,HAWK 等,使用 FDW 进行 ETL。
1.3、安装PostgreSQL
1.3.1安装依赖包
yum intall -y perl-ExtUtils-Embed readline-devel zlib-devel pam-devel libxml2-devel libxslt-devel openldap-devel python-devel gcc-c++ openssl-devel cmake yum install gcc* readline-devel |
1.3.2创建用户并改密
adduser postgres passwd postgres 更改用户 postgres 的密码 。 新的 密码: 无效的密码: 它基于字典单词 重新输入新的 密码: passwd: 所有的身份验证令牌已经成功更新。 id postgres uid=1001(postgres) gid=1001(postgres) 组=1001(postgres) |
1.3.3解压缩
tar -zxvf postgresql-9.6.2.tar.gz cd postgresql-9.6.2 |
1.3.4配置编译选项
./configure --prefix=/opt/pgsql/ --with-perl--with-libxml--with-libxslt |
1.3.5编译并安装
gmake gmake install |
1.3.6初始化数据库
mkdir /opt/pgdata chown postgres:postgres /opt/pgdata su - postgres /opt/pgsql/bin/initdb -D /opt/pgdata |
1.3.7配置环境变量
vim .bashrc export PGDATA=/opt/pgdata export PGHOME=/opt/pgsql export PATH=.:$PATH:$PGHOME/bin:$PGDATA/bin source .bashrc |
1.3.8改配置允许远程连接访问
cd /opt/pgdata vim postgresql.conf 将 #listen_addresses = 'localhost' 的注释去掉并改为 listen_addresses = '*' vim pg_hba.conf 在文件末尾添加: host all all 0.0.0.0/0 md5,表示允许任何IP连接 |
1.3.9启动postgres
pg_ctl start |
1.3.10配置系统服务[可选]
cp /opt/postgres/postgresql-9.6.2/contrib/start-scripts/linux /etc/init.d/postgresql vim /etc/init.d/postgresql #! /bin/sh # Installation prefix prefix=/opt/pgsql # Data directory PGDATA="/opt/pgdata" # Who to run the postmaster as, usually "postgres". (NOT "root") PGUSER=postgres # Where to keep a log file PGLOG="$PGDATA/serverlog" # The path that is to be used for the script PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DAEMON="$prefix/bin/postmaster" # What to use to shut down the postmaster PGCTL="$prefix/bin/pg_ctl"
set -e # Only start if we can find the postmaster. test -x $DAEMON || { echo "$DAEMON not found" if [ "$1" = "stop" ] then exit 0 else exit 5 fi }
# If we want to tell child processes to adjust their OOM scores, set up the # necessary environment variables. Can't just export them through the "su". if [ -e "$PG_OOM_ADJUST_FILE" -a -n "$PG_CHILD_OOM_SCORE_ADJ" ] then DAEMON_ENV="PG_OOM_ADJUST_FILE=$PG_OOM_ADJUST_FILE PG_OOM_ADJUST_VALUE=$PG_CHILD_OOM_SCORE_ADJ" fi
# Parse command line parameters. case $1 in start) echo -n "Starting PostgreSQL: " test -e "$PG_OOM_ADJUST_FILE" && echo "$PG_MASTER_OOM_SCORE_ADJ" > "$PG_OOM_ADJUST_FILE" su - $PGUSER -c "$DAEMON_ENV $DAEMON -D '$PGDATA' &" >>$PGLOG 2>&1 echo "ok" ;; stop) echo -n "Stopping PostgreSQL: " su - $PGUSER -c "$PGCTL stop -D '$PGDATA' -s -m fast" echo "ok" ;; restart) echo -n "Restarting PostgreSQL: " su - $PGUSER -c "$PGCTL stop -D '$PGDATA' -s -m fast -w" test -e "$PG_OOM_ADJUST_FILE" && echo "$PG_MASTER_OOM_SCORE_ADJ" > "$PG_OOM_ADJUST_FILE" su - $PGUSER -c "$DAEMON_ENV $DAEMON -D '$PGDATA' &" >>$PGLOG 2>&1 echo "ok" ;; reload) echo -n "Reload PostgreSQL: " su - $PGUSER -c "$PGCTL reload -D '$PGDATA' -s" echo "ok" ;; status) su - $PGUSER -c "$PGCTL status -D '$PGDATA'" ;; *) # Print help echo "Usage: $0 {start|stop|restart|reload|status}" 1>&2 exit 1 ;; esac
exit 0 chmod +x /etc/init.d/postgresql service postgresql start |
1.3.11登录数据库进行配置
psql 创建用户"folio_admin"并设置密码: postgres=# create role folio_admin with password 'calis123'login; 创建数据库folio_db,所有者为folio_admin: postgres=# create database folio_db owner folio_admin; 将folio_db数据库的所有权限赋予folio_admin,否则folio_admin只能登录psql,没有任何数据库操作权限: postgres=#grant all privileges on database folio_db to folio_admin; =================================================================== 创建okapi运行需要的数据库以及账号信息 创建用户"okapi"并设置密码: postgres=# create role okapi with password 'okapi25'login; 创建数据库okapi,所有者为okapi: postgres=# create database okapi owner okapi; 将okapi数据库的所有权限赋予okapi,否则okapi只能登录psql,没有任何数据库操作权限: postgres=#grant all privileges on database okapi to okapi; |
1.3.12扩展函数和okapi库
支持“不区分重音”的排序规则 如何无法再/opt/postgresql-9.6.11/contrib/unaccent下执行make&&make install 就先 yum install https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-6-x86_64/pgdg-redhat-repo-42.0-11.noarch.rpm 安装postgrrsql的源 然后安装插件依赖 安装PostgreSQL拓展包(可选) yum install postgresql96-devel.x86_64 安装PostgreSQL的附加模块(可选) yum install postgresql96-contrib.x86_64 然后应该就可以实现再contrib/unaccent下执行make && make install 然后就可以再终端执行如下方法扩展函数 CREATE EXTENSION unaccent; create extension "pgcrypto"; select digest('aa','sha1'); SELECT gen_random_uuid(); 首先创建两个数据库分别为,okapi,folio_db.并分配权限。 create user okapi with password 'okapi25'; create user folio_admin with password 'calis123'; create database okapi owner okapi; create database folio_db owner folio_admin; grant all privileges on database okapi to okapi; grant all privileges on database folio_db to folio_admin; alter role okapi superuser; alter role okapi createrole; alter role okapi createdb; alter role folio_admin superuser; alter role folio_admin createrole; alter role folio_admin createdb; 扩展okapi库 CREATE EXTENSION IF NOT EXISTS pgcrypto WITH SCHEMA public; CREATE EXTENSION IF NOT EXISTS unaccent WITH SCHEMA public; CREATE EXTENSION IF NOT EXISTS pg_trgm WITH SCHEMA public; |
1.3.13使用图形化工具
下载Navicat Premium工具尝试连接,让操作更便捷
注:如果无法连接,把防火墙端口放开
firewall-cmd --zone=public --add-port=5432/tcp --permanent firewall-cmd --reload |
1.4postgres常用命令
1.4.1登录
psql -U pname -d database // pname 表示postgres的登录用户名,database 则表示要访问的数据库 |
1.4.2查看所有的数据库
\l |
1.4.3查看所有的表(这里的红色部分根据你要查看的数据库的名字来改变)
\d database / |
1.4.4查看表的结构(这里的红色部分根据你要查看的表的名字来改变)
\d tablename/ |
1.4.5切换数据库
\c database |
1.4.6退出登录
\q |
1.4.7创建database
CREATE DATEBASE database_name; |
1.4.8创建schema
CREATE SCHEMA schema_name; |
1.4.9查看数据库下面所有的schema
select * from information_schema.schemata; |
1.4.10查看一个schema下面所有的表
select * from information_schema.tables where table_schema = 'schema_name'; |
1.4.11创建角色
CREATE ROLE role_name [...]; [...]为可多选角色属性参数,参数可分别为: 登陆(login):具有login属性的角色可以连接数据库,一个带有login属性的角色可以等同于“数据库用户”,因为数据库用户创建的时候默认自带login属性. 超级用户(superuser):超级用户拥有至高无上的权限,但是这个权限分配的时候,一定要小心,想要创建超级用户,必须使用带超级用户的角色去创建带“超级用户”的角色 . 创建数据库(createdb):创建数据库属性,顾名思义就是拥有“创建数据库”属性的角色可以创建数据库,对于超级用户的角色来说,自身可以创建数据库,不用带“创建数据库”属性 . 创建角色(createrole):带有“创建角色”属性的角色可以创建其他角色。一般带有“创建角色”属性的角色还可以删除和更改其他角色(删除和更改只限于普通用户) 口令(password):只有在客户认证方法要求与数据库建立连接必须使用口令的时候, 口令才比较重要. 在创建好角色后,如果需要修改的话,可以使用alter role语句修改
|
1.4.12权限设置
将名字为schema_name的schema的所有权限给予role_name角色; grant all on schema schema_name to role_name; 将名字为schema_name的schema下面所有的表的操作权限给予role_name角色; grant all on all tables in schema schema_name to role_name;
如果你不准备将所有的权限都给予role_name角色,可以给予部分的权限,每个权限值之间以逗号分隔,而权限的明细如下:
SELECT:该权限用来查询表或是表上的某些列,或是视图,序列。 INSERT:该权限允许对表或是视图进行插入数据操作,也可以使用COPY FROM进行数据的插入。 UPDATE:该权限允许对表或是或是表上特定的列或是视图进行更新操作。 DELETE:该权限允许对表或是视图进行删除数据的操作。 TRUNCATE:允许对表进行清空操作。 REFERENCES:允许给参照列和被参照列上创建外键约束。 TRIGGER:允许在表上创建触发器。 CREATE:对于数据库,允许在数据库上创建Schema;对于Schema,允许对Schema上创建数据库对象;对于表空间,允许把表或是索引指定到对应的表空间上(在Oracle中,我们是用quota子句或是unlimited tablespace权限来控制)。该权限与Oracle上的CREATE类权限完全不同了。 CONNECT:允许用户连接到指定的数据库上。 TEMPORARY或是TEMP:允许在指定数据库的时候创建临时表。 EXECUTE:允许执行某个函数。 USAGE:对于程序语言来说,允许使用指定的程序语言创建函数;对于Schema来说,允许查找该Schema下的对象;对于序列来说,允许使用currval和nextval函数;对于外部封装器来说,允许使用外部封装器来创建外部服务器;对于外部服务器来说,允许创建外部表。 ALL PRIVILEGES:表示一次性给予可以授予的权限。 |