一、PostgreSQL介绍
PostgreSQL是加州大学伯克利分校计算机系开发的对象关系型数据库管理系统,目前拥有活跃的开源社区贡献,最近排名也不断前进,pgsql中其实有很多有点和设计理念都要比mysql更好一些,比如稳定性比较强;高并发读写情况下性能依然较好;支持丰富的几何类型并且在GIS领域地位领先;text支持各种长度,无需区分;nosql特性,支持array和json存储和搜索等,因为这些优点,pgsql应用场景也不断扩展,下面详细写一下pgsql入门的第一步,即先将pgsql安装至操作系统,过程如下:
二、下载软件包
pgsql有很多类型的包,对于不同linux发行版都有对应的编译好的包,安装很方便,另外如果对于通用的linux平台可以编译源码安装或者安装官方编译好的二进制包,源码包的安装仅仅比二进制安装多出一个编译步骤,其余的都一样,所以这里使用安装方式是安装编译好的二进制包
pgsql官网地址:https://www.postgresql.org/,进入后点击download就来到下载页,这里点击Linux下面的Other Linux选项,然后点击下方的tar.gz archive下载二进制归档
然后就来到最终的pgsql下载页了,地址为:https://www.enterprisedb.com/download-postgresql-binaries
如上图根据机器的位数下载对应的包,我这里下载的是x86-64的包,为:postgresql-10.10-2-linux-x64-binaries.tar.gz,下载之后准备安装
三、环境准备
1、创建postgres用户
[root@wjqbackup ~]# useradd postgres [root@wjqbackup ~]# passwd postgres Changing password for user postgres. New password: Retype new password: passwd: all authentication tokens updated successfully.
注意:这里设置密码是linux用户postgres的登录密码,不是pgsql服务器的密码
2、创建安装和数据相关目录
[root@wjqbackup ~]# mkdir /usr/local/pgsql [root@wjqbackup ~]# mkdir -p /data/pgsql/5432/data
3、给postgres用户授权目录访问权限
[root@wjqbackup ~]# chown -R postgres /data/pgsql
四、安装并初始化
解压数据库并放到指定目录:
[root@wjqbackup pgsql]# tar zxvf postgresql-10.10-2-linux-x64-binaries.tar.gz # 解压出来之后目录为pgsql [root@wjqbackup pgsql]# mv pgsql /usr/local/
现在pgsql的安装目录就是/usr/local/pgsql
切换到postgres用户来操作数据库,pgsql数据库就以postgres为默认用户
[root@wjqbackup ~]# su - postgres
切换之后建议修改~/.bash_profile将pgsql的bin目录加至环境变量中,方便直接使用pgsql相关命令
[postgres@wjqbackup ~]$ vim .bash_profile PGSQL=/usr/local/pgsql PATH=$PATH:$HOME/.local/bin:$HOME/bin:$PGSQL/bin export PATH [postgres@wjqbackup ~]$ source .bash_profile
下面初始化数据库:
[postgres@wjqbackup ~]$ /usr/local/pgsql/bin/initdb -D /data/pgsql/5432/data/ The files belonging to this database system will be owned by user "postgres". This user must also own the server process. The database cluster will be initialized with locale "en_US.utf8". The default database encoding has accordingly been set to "UTF8". The default text search configuration will be set to "english". Data page checksums are disabled. fixing permissions on existing directory /data/pgsql/5432/data ... ok creating subdirectories ... ok selecting default max_connections ... 100 selecting default shared_buffers ... 128MB selecting default timezone ... PRC selecting dynamic shared memory implementation ... posix creating configuration files ... ok running bootstrap script ... ok performing post-bootstrap initialization ... ok syncing data to disk ... ok WARNING: enabling "trust" authentication for local connections You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb. Success. You can now start the database server using: /usr/local/pgsql/bin/pg_ctl -D /data/pgsql/5432/data/ -l logfile start
等待执行完毕,没什么问题就初始化成功了;
如图根据提示可以启动数据库:/usr/local/pgsql/bin/pg_ctl -D /data/pgsql/5432/data/ -l logfile start
[postgres@wjqbackup ~]$ /usr/local/pgsql/bin/pg_ctl -D /data/pgsql/5432/data/ -l /data/pgsql/5432/data/logfile start & [1] 27635 [postgres@wjqbackup ~]$ waiting for server to start.... done server started
这里-l指定日志文件位置,这里直接输出在家目录下的logfile中,这个可以自己指定,这里-D指定数据目录,默认如果不加数据目录直接报错找不到,可以刚才说的环境变量配置文件中~/.bash_profile加入一行:
export PGDATA=/data/pgsql/5432/data/ 然后source进去即可,这样pgsql会自动去找PGDATA环境变量值,找不到才会报错
启动之后此时执行: ps -ef | grep postgres 就可以看到相关进程如下:
[postgres@wjqbackup data]$ ps -ef | grep postgre postgres 27637 1 0 21:14 pts/3 00:00:00 /usr/local/pgsql/bin/postgres -D /data/pgsql/5432/data postgres 27639 27637 0 21:14 ? 00:00:00 postgres: checkpointer process postgres 27640 27637 0 21:14 ? 00:00:00 postgres: writer process postgres 27641 27637 0 21:14 ? 00:00:00 postgres: wal writer process postgres 27642 27637 0 21:14 ? 00:00:00 postgres: autovacuum launcher process postgres 27643 27637 0 21:14 ? 00:00:00 postgres: stats collector process postgres 27644 27637 0 21:14 ? 00:00:00 postgres: bgworker: logical replication launcher
pgsql默认的端口号为5432,通过netstat命令或者lsof命令都可以看到监听情况:
[postgres@wjqbackup ~]$ netstat -tuplan | grep 5432 (Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 27637/postgres tcp6 0 0 ::1:5432 :::* LISTEN 27637/postgres [postgres@wjqbackup ~]$ lsof -i:5432 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME postgres 27637 postgres 3u IPv6 13026143 0t0 TCP VM_242_174_centos:postgres (LISTEN) postgres 27637 postgres 4u IPv4 13026144 0t0 TCP VM_242_174_centos:postgres (LISTEN)
现在可以看到pgsql默认监听的是localhost或127.0.0.1,目前只能本机访问,如果远程访问就连接不上了,具体的配置文件是data目录下的postgresql.conf,可以通过修改这个配置文件来调整各个参数,比如:listen_addresses可以修改绑定的地址,默认是localhost,port可以修改监听的端口号,默认是5432,max_connections可以修改最大客户端连接数量,默认是100等等,这里就不再详细说了
停止postgresql进程
[postgres@wjqbackup data]$ /usr/local/pgsql/bin/pg_ctl -D /data/pgsql/5432/data/ stop waiting for server to shut down.... done server stopped
四、命令行界面简单操作
pgsql和mysql一样可以通过交互式提示符连接操作,连接方式如下:
[postgres@wjqbackup ~]$ psql -h 127.0.0.1 -d postgres -U postgres -p 5432 psql.bin (10.10) Type "help" for help. postgres=# help You are using psql, the command-line interface to <a href="http://www.seiang.com/?tag=postgresql" title="查看更多关于PostgreSQL的文章" target="_blank">PostgreSQL</a>. Type: \copyright for distribution terms \h for help with SQL commands \? for help with psql commands \g or terminate with semicolon to execute query \q to quit
其中-h参数指定服务器地址,默认为127.0.0.1,默认不指定即可,-d指定连接之后选中的数据库,默认也是postgres,-U指定用户,默认是当前用户,-p 指定端口号,默认是”5432″,其它更多的参数选项可以执行:psql –help进行查看
查看pgsql的版本
postgres=# select version(); version ---------------------------------------------------------------------------------------------------------- <a href="http://www.seiang.com/?tag=postgresql" title="查看更多关于PostgreSQL的文章" target="_blank">PostgreSQL</a> 10.10 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-23), 64-bit (1 row)
命令提示符前面的就是当前的数据库,使用\l查看当前的数据库列表
postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+------------+------------+----------------------- postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 | template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + | | | | | postgres=CTc/postgres (3 rows)
默认postgres,template0和1这3个库是不允许操作的;
创建新的数据库执行:CREATE DATABASE wjqdb WITH OWNER=postgres ENCODING=’UTF-8′; 这样就创建好了数据库wjqdb,然后可以执行命令\c wjqdb切换当前数据库为wjqdb,然后执行\d可以查看当前数据库下的所有表:
postgres=# CREATE DATABASE wjqdb WITH OWNER=postgres ENCODING='UTF-8'; CREATE DATABASE postgres=# postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+------------+------------+----------------------- postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 | template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + | | | | | postgres=CTc/postgres wjqdb | postgres | UTF8 | en_US.utf8 | en_US.utf8 | (4 rows)
创建一个简单的数据表可以执行下面的命令:
wjqdb=# CREATE TABLE student ( wjqdb(# id integer NOT NULL, wjqdb(# name character(32), wjqdb(# number char(5), wjqdb(# CONSTRAINT student_pkey PRIMARY KEY (id) wjqdb(# ); CREATE TABLE
创建表之后可以使用 \d student; 查看表的详细信息,如下:
wjqdb=# \d student Table "public.student" Column | Type | Collation | Nullable | Default --------+---------------+-----------+----------+--------- id | integer | | not null | name | character(32) | | | number | character(5) | | | Indexes: "student_pkey" PRIMARY KEY, btree (id)
现在可以插入一条测试数据:
wjqdb=# INSERT INTO student (id, name, number) VALUES (1, '张三', '1023'); 然后可以查询这条数据: wjqdb=# SELECT * FROM student;
最后可以执行 \q 退出交互式界面
五、简单的配置
(1)配置监听的地址
对postgresql.conf文件进行编辑
#listen_addresses = ‘localhost’
修改成:
listen_addresses = ‘*’
(2)配置允许远程连接
对pg_hba.conf文件进行编辑
# IPv4 local connections:
host all all 127.0.0.1/32 trust
修改成
host all all 0.0.0.0/0 md5
最后一项method取值解释如下:
trust 任何连接都允许,不需要密码
reject 拒绝符合条件(前面几个条件)的请求
md5 接收一个MD5加密过的密码
password 接收一个密码来登陆,只在可信的网络使用这种方式
gss 使用gssapi认证,只在tcp/ip连接可用
sspi 只在windows可用的一种方式
krb5 不常用,只在TCP/IP可用
ident 使用操作系统用户名认证,验证它是否符合请求的的数据库用户名
ldap 使用LDAP服务器认证
cert 使用ssl客户端认证
pam 使用操作系统的pam模块服务
(3)修改postgre用户的密码
postgres=# \password Enter new password: (输入密码) Enter it again: (再次输入密码) postgres=#
重启实例
[postgres@wjqbackup ~]$ psql -h 127.0.0.1 -d postgres -U postgres -p 5432 Password for user postgres:
(4)客户端远程登录测试
安装pgadmin4客户端进行连接测试
上面是一些最基本的操作,可以看出除了一些属性类的操作外,通用的sql语句和mysql几乎完全一样,只是数据类型表达有所不同;对于pgsql的安装和简单的使用就先说这些,另外pgsql还支持更多复杂的查询的操作,这个后续如果有涉及会继续分享;